fix(form-core): re-run form-level validator on resubmit to clear its own stale field errors - #2260
Draft
FrancoKaddour wants to merge 1 commit into
Draft
Conversation
…own stale field errors
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #2248
Problem
With only a form-level
onSubmitvalidator (no field-level validators), the form can never re-validate on a second submit while any error is outstanding._handleSubmitrunsvalidateAllFields('submit')(field-level only), then bails atif (!this.state.isFieldsValid) return— beforethis.validate('submit')(the form-level validator) is reached. A form-level validator writes its errors onto fields ({ fields }), butvalidateAllFieldscan't clear or recompute them, soisFieldsValidstaysfalsefrom the previous submit and the form-level validator never re-runs — gating the form off permanently (even withcanSubmitWhenInvalid: true).Fix
Run the form-level validator right after
validateAllFields, guarded by whether any field-level validator errored this submit (validateAllFieldsreturns those errors). When none errored, it re-runs and recomputes/clears its own field errors; when field-level validators did error, it's skipped as before (preserving the existing "don't trigger form validators if field validators errored" behavior).Tests
Added a
form-coreunit test reproducing #2248 (form-level-only validator, fill fields, resubmit → errors clear andonSubmitruns). Fullform-core(504) andreact-form(126) suites pass; the existing field-validator-gating test still passes.