Skip to content

Commit 9a4d86f

Browse files
committed
Updated field preset inputs to update errors for duplicate labels
1 parent 5911689 commit 9a4d86f

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed

components/settings/SettingsEntry/field-presets/FieldMultiPresetInput.tsx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import _ from "lodash"
2+
import { useMemo } from "react"
13
import {
24
Controller,
35
ControllerProps,
@@ -61,11 +63,25 @@ const FieldMultiPresetInput = <
6163
control: formMethods.control,
6264
})
6365

66+
const arrayPath = useMemo(
67+
() => name.match("/(.*).d+/")?.[0] as string,
68+
[name],
69+
)
70+
6471
return (
6572
<>
6673
<FormGroup className="field-multipreset" row>
6774
<Input
68-
{...formMethods.register(`${name}.label` as Path<TFieldValues>)}
75+
{...formMethods.register(`${name}.label` as Path<TFieldValues>, {
76+
deps: _.range(arrayMethods.fields.length).reduce(
77+
(arr, i2) => [
78+
...arr,
79+
`${arrayPath}.${i2}.label`,
80+
`${arrayPath}.${i2}.value`,
81+
],
82+
[] as string[],
83+
),
84+
})}
6985
fullWidth
7086
/>
7187
<div className="multipreset-value-list">
@@ -75,6 +91,16 @@ const FieldMultiPresetInput = <
7591
control={formMethods.control}
7692
name={`${name}.value.${index}` as Path<TFieldValues>}
7793
render={ValueInput}
94+
rules={{
95+
deps: _.range(arrayMethods.fields.length).reduce(
96+
(arr, i2) => [
97+
...arr,
98+
`${arrayPath}.${i2}.label`,
99+
`${arrayPath}.${i2}.value`,
100+
],
101+
[] as string[],
102+
),
103+
}}
78104
/>
79105
<div className="row-actions">
80106
<IconButton

components/settings/SettingsEntry/field-presets/FieldPresetFieldArray.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type FieldPresetFieldArrayProps<
4141
allowMultiple?: boolean
4242
valueInput: ControllerProps<TFieldValues>["render"]
4343
}
44+
4445
const FieldPresetFieldArray = <
4546
TValue = unknown,
4647
TFieldValues extends FieldValues = FieldValues,
@@ -93,6 +94,7 @@ const FieldPresetFieldArray = <
9394
<FieldPresetInput
9495
name={`${name}.${index}`}
9596
formMethods={formMethods}
97+
arrayMethods={arrayMethods as any} //TODO: Fix typing
9698
valueInput={valueInput}
9799
/>
98100
)}

components/settings/SettingsEntry/field-presets/FieldPresetInput.tsx

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import _ from "lodash"
2+
import { useMemo } from "react"
13
import {
24
Controller,
35
ControllerProps,
46
FieldArrayPath,
57
FieldValues,
68
Path,
9+
UseFieldArrayReturn,
710
UseFormReturn,
811
} from "react-hook-form"
912

@@ -15,6 +18,7 @@ type FieldPresetInputProps<
1518
> = {
1619
name: `${TFieldArrayName}.${number}`
1720
formMethods: UseFormReturn<TFieldValues>
21+
arrayMethods: UseFieldArrayReturn<TFieldValues, TFieldArrayName>
1822
valueInput: ControllerProps<TFieldValues>["render"]
1923
}
2024

@@ -24,23 +28,45 @@ const FieldPresetInput = <
2428
>(
2529
props: FieldPresetInputProps<TFieldValues, TFieldArrayName>,
2630
) => {
27-
const { name, formMethods, valueInput: ValueInput } = props
31+
const { name, formMethods, arrayMethods, valueInput: ValueInput } = props
2832

2933
const { register } = formMethods
3034

3135
const presetValue = formMethods.watch(`${name}.value` as Path<TFieldValues>)
3236

37+
const { arrayPath, index } = useMemo(
38+
() =>
39+
name.match(/(?<arrayPath>.*)\.(?<index>\d+)/)?.groups as {
40+
arrayPath: string
41+
index: string
42+
},
43+
[name],
44+
)
45+
3346
return (
3447
<FormGroup row>
3548
<Input
36-
{...register(`${name}.label` as Path<TFieldValues>)}
49+
{...register(`${name}.label` as Path<TFieldValues>, {
50+
deps: _.range(arrayMethods.fields.length)
51+
.filter((i2) => i2 !== Number(index))
52+
.reduce(
53+
(arr, i2) => [...arr, `${arrayPath}.${i2}.label`],
54+
[] as string[],
55+
),
56+
})}
3757
placeholder={presetValue}
3858
fullWidth
3959
/>
4060
<Controller
4161
control={formMethods.control}
4262
name={`${name}.value` as Path<TFieldValues>}
4363
render={ValueInput}
64+
rules={{
65+
deps: _.range(arrayMethods.fields.length).reduce(
66+
(arr, i2) => [...arr, `${arrayPath}.${i2}.label`],
67+
[] as string[],
68+
),
69+
}}
4470
/>
4571
</FormGroup>
4672
)

0 commit comments

Comments
 (0)