Skip to content

Commit b2d1cba

Browse files
author
Harry Whorlow
committed
feat(core): form reset field utility function
1 parent fed72ed commit b2d1cba

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

packages/form-core/src/FormApi.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,6 +1715,9 @@ export class FormApi<
17151715
})
17161716
}
17171717

1718+
/**
1719+
* resets every field's meta
1720+
*/
17181721
resetFieldMeta = <TField extends DeepKeys<TFormData>>(
17191722
fieldMeta: Record<TField, AnyFieldMeta>,
17201723
): Record<TField, AnyFieldMeta> => {
@@ -1956,6 +1959,36 @@ export class FormApi<
19561959
this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')
19571960
this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')
19581961
}
1962+
1963+
/**
1964+
* Resets the field value and meta to default state
1965+
*/
1966+
resetField = <TField extends DeepKeys<TFormData>>(field: TField) => {
1967+
this.baseStore.setState((prev) => {
1968+
return {
1969+
...prev,
1970+
fieldMetaBase: {
1971+
...prev.fieldMetaBase,
1972+
[field]: {
1973+
isValidating: false,
1974+
isTouched: false,
1975+
isBlurred: false,
1976+
isDirty: false,
1977+
isPristine: true,
1978+
errors: [],
1979+
errorMap: {},
1980+
},
1981+
},
1982+
values: {
1983+
...prev.values,
1984+
[field]:
1985+
this.options.defaultValues &&
1986+
this.options.defaultValues[field as keyof TFormData],
1987+
},
1988+
}
1989+
})
1990+
}
1991+
19591992
/**
19601993
* Updates the form's errorMap
19611994
*/

packages/form-core/tests/FormApi.spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2864,3 +2864,26 @@ it('should update isSubmitSuccessful correctly during form submission', async ()
28642864

28652865
expect(form.state.isSubmitSuccessful).toBe(false)
28662866
})
2867+
2868+
it('should reset the fields value and meta to default state', async () => {
2869+
const form = new FormApi({
2870+
defaultValues: {
2871+
name: 'tony',
2872+
} as { name: string },
2873+
})
2874+
form.mount()
2875+
const field = new FieldApi({
2876+
form,
2877+
name: 'name',
2878+
})
2879+
2880+
field.mount()
2881+
field.setValue('hawk')
2882+
2883+
expect(form.state.values.name).toStrictEqual('hawk')
2884+
expect(field.state.meta.isTouched).toBe(true)
2885+
2886+
form.resetField('name')
2887+
expect(form.state.values.name).toStrictEqual('tony')
2888+
expect(field.state.meta.isTouched).toBe(false)
2889+
})

0 commit comments

Comments
 (0)