From cf4a4379d82b00b72907cb7d24caee7aac40a6f7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 17:06:36 +0000 Subject: [PATCH 1/3] Initial plan From 75d6eac0c4b085e4849e0ac25af4aa739500da1e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 17:15:41 +0000 Subject: [PATCH 2/3] Add additional print settings to GroupifierPrinting page Co-authored-by: coder13 <881394+coder13@users.noreply.github.com> --- .../External/GroupifierPrinting.tsx | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/src/pages/Competition/External/GroupifierPrinting.tsx b/src/pages/Competition/External/GroupifierPrinting.tsx index ff5bcdd..a4f317b 100644 --- a/src/pages/Competition/External/GroupifierPrinting.tsx +++ b/src/pages/Competition/External/GroupifierPrinting.tsx @@ -3,12 +3,14 @@ import { useDispatch } from 'react-redux'; import { Container, FormControl, + FormLabel, InputLabel, Link, MenuItem, Select, SelectChangeEvent, Stack, + Switch, } from '@mui/material'; import { useAppSelector } from '../../../store'; import { updateGlobalExtension } from '../../../store/actions'; @@ -17,6 +19,10 @@ type ScorecardSize = 'a4' | 'a6' | 'letter'; interface IGroupifierPrintingConfig { scorecardPaperSize: ScorecardSize; + printStations?: boolean; + printScrambleCheckerForTopRankedCompetitors?: boolean; + printScrambleCheckerForFinalRounds?: boolean; + printScrambleCheckerForBlankScorecards?: boolean; } export const GroupifierPrintingConfig = () => { @@ -43,6 +49,70 @@ export const GroupifierPrintingConfig = () => { [dispatch, groupifierConfig] ); + const updatePrintStations = useCallback( + (event: React.ChangeEvent) => { + dispatch( + updateGlobalExtension({ + id: 'groupifier.CompetitionConfig', + specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', + data: { + ...groupifierConfig, + printStations: event.target.checked, + }, + }) + ); + }, + [dispatch, groupifierConfig] + ); + + const updatePrintScrambleCheckerForTopRankedCompetitors = useCallback( + (event: React.ChangeEvent) => { + dispatch( + updateGlobalExtension({ + id: 'groupifier.CompetitionConfig', + specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', + data: { + ...groupifierConfig, + printScrambleCheckerForTopRankedCompetitors: event.target.checked, + }, + }) + ); + }, + [dispatch, groupifierConfig] + ); + + const updatePrintScrambleCheckerForFinalRounds = useCallback( + (event: React.ChangeEvent) => { + dispatch( + updateGlobalExtension({ + id: 'groupifier.CompetitionConfig', + specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', + data: { + ...groupifierConfig, + printScrambleCheckerForFinalRounds: event.target.checked, + }, + }) + ); + }, + [dispatch, groupifierConfig] + ); + + const updatePrintScrambleCheckerForBlankScorecards = useCallback( + (event: React.ChangeEvent) => { + dispatch( + updateGlobalExtension({ + id: 'groupifier.CompetitionConfig', + specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', + data: { + ...groupifierConfig, + printScrambleCheckerForBlankScorecards: event.target.checked, + }, + }) + ); + }, + [dispatch, groupifierConfig] + ); + return ( @@ -70,6 +140,34 @@ export const GroupifierPrintingConfig = () => { Letter + + Print Stations + + + + Print Scramble Checker for Top Ranked Competitors + + + + Print Scramble Checker for Final Rounds + + + + Print Scramble Checker for Blank Scorecards + + ); From 7b3c2e346529b9e5ea9a8321648f14fa7fd502d6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 18:06:08 +0000 Subject: [PATCH 3/3] Refactor: use Grid layout and reduce code duplication Co-authored-by: coder13 <881394+coder13@users.noreply.github.com> --- .../External/GroupifierPrinting.tsx | 132 ++++++++---------- 1 file changed, 57 insertions(+), 75 deletions(-) diff --git a/src/pages/Competition/External/GroupifierPrinting.tsx b/src/pages/Competition/External/GroupifierPrinting.tsx index a4f317b..6d795dd 100644 --- a/src/pages/Competition/External/GroupifierPrinting.tsx +++ b/src/pages/Competition/External/GroupifierPrinting.tsx @@ -4,6 +4,7 @@ import { Container, FormControl, FormLabel, + Grid, InputLabel, Link, MenuItem, @@ -33,15 +34,15 @@ export const GroupifierPrintingConfig = () => { )?.data as IGroupifierPrintingConfig | undefined; const scorecardPaperSize = groupifierConfig?.scorecardPaperSize; - const updateScorecardPaperSize = useCallback( - (event: SelectChangeEvent) => { + const updateExtension = useCallback( + (updates: Partial) => { dispatch( updateGlobalExtension({ id: 'groupifier.CompetitionConfig', specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', data: { ...groupifierConfig, - scorecardPaperSize: event.target.value as ScorecardSize, + ...updates, }, }) ); @@ -49,68 +50,39 @@ export const GroupifierPrintingConfig = () => { [dispatch, groupifierConfig] ); + const updateScorecardPaperSize = useCallback( + (event: SelectChangeEvent) => { + updateExtension({ scorecardPaperSize: event.target.value as ScorecardSize }); + }, + [updateExtension] + ); + const updatePrintStations = useCallback( (event: React.ChangeEvent) => { - dispatch( - updateGlobalExtension({ - id: 'groupifier.CompetitionConfig', - specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', - data: { - ...groupifierConfig, - printStations: event.target.checked, - }, - }) - ); + updateExtension({ printStations: event.target.checked }); }, - [dispatch, groupifierConfig] + [updateExtension] ); const updatePrintScrambleCheckerForTopRankedCompetitors = useCallback( (event: React.ChangeEvent) => { - dispatch( - updateGlobalExtension({ - id: 'groupifier.CompetitionConfig', - specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', - data: { - ...groupifierConfig, - printScrambleCheckerForTopRankedCompetitors: event.target.checked, - }, - }) - ); + updateExtension({ printScrambleCheckerForTopRankedCompetitors: event.target.checked }); }, - [dispatch, groupifierConfig] + [updateExtension] ); const updatePrintScrambleCheckerForFinalRounds = useCallback( (event: React.ChangeEvent) => { - dispatch( - updateGlobalExtension({ - id: 'groupifier.CompetitionConfig', - specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', - data: { - ...groupifierConfig, - printScrambleCheckerForFinalRounds: event.target.checked, - }, - }) - ); + updateExtension({ printScrambleCheckerForFinalRounds: event.target.checked }); }, - [dispatch, groupifierConfig] + [updateExtension] ); const updatePrintScrambleCheckerForBlankScorecards = useCallback( (event: React.ChangeEvent) => { - dispatch( - updateGlobalExtension({ - id: 'groupifier.CompetitionConfig', - specUrl: 'https://groupifier.jonatanklosko.com/wcif-extensions/CompetitionConfig.json', - data: { - ...groupifierConfig, - printScrambleCheckerForBlankScorecards: event.target.checked, - }, - }) - ); + updateExtension({ printScrambleCheckerForBlankScorecards: event.target.checked }); }, - [dispatch, groupifierConfig] + [updateExtension] ); return ( @@ -140,34 +112,44 @@ export const GroupifierPrintingConfig = () => { Letter - - Print Stations - - - - Print Scramble Checker for Top Ranked Competitors - - - - Print Scramble Checker for Final Rounds - - - - Print Scramble Checker for Blank Scorecards - - + + + Print Stations + + + + + + Print Scramble Checker for Top Ranked Competitors + + + + + + Print Scramble Checker for Final Rounds + + + + + + Print Scramble Checker for Blank Scorecards + + + + + );