Skip to content

Commit

Permalink
preserve prematch fields
Browse files Browse the repository at this point in the history
  • Loading branch information
tytremblay committed Jan 19, 2025
1 parent afe3b14 commit 4bd6795
Show file tree
Hide file tree
Showing 10 changed files with 554 additions and 492 deletions.
831 changes: 416 additions & 415 deletions config/2025/config.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/components/Sections/FormSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export default function FormSection(props: SectionProps) {
section={props.name}
code={input.code}
type={input.type}
preserveSection={section?.preserveDataOnReset}
preserveSection={section?.formResetBehavior === 'preserve'}
/>
</InputCard>
))}
Expand Down
29 changes: 4 additions & 25 deletions src/components/inputs/BaseInputProps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,10 @@ export const inputBaseSchema = z.object({
required: z.boolean().describe('Whether this input is required'),
code: z.string().describe('A unique code for this input'),
disabled: z.boolean().optional().describe('Whether this input is disabled'),
preserveDataOnReset: z
.boolean()
.optional()
.describe(
'Whether this input should be preserved when the scouting form is reset',
),
formResetBehavior: z
.enum(['reset', 'preserve', 'increment'])
.default('reset')
.describe('The behavior of this input when the form is reset'),
defaultValue: z.unknown().describe('The default value'),
});

Expand All @@ -32,12 +30,6 @@ export const numberInputSchema = inputBaseSchema.extend({
min: z.number().optional().describe('The minimum value'),
max: z.number().optional().describe('The maximum value'),
defaultValue: z.number().default(0).describe('The default value'),
autoIncrementOnReset: z
.boolean()
.optional()
.describe(
'Whether this input should auto-increment on reset, instead of resetting to the default value',
),
});

export const selectInputSchema = inputBaseSchema.extend({
Expand All @@ -59,12 +51,6 @@ export const counterInputSchema = inputBaseSchema.extend({
max: z.number().optional().describe('The maximum value'),
step: z.number().optional().describe('The step value').default(1),
defaultValue: z.number().default(0).describe('The default value'),
autoIncrementOnReset: z
.boolean()
.optional()
.describe(
'Whether this input should auto-increment on reset, instead of resetting to the default value',
),
});

export const rangeInputSchema = inputBaseSchema.extend({
Expand All @@ -73,12 +59,6 @@ export const rangeInputSchema = inputBaseSchema.extend({
max: z.number().optional().describe('The maximum value'),
step: z.number().optional().describe('The step value').default(1),
defaultValue: z.number().default(0).describe('The default value'),
autoIncrementOnReset: z
.boolean()
.optional()
.describe(
'Whether this input should auto-increment on reset, instead of resetting to the default value',
),
});

export const booleanInputSchema = inputBaseSchema.extend({
Expand All @@ -93,7 +73,6 @@ export const timerInputSchema = inputBaseSchema.extend({

export const sectionSchema = z.object({
name: z.string(),
preserveDataOnReset: z.boolean().optional(),
fields: z.array(
z.discriminatedUnion('type', [
counterInputSchema,
Expand Down
20 changes: 13 additions & 7 deletions src/components/inputs/CheckboxInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,22 @@ export default function CheckboxInput(props: ConfigurableInputProps) {

const [checked, setChecked] = React.useState(data.defaultValue);

const resetState = React.useCallback(({force}: {force: boolean}) => {
if (!force && (data.preserveDataOnReset || props.preserveSection)) {
return;
}
setChecked(data.defaultValue);
}, [data.defaultValue]);
const resetState = React.useCallback(
({ force }: { force: boolean }) => {
if (force) {
setChecked(data.defaultValue);
return;
}
if (data.formResetBehavior === 'preserve' || props.preserveSection) {
return;
}
setChecked(data.defaultValue);
},
[data.defaultValue],
);

useEvent('resetFields', resetState);


useEffect(() => {
updateValue(props.code, checked);
}, [checked]);
Expand Down
32 changes: 23 additions & 9 deletions src/components/inputs/CounterInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,30 @@ export default function CounterInput(props: ConfigurableInputProps) {

const [value, setValue] = useState(data.defaultValue);

const resetState = useCallback(({force}: {force: boolean}) => {
if(!force && (data.preserveDataOnReset || props.preserveSection)) {
if (data.autoIncrementOnReset) {
const newVal = typeof value === 'number' ? value + data.step : 1;
setValue(newVal);
const resetState = useCallback(
({ force }: { force: boolean }) => {
if (force) {
setValue(data.defaultValue);
return;
}
return;
};
setValue(data.defaultValue);
}, [value]);
if (props.preserveSection) {
return;
}
switch (data.formResetBehavior) {
case 'reset':
setValue(data.defaultValue);
return;
case 'increment':
setValue(prev => (typeof prev === 'number' ? prev + data.step : 1));
return;
case 'preserve':
return;
default:
return;
}
},
[value],
);

useEvent('resetFields', resetState);

Expand Down
35 changes: 25 additions & 10 deletions src/components/inputs/NumberInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,32 @@ export default function NumberInput(props: ConfigurableInputProps) {

const [value, setValue] = React.useState<number | ''>(data.defaultValue);

const resetState = useCallback(({force}: {force: boolean}) => {
if (!force && (data.preserveDataOnReset || props.preserveSection)) {
if (data.autoIncrementOnReset) {
const newVal = typeof value === 'number' ? value + 1 : 1;
setValue(newVal);
const resetState = useCallback(
({ force }: { force: boolean }) => {
console.log(
`resetState ${data.code}`,
`force: ${force}`,
`behavior: ${data.formResetBehavior}`,
);
if (force) {
setValue(data.defaultValue);
return;
}
switch (data.formResetBehavior) {
case 'reset':
setValue(data.defaultValue);
return;
case 'increment':
setValue(prev => (typeof prev === 'number' ? prev + 1 : 1));
return;
case 'preserve':
return;
default:
return;
}
return;
} else {
setValue(data.defaultValue);
}
}, [data.defaultValue, value]);
},
[data.defaultValue, value],
);

useEvent('resetFields', resetState);

Expand Down
34 changes: 25 additions & 9 deletions src/components/inputs/RangeInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,32 @@ export default function RangeInput(props: ConfigurableInputProps) {

const [value, setValue] = useState(data.defaultValue);

const resetState = useCallback(({force}: {force: boolean}) => {
if (!force && (data.preserveDataOnReset || props.preserveSection)) {
if (data.autoIncrementOnReset) {
const newVal = typeof value === 'number' ? value + data.step : 1;
setValue(newVal);
const resetState = useCallback(
({ force }: { force: boolean }) => {
if (force) {
setValue(data.defaultValue);
return;
}
return;
}
setValue(data.defaultValue);
}, [data.defaultValue]);

if (props.preserveSection) {
return;
}

switch (data.formResetBehavior) {
case 'reset':
setValue(data.defaultValue);
return;
case 'increment':
setValue(prev => (typeof prev === 'number' ? prev + data.step : 1));
return;
case 'preserve':
return;
default:
return;
}
},
[data.defaultValue],
);

useEvent('resetFields', resetState);

Expand Down
24 changes: 18 additions & 6 deletions src/components/inputs/SelectInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,24 @@ export default function SelectInput(props: ConfigurableInputProps) {
updateValue(props.code, value);
}, [value]);

const resetState = useCallback(({force}: {force: boolean}) => {
if (!force && (data.preserveDataOnReset || props.preserveSection)) {
return;
}
setValue(data.defaultValue);
}, [data.defaultValue]);
const resetState = useCallback(
({ force }: { force: boolean }) => {
console.log(
`resetState ${data.code}`,
`force: ${force}`,
`behavior: ${data.formResetBehavior}`,
);
if (force) {
setValue(data.defaultValue);
return;
}
if (data.formResetBehavior === 'preserve' || props.preserveSection) {
return;
}
setValue(data.defaultValue);
},
[data.defaultValue],
);

useEvent('resetFields', resetState);

Expand Down
24 changes: 18 additions & 6 deletions src/components/inputs/StringInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,24 @@ export default function StringInput(props: ConfigurableInputProps) {

const [value, setValue] = React.useState(data.defaultValue);

const resetState = useCallback(({force}: {force: boolean}) => {
if (!force && (data.preserveDataOnReset || props.preserveSection)) {
return;
}
setValue(data.defaultValue);
}, [data.defaultValue]);
const resetState = useCallback(
({ force }: { force: boolean }) => {
console.log(
`resetState ${data.code}`,
`force: ${force}`,
`behavior: ${data.formResetBehavior}`,
);
if (force) {
setValue(data.defaultValue);
return;
}
if (data.formResetBehavior === 'preserve' || props.preserveSection) {
return;
}
setValue(data.defaultValue);
},
[data.defaultValue],
);

useEvent('resetFields', resetState);

Expand Down
15 changes: 11 additions & 4 deletions src/components/inputs/TimerInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,15 @@ export default function TimerInput(props: ConfigurableInputProps) {

const average = useMemo(() => getAvg(times), [times]);

const resetState = useCallback(({force}: {force: boolean}) => {
if (!force && (data.preserveDataOnReset || props.preserveSection)) {
const resetState = useCallback(({ force }: { force: boolean }) => {
if (force) {
setTime(data.defaultValue);
toggleTimer(false);
setTimes([]);
updateValue(props.code, data.defaultValue);
return;
}
if (data.formResetBehavior === 'preserve' || props.preserveSection) {
return;
}

Expand All @@ -43,7 +50,7 @@ export default function TimerInput(props: ConfigurableInputProps) {
}, []);

useEvent('resetFields', resetState);

function startStop() {
toggleTimer(!isRunning);
}
Expand Down Expand Up @@ -84,7 +91,7 @@ export default function TimerInput(props: ConfigurableInputProps) {
<Button variant="outline" disabled={time === 0} onClick={() => lap()}>
<TimerReset className="size-4" />
</Button>
<Button variant="outline" onClick={() => resetState({force: false})}>
<Button variant="outline" onClick={() => resetState({ force: false })}>
<Undo className="size-4" />
</Button>
</div>
Expand Down

0 comments on commit 4bd6795

Please sign in to comment.