@formio/js 5.0.0-rc.42 → 5.0.0-rc.43
Sign up to get free protection for your applications and to get access to all the features.
- 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",
|