From e5ebe68cb15a7129c7d0c92ec46c822ba91cf567 Mon Sep 17 00:00:00 2001 From: Surya Date: Wed, 28 Oct 2026 15:06:20 +0530 Subject: [PATCH] fix(form-core): clear form errors only on change --- packages/form-core/src/FormApi.ts | 4 +-- packages/form-core/tests/FormApi.spec.ts | 38 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/form-core/src/FormApi.ts b/packages/form-core/src/FormApi.ts index 4400017d30..641b0fc73b 100644 --- a/packages/form-core/src/FormApi.ts +++ b/packages/form-core/src/FormApi.ts @@ -2112,7 +2112,7 @@ export class FormApi< if ( // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition this.state.errorMap?.[submitErrKey] && - cause !== 'submit' && + cause === 'change' && !hasErrored ) { this.baseStore.setState((prev) => ({ @@ -2132,7 +2132,7 @@ export class FormApi< if ( // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition this.state.errorMap?.[serverErrKey] && - cause !== 'server' && + cause === 'change' && !hasErrored ) { this.baseStore.setState((prev) => ({ diff --git a/packages/form-core/tests/FormApi.spec.ts b/packages/form-core/tests/FormApi.spec.ts index c57bb044e8..7266aca3fb 100644 --- a/packages/form-core/tests/FormApi.spec.ts +++ b/packages/form-core/tests/FormApi.spec.ts @@ -2063,6 +2063,44 @@ describe('form api', () => { ).toBeUndefined() }) + it('should not clear form-level onSubmit error when a field is blurred without changing its value', async () => { + const form = new FormApi({ + defaultValues: { + firstName: '', + }, + validators: { + onSubmit: ({ value }) => { + if (value.firstName.length === 0) { + return { + form: 'something went wrong', + fields: { + firstName: 'first name is required', + }, + } + } + return null + }, + }, + }) + + form.mount() + + const field = new FieldApi({ + form, + name: 'firstName', + }) + + field.mount() + + await form.handleSubmit() + + expect(form.state.errorMap.onSubmit).toBe('something went wrong') + + field.handleBlur() + + expect(form.state.errorMap.onSubmit).toBe('something went wrong') + }) + it('should validate all fields consistently - field level onChange validators', async () => { const form = new FormApi({ defaultValues: {