@formio/js 5.0.0-dev.5719.d2d4a61 → 5.0.0-dev.5720.4409b3f

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 (78) hide show
  1. package/Changelog.md +15 -0
  2. package/dist/formio.form.js +11 -11
  3. package/dist/formio.form.min.js +1 -1
  4. package/dist/formio.full.js +12 -12
  5. package/dist/formio.full.min.js +1 -1
  6. package/lib/cjs/Form.d.ts +2 -2
  7. package/lib/cjs/Form.js +9 -3
  8. package/lib/cjs/Webform.js +1 -2
  9. package/lib/cjs/WebformBuilder.js +11 -2
  10. package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +2 -1
  11. package/lib/cjs/components/_classes/nested/NestedComponent.js +5 -1
  12. package/lib/cjs/components/currency/Currency.d.ts +1 -0
  13. package/lib/cjs/components/datagrid/DataGrid.d.ts +0 -1
  14. package/lib/cjs/components/datagrid/DataGrid.js +0 -8
  15. package/lib/cjs/components/datamap/DataMap.js +1 -1
  16. package/lib/cjs/components/editgrid/EditGrid.js +1 -5
  17. package/lib/cjs/components/number/Number.d.ts +7 -1
  18. package/lib/cjs/components/number/Number.js +11 -0
  19. package/lib/cjs/components/number/fixtures/comp10.d.ts +18 -0
  20. package/lib/cjs/components/number/fixtures/comp10.js +21 -0
  21. package/lib/cjs/components/number/fixtures/index.d.ts +2 -1
  22. package/lib/cjs/components/number/fixtures/index.js +3 -1
  23. package/lib/cjs/components/panel/Panel.d.ts +1 -0
  24. package/lib/cjs/components/panel/Panel.js +1 -0
  25. package/lib/cjs/components/radio/Radio.js +17 -6
  26. package/lib/cjs/components/radio/fixtures/comp12.d.ts +29 -0
  27. package/lib/cjs/components/radio/fixtures/comp12.js +36 -0
  28. package/lib/cjs/components/radio/fixtures/index.d.ts +2 -1
  29. package/lib/cjs/components/radio/fixtures/index.js +3 -1
  30. package/lib/cjs/components/select/Select.d.ts +38 -0
  31. package/lib/cjs/components/select/Select.js +12 -2
  32. package/lib/cjs/components/select/fixtures/comp25.d.ts +44 -0
  33. package/lib/cjs/components/select/fixtures/comp25.js +59 -0
  34. package/lib/cjs/components/select/fixtures/index.d.ts +2 -1
  35. package/lib/cjs/components/select/fixtures/index.js +3 -1
  36. package/lib/cjs/components/time/Time.d.ts +2 -2
  37. package/lib/cjs/components/time/Time.js +3 -2
  38. package/lib/cjs/components/time/fixtures/comp4.d.ts +166 -0
  39. package/lib/cjs/components/time/fixtures/comp4.js +171 -0
  40. package/lib/cjs/components/time/fixtures/index.d.ts +2 -1
  41. package/lib/cjs/components/time/fixtures/index.js +3 -1
  42. package/lib/mjs/Form.d.ts +2 -2
  43. package/lib/mjs/Form.js +9 -3
  44. package/lib/mjs/Webform.js +1 -2
  45. package/lib/mjs/WebformBuilder.js +10 -2
  46. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +2 -1
  47. package/lib/mjs/components/_classes/nested/NestedComponent.js +5 -1
  48. package/lib/mjs/components/currency/Currency.d.ts +1 -0
  49. package/lib/mjs/components/datagrid/DataGrid.d.ts +0 -1
  50. package/lib/mjs/components/datagrid/DataGrid.js +0 -8
  51. package/lib/mjs/components/datamap/DataMap.js +1 -1
  52. package/lib/mjs/components/editgrid/EditGrid.js +1 -5
  53. package/lib/mjs/components/number/Number.d.ts +7 -1
  54. package/lib/mjs/components/number/Number.js +11 -0
  55. package/lib/mjs/components/number/fixtures/comp10.d.ts +18 -0
  56. package/lib/mjs/components/number/fixtures/comp10.js +19 -0
  57. package/lib/mjs/components/number/fixtures/index.d.ts +2 -1
  58. package/lib/mjs/components/number/fixtures/index.js +2 -1
  59. package/lib/mjs/components/panel/Panel.d.ts +1 -0
  60. package/lib/mjs/components/panel/Panel.js +1 -0
  61. package/lib/mjs/components/radio/Radio.js +17 -6
  62. package/lib/mjs/components/radio/fixtures/comp12.d.ts +29 -0
  63. package/lib/mjs/components/radio/fixtures/comp12.js +34 -0
  64. package/lib/mjs/components/radio/fixtures/index.d.ts +2 -1
  65. package/lib/mjs/components/radio/fixtures/index.js +2 -1
  66. package/lib/mjs/components/select/Select.d.ts +38 -0
  67. package/lib/mjs/components/select/Select.js +15 -3
  68. package/lib/mjs/components/select/fixtures/comp25.d.ts +44 -0
  69. package/lib/mjs/components/select/fixtures/comp25.js +57 -0
  70. package/lib/mjs/components/select/fixtures/index.d.ts +2 -1
  71. package/lib/mjs/components/select/fixtures/index.js +2 -1
  72. package/lib/mjs/components/time/Time.d.ts +2 -2
  73. package/lib/mjs/components/time/Time.js +3 -2
  74. package/lib/mjs/components/time/fixtures/comp4.d.ts +166 -0
  75. package/lib/mjs/components/time/fixtures/comp4.js +169 -0
  76. package/lib/mjs/components/time/fixtures/index.d.ts +2 -1
  77. package/lib/mjs/components/time/fixtures/index.js +2 -1
  78. package/package.json +1 -1
@@ -21,5 +21,6 @@ import comp21 from './comp21';
21
21
  import comp22 from './comp22';
22
22
  import comp23 from './comp23';
23
23
  import comp24 from './comp24';
24
- export { comp1, comp2, comp4, comp5, comp6, comp7, comp8, comp9, comp10, comp11, comp12, comp13, comp14, comp15, comp16, comp17, comp18, comp19, comp20, comp21, comp22, comp23, comp24 };
24
+ import comp25 from './comp25';
25
+ export { comp1, comp2, comp4, comp5, comp6, comp7, comp8, comp9, comp10, comp11, comp12, comp13, comp14, comp15, comp16, comp17, comp18, comp19, comp20, comp21, comp22, comp23, comp24, comp25 };
25
26
  export { multiSelect, multiSelectOptions } from "./comp3";
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.comp24 = exports.comp23 = exports.comp22 = exports.comp21 = exports.comp20 = exports.comp19 = exports.comp18 = exports.comp17 = exports.comp16 = exports.comp15 = exports.comp14 = exports.comp13 = exports.comp12 = exports.comp11 = exports.comp10 = exports.comp9 = exports.comp8 = exports.comp7 = exports.comp6 = exports.comp5 = exports.comp4 = exports.comp2 = exports.comp1 = exports.multiSelectOptions = exports.multiSelect = void 0;
6
+ exports.comp25 = exports.comp24 = exports.comp23 = exports.comp22 = exports.comp21 = exports.comp20 = exports.comp19 = exports.comp18 = exports.comp17 = exports.comp16 = exports.comp15 = exports.comp14 = exports.comp13 = exports.comp12 = exports.comp11 = exports.comp10 = exports.comp9 = exports.comp8 = exports.comp7 = exports.comp6 = exports.comp5 = exports.comp4 = exports.comp2 = exports.comp1 = exports.multiSelectOptions = exports.multiSelect = void 0;
7
7
  const comp1_1 = __importDefault(require("./comp1"));
8
8
  exports.comp1 = comp1_1.default;
9
9
  const comp2_1 = __importDefault(require("./comp2"));
@@ -53,3 +53,5 @@ const comp23_1 = __importDefault(require("./comp23"));
53
53
  exports.comp23 = comp23_1.default;
54
54
  const comp24_1 = __importDefault(require("./comp24"));
55
55
  exports.comp24 = comp24_1.default;
56
+ const comp25_1 = __importDefault(require("./comp25"));
57
+ exports.comp25 = comp25_1.default;
@@ -1,12 +1,12 @@
1
1
  export default class TimeComponent extends TextFieldComponent {
2
- rawData: string | never[];
2
+ rawData: any;
3
3
  get dataFormat(): any;
4
4
  get skipMaskValidation(): boolean;
5
5
  isNotCompleteInput(value: any): any;
6
6
  removeValue(index: any): void;
7
7
  resetRawData(index: any): void;
8
8
  setRawValue(value: any, index: any): void;
9
- getRawValue(index: any): string | never[];
9
+ getRawValue(index: any): any;
10
10
  getValueAt(index: any): any;
11
11
  setValueAt(index: any, value: any): void;
12
12
  getStringAsValue(view: any): any;
@@ -30,7 +30,8 @@ class TimeComponent extends TextField_1.default {
30
30
  this.component.inputType = isEdgeBrowser && edgeVersion <= 18
31
31
  ? 'text'
32
32
  : (this.component.inputType || 'time');
33
- this.rawData = this.component.multiple ? [] : this.emptyValue;
33
+ // If default value is given then the raw data needs to be set
34
+ this.rawData = this.component.multiple ? [] : this.getValueAsString(this.defaultValue) || this.emptyValue;
34
35
  }
35
36
  static get builderInfo() {
36
37
  return {
@@ -61,7 +62,7 @@ class TimeComponent extends TextField_1.default {
61
62
  return value;
62
63
  }
63
64
  get validationValue() {
64
- if (Array.isArray(this.rawData) && !this.rawData.length || !this.rawData) {
65
+ if ((Array.isArray(this.rawData) && !this.rawData.length) || !this.rawData) {
65
66
  return this.dataValue;
66
67
  }
67
68
  return this.rawData;
@@ -0,0 +1,166 @@
1
+ declare namespace _default {
2
+ let type: string;
3
+ let display: string;
4
+ let components: {
5
+ title: string;
6
+ breadcrumbClickable: boolean;
7
+ buttonSettings: {
8
+ previous: boolean;
9
+ cancel: boolean;
10
+ next: boolean;
11
+ };
12
+ navigateOnEnter: boolean;
13
+ saveOnEnter: boolean;
14
+ scrollToTop: boolean;
15
+ collapsible: boolean;
16
+ key: string;
17
+ type: string;
18
+ label: string;
19
+ components: {
20
+ label: string;
21
+ disabled: boolean;
22
+ alwaysEnabled: boolean;
23
+ tableView: boolean;
24
+ defaultValue: string;
25
+ key: string;
26
+ type: string;
27
+ input: boolean;
28
+ inputMask: string;
29
+ hideOnChildrenHidden: boolean;
30
+ id: string;
31
+ placeholder: string;
32
+ prefix: string;
33
+ customClass: string;
34
+ suffix: string;
35
+ multiple: boolean;
36
+ protected: boolean;
37
+ unique: boolean;
38
+ persistent: boolean;
39
+ hidden: boolean;
40
+ clearOnHide: boolean;
41
+ refreshOn: string;
42
+ redrawOn: string;
43
+ modalEdit: boolean;
44
+ dataGridLabel: boolean;
45
+ labelPosition: string;
46
+ description: string;
47
+ errorLabel: string;
48
+ tooltip: string;
49
+ hideLabel: boolean;
50
+ tabindex: string;
51
+ autofocus: boolean;
52
+ dbIndex: boolean;
53
+ customDefaultValue: string;
54
+ calculateValue: string;
55
+ calculateServer: boolean;
56
+ widget: {
57
+ type: string;
58
+ };
59
+ attributes: {};
60
+ validateOn: string;
61
+ validate: {
62
+ required: boolean;
63
+ custom: string;
64
+ customPrivate: boolean;
65
+ strictDateValidation: boolean;
66
+ multiple: boolean;
67
+ unique: boolean;
68
+ minLength: string;
69
+ maxLength: string;
70
+ pattern: string;
71
+ };
72
+ conditional: {
73
+ show: null;
74
+ when: null;
75
+ eq: string;
76
+ };
77
+ overlay: {
78
+ style: string;
79
+ left: string;
80
+ top: string;
81
+ width: string;
82
+ height: string;
83
+ };
84
+ allowCalculateOverride: boolean;
85
+ encrypted: boolean;
86
+ showCharCount: boolean;
87
+ showWordCount: boolean;
88
+ properties: {};
89
+ allowMultipleMasks: boolean;
90
+ addons: never[];
91
+ mask: boolean;
92
+ inputType: string;
93
+ inputFormat: string;
94
+ displayMask: string;
95
+ spellcheck: boolean;
96
+ truncateMultipleSpaces: boolean;
97
+ format: string;
98
+ dataFormat: string;
99
+ }[];
100
+ input: boolean;
101
+ tableView: boolean;
102
+ id: string;
103
+ placeholder: string;
104
+ prefix: string;
105
+ customClass: string;
106
+ suffix: string;
107
+ multiple: boolean;
108
+ defaultValue: null;
109
+ protected: boolean;
110
+ unique: boolean;
111
+ persistent: boolean;
112
+ hidden: boolean;
113
+ clearOnHide: boolean;
114
+ refreshOn: string;
115
+ redrawOn: string;
116
+ modalEdit: boolean;
117
+ dataGridLabel: boolean;
118
+ labelPosition: string;
119
+ description: string;
120
+ errorLabel: string;
121
+ tooltip: string;
122
+ hideLabel: boolean;
123
+ tabindex: string;
124
+ disabled: boolean;
125
+ autofocus: boolean;
126
+ dbIndex: boolean;
127
+ customDefaultValue: string;
128
+ calculateValue: string;
129
+ calculateServer: boolean;
130
+ widget: null;
131
+ attributes: {};
132
+ validateOn: string;
133
+ validate: {
134
+ required: boolean;
135
+ custom: string;
136
+ customPrivate: boolean;
137
+ strictDateValidation: boolean;
138
+ multiple: boolean;
139
+ unique: boolean;
140
+ };
141
+ conditional: {
142
+ show: null;
143
+ when: null;
144
+ eq: string;
145
+ };
146
+ overlay: {
147
+ style: string;
148
+ left: string;
149
+ top: string;
150
+ width: string;
151
+ height: string;
152
+ };
153
+ allowCalculateOverride: boolean;
154
+ encrypted: boolean;
155
+ showCharCount: boolean;
156
+ showWordCount: boolean;
157
+ properties: {};
158
+ allowMultipleMasks: boolean;
159
+ addons: never[];
160
+ tree: boolean;
161
+ lazyLoad: boolean;
162
+ theme: string;
163
+ breadcrumb: string;
164
+ }[];
165
+ }
166
+ export default _default;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ "type": "form",
5
+ "display": "wizard",
6
+ "components": [
7
+ {
8
+ "title": "Page 1",
9
+ "breadcrumbClickable": true,
10
+ "buttonSettings": {
11
+ "previous": true,
12
+ "cancel": true,
13
+ "next": true
14
+ },
15
+ "navigateOnEnter": false,
16
+ "saveOnEnter": false,
17
+ "scrollToTop": false,
18
+ "collapsible": false,
19
+ "key": "page1",
20
+ "type": "panel",
21
+ "label": "Page 1",
22
+ "components": [
23
+ {
24
+ "label": "Time",
25
+ "disabled": true,
26
+ "alwaysEnabled": false,
27
+ "tableView": true,
28
+ "defaultValue": "03:03 PM",
29
+ "key": "time1",
30
+ "type": "time",
31
+ "input": true,
32
+ "inputMask": "99:99",
33
+ "hideOnChildrenHidden": false,
34
+ "id": "efw9yyq",
35
+ "placeholder": "",
36
+ "prefix": "",
37
+ "customClass": "",
38
+ "suffix": "",
39
+ "multiple": false,
40
+ "protected": false,
41
+ "unique": false,
42
+ "persistent": true,
43
+ "hidden": false,
44
+ "clearOnHide": true,
45
+ "refreshOn": "",
46
+ "redrawOn": "",
47
+ "modalEdit": false,
48
+ "dataGridLabel": false,
49
+ "labelPosition": "top",
50
+ "description": "",
51
+ "errorLabel": "",
52
+ "tooltip": "",
53
+ "hideLabel": false,
54
+ "tabindex": "",
55
+ "autofocus": false,
56
+ "dbIndex": false,
57
+ "customDefaultValue": "",
58
+ "calculateValue": "",
59
+ "calculateServer": false,
60
+ "widget": {
61
+ "type": "input"
62
+ },
63
+ "attributes": {},
64
+ "validateOn": "change",
65
+ "validate": {
66
+ "required": false,
67
+ "custom": "",
68
+ "customPrivate": false,
69
+ "strictDateValidation": false,
70
+ "multiple": false,
71
+ "unique": false,
72
+ "minLength": "",
73
+ "maxLength": "",
74
+ "pattern": ""
75
+ },
76
+ "conditional": {
77
+ "show": null,
78
+ "when": null,
79
+ "eq": ""
80
+ },
81
+ "overlay": {
82
+ "style": "",
83
+ "left": "",
84
+ "top": "",
85
+ "width": "",
86
+ "height": ""
87
+ },
88
+ "allowCalculateOverride": false,
89
+ "encrypted": false,
90
+ "showCharCount": false,
91
+ "showWordCount": false,
92
+ "properties": {},
93
+ "allowMultipleMasks": false,
94
+ "addons": [],
95
+ "mask": false,
96
+ "inputType": "time",
97
+ "inputFormat": "plain",
98
+ "displayMask": "",
99
+ "spellcheck": true,
100
+ "truncateMultipleSpaces": false,
101
+ "format": "HH:mm",
102
+ "dataFormat": "HH:mm:ss"
103
+ }
104
+ ],
105
+ "input": false,
106
+ "tableView": false,
107
+ "id": "e7vej1d",
108
+ "placeholder": "",
109
+ "prefix": "",
110
+ "customClass": "",
111
+ "suffix": "",
112
+ "multiple": false,
113
+ "defaultValue": null,
114
+ "protected": false,
115
+ "unique": false,
116
+ "persistent": false,
117
+ "hidden": false,
118
+ "clearOnHide": false,
119
+ "refreshOn": "",
120
+ "redrawOn": "",
121
+ "modalEdit": false,
122
+ "dataGridLabel": false,
123
+ "labelPosition": "top",
124
+ "description": "",
125
+ "errorLabel": "",
126
+ "tooltip": "",
127
+ "hideLabel": false,
128
+ "tabindex": "",
129
+ "disabled": false,
130
+ "autofocus": false,
131
+ "dbIndex": false,
132
+ "customDefaultValue": "",
133
+ "calculateValue": "",
134
+ "calculateServer": false,
135
+ "widget": null,
136
+ "attributes": {},
137
+ "validateOn": "change",
138
+ "validate": {
139
+ "required": false,
140
+ "custom": "",
141
+ "customPrivate": false,
142
+ "strictDateValidation": false,
143
+ "multiple": false,
144
+ "unique": false
145
+ },
146
+ "conditional": {
147
+ "show": null,
148
+ "when": null,
149
+ "eq": ""
150
+ },
151
+ "overlay": {
152
+ "style": "",
153
+ "left": "",
154
+ "top": "",
155
+ "width": "",
156
+ "height": ""
157
+ },
158
+ "allowCalculateOverride": false,
159
+ "encrypted": false,
160
+ "showCharCount": false,
161
+ "showWordCount": false,
162
+ "properties": {},
163
+ "allowMultipleMasks": false,
164
+ "addons": [],
165
+ "tree": false,
166
+ "lazyLoad": false,
167
+ "theme": "default",
168
+ "breadcrumb": "default"
169
+ }
170
+ ],
171
+ };
@@ -1,6 +1,7 @@
1
1
  import comp1 from './comp1';
2
2
  import comp2 from './comp2';
3
3
  import comp3 from './comp3';
4
+ import comp4 from './comp4';
4
5
  import timeForm from './timeForm';
5
6
  import timeForm2 from './timeForm2';
6
- export { comp1, comp2, comp3, timeForm, timeForm2 };
7
+ export { comp1, comp2, comp3, comp4, timeForm, timeForm2 };
@@ -3,13 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.timeForm2 = exports.timeForm = exports.comp3 = exports.comp2 = exports.comp1 = void 0;
6
+ exports.timeForm2 = exports.timeForm = exports.comp4 = exports.comp3 = exports.comp2 = exports.comp1 = void 0;
7
7
  const comp1_1 = __importDefault(require("./comp1"));
8
8
  exports.comp1 = comp1_1.default;
9
9
  const comp2_1 = __importDefault(require("./comp2"));
10
10
  exports.comp2 = comp2_1.default;
11
11
  const comp3_1 = __importDefault(require("./comp3"));
12
12
  exports.comp3 = comp3_1.default;
13
+ const comp4_1 = __importDefault(require("./comp4"));
14
+ exports.comp4 = comp4_1.default;
13
15
  const timeForm_1 = __importDefault(require("./timeForm"));
14
16
  exports.timeForm = timeForm_1.default;
15
17
  const timeForm2_1 = __importDefault(require("./timeForm2"));
package/lib/mjs/Form.d.ts CHANGED
@@ -398,10 +398,10 @@ export default class Form extends Element {
398
398
  getFormInitOptions(url: string, form: import('@formio/core').Form): object;
399
399
  /**
400
400
  * Sets the form to the JSON schema of a form.
401
- * @param {import('@formio/core').Form} formParam - The form JSON to set this form to.
401
+ * @param {import('@formio/core').Form | string} formParam - The form JSON to set this form to.
402
402
  * @returns {Promise<Webform|Wizard|PDF>} - The webform instance that was created.
403
403
  */
404
- setForm(formParam: import('@formio/core').Form): Promise<Webform | Wizard | PDF>;
404
+ setForm(formParam: import('@formio/core').Form | string): Promise<Webform | Wizard | PDF>;
405
405
  _form: any;
406
406
  getSubmission(formio: any, opts: any): any;
407
407
  /**
package/lib/mjs/Form.js CHANGED
@@ -264,7 +264,7 @@ export default class Form extends Element {
264
264
  }
265
265
  /**
266
266
  * Sets the form to the JSON schema of a form.
267
- * @param {import('@formio/core').Form} formParam - The form JSON to set this form to.
267
+ * @param {import('@formio/core').Form | string} formParam - The form JSON to set this form to.
268
268
  * @returns {Promise<Webform|Wizard|PDF>} - The webform instance that was created.
269
269
  */
270
270
  setForm(formParam) {
@@ -291,8 +291,14 @@ export default class Form extends Element {
291
291
  }
292
292
  this.loading = false;
293
293
  this.instance = this.instance || this.create(form.display);
294
- const options = this.getFormInitOptions(formParam, form);
295
- this.instance.setUrl(formParam, options);
294
+ // If we're in builder mode, instance.setUrl is not a function, so just manually set the URL.
295
+ if (this.instance.setUrl) {
296
+ const options = this.getFormInitOptions(formParam, form);
297
+ this.instance.setUrl(formParam, options);
298
+ }
299
+ else {
300
+ this.instance.url = formParam;
301
+ }
296
302
  this.instance.nosubmit = false;
297
303
  this._form = this.instance.form = form;
298
304
  if (submission) {
@@ -830,7 +830,6 @@ export default class Webform extends NestedDataComponent {
830
830
  if (!submission || !submission.data) {
831
831
  submission = {
832
832
  data: {},
833
- metadata: submission.metadata,
834
833
  };
835
834
  }
836
835
  // Metadata needs to be available before setValue
@@ -1134,7 +1133,7 @@ export default class Webform extends NestedDataComponent {
1134
1133
  });
1135
1134
  const displayedErrors = [];
1136
1135
  if (errors.length) {
1137
- errors = _.uniqBy(errors, (error) => error.message);
1136
+ errors = _.uniqBy(errors, (error) => [error.message, error.component?.id, error.context?.path].join());
1138
1137
  const createListItem = (message, index) => {
1139
1138
  const err = errors[index];
1140
1139
  const messageFromIndex = !_.isUndefined(index) && errors && errors[index];
@@ -892,7 +892,11 @@ export default class WebformBuilder extends Component {
892
892
  if (form && form.properties) {
893
893
  this.options.properties = form.properties;
894
894
  }
895
- this.keyboardActionsEnabled = _.get(this.options, 'keyboardBuilder', false) || this.options.properties?.keyboardBuilder;
895
+ let keyboardActionsEnabled = _.get(this.options, 'keyboardBuilder', false) || this.options.properties?.keyboardBuilder;
896
+ if (typeof keyboardActionsEnabled === 'string') {
897
+ keyboardActionsEnabled = keyboardActionsEnabled === 'true';
898
+ }
899
+ this.keyboardActionsEnabled = keyboardActionsEnabled;
896
900
  const isShowSubmitButton = !this.options.noDefaultSubmitButton
897
901
  && (!form.components.length || !form.components.find(comp => comp.key === 'submit'));
898
902
  // Ensure there is at least a submit button.
@@ -1044,7 +1048,10 @@ export default class WebformBuilder extends Component {
1044
1048
  'calculateValue',
1045
1049
  'conditional',
1046
1050
  'customConditional',
1047
- 'id'
1051
+ 'id',
1052
+ 'fields.day.required',
1053
+ 'fields.month.required',
1054
+ 'fields.year.required',
1048
1055
  ]));
1049
1056
  const parentComponent = defaultValueComponent.parent;
1050
1057
  let tabIndex = -1;
@@ -1231,6 +1238,7 @@ export default class WebformBuilder extends Component {
1231
1238
  helplinks: this.helplinks,
1232
1239
  }));
1233
1240
  this.editForm.attach(this.componentEdit.querySelector(`[${this._referenceAttributeName}="editForm"]`));
1241
+ this.updateComponent(this.editForm.submission.data ?? component);
1234
1242
  this.attachEditComponentControls(component, parent, isNew, original, ComponentClass);
1235
1243
  });
1236
1244
  });
@@ -211,11 +211,12 @@ export default class NestedComponent extends Field {
211
211
  calculateValue(data: any, flags: any, row: any): any;
212
212
  isLastPage(): boolean;
213
213
  isValid(data: any, dirty: any): any;
214
- validationProcessor({ scope, data, row, instance }: {
214
+ validationProcessor({ scope, data, row, instance, component }: {
215
215
  scope: any;
216
216
  data: any;
217
217
  row: any;
218
218
  instance: any;
219
+ component: any;
219
220
  }, flags: any): void;
220
221
  /**
221
222
  * Perform a validation on all child components of this nested component.
@@ -493,6 +493,7 @@ export default class NestedComponent extends Field {
493
493
  header: 'single',
494
494
  collapsed: this.collapsed,
495
495
  [this.nestedKey]: 'single',
496
+ messageContainer: 'single-scope',
496
497
  });
497
498
  let childPromise = Promise.resolve();
498
499
  if (this.refs[this.nestedKey]) {
@@ -677,8 +678,11 @@ export default class NestedComponent extends Field {
677
678
  isValid(data, dirty) {
678
679
  return this.getComponents().reduce((valid, comp) => comp.isValid(data, dirty) && valid, super.isValid(data, dirty));
679
680
  }
680
- validationProcessor({ scope, data, row, instance }, flags) {
681
+ validationProcessor({ scope, data, row, instance, component }, flags) {
681
682
  const { dirty } = flags;
683
+ if (this.root.hasExtraPages && this.page !== this.root.page) {
684
+ instance = this.getComponentById(component.id);
685
+ }
682
686
  if (!instance) {
683
687
  return;
684
688
  }
@@ -2,6 +2,7 @@ export default class CurrencyComponent extends NumberComponent {
2
2
  constructor(component: any, options: any, data: any);
3
3
  currencyPrefix: any;
4
4
  currencySuffix: any;
5
+ parseNumber(value: any): number;
5
6
  parseValue(value: any): string | null;
6
7
  addZerosAndFormatValue(value: any): any;
7
8
  stripPrefixSuffix(value: any): any;
@@ -59,7 +59,6 @@ export default class DataGridComponent extends NestedArrayComponent {
59
59
  getRows(): {}[];
60
60
  getColumns(): any[];
61
61
  hasHeader(): any;
62
- loadRefs(element: any, refs: any): void;
63
62
  dragula: any;
64
63
  getComponentsContainer(): any;
65
64
  /**
@@ -260,13 +260,6 @@ export default class DataGridComponent extends NestedArrayComponent {
260
260
  return hasHeader || ((col.label || col.title) && !col.hideLabel);
261
261
  }, false);
262
262
  }
263
- loadRefs(element, refs) {
264
- super.loadRefs(element, refs);
265
- if (refs['messageContainer'] === 'single') {
266
- const container = _.last(element.querySelectorAll(`[${this._referenceAttributeName}=messageContainer]`));
267
- this.refs['messageContainer'] = container || this.refs['messageContainer'];
268
- }
269
- }
270
263
  attach(element) {
271
264
  this.loadRefs(element, {
272
265
  [`${this.datagridKey}-row`]: 'multiple',
@@ -275,7 +268,6 @@ export default class DataGridComponent extends NestedArrayComponent {
275
268
  [`${this.datagridKey}-removeRow`]: 'multiple',
276
269
  [`${this.datagridKey}-group-header`]: 'multiple',
277
270
  [this.datagridKey]: 'multiple',
278
- 'messageContainer': 'single'
279
271
  });
280
272
  if (this.allowReorder) {
281
273
  this.refs[`${this.datagridKey}-row`].forEach((row, index) => {
@@ -236,7 +236,7 @@ export default class DataMapComponent extends DataGridComponent {
236
236
  delete dataValue[key];
237
237
  const comp = components[this.valueKey];
238
238
  comp.component.key = newKey;
239
- comp.path = Components.calculateComponentPath(comp);
239
+ comp.path = Components.getComponentPath(comp);
240
240
  key = newKey;
241
241
  });
242
242
  const valueComponent = _.clone(this.component.valueComponent);
@@ -484,11 +484,7 @@ export default class EditGridComponent extends NestedArrayComponent {
484
484
  else {
485
485
  this.removeClass(this.refs.component, `formio-component-${this.component.type}-row-open`);
486
486
  }
487
- const superAttach = super.attach(element);
488
- this.loadRefs(element, {
489
- messageContainer: 'single-scope',
490
- });
491
- return superAttach;
487
+ return super.attach(element);
492
488
  }
493
489
  flattenRowDataValue(dataValue) {
494
490
  const flattened = {};
@@ -27,7 +27,13 @@ export default class NumberComponent extends Input {
27
27
  */
28
28
  createNumberMask(): any;
29
29
  isDecimalAllowed(): any;
30
- parseNumber(value: any): number;
30
+ /**
31
+ * parses a numeric string by removing the delimiters and replacing the decimal separator back to '.' so that it can
32
+ * be processed by either parseInt or parseFloat
33
+ * @param {string} value the value to be parsed
34
+ * @returns {number} a parsed number
35
+ */
36
+ parseNumber(value: string): number;
31
37
  setInputMask(input: any): void;
32
38
  getValueAt(index: any): number | null;
33
39
  setValueAt(index: any, value: any, flags?: {}): void;
@@ -89,6 +89,11 @@ export default class NumberComponent extends Input {
89
89
  }
90
90
  get defaultValue() {
91
91
  let defaultValue = super.defaultValue;
92
+ if (typeof defaultValue === 'string') {
93
+ // Default value may be a string or have custom thousands separators or decimal symbols, so we need to call
94
+ // parseNumber on it
95
+ defaultValue = this.parseNumber(defaultValue);
96
+ }
92
97
  if (!defaultValue && this.component.defaultValue === 0) {
93
98
  defaultValue = this.component.defaultValue;
94
99
  }
@@ -100,6 +105,12 @@ export default class NumberComponent extends Input {
100
105
  isDecimalAllowed() {
101
106
  return _.get(this.component, 'allowDecimal', !(this.component.validate && this.component.validate.integer));
102
107
  }
108
+ /**
109
+ * parses a numeric string by removing the delimiters and replacing the decimal separator back to '.' so that it can
110
+ * be processed by either parseInt or parseFloat
111
+ * @param {string} value the value to be parsed
112
+ * @returns {number} a parsed number
113
+ */
103
114
  parseNumber(value) {
104
115
  // Remove delimiters and convert decimal separator to dot.
105
116
  value = value.split(this.delimiter).join('').replace(this.decimalSeparator, '.');