Skip to content
This repository was archived by the owner on Apr 9, 2025. It is now read-only.

Commit d429d44

Browse files
authored
Merge pull request #69 from dbssman/feature/53-add-dependencies-capability-to-field
🔀 Add field dependency capabilities
2 parents 9b13060 + 17e9ac2 commit d429d44

File tree

7 files changed

+45
-5
lines changed

7 files changed

+45
-5
lines changed

docs/api/use-form-handler/register.md

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Coming soon...
2323
| withDetails | `boolean` | Explicitly indicates if you want to bind dirty and and touched state for the registered field |
2424
| disabled | `boolean` | Disables the field. When a field is disabled it gets reset, and is not able to validate, or set new values until it is enabled again. The field is also not considered for the form validation. |
2525
| useNativeValidation | `boolean` | Set to true if you want to use native HTML validation |
26+
| dependentFields | `string[]` | Array of names from fields that depend on this one validation |
2627

2728
## Return
2829

package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vue-form-handler",
3-
"version": "0.3.0",
3+
"version": "0.4.0",
44
"type": "module",
55
"license": "MIT",
66
"author": "Dennis R. Bosmans",
@@ -64,4 +64,4 @@
6464
"vitest": "^0.26.1",
6565
"vue-tsc": "^1.0.9"
6666
}
67-
}
67+
}

src/test/register.test.ts

+26
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,30 @@ describe('register()', () => {
7171
expect(values.field).toBe('error')
7272
expect(formState.isValid).toBeFalsy()
7373
})
74+
it('should trigger validation on dependent field', async () => {
75+
const { register, formState, setValue } = useFormHandler()
76+
register('field1', {
77+
dependentFields: ['field2'],
78+
})
79+
register('field2', {
80+
required: true,
81+
})
82+
await setValue('field1', 'error')
83+
expect(formState.isValid).toBeFalsy()
84+
})
85+
it('should trigger validation on multiple dependent fields', async () => {
86+
const { register, formState, setValue } = useFormHandler()
87+
register('field1', {
88+
dependentFields: ['field2', 'field3'],
89+
})
90+
register('field2', {
91+
required: true,
92+
})
93+
register('field3', {
94+
required: true,
95+
})
96+
await setValue('field1', 'error')
97+
expect(formState.errors.field2).toBeDefined()
98+
expect(formState.errors.field3).toBeDefined()
99+
})
74100
})

src/types/refs.ts

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export interface WrappedReference {
3636
_validations: Validations
3737
_disabled: boolean
3838
_defaultValue: any
39+
_dependentFields?: string[]
3940
}
4041

4142
export type Refs = Record<string, WrappedReference>

src/types/register.ts

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ export interface RegisterOptions extends ValidationsConfiguration {
2525

2626
/** Indicates if the control should use the native html validation */
2727
useNativeValidation?: boolean
28+
29+
/** Array of dependent fields */
30+
dependentFields?: string[]
2831
}
2932

3033
export type RegisterReturn = BaseControlProps & NativeValidations

src/useFormHandler.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export const useFormHandler: UseFormHandler = ({
8181
},
8282
_defaultValue: options.defaultValue,
8383
_disabled: !!options.disabled,
84+
_dependentFields: options.dependentFields,
8485
}
8586
if (needsReset) {
8687
unregister(name)
@@ -183,8 +184,9 @@ export const useFormHandler: UseFormHandler = ({
183184
}
184185

185186
const setValue: SetValue = async (name, value = DEFAULT_FIELD_VALUE) => {
187+
const field = _refs[name]
186188
if (
187-
!_refs[name]?._disabled &&
189+
!field?._disabled &&
188190
(!interceptor ||
189191
(await interceptor({
190192
clearError,
@@ -203,6 +205,13 @@ export const useFormHandler: UseFormHandler = ({
203205
) {
204206
values[name] = value
205207
setDirty(name, !isEqual(value, _getInitial(name)))
208+
if (field && field._dependentFields) {
209+
for (const dependentField of field._dependentFields) {
210+
if (_refs[dependentField]) {
211+
await triggerValidation(dependentField)
212+
}
213+
}
214+
}
206215
return
207216
}
208217
if (

0 commit comments

Comments
 (0)