Skip to content

Commit 791c3c1

Browse files
committed
fix: only set fields to isBlurred after field blur or form submit
Signed-off-by: Pascal Küsgen <pascalkuesgen@gmail.com>
1 parent aaeb8db commit 791c3c1

File tree

3 files changed

+57
-13
lines changed

3 files changed

+57
-13
lines changed

packages/form-core/src/FormApi.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -621,12 +621,6 @@ export class FormApi<
621621
// Mark them as touched
622622
field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))
623623
}
624-
625-
// If any fields are not blurred
626-
if (!field.instance.state.meta.isBlurred) {
627-
// Mark them as blurred
628-
field.instance.setMeta((prev) => ({ ...prev, isBlurred: true }))
629-
}
630624
})
631625
})
632626

@@ -690,12 +684,6 @@ export class FormApi<
690684
fieldInstance.setMeta((prev) => ({ ...prev, isTouched: true }))
691685
}
692686

693-
// If the field is not blurred (same logic as in validateAllFields)
694-
if (!fieldInstance.state.meta.isBlurred) {
695-
// Mark it as blurred
696-
fieldInstance.setMeta((prev) => ({ ...prev, isBlurred: true }))
697-
}
698-
699687
return fieldInstance.validate(cause)
700688
}
701689

@@ -967,6 +955,19 @@ export class FormApi<
967955
this.store.setState((prev) => ({ ...prev, isSubmitting: false }))
968956
}
969957

958+
// Set all fields to blurred
959+
this.store.batch(() => {
960+
void (
961+
Object.values(this.fieldInfo) as FieldInfo<any, TFormValidator>[]
962+
).forEach((field) => {
963+
if (!field.instance) return
964+
965+
if (!field.instance.state.meta.isBlurred) {
966+
field.instance.setMeta((prev) => ({ ...prev, isBlurred: true }))
967+
}
968+
})
969+
})
970+
970971
// Validate form and all fields
971972
await this.validateAllFields('submit')
972973

@@ -1094,7 +1095,6 @@ export class FormApi<
10941095
this.setFieldMeta(field, (prev) => ({
10951096
...prev,
10961097
isTouched: true,
1097-
isBlurred: true,
10981098
isDirty: true,
10991099
errorMap: {
11001100
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,29 @@ describe('field api', () => {
9595
expect(field.getValue()).toBe('other')
9696
})
9797

98+
it('should set isBlurred correctly', () => {
99+
const form = new FormApi({
100+
defaultValues: {
101+
names: ['test'],
102+
},
103+
})
104+
form.mount()
105+
106+
const field = new FieldApi({
107+
form,
108+
name: 'names',
109+
})
110+
field.mount()
111+
112+
expect(field.getMeta().isBlurred).toBe(false)
113+
114+
field.pushValue('other')
115+
expect(field.getMeta().isBlurred).toBe(false)
116+
117+
field.handleBlur()
118+
expect(field.getMeta().isBlurred).toBe(true)
119+
})
120+
98121
it('should push an array value correctly', () => {
99122
const form = new FormApi({
100123
defaultValues: {

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2354,3 +2354,24 @@ describe('form api', () => {
23542354
expect(passconfirmField.state.meta.errors.length).toBe(0)
23552355
})
23562356
})
2357+
2358+
it('should update the onBlur state of the fields when the form is submitted', async () => {
2359+
const form = new FormApi({
2360+
defaultValues: {
2361+
firstName: '',
2362+
},
2363+
})
2364+
2365+
const field = new FieldApi({
2366+
form,
2367+
name: 'firstName',
2368+
})
2369+
2370+
field.mount()
2371+
2372+
expect(field.state.meta.isBlurred).toBe(false)
2373+
2374+
await form.handleSubmit()
2375+
2376+
expect(field.state.meta.isBlurred).toBe(true)
2377+
})

0 commit comments

Comments
 (0)