@formio/js 5.0.0-rc.42 → 5.0.0-rc.43
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.
- package/dist/formio.embed.js +1 -1
- package/dist/formio.embed.min.js +1 -1
- package/dist/formio.embed.min.js.LICENSE.txt +1 -1
- package/dist/formio.form.js +3687 -4873
- package/dist/formio.form.min.js +1 -1
- package/dist/formio.form.min.js.LICENSE.txt +2 -4
- package/dist/formio.full.js +4124 -5560
- package/dist/formio.full.min.js +1 -1
- package/dist/formio.full.min.js.LICENSE.txt +2 -4
- package/dist/formio.js +79 -89
- package/dist/formio.min.js +1 -1
- package/dist/formio.min.js.LICENSE.txt +1 -1
- package/dist/formio.utils.js +82 -146
- package/dist/formio.utils.min.js +1 -1
- package/dist/formio.utils.min.js.LICENSE.txt +2 -4
- package/lib/cjs/Webform.js +5 -7
- package/lib/cjs/components/_classes/component/Component.js +7 -3
- package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
- package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.js +1 -1
- package/lib/cjs/components/editgrid/EditGrid.js +1 -0
- package/lib/cjs/components/form/Form.js +9 -6
- package/lib/cjs/widgets/CalendarWidget.js +3 -2
- package/lib/cjs/widgets/InputWidget.js +2 -2
- package/lib/mjs/Webform.js +5 -7
- package/lib/mjs/components/_classes/component/Component.js +7 -3
- package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
- package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.js +1 -1
- package/lib/mjs/components/editgrid/EditGrid.js +1 -0
- package/lib/mjs/components/form/Form.js +7 -4
- package/lib/mjs/widgets/CalendarWidget.js +3 -2
- package/lib/mjs/widgets/InputWidget.js +2 -2
- package/package.json +11 -11
@@ -10,11 +10,9 @@
|
|
10
10
|
* MIT licensed
|
11
11
|
*/
|
12
12
|
|
13
|
-
/*! @license DOMPurify 3.0
|
13
|
+
/*! @license DOMPurify 3.1.0 | (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.0/LICENSE */
|
14
14
|
|
15
|
-
/*!
|
16
|
-
|
17
|
-
/*! formiojs v5.0.0-rc.42 | https://unpkg.com/formiojs@5.0.0-rc.42/LICENSE.txt */
|
15
|
+
/*! formiojs v5.0.0-rc.43 | https://unpkg.com/formiojs@5.0.0-rc.43/LICENSE.txt */
|
18
16
|
|
19
17
|
/**
|
20
18
|
* @license
|
package/lib/cjs/Webform.js
CHANGED
@@ -693,12 +693,13 @@ class Webform extends NestedDataComponent_1.default {
|
|
693
693
|
* @param {userId} - The user id where we need to restore the draft from.
|
694
694
|
*/
|
695
695
|
restoreDraft(userId) {
|
696
|
-
|
696
|
+
const formio = this.formio || this.options.formio;
|
697
|
+
if (!formio) {
|
697
698
|
this.handleDraftError('restoreDraftInstanceError', null, true);
|
698
699
|
return;
|
699
700
|
}
|
700
701
|
this.savingDraft = true;
|
701
|
-
|
702
|
+
formio.loadSubmissions({
|
702
703
|
params: {
|
703
704
|
state: 'draft',
|
704
705
|
owner: userId
|
@@ -997,10 +998,7 @@ class Webform extends NestedDataComponent_1.default {
|
|
997
998
|
* @returns {*}
|
998
999
|
*/
|
999
1000
|
/* eslint-disable no-unused-vars */
|
1000
|
-
showErrors(errors, triggerEvent
|
1001
|
-
if (!errors) {
|
1002
|
-
return;
|
1003
|
-
}
|
1001
|
+
showErrors(errors, triggerEvent) {
|
1004
1002
|
this.loading = false;
|
1005
1003
|
if (!Array.isArray(errors)) {
|
1006
1004
|
errors = [errors];
|
@@ -1153,7 +1151,7 @@ class Webform extends NestedDataComponent_1.default {
|
|
1153
1151
|
if (this.submitted) {
|
1154
1152
|
// show server errors while they are not cleaned/fixed
|
1155
1153
|
const nonComponentServerErrors = lodash_1.default.filter(this.serverErrors || [], err => !err.component && !err.path);
|
1156
|
-
this.showErrors(nonComponentServerErrors.length ? nonComponentServerErrors :
|
1154
|
+
this.showErrors(nonComponentServerErrors.length ? nonComponentServerErrors : errors);
|
1157
1155
|
}
|
1158
1156
|
// See if we need to save the draft of the form.
|
1159
1157
|
if (modified && this.options.saveDraft) {
|
@@ -2698,6 +2698,7 @@ class Component extends Element_1.default {
|
|
2698
2698
|
component: this.component,
|
2699
2699
|
data,
|
2700
2700
|
row,
|
2701
|
+
value: this.validationValue,
|
2701
2702
|
path: this.path || this.component.key,
|
2702
2703
|
instance: this,
|
2703
2704
|
scope: { errors: [] },
|
@@ -2965,6 +2966,11 @@ class Component extends Element_1.default {
|
|
2965
2966
|
}
|
2966
2967
|
shouldSkipValidation(data, row, flags = {}) {
|
2967
2968
|
const { validateWhenHidden = false } = this.component || {};
|
2969
|
+
const forceValidOnHidden = (!this.visible || !this.checkCondition(row, data)) && !validateWhenHidden;
|
2970
|
+
if (forceValidOnHidden) {
|
2971
|
+
// If this component is forced valid when it is hidden, then we also need to reset the errors for this component.
|
2972
|
+
this._errors = [];
|
2973
|
+
}
|
2968
2974
|
const rules = [
|
2969
2975
|
// Do not validate if the flags say not too.
|
2970
2976
|
() => flags.noValidate,
|
@@ -2975,9 +2981,7 @@ class Component extends Element_1.default {
|
|
2975
2981
|
// Check to see if we are editing and if so, check component persistence.
|
2976
2982
|
() => this.isValueHidden(),
|
2977
2983
|
// Force valid if component is hidden.
|
2978
|
-
() =>
|
2979
|
-
// Force valid if component is conditionally hidden.
|
2980
|
-
() => !this.checkCondition(row, data) && !validateWhenHidden
|
2984
|
+
() => forceValidOnHidden
|
2981
2985
|
];
|
2982
2986
|
return rules.some(pred => pred());
|
2983
2987
|
}
|
@@ -189,7 +189,7 @@ class NestedArrayComponent extends NestedDataComponent_1.default {
|
|
189
189
|
return super.getValueAsString(value, options);
|
190
190
|
}
|
191
191
|
getComponents(rowIndex) {
|
192
|
-
if (rowIndex !== undefined) {
|
192
|
+
if (rowIndex !== undefined && rowIndex !== null) {
|
193
193
|
if (!this.iteratableRows[rowIndex]) {
|
194
194
|
return [];
|
195
195
|
}
|
@@ -66,7 +66,7 @@ class NestedDataComponent extends NestedComponent_1.default {
|
|
66
66
|
<tbody>
|
67
67
|
`);
|
68
68
|
const htmlTagRegExp = new RegExp('<(.*?)>');
|
69
|
-
this.
|
69
|
+
this.everyComponent((component) => {
|
70
70
|
if (component.isInputComponent && component.visible && !component.skipInEmail) {
|
71
71
|
const componentValue = component.getView(component.dataValue, options);
|
72
72
|
result += (`
|
@@ -143,6 +143,7 @@ class FormComponent extends Component_1.default {
|
|
143
143
|
return this.subForm.getComponent(path, fn, originalPathStr);
|
144
144
|
}
|
145
145
|
}
|
146
|
+
/* eslint-disable max-statements */
|
146
147
|
getSubOptions(options = {}) {
|
147
148
|
options.events = this.createEmitter();
|
148
149
|
// Make sure to not show the submit button in wizards in the nested forms.
|
@@ -200,12 +201,14 @@ class FormComponent extends Component_1.default {
|
|
200
201
|
}
|
201
202
|
if (this.options.saveDraft) {
|
202
203
|
options.saveDraft = this.options.saveDraft;
|
204
|
+
options.formio = new Formio_1.Formio(this.formSrc);
|
203
205
|
}
|
204
206
|
if (this.options.saveDraftThrottle) {
|
205
207
|
options.saveDraftThrottle = this.options.saveDraftThrottle;
|
206
208
|
}
|
207
209
|
return options;
|
208
210
|
}
|
211
|
+
/* eslint-enable max-statements */
|
209
212
|
render() {
|
210
213
|
if (this.builderMode) {
|
211
214
|
return super.render(this.component.label || 'Nested form');
|
@@ -403,10 +406,6 @@ class FormComponent extends Component_1.default {
|
|
403
406
|
this.subForm.nosubmit = true;
|
404
407
|
this.subForm.root = this.root;
|
405
408
|
this.subForm.localRoot = this.isNestedWizard ? this.localRoot : this.subForm;
|
406
|
-
if (this.parent) {
|
407
|
-
this.subForm.draftEnabled = this.parent.draftEnabled;
|
408
|
-
this.subForm.savingDraft = this.parent.savingDraft;
|
409
|
-
}
|
410
409
|
this.restoreValue();
|
411
410
|
this.valueChanged = this.hasSetValue;
|
412
411
|
this.onChange();
|
@@ -571,11 +570,15 @@ class FormComponent extends Component_1.default {
|
|
571
570
|
* Submit the form before the whole form is triggered.
|
572
571
|
*/
|
573
572
|
beforeSubmit() {
|
574
|
-
var _a;
|
573
|
+
var _a, _b, _c;
|
575
574
|
const submission = this.dataValue;
|
575
|
+
// Cancel triggered saveDraft
|
576
|
+
if (((_a = this.subForm) === null || _a === void 0 ? void 0 : _a.draftEnabled) && ((_b = this.subForm.triggerSaveDraft) === null || _b === void 0 ? void 0 : _b.cancel)) {
|
577
|
+
this.subForm.triggerSaveDraft.cancel();
|
578
|
+
}
|
576
579
|
const isAlreadySubmitted = submission && submission._id && submission.form;
|
577
580
|
// This submission has already been submitted, so just return the reference data.
|
578
|
-
if (isAlreadySubmitted && !((
|
581
|
+
if (isAlreadySubmitted && !((_c = this.subForm) === null || _c === void 0 ? void 0 : _c.wizard)) {
|
579
582
|
this.dataValue = submission;
|
580
583
|
return Promise.resolve(this.dataValue);
|
581
584
|
}
|
@@ -338,7 +338,8 @@ class CalendarWidget extends InputWidget_1.default {
|
|
338
338
|
this.input.setAttribute('aria-invalid', 'false');
|
339
339
|
}
|
340
340
|
}
|
341
|
-
validationValue(
|
341
|
+
get validationValue() {
|
342
|
+
const value = this.dataValue;
|
342
343
|
if (typeof value === 'string') {
|
343
344
|
return new Date(value);
|
344
345
|
}
|
@@ -357,7 +358,7 @@ class CalendarWidget extends InputWidget_1.default {
|
|
357
358
|
initFlatpickr(Flatpickr) {
|
358
359
|
// Create a new flatpickr.
|
359
360
|
this.calendar = new Flatpickr(this._input, Object.assign(Object.assign({}, this.settings), { disableMobile: true }));
|
360
|
-
this.calendar.altInput
|
361
|
+
this.addEventListener(this.calendar.altInput, 'input', (event) => {
|
361
362
|
if (this.settings.allowInput && this.settings.currentValue !== event.target.value) {
|
362
363
|
this.settings.manualInputValue = event.target.value;
|
363
364
|
this.settings.isManuallyOverriddenValue = true;
|
package/lib/mjs/Webform.js
CHANGED
@@ -693,12 +693,13 @@ export default class Webform extends NestedDataComponent {
|
|
693
693
|
* @param {userId} - The user id where we need to restore the draft from.
|
694
694
|
*/
|
695
695
|
restoreDraft(userId) {
|
696
|
-
|
696
|
+
const formio = this.formio || this.options.formio;
|
697
|
+
if (!formio) {
|
697
698
|
this.handleDraftError('restoreDraftInstanceError', null, true);
|
698
699
|
return;
|
699
700
|
}
|
700
701
|
this.savingDraft = true;
|
701
|
-
|
702
|
+
formio.loadSubmissions({
|
702
703
|
params: {
|
703
704
|
state: 'draft',
|
704
705
|
owner: userId
|
@@ -997,10 +998,7 @@ export default class Webform extends NestedDataComponent {
|
|
997
998
|
* @returns {*}
|
998
999
|
*/
|
999
1000
|
/* eslint-disable no-unused-vars */
|
1000
|
-
showErrors(errors, triggerEvent
|
1001
|
-
if (!errors) {
|
1002
|
-
return;
|
1003
|
-
}
|
1001
|
+
showErrors(errors, triggerEvent) {
|
1004
1002
|
this.loading = false;
|
1005
1003
|
if (!Array.isArray(errors)) {
|
1006
1004
|
errors = [errors];
|
@@ -1151,7 +1149,7 @@ export default class Webform extends NestedDataComponent {
|
|
1151
1149
|
if (this.submitted) {
|
1152
1150
|
// show server errors while they are not cleaned/fixed
|
1153
1151
|
const nonComponentServerErrors = _.filter(this.serverErrors || [], err => !err.component && !err.path);
|
1154
|
-
this.showErrors(nonComponentServerErrors.length ? nonComponentServerErrors :
|
1152
|
+
this.showErrors(nonComponentServerErrors.length ? nonComponentServerErrors : errors);
|
1155
1153
|
}
|
1156
1154
|
// See if we need to save the draft of the form.
|
1157
1155
|
if (modified && this.options.saveDraft) {
|
@@ -2665,6 +2665,7 @@ export default class Component extends Element {
|
|
2665
2665
|
component: this.component,
|
2666
2666
|
data,
|
2667
2667
|
row,
|
2668
|
+
value: this.validationValue,
|
2668
2669
|
path: this.path || this.component.key,
|
2669
2670
|
instance: this,
|
2670
2671
|
scope: { errors: [] },
|
@@ -2930,6 +2931,11 @@ export default class Component extends Element {
|
|
2930
2931
|
}
|
2931
2932
|
shouldSkipValidation(data, row, flags = {}) {
|
2932
2933
|
const { validateWhenHidden = false } = this.component || {};
|
2934
|
+
const forceValidOnHidden = (!this.visible || !this.checkCondition(row, data)) && !validateWhenHidden;
|
2935
|
+
if (forceValidOnHidden) {
|
2936
|
+
// If this component is forced valid when it is hidden, then we also need to reset the errors for this component.
|
2937
|
+
this._errors = [];
|
2938
|
+
}
|
2933
2939
|
const rules = [
|
2934
2940
|
// Do not validate if the flags say not too.
|
2935
2941
|
() => flags.noValidate,
|
@@ -2940,9 +2946,7 @@ export default class Component extends Element {
|
|
2940
2946
|
// Check to see if we are editing and if so, check component persistence.
|
2941
2947
|
() => this.isValueHidden(),
|
2942
2948
|
// Force valid if component is hidden.
|
2943
|
-
() =>
|
2944
|
-
// Force valid if component is conditionally hidden.
|
2945
|
-
() => !this.checkCondition(row, data) && !validateWhenHidden
|
2949
|
+
() => forceValidOnHidden
|
2946
2950
|
];
|
2947
2951
|
return rules.some(pred => pred());
|
2948
2952
|
}
|
@@ -184,7 +184,7 @@ export default class NestedArrayComponent extends NestedDataComponent {
|
|
184
184
|
return super.getValueAsString(value, options);
|
185
185
|
}
|
186
186
|
getComponents(rowIndex) {
|
187
|
-
if (rowIndex !== undefined) {
|
187
|
+
if (rowIndex !== undefined && rowIndex !== null) {
|
188
188
|
if (!this.iteratableRows[rowIndex]) {
|
189
189
|
return [];
|
190
190
|
}
|
@@ -65,7 +65,7 @@ export default class NestedDataComponent extends NestedComponent {
|
|
65
65
|
<tbody>
|
66
66
|
`);
|
67
67
|
const htmlTagRegExp = new RegExp('<(.*?)>');
|
68
|
-
this.
|
68
|
+
this.everyComponent((component) => {
|
69
69
|
if (component.isInputComponent && component.visible && !component.skipInEmail) {
|
70
70
|
const componentValue = component.getView(component.dataValue, options);
|
71
71
|
result += (`
|
@@ -137,6 +137,7 @@ export default class FormComponent extends Component {
|
|
137
137
|
return this.subForm.getComponent(path, fn, originalPathStr);
|
138
138
|
}
|
139
139
|
}
|
140
|
+
/* eslint-disable max-statements */
|
140
141
|
getSubOptions(options = {}) {
|
141
142
|
options.events = this.createEmitter();
|
142
143
|
// Make sure to not show the submit button in wizards in the nested forms.
|
@@ -194,12 +195,14 @@ export default class FormComponent extends Component {
|
|
194
195
|
}
|
195
196
|
if (this.options.saveDraft) {
|
196
197
|
options.saveDraft = this.options.saveDraft;
|
198
|
+
options.formio = new Formio(this.formSrc);
|
197
199
|
}
|
198
200
|
if (this.options.saveDraftThrottle) {
|
199
201
|
options.saveDraftThrottle = this.options.saveDraftThrottle;
|
200
202
|
}
|
201
203
|
return options;
|
202
204
|
}
|
205
|
+
/* eslint-enable max-statements */
|
203
206
|
render() {
|
204
207
|
if (this.builderMode) {
|
205
208
|
return super.render(this.component.label || 'Nested form');
|
@@ -399,10 +402,6 @@ export default class FormComponent extends Component {
|
|
399
402
|
this.subForm.nosubmit = true;
|
400
403
|
this.subForm.root = this.root;
|
401
404
|
this.subForm.localRoot = this.isNestedWizard ? this.localRoot : this.subForm;
|
402
|
-
if (this.parent) {
|
403
|
-
this.subForm.draftEnabled = this.parent.draftEnabled;
|
404
|
-
this.subForm.savingDraft = this.parent.savingDraft;
|
405
|
-
}
|
406
405
|
this.restoreValue();
|
407
406
|
this.valueChanged = this.hasSetValue;
|
408
407
|
this.onChange();
|
@@ -566,6 +565,10 @@ export default class FormComponent extends Component {
|
|
566
565
|
*/
|
567
566
|
beforeSubmit() {
|
568
567
|
const submission = this.dataValue;
|
568
|
+
// Cancel triggered saveDraft
|
569
|
+
if (this.subForm?.draftEnabled && this.subForm.triggerSaveDraft?.cancel) {
|
570
|
+
this.subForm.triggerSaveDraft.cancel();
|
571
|
+
}
|
569
572
|
const isAlreadySubmitted = submission && submission._id && submission.form;
|
570
573
|
// This submission has already been submitted, so just return the reference data.
|
571
574
|
if (isAlreadySubmitted && !this.subForm?.wizard) {
|
@@ -330,7 +330,8 @@ export default class CalendarWidget extends InputWidget {
|
|
330
330
|
this.input.setAttribute('aria-invalid', 'false');
|
331
331
|
}
|
332
332
|
}
|
333
|
-
validationValue(
|
333
|
+
get validationValue() {
|
334
|
+
const value = this.dataValue;
|
334
335
|
if (typeof value === 'string') {
|
335
336
|
return new Date(value);
|
336
337
|
}
|
@@ -348,7 +349,7 @@ export default class CalendarWidget extends InputWidget {
|
|
348
349
|
initFlatpickr(Flatpickr) {
|
349
350
|
// Create a new flatpickr.
|
350
351
|
this.calendar = new Flatpickr(this._input, { ...this.settings, disableMobile: true });
|
351
|
-
this.calendar.altInput
|
352
|
+
this.addEventListener(this.calendar.altInput, 'input', (event) => {
|
352
353
|
if (this.settings.allowInput && this.settings.currentValue !== event.target.value) {
|
353
354
|
this.settings.manualInputValue = event.target.value;
|
354
355
|
this.settings.isManuallyOverriddenValue = true;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@formio/js",
|
3
|
-
"version": "5.0.0-rc.
|
3
|
+
"version": "5.0.0-rc.43",
|
4
4
|
"description": "JavaScript powered Forms with JSON Form Builder",
|
5
5
|
"main": "lib/cjs/index.js",
|
6
6
|
"exports": {
|
@@ -86,7 +86,7 @@
|
|
86
86
|
"dependencies": {
|
87
87
|
"@formio/bootstrap": "^3.0.0-rc.22",
|
88
88
|
"@formio/choices.js": "^10.2.1",
|
89
|
-
"@formio/core": "^2.
|
89
|
+
"@formio/core": "^2.1.0-dev.tt.2",
|
90
90
|
"@formio/text-mask-addons": "^3.8.0-formio.2",
|
91
91
|
"@formio/vanilla-text-mask": "^5.1.1-formio.1",
|
92
92
|
"abortcontroller-polyfill": "^1.7.5",
|
@@ -95,10 +95,10 @@
|
|
95
95
|
"browser-cookies": "^1.2.0",
|
96
96
|
"browser-md5-file": "^1.1.1",
|
97
97
|
"compare-versions": "^6.0.0-rc.2",
|
98
|
-
"core-js": "^3.
|
98
|
+
"core-js": "^3.37.0",
|
99
99
|
"dialog-polyfill": "^0.5.6",
|
100
100
|
"dom-autoscroller": "^2.3.4",
|
101
|
-
"dompurify": "^3.0
|
101
|
+
"dompurify": "^3.1.0",
|
102
102
|
"downloadjs": "^1.4.7",
|
103
103
|
"dragula": "^3.7.3",
|
104
104
|
"eventemitter3": "^5.0.1",
|
@@ -122,9 +122,9 @@
|
|
122
122
|
"vanilla-picker": "^2.12.3"
|
123
123
|
},
|
124
124
|
"devDependencies": {
|
125
|
-
"@typescript-eslint/eslint-plugin": "^7.
|
126
|
-
"@typescript-eslint/parser": "^7.
|
127
|
-
"ace-builds": "1.
|
125
|
+
"@typescript-eslint/eslint-plugin": "^7.6.0",
|
126
|
+
"@typescript-eslint/parser": "^7.6.0",
|
127
|
+
"ace-builds": "1.33.0",
|
128
128
|
"async-limiter": "^2.0.0",
|
129
129
|
"bootstrap-icons": "^1.10.5",
|
130
130
|
"bootswatch": "^5.3.3",
|
@@ -154,7 +154,7 @@
|
|
154
154
|
"gulp-sync": "^0.1.4",
|
155
155
|
"gulp-watch": "^5.0.1",
|
156
156
|
"hoek": "^6.1.3",
|
157
|
-
"jsdom": "
|
157
|
+
"jsdom": "22.1.0",
|
158
158
|
"jsdom-global": "^3.0.2",
|
159
159
|
"karma": "^6.4.3",
|
160
160
|
"karma-chrome-launcher": "^3.2.0",
|
@@ -170,15 +170,15 @@
|
|
170
170
|
"pretty": "^2.0.0",
|
171
171
|
"pygments-css": "^1.0.0",
|
172
172
|
"raw-loader": "^4.0.2",
|
173
|
-
"sass": "^1.
|
173
|
+
"sass": "^1.74.1",
|
174
174
|
"shortcut-buttons-flatpickr": "^0.4.0",
|
175
175
|
"sinon": "^17.0.1",
|
176
176
|
"string-replace-loader": "^3.1.0",
|
177
177
|
"ts-loader": "^9.4.4",
|
178
178
|
"ts-node": "^10.9.1",
|
179
|
-
"typescript": "5.3.
|
179
|
+
"typescript": "5.3.2",
|
180
180
|
"webpack": "^5.90.3",
|
181
|
-
"webpack-bundle-analyzer": "^4.
|
181
|
+
"webpack-bundle-analyzer": "^4.10.2",
|
182
182
|
"webpack-cli": "^5.1.1",
|
183
183
|
"webpack-node-externals": "^3.0.0",
|
184
184
|
"webpack-stream": "^7.0.0",
|