@formio/js 5.0.0-rc.99 → 5.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/formio.embed.js +1 -1
  2. package/dist/formio.embed.min.js +1 -1
  3. package/dist/formio.embed.min.js.LICENSE.txt +1 -1
  4. package/dist/formio.form.js +122 -121
  5. package/dist/formio.form.min.js +1 -1
  6. package/dist/formio.form.min.js.LICENSE.txt +3 -11
  7. package/dist/formio.full.js +123 -122
  8. package/dist/formio.full.min.js +1 -1
  9. package/dist/formio.full.min.js.LICENSE.txt +3 -11
  10. package/dist/formio.js +3011 -281
  11. package/dist/formio.min.js +1 -1
  12. package/dist/formio.min.js.LICENSE.txt +14 -2
  13. package/dist/formio.utils.js +65 -54
  14. package/dist/formio.utils.min.js +1 -1
  15. package/dist/formio.utils.min.js.LICENSE.txt +7 -5
  16. package/lib/cjs/Webform.d.ts +8 -1
  17. package/lib/cjs/Webform.js +40 -32
  18. package/lib/cjs/WebformBuilder.js +22 -18
  19. package/lib/cjs/Wizard.d.ts +0 -1
  20. package/lib/cjs/Wizard.js +19 -33
  21. package/lib/cjs/components/Components.d.ts +0 -7
  22. package/lib/cjs/components/Components.js +1 -33
  23. package/lib/cjs/components/_classes/component/Component.d.ts +37 -7
  24. package/lib/cjs/components/_classes/component/Component.js +70 -26
  25. package/lib/cjs/components/_classes/component/editForm/Component.edit.validation.js +1 -1
  26. package/lib/cjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
  27. package/lib/cjs/components/_classes/componentModal/ComponentModal.js +1 -0
  28. package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +4 -19
  29. package/lib/cjs/components/_classes/nested/NestedComponent.js +38 -53
  30. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
  31. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +7 -44
  32. package/lib/cjs/components/datagrid/DataGrid.d.ts +0 -1
  33. package/lib/cjs/components/datagrid/DataGrid.js +1 -45
  34. package/lib/cjs/components/datamap/DataMap.js +1 -2
  35. package/lib/cjs/components/editgrid/EditGrid.js +6 -6
  36. package/lib/cjs/components/form/Form.d.ts +8 -3
  37. package/lib/cjs/components/form/Form.js +26 -25
  38. package/lib/cjs/components/html/HTML.js +1 -1
  39. package/lib/cjs/components/selectboxes/SelectBoxes.js +8 -1
  40. package/lib/cjs/components/signature/Signature.d.ts +0 -1
  41. package/lib/cjs/components/signature/Signature.js +1 -1
  42. package/lib/cjs/utils/conditionOperators/DateGreaterThan.js +2 -2
  43. package/lib/cjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
  44. package/lib/cjs/utils/conditionOperators/IsEmptyValue.js +2 -2
  45. package/lib/cjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
  46. package/lib/cjs/utils/conditionOperators/IsEqualTo.js +2 -2
  47. package/lib/cjs/utils/formUtils.d.ts +25 -14
  48. package/lib/cjs/utils/formUtils.js +11 -16
  49. package/lib/cjs/utils/utils.d.ts +1 -3
  50. package/lib/cjs/utils/utils.js +19 -35
  51. package/lib/mjs/Webform.d.ts +8 -1
  52. package/lib/mjs/Webform.js +37 -31
  53. package/lib/mjs/WebformBuilder.js +22 -18
  54. package/lib/mjs/Wizard.d.ts +0 -1
  55. package/lib/mjs/Wizard.js +16 -29
  56. package/lib/mjs/components/Components.d.ts +0 -7
  57. package/lib/mjs/components/Components.js +1 -32
  58. package/lib/mjs/components/_classes/component/Component.d.ts +37 -7
  59. package/lib/mjs/components/_classes/component/Component.js +80 -27
  60. package/lib/mjs/components/_classes/component/editForm/Component.edit.validation.js +1 -1
  61. package/lib/mjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
  62. package/lib/mjs/components/_classes/componentModal/ComponentModal.js +1 -0
  63. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +4 -19
  64. package/lib/mjs/components/_classes/nested/NestedComponent.js +39 -54
  65. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
  66. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +8 -43
  67. package/lib/mjs/components/datagrid/DataGrid.d.ts +0 -1
  68. package/lib/mjs/components/datagrid/DataGrid.js +1 -45
  69. package/lib/mjs/components/datamap/DataMap.js +1 -2
  70. package/lib/mjs/components/editgrid/EditGrid.js +9 -6
  71. package/lib/mjs/components/form/Form.d.ts +8 -3
  72. package/lib/mjs/components/form/Form.js +27 -25
  73. package/lib/mjs/components/html/HTML.js +1 -1
  74. package/lib/mjs/components/selectboxes/SelectBoxes.js +8 -1
  75. package/lib/mjs/components/signature/Signature.d.ts +0 -1
  76. package/lib/mjs/components/signature/Signature.js +1 -1
  77. package/lib/mjs/utils/conditionOperators/DateGreaterThan.js +2 -2
  78. package/lib/mjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
  79. package/lib/mjs/utils/conditionOperators/IsEmptyValue.js +2 -2
  80. package/lib/mjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
  81. package/lib/mjs/utils/conditionOperators/IsEqualTo.js +2 -2
  82. package/lib/mjs/utils/formUtils.d.ts +25 -14
  83. package/lib/mjs/utils/formUtils.js +2 -12
  84. package/lib/mjs/utils/utils.d.ts +1 -3
  85. package/lib/mjs/utils/utils.js +18 -33
  86. package/package.json +4 -4
@@ -1,9 +1,9 @@
1
1
  /*!
2
2
  * dist/inputmask
3
3
  * https://github.com/RobinHerbots/Inputmask
4
- * Copyright (c) 2010 - 2023 Robin Herbots
4
+ * Copyright (c) 2010 - 2024 Robin Herbots
5
5
  * Licensed under the MIT license
6
- * Version: 5.0.8
6
+ * Version: 5.0.9
7
7
  */
8
8
 
9
9
  /*!
@@ -18,9 +18,11 @@
18
18
  * MIT licensed
19
19
  */
20
20
 
21
- /*! @license DOMPurify 3.1.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.6/LICENSE */
21
+ /*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */
22
22
 
23
- /*! formiojs v5.0.0-rc.99 | https://unpkg.com/formiojs@5.0.0-rc.99/LICENSE.txt */
23
+ /*! formiojs v5.1.0-rc.1 | https://unpkg.com/formiojs@5.1.0-rc.1/LICENSE.txt */
24
+
25
+ /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
24
26
 
25
27
  /**
26
28
  * @license
@@ -41,4 +43,4 @@
41
43
 
42
44
  //! moment.js
43
45
 
44
- //! version : 0.5.45
46
+ //! version : 0.5.46
@@ -330,6 +330,13 @@ declare class Webform extends NestedDataComponent {
330
330
  * @returns {object} - The submission object.
331
331
  */
332
332
  get submission(): object;
333
+ /**
334
+ * Sets the submission value
335
+ * @param {object|null|undefined} submission - The submission to set.
336
+ * @param {object|null|undefined} flags - Any flags to apply when setting the submission.
337
+ * @return {void}
338
+ */
339
+ onSetSubmission(submission: object | null | undefined, flags?: object | null | undefined): void;
333
340
  /**
334
341
  * Sets a submission and returns the promise when it is ready.
335
342
  * @param {any} submission - The submission to set.
@@ -419,7 +426,7 @@ declare class Webform extends NestedDataComponent {
419
426
  */
420
427
  cancel(noconfirm: boolean): boolean;
421
428
  setMetadata(submission: any): void;
422
- submitForm(options?: {}): Promise<any>;
429
+ submitForm(options?: {}, local?: boolean): Promise<any>;
423
430
  setServerErrors(error: any): void;
424
431
  serverErrors: any;
425
432
  executeSubmit(options: any): Promise<object>;
@@ -587,11 +587,12 @@ class Webform extends NestedDataComponent_1.default {
587
587
  * @returns {Promise} - The promise that is triggered when the form is set.
588
588
  */
589
589
  setForm(form, flags = {}) {
590
- var _a, _b, _c;
590
+ var _a;
591
591
  const isFormAlreadySet = this._form && ((_a = this._form.components) === null || _a === void 0 ? void 0 : _a.length);
592
592
  try {
593
593
  // Do not set the form again if it has been already set
594
594
  if (isFormAlreadySet && JSON.stringify(this._form) === JSON.stringify(form)) {
595
+ this.formReadyResolve();
595
596
  return Promise.resolve();
596
597
  }
597
598
  // Create the form.
@@ -599,13 +600,11 @@ class Webform extends NestedDataComponent_1.default {
599
600
  if (this.onSetForm) {
600
601
  this.onSetForm(lodash_1.default.cloneDeep(this._form), form);
601
602
  }
602
- if ((_c = (_b = this.parent) === null || _b === void 0 ? void 0 : _b.component) === null || _c === void 0 ? void 0 : _c.modalEdit) {
603
- return Promise.resolve();
604
- }
605
603
  }
606
604
  catch (err) {
607
605
  console.warn(err);
608
606
  // If provided form is not a valid JSON object, do not set it too
607
+ this.formReadyReject(err);
609
608
  return Promise.resolve();
610
609
  }
611
610
  // Allow the form to provide component overrides.
@@ -704,6 +703,18 @@ class Webform extends NestedDataComponent_1.default {
704
703
  set submission(submission) {
705
704
  this.setSubmission(submission);
706
705
  }
706
+ /**
707
+ * Sets the submission value
708
+ * @param {object|null|undefined} submission - The submission to set.
709
+ * @param {object|null|undefined} flags - Any flags to apply when setting the submission.
710
+ * @return {void}
711
+ */
712
+ onSetSubmission(submission, flags = {}) {
713
+ this.submissionSet = true;
714
+ this.triggerChange(flags);
715
+ this.emit('beforeSetSubmission', submission);
716
+ this.setValue(submission, flags);
717
+ }
707
718
  /**
708
719
  * Sets a submission and returns the promise when it is ready.
709
720
  * @param {any} submission - The submission to set.
@@ -717,10 +728,7 @@ class Webform extends NestedDataComponent_1.default {
717
728
  if (resolveFlags) {
718
729
  flags = Object.assign(Object.assign({}, flags), resolveFlags);
719
730
  }
720
- this.submissionSet = true;
721
- this.triggerChange(flags);
722
- this.emit("beforeSetSubmission", submission);
723
- this.setValue(submission, flags);
731
+ this.onSetSubmission(submission, flags);
724
732
  return this.submissionReadyResolve(submission);
725
733
  }, (err) => this.submissionReadyReject(err))
726
734
  .catch((err) => this.submissionReadyReject(err)));
@@ -839,6 +847,9 @@ class Webform extends NestedDataComponent_1.default {
839
847
  return changed;
840
848
  }
841
849
  getValue() {
850
+ if (!this._submission) {
851
+ this._submission = {};
852
+ }
842
853
  if (!this._submission.data) {
843
854
  this._submission.data = {};
844
855
  }
@@ -1098,29 +1109,24 @@ class Webform extends NestedDataComponent_1.default {
1098
1109
  return;
1099
1110
  }
1100
1111
  // Mark any components as invalid if in a custom message.
1112
+ const componentErrors = {};
1101
1113
  errors.forEach((err) => {
1102
- const { components = [] } = err;
1103
- if (err.component) {
1104
- components.push(err.component);
1105
- }
1106
- if (err.path) {
1107
- components.push(err.path);
1114
+ var _a, _b;
1115
+ const path = err.path || ((_a = err.context) === null || _a === void 0 ? void 0 : _a.path) || ((_b = err.component) === null || _b === void 0 ? void 0 : _b.key);
1116
+ if (!componentErrors[path]) {
1117
+ componentErrors[path] = [];
1108
1118
  }
1109
- components.forEach((path) => {
1110
- const originalPath = (0, utils_1.getStringFromComponentPath)(path);
1111
- const component = this.getComponent(path, lodash_1.default.identity, originalPath);
1112
- if (err.fromServer) {
1113
- if (component.serverErrors) {
1114
- component.serverErrors.push(err);
1115
- }
1116
- else {
1117
- component.serverErrors = [err];
1118
- }
1119
- }
1120
- const components = lodash_1.default.compact(Array.isArray(component) ? component : [component]);
1121
- components.forEach((component) => component.setCustomValidity(err.message, true));
1122
- });
1119
+ componentErrors[path].push(err);
1123
1120
  });
1121
+ // Iterate through all of our component errors and apply them to the components.
1122
+ for (let path in componentErrors) {
1123
+ const component = this.getComponent(path);
1124
+ const errors = componentErrors[path];
1125
+ if (component) {
1126
+ component.serverErrors = errors.filter((err) => err.fromServer);
1127
+ component.setCustomValidity(errors, true);
1128
+ }
1129
+ }
1124
1130
  const displayedErrors = [];
1125
1131
  if (errors.length) {
1126
1132
  errors = lodash_1.default.uniqBy(errors, (error) => { var _a, _b; return [error.message, (_a = error.component) === null || _a === void 0 ? void 0 : _a.id, (_b = error.context) === null || _b === void 0 ? void 0 : _b.path].join(); });
@@ -1312,7 +1318,7 @@ class Webform extends NestedDataComponent_1.default {
1312
1318
  onLine: navigator.onLine,
1313
1319
  });
1314
1320
  }
1315
- submitForm(options = {}) {
1321
+ submitForm(options = {}, local = false) {
1316
1322
  this.clearServerErrors();
1317
1323
  return new Promise((resolve, reject) => {
1318
1324
  // Read-only forms should never submit.
@@ -1338,6 +1344,7 @@ class Webform extends NestedDataComponent_1.default {
1338
1344
  return reject("Invalid Submission");
1339
1345
  }
1340
1346
  const errors = this.validate(submission.data, {
1347
+ local,
1341
1348
  dirty: true,
1342
1349
  silentCheck: false,
1343
1350
  process: "submit",
@@ -1352,12 +1359,13 @@ class Webform extends NestedDataComponent_1.default {
1352
1359
  console.error(err);
1353
1360
  }
1354
1361
  this.everyComponent((comp) => {
1362
+ var _a, _b;
1355
1363
  if (submission._vnote && comp.type === "form" && comp.component.reference) {
1356
- lodash_1.default.get(submission.data, comp.path, {})._vnote = submission._vnote;
1364
+ lodash_1.default.get(submission.data, local ? (_a = comp.paths) === null || _a === void 0 ? void 0 : _a.localDataPath : comp.path, {})._vnote = submission._vnote;
1357
1365
  }
1358
1366
  const { persistent } = comp.component;
1359
1367
  if (persistent === "client-only") {
1360
- lodash_1.default.unset(submission.data, comp.path);
1368
+ lodash_1.default.unset(submission.data, local ? (_b = comp.paths) === null || _b === void 0 ? void 0 : _b.localDataPath : comp.path);
1361
1369
  }
1362
1370
  });
1363
1371
  this.hook("customValidation", Object.assign(Object.assign({}, submission), { component: options.component }), (err) => {
@@ -1524,7 +1532,7 @@ class Webform extends NestedDataComponent_1.default {
1524
1532
  return;
1525
1533
  }
1526
1534
  const captchaComponent = [];
1527
- (0, formUtils_1.eachComponent)(this.components, (component) => {
1535
+ this.eachComponent((component) => {
1528
1536
  if (/^(re)?captcha$/.test(component.type) && component.component.eventType === 'formLoad') {
1529
1537
  captchaComponent.push(component);
1530
1538
  }
@@ -913,13 +913,16 @@ class WebformBuilder extends Component_1.default {
913
913
  keyboardActionsEnabled = keyboardActionsEnabled === 'true';
914
914
  }
915
915
  this.keyboardActionsEnabled = keyboardActionsEnabled;
916
- const isSubmitButton = (comp) => {
917
- return (comp.type === 'button') && ((comp.action === 'submit') || !comp.action);
918
- };
919
- const isShowSubmitButton = !this.options.noDefaultSubmitButton
920
- && (!form.components.length || !form.components.find(comp => isSubmitButton(comp)));
916
+ const { display, noAddSubmitButton, noDefaultSubmitButton } = this.options;
917
+ const { _id, components } = form;
918
+ const isSubmitButton = ({ type, action }) => type === 'button' && (action === 'submit' || !action);
919
+ const hasSubmitButton = components.some(isSubmitButton);
920
+ // Add submit button if form display was switched from wizard
921
+ // Don't add if there is noAddSubmitButton flag passed, or the form has id, or the form has a submit button already
922
+ const shouldAddSubmitButton = (display === 'wizard' && !hasSubmitButton) ||
923
+ (!noAddSubmitButton && !_id && !hasSubmitButton);
921
924
  // Ensure there is at least a submit button.
922
- if (isShowSubmitButton) {
925
+ if (!noDefaultSubmitButton && shouldAddSubmitButton) {
923
926
  form.components.push({
924
927
  type: 'button',
925
928
  label: 'Submit',
@@ -1068,6 +1071,7 @@ class WebformBuilder extends Component_1.default {
1068
1071
  'conditional',
1069
1072
  'customConditional',
1070
1073
  'id',
1074
+ 'logic',
1071
1075
  'fields.day.required',
1072
1076
  'fields.month.required',
1073
1077
  'fields.year.required',
@@ -1093,6 +1097,12 @@ class WebformBuilder extends Component_1.default {
1093
1097
  parentComponent.tabs[tabIndex].splice(index, 1, newComp);
1094
1098
  newComp.checkValidity = () => true;
1095
1099
  newComp.build(defaultValueComponent.element);
1100
+ if (this.preview && !this.preview.defaultChanged) {
1101
+ const defaultValue = lodash_1.default.get(this.preview._data, this.editForm._data.key);
1102
+ if (lodash_1.default.isObject(defaultValue) && !lodash_1.default.isArray(defaultValue)) {
1103
+ this.editForm._data.defaultValue = defaultValue;
1104
+ }
1105
+ }
1096
1106
  }
1097
1107
  }
1098
1108
  else {
@@ -1103,6 +1113,7 @@ class WebformBuilder extends Component_1.default {
1103
1113
  path.unshift(component.key);
1104
1114
  dataPath = (0, utils_1.getStringFromComponentPath)(path);
1105
1115
  }
1116
+ this.preview.defaultChanged = true;
1106
1117
  lodash_1.default.set(this.preview._data, dataPath, changed.value);
1107
1118
  lodash_1.default.set(this.webform._data, dataPath, changed.value);
1108
1119
  }
@@ -1113,20 +1124,12 @@ class WebformBuilder extends Component_1.default {
1113
1124
  findRepeatablePaths() {
1114
1125
  const repeatablePaths = [];
1115
1126
  const keys = new Map();
1116
- (0, formUtils_1.eachComponent)(this.form.components, (comp, path) => {
1117
- if (!comp.key) {
1118
- return;
1119
- }
1120
- if (keys.has(comp.key)) {
1121
- if (keys.get(comp.key).includes(path)) {
1122
- repeatablePaths.push(path);
1123
- }
1124
- else {
1125
- keys.set(comp.key, [...keys.get(comp.key), path]);
1126
- }
1127
+ (0, formUtils_1.eachComponent)(this.form.components, (comp, path, components, parent, paths) => {
1128
+ if (keys.has(paths.dataPath)) {
1129
+ repeatablePaths.push(paths.dataPath);
1127
1130
  }
1128
1131
  else {
1129
- keys.set(comp.key, [path]);
1132
+ keys.set(paths.dataPath, true);
1130
1133
  }
1131
1134
  }, true);
1132
1135
  return repeatablePaths;
@@ -1187,6 +1190,7 @@ class WebformBuilder extends Component_1.default {
1187
1190
  }
1188
1191
  const rebuild = parentComponent.rebuild() || Promise.resolve();
1189
1192
  return rebuild.then(() => {
1193
+ parentComponent.resetValue();
1190
1194
  const schema = parentContainer ? parentContainer[index] : (comp ? comp.schema : []);
1191
1195
  this.emitSaveComponentEvent(schema, originalComp, parentComponent.schema, path, index, isNew, originalComponentSchema);
1192
1196
  this.emit('change', this.form);
@@ -105,7 +105,6 @@ declare class Wizard extends Webform {
105
105
  pageId(page: any): any;
106
106
  onChange(flags: any, changed: any, modified: any, changes: any): void;
107
107
  checkValidity(data: any, dirty: any, row: any, currentPageOnly: any, childErrors?: any[]): any;
108
- showErrors(errors: any, triggerEvent: any): void | any[];
109
108
  focusOnComponent(key: any): void | Promise<void>;
110
109
  }
111
110
  declare namespace Wizard {
package/lib/cjs/Wizard.js CHANGED
@@ -375,11 +375,11 @@ class Wizard extends Webform_1.default {
375
375
  this.emit('wizardPageSelected', this.pages[index], index);
376
376
  }
377
377
  attachHeader() {
378
- var _a;
378
+ var _a, _b;
379
379
  const isAllowPrevious = this.isAllowPrevious();
380
- this.attachTooltips(this.refs[`${this.wizardKey}-tooltip`], this.currentPanel.tooltip);
380
+ this.attachTooltips(this.refs[`${this.wizardKey}-tooltip`], (_a = this.currentPanel) === null || _a === void 0 ? void 0 : _a.tooltip);
381
381
  if (this.isBreadcrumbClickable() || isAllowPrevious) {
382
- (_a = this.refs[`${this.wizardKey}-link`]) === null || _a === void 0 ? void 0 : _a.forEach((link, index) => {
382
+ (_b = this.refs[`${this.wizardKey}-link`]) === null || _b === void 0 ? void 0 : _b.forEach((link, index) => {
383
383
  if (!isAllowPrevious || index <= this.enabledIndex) {
384
384
  this.addEventListener(link, 'click', (event) => {
385
385
  this.emit('wizardNavigationClicked', this.pages[index]);
@@ -602,7 +602,10 @@ class Wizard extends Webform_1.default {
602
602
  }
603
603
  this.redraw().then(() => {
604
604
  this.checkData(this.submission.data);
605
- this.validateCurrentPage();
605
+ const errors = this.submitted ? this.validate(this.localData, { dirty: true }) : this.validateCurrentPage();
606
+ if (this.alert) {
607
+ this.showErrors(errors, true, true);
608
+ }
606
609
  });
607
610
  return Promise.resolve();
608
611
  }
@@ -699,9 +702,11 @@ class Wizard extends Webform_1.default {
699
702
  });
700
703
  });
701
704
  }
702
- // Validate the form, before go to the next page
703
- const errors = this.validateCurrentPage({ dirty: true });
704
- if (errors.length === 0) {
705
+ // Validate the form before going to the next page
706
+ const currentPageErrors = this.validateCurrentPage({ dirty: true });
707
+ const errors = this.submitted ? this.validate(this.localData, { dirty: true }) : currentPageErrors;
708
+ // allow going to the next page if the current page is valid, even if there are form level errors
709
+ if (currentPageErrors.length === 0) {
705
710
  this.checkData(this.submission.data);
706
711
  return this.beforePage(true).then(() => {
707
712
  return this.setPage(this.getNextPage()).then(() => {
@@ -716,13 +721,14 @@ class Wizard extends Webform_1.default {
716
721
  else {
717
722
  this.currentPage.components.forEach((comp) => comp.setPristine(false));
718
723
  this.scrollIntoView(this.element, true);
719
- return Promise.reject(super.showErrors(errors, true));
724
+ return Promise.reject(this.showErrors(errors, true));
720
725
  }
721
726
  }
722
727
  validateCurrentPage(flags = {}) {
723
- var _a;
728
+ var _a, _b;
729
+ const components = (_a = this.currentPage) === null || _a === void 0 ? void 0 : _a.components.map((component) => component.component);
724
730
  // Accessing the parent ensures the right instance (whether it's the parent Wizard or a nested Wizard) performs its validation
725
- return (_a = this.currentPage) === null || _a === void 0 ? void 0 : _a.parent.validateComponents(this.currentPage.component.components, this.currentPage.parent.data, flags);
731
+ return (_b = this.currentPage) === null || _b === void 0 ? void 0 : _b.parent.validateComponents(components, this.root.data, flags);
726
732
  }
727
733
  emitPrevPage() {
728
734
  this.emit('prevPage', { page: this.page, submission: this.submission });
@@ -864,7 +870,8 @@ class Wizard extends Webform_1.default {
864
870
  onChange(flags, changed, modified, changes) {
865
871
  var _a, _b;
866
872
  super.onChange(flags, changed, modified, changes);
867
- const errors = this.validate(this.localData, { dirty: false });
873
+ // The onChange loop doesn't need all components for wizards
874
+ const errors = this.submitted ? this.validate(this.localData, { dirty: true }) : this.validateCurrentPage();
868
875
  if (this.alert) {
869
876
  this.showErrors(errors, true, true);
870
877
  }
@@ -896,13 +903,6 @@ class Wizard extends Webform_1.default {
896
903
  this.redraw();
897
904
  }
898
905
  }
899
- redraw() {
900
- var _a, _b;
901
- if ((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.component) === null || _b === void 0 ? void 0 : _b.modalEdit) {
902
- return this.parent.redraw();
903
- }
904
- return super.redraw();
905
- }
906
906
  rebuild() {
907
907
  const currentPage = this.page;
908
908
  const setCurrentPage = () => this.setPage(currentPage);
@@ -919,21 +919,7 @@ class Wizard extends Webform_1.default {
919
919
  return components.reduce((check, comp) => comp.checkValidity(data, dirty, row, currentPageOnly, childErrors) && check, true);
920
920
  }
921
921
  get errors() {
922
- if (!this.isLastPage()) {
923
- return this.currentPage.errors;
924
- }
925
- return super.errors;
926
- }
927
- showErrors(errors, triggerEvent) {
928
- if (this.hasExtraPages) {
929
- this.subWizards.forEach((subWizard) => {
930
- if (Array.isArray(subWizard.errors)) {
931
- errors = [...errors, ...subWizard.errors];
932
- }
933
- });
934
- }
935
- ;
936
- return super.showErrors(errors, triggerEvent);
922
+ return !this.isLastPage() && !this.submitted ? this.currentPage.errors : super.errors;
937
923
  }
938
924
  focusOnComponent(key) {
939
925
  const component = this.getComponent(key);
@@ -256,13 +256,6 @@ export default class Components {
256
256
  static setComponents(comps: any): void;
257
257
  static addComponent(name: any, comp: any): void;
258
258
  static setComponent(name: any, comp: any): void;
259
- /**
260
- * Return a path of component's value.
261
- * @param {Component} component - The component instance.
262
- * @returns {string} - The component's value path.
263
- */
264
- static getComponentPath(component: Component): string;
265
259
  static create(component: any, options: any, data: any): any;
266
260
  }
267
261
  import BaseEditForm from './_classes/component/Component.form';
268
- import Component from './_classes/component/Component';
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const Component_1 = __importDefault(require("./_classes/component/Component"));
7
7
  const utils_1 = __importDefault(require("./_classes/component/editForm/utils"));
8
8
  const Component_form_1 = __importDefault(require("./_classes/component/Component.form"));
9
- const utils_2 = require("../utils/utils");
10
9
  const lodash_1 = __importDefault(require("lodash"));
11
10
  class Components {
12
11
  static set EditFormUtils(value) {
@@ -49,35 +48,6 @@ class Components {
49
48
  static setComponent(name, comp) {
50
49
  Components.components[name] = comp;
51
50
  }
52
- /**
53
- * Return a path of component's value.
54
- * @param {Component} component - The component instance.
55
- * @returns {string} - The component's value path.
56
- */
57
- static getComponentPath(component) {
58
- var _a;
59
- let path = '';
60
- const componentKey = (0, utils_2.getComponentKey)(component.component);
61
- if (componentKey) {
62
- let thisPath = ((_a = component.options) === null || _a === void 0 ? void 0 : _a.parent) || component;
63
- while (thisPath && !thisPath.allowData && thisPath.parent) {
64
- thisPath = thisPath.parent;
65
- }
66
- // TODO: any component that is nested in e.g. a Data Grid or an Edit Grid is going to receive a row prop; the problem
67
- // is that options.row is passed to each further nested component, which results in erroneous paths like
68
- // `editGrid[0].container[0].textField` rather than `editGrid[0].container.textField`. This should be adapted for other
69
- // components with a tree-like data model
70
- const rowIndex = component.row;
71
- const rowIndexPath = rowIndex && !['container'].includes(thisPath.component.type) ? `[${Number.parseInt(rowIndex)}]` : '';
72
- path = `${thisPath.path}${rowIndexPath}.`;
73
- if (rowIndexPath && (0, utils_2.getModelType)(thisPath) === 'nestedDataArray') {
74
- path = `${path}data.`;
75
- }
76
- path += componentKey;
77
- return lodash_1.default.trim(path, '.');
78
- }
79
- return path;
80
- }
81
51
  static create(component, options, data) {
82
52
  let comp = null;
83
53
  if (component.type && Components.components.hasOwnProperty(component.type)) {
@@ -102,9 +72,7 @@ class Components {
102
72
  else {
103
73
  comp = new Component_1.default(component, options, data);
104
74
  }
105
- const path = Components.getComponentPath(comp);
106
- if (path) {
107
- comp.path = path;
75
+ if (comp.path) {
108
76
  comp.componentsMap[comp.path] = comp;
109
77
  }
110
78
  return comp;
@@ -42,14 +42,13 @@ declare class Component extends Element {
42
42
  */
43
43
  private _hasCondition;
44
44
  /**
45
- * References to dom elements
45
+ * The row index for this component.
46
46
  */
47
- refs: {};
47
+ _rowIndex: number | undefined;
48
48
  /**
49
- * The data path to this specific component instance.
50
- * @type {string}
49
+ * References to dom elements
51
50
  */
52
- path: string;
51
+ refs: {};
53
52
  /**
54
53
  * An array of all the children components errors.
55
54
  */
@@ -114,6 +113,11 @@ declare class Component extends Element {
114
113
  * @type {Component}
115
114
  */
116
115
  parent: Component;
116
+ /**
117
+ * The component paths for this component.
118
+ * @type {import('@formio/core').ComponentPaths} - The component paths.
119
+ */
120
+ paths: import('@formio/core').ComponentPaths;
117
121
  _path: string;
118
122
  /**
119
123
  * Determines if this component is visible, or not.
@@ -158,7 +162,7 @@ declare class Component extends Element {
158
162
  * @type {*}
159
163
  */
160
164
  info: any;
161
- get componentsMap(): any;
165
+ get componentsMap(): object;
162
166
  set data(value: any);
163
167
  get data(): any;
164
168
  mergeSchema(component?: {}): any;
@@ -182,6 +186,17 @@ declare class Component extends Element {
182
186
  * @returns {boolean} - TRUE if the component is disabled.
183
187
  */
184
188
  get disabled(): boolean;
189
+ /**
190
+ * Set Row Index to row and update each component.
191
+ * @param {number} value - The row index.
192
+ * @returns {void}
193
+ */
194
+ set rowIndex(value: number);
195
+ /**
196
+ * Get Row Index.
197
+ * @returns {number} - The row index.
198
+ */
199
+ get rowIndex(): number;
185
200
  afterComponentAssign(): void;
186
201
  createAddon(addonConfiguration: any): any;
187
202
  get shouldDisabled(): any;
@@ -190,6 +205,8 @@ declare class Component extends Element {
190
205
  get hasInput(): any;
191
206
  get defaultSchema(): any;
192
207
  get key(): any;
208
+ set path(path: string | undefined);
209
+ get path(): string | undefined;
193
210
  set parentVisible(value: any);
194
211
  get parentVisible(): any;
195
212
  set parentDisabled(value: boolean);
@@ -212,7 +229,7 @@ declare class Component extends Element {
212
229
  _currentForm: any;
213
230
  get fullMode(): boolean;
214
231
  get builderMode(): boolean;
215
- get calculatedPath(): string;
232
+ get calculatedPath(): string | undefined;
216
233
  get labelPosition(): any;
217
234
  get labelWidth(): any;
218
235
  get labelMargin(): any;
@@ -343,6 +360,12 @@ declare class Component extends Element {
343
360
  * @param {string} template - The template to use for the modal dialog.
344
361
  */
345
362
  setOpenModalElement(template?: string): void;
363
+ /**
364
+ * Renders a modal preview template and returns the markup as a string
365
+ * @param {object|null|undefined} ctx - The rendering context
366
+ * @return {string} - The modal preview markup
367
+ */
368
+ renderModalPreview(ctx: object | null | undefined): string;
346
369
  /**
347
370
  * Returns the modal preview template.
348
371
  * @returns {string} - The modal preview template.
@@ -362,6 +385,13 @@ declare class Component extends Element {
362
385
  * @returns {string} - The rendered HTML string of a component.
363
386
  */
364
387
  render(children?: string, topLevel?: boolean): string;
388
+ /**
389
+ * Creates the tooltip instance using tippy.js and returns it
390
+ * @param {HTMLElement} tooltipEl - HTML element to attach the tooltip
391
+ * @param {object|null|undefined} settings - tippy.js options
392
+ * @return {import('tippy.js').Tippy} - tippy.js instance
393
+ */
394
+ createTooltip(tooltipEl: HTMLElement, settings?: object | null | undefined): import('tippy.js').Tippy;
365
395
  /**
366
396
  * Attaches all the tooltips provided the refs object.
367
397
  * @param {object} toolTipsRefs - The refs for the tooltips within your template.