Skip to content

Commit 7d089b0

Browse files
committed
fix: only set fields to isBlurred after field blur or form submit
Signed-off-by: Pascal Küsgen <[email protected]>
1 parent af3f6b3 commit 7d089b0

File tree

3 files changed

+80
-13
lines changed

3 files changed

+80
-13
lines changed

packages/form-core/src/FormApi.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -640,12 +640,6 @@ export class FormApi<
640640
// Mark them as touched
641641
field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))
642642
}
643-
644-
// If any fields are not blurred
645-
if (!field.instance.state.meta.isBlurred) {
646-
// Mark them as blurred
647-
field.instance.setMeta((prev) => ({ ...prev, isBlurred: true }))
648-
}
649643
})
650644
})
651645

@@ -709,12 +703,6 @@ export class FormApi<
709703
fieldInstance.setMeta((prev) => ({ ...prev, isTouched: true }))
710704
}
711705

712-
// If the field is not blurred (same logic as in validateAllFields)
713-
if (!fieldInstance.state.meta.isBlurred) {
714-
// Mark it as blurred
715-
fieldInstance.setMeta((prev) => ({ ...prev, isBlurred: true }))
716-
}
717-
718706
return fieldInstance.validate(cause)
719707
}
720708

@@ -986,6 +974,19 @@ export class FormApi<
986974
this.store.setState((prev) => ({ ...prev, isSubmitting: false }))
987975
}
988976

977+
// Set all fields to blurred
978+
this.store.batch(() => {
979+
void (
980+
Object.values(this.fieldInfo) as FieldInfo<any, TFormValidator>[]
981+
).forEach((field) => {
982+
if (!field.instance) return
983+
984+
if (!field.instance.state.meta.isBlurred) {
985+
field.instance.setMeta((prev) => ({ ...prev, isBlurred: true }))
986+
}
987+
})
988+
})
989+
989990
// Validate form and all fields
990991
await this.validateAllFields('submit')
991992

@@ -1113,7 +1114,6 @@ export class FormApi<
11131114
this.setFieldMeta(field, (prev) => ({
11141115
...prev,
11151116
isTouched: true,
1116-
isBlurred: true,
11171117
isDirty: true,
11181118
errorMap: {
11191119
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,52 @@ 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+
firstName: '',
102+
},
103+
})
104+
form.mount()
105+
106+
const field = new FieldApi({
107+
form,
108+
name: 'firstName',
109+
})
110+
field.mount()
111+
112+
expect(field.getMeta().isBlurred).toBe(false)
113+
114+
field.setValue('Bob')
115+
expect(field.getMeta().isBlurred).toBe(false)
116+
117+
field.handleBlur()
118+
expect(field.getMeta().isBlurred).toBe(true)
119+
})
120+
121+
it('should set isBlurred correctly for arrays', () => {
122+
const form = new FormApi({
123+
defaultValues: {
124+
firstNames: ['Bob'],
125+
},
126+
})
127+
form.mount()
128+
129+
const field = new FieldApi({
130+
form,
131+
name: 'firstNames',
132+
})
133+
field.mount()
134+
135+
expect(field.getMeta().isBlurred).toBe(false)
136+
137+
field.pushValue('Bill')
138+
expect(field.getMeta().isBlurred).toBe(false)
139+
140+
field.handleBlur()
141+
expect(field.getMeta().isBlurred).toBe(true)
142+
})
143+
98144
it('should push an array value correctly', () => {
99145
const form = new FormApi({
100146
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)