Skip to content

Commit

Permalink
FIO-9350 Wizard: Show form-level errors after failed submission on su…
Browse files Browse the repository at this point in the history
…bsequent form interaction when current page has no errors (#5922)

* FIO-9350 Wizard: Show all form errors consistently after failed submission

- Show all form errors on page without required fields after failed submission
- Show all form errors on page with required fields after failed submission and after interacting with the page

* FIO-9350 Wizard: Persist form errors if submission failed

- While showErrors worked as expected (defined in Webform), this.errors (get errors()) in Wizard was not persisting all the form errors after a failed submission

* FIO-9350 Wizard: Clean up dup helper fns in tests

- Consolidate most link navigation to one global helper fn

* FIO-9350 Wizard: Add test for maintaining form errors after failed submit

- Show form-level errors after failed submission even when the current page has no errors

* FIO-9350 Wizard: Simplify async flow for flaky test
  • Loading branch information
blakekrammes authored Dec 3, 2024
1 parent 0698685 commit 3ff37eb
Show file tree
Hide file tree
Showing 3 changed files with 296 additions and 214 deletions.
23 changes: 12 additions & 11 deletions src/Wizard.js
Original file line number Diff line number Diff line change
Expand Up @@ -690,7 +690,10 @@ export default class Wizard extends Webform {
}
this.redraw().then(() => {
this.checkData(this.submission.data);
this.validateCurrentPage();
const errors = this.submitted ? this.validate(this.localData, { dirty: true }) : this.validateCurrentPage();
if (this.alert) {
this.showErrors(errors, true, true);
}
});
return Promise.resolve();
}
Expand Down Expand Up @@ -801,9 +804,11 @@ export default class Wizard extends Webform {
});
}

// Validate the form, before go to the next page
const errors = this.validateCurrentPage({ dirty: true });
if (errors.length === 0) {
// Validate the form before going to the next page
const currentPageErrors = this.validateCurrentPage({ dirty: true });
const errors = this.submitted ? this.validate(this.localData, { dirty: true }) : currentPageErrors;
// allow going to the next page if the current page is valid, even if there are form level errors
if (currentPageErrors.length === 0) {
this.checkData(this.submission.data);
return this.beforePage(true).then(() => {
return this.setPage(this.getNextPage()).then(() => {
Expand All @@ -819,7 +824,7 @@ export default class Wizard extends Webform {
else {
this.currentPage.components.forEach((comp) => comp.setPristine(false));
this.scrollIntoView(this.element, true);
return Promise.reject(super.showErrors(errors, true));
return Promise.reject(this.showErrors(errors, true));
}
}

Expand Down Expand Up @@ -1067,12 +1072,8 @@ export default class Wizard extends Webform {
);
}

get errors() {
if (!this.isLastPage()) {
return this.currentPage.errors;
}

return super.errors;
get errors() {
return !this.isLastPage() && !this.submitted ? this.currentPage.errors : super.errors;
}

focusOnComponent(key) {
Expand Down
140 changes: 140 additions & 0 deletions test/forms/simpleWizardWithRequiredFields.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
export default {
"_id": "6740b7686f3a02cd736b5750",
"title": "form123",
"name": "form123",
"path": "form123",
"type": "form",
"display": "wizard",
"tags": [],
"access": [
{
"type": "read_all",
"roles": [
"6740b7686f3a02cd736b56f3",
"6740b7686f3a02cd736b56f7",
"6740b7686f3a02cd736b56fb",
"6740b7686f3a02cd736b56ff",
"6740b7686f3a02cd736b5703",
"6740b7686f3a02cd736b5707",
"6740b7686f3a02cd736b570b",
"6740b7686f3a02cd736b570f",
"6740b7686f3a02cd736b5713",
"6740b7686f3a02cd736b5717",
"6740b7686f3a02cd736b571b",
"6740b7686f3a02cd736b571f",
"6740b7686f3a02cd736b5723",
"6740b7686f3a02cd736b5727",
"6740b7686f3a02cd736b572b",
"6740b7686f3a02cd736b572f",
"6740b7686f3a02cd736b5733",
"6740b7686f3a02cd736b5737",
"6740b7686f3a02cd736b573b",
"6740b7686f3a02cd736b573f",
"6740b7686f3a02cd736b5743",
"6740b7686f3a02cd736b5747",
"6740b7686f3a02cd736b574b"
]
}
],
"submissionAccess": [],
"owner": null,
"components": [
{
"title": "Page 1",
"breadcrumbClickable": true,
"buttonSettings": {
"previous": true,
"cancel": false,
"next": true
},
"navigateOnEnter": false,
"saveOnEnter": false,
"scrollToTop": false,
"collapsible": false,
"key": "page1",
"type": "panel",
"label": "Page 1",
"components": [
{
"label": "Text Field",
"applyMaskOn": "change",
"tableView": true,
"validate": {
"required": true
},
"key": "textField",
"type": "textfield",
"input": true
}
],
"input": false,
"tableView": false
},
{
"title": "Page 2",
"breadcrumbClickable": true,
"buttonSettings": {
"previous": true,
"cancel": true,
"next": true
},
"navigateOnEnter": false,
"saveOnEnter": false,
"scrollToTop": false,
"collapsible": false,
"key": "page2",
"type": "panel",
"label": "Page 2",
"components": [
{
"label": "Number",
"applyMaskOn": "change",
"mask": false,
"tableView": false,
"delimiter": false,
"requireDecimal": false,
"inputFormat": "plain",
"truncateMultipleSpaces": false,
"key": "number",
"type": "number",
"input": true
}
],
"input": false,
"tableView": false
},
{
"title": "Page 3",
"label": "Page 3",
"type": "panel",
"key": "page3",
"components": [
{
"label": "Text Field",
"applyMaskOn": "change",
"tableView": true,
"validate": {
"required": true
},
"validateWhenHidden": false,
"key": "textField1",
"type": "textfield",
"input": true
}
],
"input": false,
"tableView": false
}
],
"pdfComponents": [],
"settings": {},
"properties": {},
"machineName": "authoring-bsajzvvuohccvoq:form123",
"project": "6740b7686f3a02cd736b56e9",
"controller": "",
"revisions": "",
"submissionRevisions": "",
"_vid": 0,
"created": "2024-11-22T16:55:04.926Z",
"modified": "2024-11-22T16:55:04.928Z"
};
Loading

0 comments on commit 3ff37eb

Please sign in to comment.