@formio/js 5.0.0-dev.5913.cf6760f → 5.0.0-dev.5914.479573c
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/Changelog.md +3 -0
- package/dist/formio.form.js +570 -580
- package/dist/formio.form.min.js +1 -1
- package/dist/formio.form.min.js.LICENSE.txt +1 -3
- package/dist/formio.full.js +572 -582
- package/dist/formio.full.min.js +1 -1
- package/dist/formio.full.min.js.LICENSE.txt +1 -3
- package/dist/formio.js +3006 -287
- package/dist/formio.min.js +1 -1
- package/dist/formio.min.js.LICENSE.txt +12 -0
- package/dist/formio.utils.js +40 -50
- package/dist/formio.utils.min.js +1 -1
- package/dist/formio.utils.min.js.LICENSE.txt +1 -3
- package/lib/cjs/Webform.d.ts +1 -1
- package/lib/cjs/Webform.js +27 -28
- package/lib/cjs/WebformBuilder.js +9 -29
- package/lib/cjs/Wizard.d.ts +2 -1
- package/lib/cjs/Wizard.js +30 -29
- package/lib/cjs/components/Components.d.ts +0 -7
- package/lib/cjs/components/Components.js +1 -33
- package/lib/cjs/components/_classes/component/Component.d.ts +24 -7
- package/lib/cjs/components/_classes/component/Component.js +47 -13
- package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +4 -19
- package/lib/cjs/components/_classes/nested/NestedComponent.js +39 -54
- package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
- package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +9 -46
- package/lib/cjs/components/datagrid/DataGrid.d.ts +0 -1
- package/lib/cjs/components/datagrid/DataGrid.js +1 -45
- package/lib/cjs/components/datamap/DataMap.js +1 -2
- package/lib/cjs/components/editgrid/EditGrid.js +6 -6
- package/lib/cjs/components/form/Form.d.ts +1 -3
- package/lib/cjs/components/form/Form.js +15 -24
- package/lib/cjs/components/hidden/Hidden.d.ts +0 -1
- package/lib/cjs/components/hidden/Hidden.js +1 -1
- package/lib/cjs/components/select/editForm/Select.edit.data.d.ts +1 -1
- package/lib/cjs/components/select/editForm/Select.edit.data.js +1 -0
- package/lib/cjs/components/selectboxes/SelectBoxes.js +0 -1
- package/lib/cjs/utils/conditionOperators/DateGreaterThan.js +2 -2
- package/lib/cjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
- package/lib/cjs/utils/conditionOperators/IsEmptyValue.js +2 -2
- package/lib/cjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
- package/lib/cjs/utils/conditionOperators/IsEqualTo.js +2 -2
- package/lib/cjs/utils/formUtils.d.ts +25 -14
- package/lib/cjs/utils/formUtils.js +11 -16
- package/lib/cjs/utils/utils.d.ts +1 -2
- package/lib/cjs/utils/utils.js +15 -31
- package/lib/mjs/Webform.d.ts +1 -1
- package/lib/mjs/Webform.js +24 -27
- package/lib/mjs/WebformBuilder.js +9 -29
- package/lib/mjs/Wizard.d.ts +2 -1
- package/lib/mjs/Wizard.js +27 -25
- package/lib/mjs/components/Components.d.ts +0 -7
- package/lib/mjs/components/Components.js +1 -32
- package/lib/mjs/components/_classes/component/Component.d.ts +24 -7
- package/lib/mjs/components/_classes/component/Component.js +49 -14
- package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +4 -19
- package/lib/mjs/components/_classes/nested/NestedComponent.js +40 -55
- package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
- package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +8 -43
- package/lib/mjs/components/datagrid/DataGrid.d.ts +0 -1
- package/lib/mjs/components/datagrid/DataGrid.js +1 -45
- package/lib/mjs/components/datamap/DataMap.js +1 -2
- package/lib/mjs/components/editgrid/EditGrid.js +9 -6
- package/lib/mjs/components/form/Form.d.ts +1 -3
- package/lib/mjs/components/form/Form.js +16 -24
- package/lib/mjs/components/hidden/Hidden.d.ts +0 -1
- package/lib/mjs/components/hidden/Hidden.js +1 -1
- package/lib/mjs/components/select/editForm/Select.edit.data.d.ts +1 -1
- package/lib/mjs/components/select/editForm/Select.edit.data.js +1 -0
- package/lib/mjs/components/selectboxes/SelectBoxes.js +0 -1
- package/lib/mjs/utils/conditionOperators/DateGreaterThan.js +2 -2
- package/lib/mjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
- package/lib/mjs/utils/conditionOperators/IsEmptyValue.js +2 -2
- package/lib/mjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
- package/lib/mjs/utils/conditionOperators/IsEqualTo.js +2 -2
- package/lib/mjs/utils/formUtils.d.ts +25 -14
- package/lib/mjs/utils/formUtils.js +2 -12
- package/lib/mjs/utils/utils.d.ts +1 -2
- package/lib/mjs/utils/utils.js +14 -29
- package/package.json +3 -3
|
@@ -133,15 +133,11 @@ class FormComponent extends Component_1.default {
|
|
|
133
133
|
this.subFormRevision = undefined;
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
-
getComponent(path
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
path.shift();
|
|
140
|
-
}
|
|
141
|
-
const originalPathStr = `${this.path}.data.${(0, utils_1.getStringFromComponentPath)(path)}`;
|
|
142
|
-
if (this.subForm) {
|
|
143
|
-
return this.subForm.getComponent(path, fn, originalPathStr);
|
|
136
|
+
getComponent(path) {
|
|
137
|
+
if (!this.subForm) {
|
|
138
|
+
return null;
|
|
144
139
|
}
|
|
140
|
+
return this.subForm.getComponent(path);
|
|
145
141
|
}
|
|
146
142
|
/* eslint-disable max-statements */
|
|
147
143
|
getSubOptions(options = {}) {
|
|
@@ -209,6 +205,7 @@ class FormComponent extends Component_1.default {
|
|
|
209
205
|
if (this.options.skipDraftRestore) {
|
|
210
206
|
options.skipDraftRestore = this.options.skipDraftRestore;
|
|
211
207
|
}
|
|
208
|
+
options.parent = this;
|
|
212
209
|
return options;
|
|
213
210
|
}
|
|
214
211
|
/* eslint-enable max-statements */
|
|
@@ -297,6 +294,7 @@ class FormComponent extends Component_1.default {
|
|
|
297
294
|
const modalShouldBeOpened = this.componentModal ? this.componentModal.isOpened : false;
|
|
298
295
|
const currentValue = modalShouldBeOpened ? this.componentModal.currentValue : this.dataValue;
|
|
299
296
|
this.componentModal = new ComponentModal_1.default(this, element, modalShouldBeOpened, currentValue, this._referenceAttributeName);
|
|
297
|
+
this.subForm.element = this.componentModal.refs.modalContents;
|
|
300
298
|
this.setOpenModalElement();
|
|
301
299
|
}
|
|
302
300
|
this.calculateValue();
|
|
@@ -395,6 +393,9 @@ class FormComponent extends Component_1.default {
|
|
|
395
393
|
return (new Form_1.default(form, this.getSubOptions())).ready.then((instance) => {
|
|
396
394
|
this.subForm = instance;
|
|
397
395
|
this.subForm.currentForm = this;
|
|
396
|
+
const componentsMap = this.componentsMap;
|
|
397
|
+
const formComponentsMap = this.subForm.componentsMap;
|
|
398
|
+
lodash_1.default.assign(componentsMap, formComponentsMap);
|
|
398
399
|
this.subForm.parent = this;
|
|
399
400
|
this.subForm.parentVisible = this.visible;
|
|
400
401
|
this.subForm.on('change', () => {
|
|
@@ -413,6 +414,8 @@ class FormComponent extends Component_1.default {
|
|
|
413
414
|
this.valueChanged = this.hasSetValue;
|
|
414
415
|
this.onChange();
|
|
415
416
|
return this.subForm;
|
|
417
|
+
}).catch((err) => {
|
|
418
|
+
console.log(err);
|
|
416
419
|
});
|
|
417
420
|
}).then((subForm) => {
|
|
418
421
|
this.updateSubWizards(subForm);
|
|
@@ -469,18 +472,6 @@ class FormComponent extends Component_1.default {
|
|
|
469
472
|
}
|
|
470
473
|
return Promise.resolve();
|
|
471
474
|
}
|
|
472
|
-
get subFormData() {
|
|
473
|
-
var _a;
|
|
474
|
-
return ((_a = this.dataValue) === null || _a === void 0 ? void 0 : _a.data) || {};
|
|
475
|
-
}
|
|
476
|
-
checkComponentValidity(data, dirty, row, options, errors = []) {
|
|
477
|
-
options = options || {};
|
|
478
|
-
const silentCheck = options.silentCheck || false;
|
|
479
|
-
if (this.subForm && !this.isNestedWizard) {
|
|
480
|
-
return this.subForm.checkValidity(this.subFormData, dirty, null, silentCheck, errors);
|
|
481
|
-
}
|
|
482
|
-
return super.checkComponentValidity(data, dirty, row, options, errors);
|
|
483
|
-
}
|
|
484
475
|
checkComponentConditions(data, flags, row) {
|
|
485
476
|
const visible = super.checkComponentConditions(data, flags, row);
|
|
486
477
|
// Return if already hidden
|
|
@@ -488,14 +479,14 @@ class FormComponent extends Component_1.default {
|
|
|
488
479
|
return visible;
|
|
489
480
|
}
|
|
490
481
|
if (this.subForm) {
|
|
491
|
-
return this.subForm.checkConditions(
|
|
482
|
+
return this.subForm.checkConditions(data, flags, row);
|
|
492
483
|
}
|
|
493
484
|
// There are few cases when subForm is not loaded when a change is triggered,
|
|
494
485
|
// so we need to perform checkConditions after it is ready, or some conditional fields might be hidden in View mode
|
|
495
486
|
else if (this.subFormReady) {
|
|
496
487
|
this.subFormReady.then(() => {
|
|
497
488
|
if (this.subForm) {
|
|
498
|
-
return this.subForm.checkConditions(
|
|
489
|
+
return this.subForm.checkConditions(data, flags, row);
|
|
499
490
|
}
|
|
500
491
|
});
|
|
501
492
|
}
|
|
@@ -503,7 +494,7 @@ class FormComponent extends Component_1.default {
|
|
|
503
494
|
}
|
|
504
495
|
calculateValue(data, flags, row) {
|
|
505
496
|
if (this.subForm) {
|
|
506
|
-
return this.subForm.calculateValue(
|
|
497
|
+
return this.subForm.calculateValue(data, flags, row);
|
|
507
498
|
}
|
|
508
499
|
return super.calculateValue(data, flags, row);
|
|
509
500
|
}
|
|
@@ -545,7 +536,7 @@ class FormComponent extends Component_1.default {
|
|
|
545
536
|
}
|
|
546
537
|
this.subForm.nosubmit = false;
|
|
547
538
|
this.subForm.submitted = true;
|
|
548
|
-
return this.subForm.submitForm().then(result => {
|
|
539
|
+
return this.subForm.submitForm({}, true).then(result => {
|
|
549
540
|
this.subForm.loading = false;
|
|
550
541
|
this.subForm.showAllErrors = false;
|
|
551
542
|
this.dataValue = result.submission;
|
|
@@ -1099,6 +1099,7 @@ declare const _default: ({
|
|
|
1099
1099
|
alwaysEnabled?: undefined;
|
|
1100
1100
|
} | {
|
|
1101
1101
|
key: string;
|
|
1102
|
+
type: string;
|
|
1102
1103
|
conditional: {
|
|
1103
1104
|
json: {
|
|
1104
1105
|
and: ({
|
|
@@ -1149,7 +1150,6 @@ declare const _default: ({
|
|
|
1149
1150
|
};
|
|
1150
1151
|
};
|
|
1151
1152
|
data?: undefined;
|
|
1152
|
-
type?: undefined;
|
|
1153
1153
|
weight?: undefined;
|
|
1154
1154
|
input?: undefined;
|
|
1155
1155
|
label?: undefined;
|
|
@@ -20,13 +20,13 @@ class DateGeaterThan extends ConditionOperator_1.default {
|
|
|
20
20
|
}
|
|
21
21
|
execute(options, functionName = 'isAfter') {
|
|
22
22
|
var _a;
|
|
23
|
-
const { value, instance,
|
|
23
|
+
const { value, instance, path } = options;
|
|
24
24
|
if (!value) {
|
|
25
25
|
return false;
|
|
26
26
|
}
|
|
27
27
|
let conditionTriggerComponent = null;
|
|
28
28
|
if ((_a = instance === null || instance === void 0 ? void 0 : instance.root) === null || _a === void 0 ? void 0 : _a.getComponent) {
|
|
29
|
-
conditionTriggerComponent = instance.root.getComponent(
|
|
29
|
+
conditionTriggerComponent = instance.root.getComponent(path);
|
|
30
30
|
}
|
|
31
31
|
if (conditionTriggerComponent && conditionTriggerComponent.isPartialDay && conditionTriggerComponent.isPartialDay(value)) {
|
|
32
32
|
return false;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export default class IsEmptyValue extends ConditionOperator {
|
|
2
|
-
execute({ value, instance,
|
|
2
|
+
execute({ value, instance, path }: {
|
|
3
3
|
value: any;
|
|
4
4
|
instance: any;
|
|
5
|
-
|
|
5
|
+
path: any;
|
|
6
6
|
}): any;
|
|
7
7
|
getResult(options: any): any;
|
|
8
8
|
}
|
|
@@ -15,11 +15,11 @@ class IsEmptyValue extends ConditionOperator_1.default {
|
|
|
15
15
|
static get requireValue() {
|
|
16
16
|
return false;
|
|
17
17
|
}
|
|
18
|
-
execute({ value, instance,
|
|
18
|
+
execute({ value, instance, path }) {
|
|
19
19
|
var _a;
|
|
20
20
|
const isEmptyValue = lodash_1.default.isEmpty(lodash_1.default.isNumber(value) ? String(value) : value);
|
|
21
21
|
if ((_a = instance === null || instance === void 0 ? void 0 : instance.root) === null || _a === void 0 ? void 0 : _a.getComponent) {
|
|
22
|
-
const conditionTriggerComponent = instance.root.getComponent(
|
|
22
|
+
const conditionTriggerComponent = instance.root.getComponent(path);
|
|
23
23
|
return (conditionTriggerComponent === null || conditionTriggerComponent === void 0 ? void 0 : conditionTriggerComponent.isEmpty) ? conditionTriggerComponent.isEmpty() : isEmptyValue;
|
|
24
24
|
}
|
|
25
25
|
return isEmptyValue;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export default class IsEqualTo extends ConditionOperator {
|
|
2
|
-
execute({ value, comparedValue, instance,
|
|
2
|
+
execute({ value, comparedValue, instance, path }: {
|
|
3
3
|
value: any;
|
|
4
4
|
comparedValue: any;
|
|
5
5
|
instance: any;
|
|
6
|
-
|
|
6
|
+
path: any;
|
|
7
7
|
}): any;
|
|
8
8
|
}
|
|
9
9
|
import ConditionOperator from './ConditionOperator';
|
|
@@ -13,7 +13,7 @@ class IsEqualTo extends ConditionOperator_1.default {
|
|
|
13
13
|
static get displayedName() {
|
|
14
14
|
return 'Is Equal To';
|
|
15
15
|
}
|
|
16
|
-
execute({ value, comparedValue, instance,
|
|
16
|
+
execute({ value, comparedValue, instance, path }) {
|
|
17
17
|
var _a, _b;
|
|
18
18
|
if ((value || value === false) && comparedValue && typeof value !== typeof comparedValue && lodash_1.default.isString(comparedValue)) {
|
|
19
19
|
try {
|
|
@@ -23,7 +23,7 @@ class IsEqualTo extends ConditionOperator_1.default {
|
|
|
23
23
|
catch (e) { }
|
|
24
24
|
}
|
|
25
25
|
if ((_a = instance === null || instance === void 0 ? void 0 : instance.root) === null || _a === void 0 ? void 0 : _a.getComponent) {
|
|
26
|
-
const conditionTriggerComponent = instance.root.getComponent(
|
|
26
|
+
const conditionTriggerComponent = instance.root.getComponent(path);
|
|
27
27
|
if (conditionTriggerComponent
|
|
28
28
|
&& (0, utils_1.isSelectResourceWithObjectValue)(conditionTriggerComponent.component)
|
|
29
29
|
&& ((_b = conditionTriggerComponent.component) === null || _b === void 0 ? void 0 : _b.template)) {
|
|
@@ -1,22 +1,33 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deprecated version of findComponents. Renamed to searchComponents.
|
|
3
|
-
* @param {import('@formio/core').Component[]} components - The components to find components within.
|
|
4
|
-
* @param {object} query - The query to use when searching for the components.
|
|
5
|
-
* @returns {import('@formio/core').Component[]} - The result of the component that is found.
|
|
6
|
-
*/
|
|
7
|
-
export function findComponents(components: import('@formio/core').Component[], query: object): import('@formio/core').Component[];
|
|
8
1
|
export const flattenComponents: typeof Utils.flattenComponents;
|
|
9
2
|
export const guid: typeof Utils.guid;
|
|
10
3
|
export const uniqueName: typeof Utils.uniqueName;
|
|
11
|
-
export const
|
|
4
|
+
export const MODEL_TYPES_OF_KNOWN_COMPONENTS: {
|
|
5
|
+
nestedArray: string[];
|
|
6
|
+
nestedDataArray: string[];
|
|
7
|
+
dataObject: string[];
|
|
8
|
+
object: string[];
|
|
9
|
+
map: string[];
|
|
10
|
+
content: string[];
|
|
11
|
+
string: string[];
|
|
12
|
+
number: string[];
|
|
13
|
+
boolean: string[];
|
|
14
|
+
none: string[];
|
|
15
|
+
any: string[];
|
|
16
|
+
};
|
|
12
17
|
export const getModelType: typeof Utils.getModelType;
|
|
13
|
-
export const
|
|
14
|
-
export const
|
|
18
|
+
export const getComponentPath: any;
|
|
19
|
+
export const setComponentScope: typeof Utils.setComponentScope;
|
|
20
|
+
export const resetComponentScope: typeof Utils.resetComponentScope;
|
|
15
21
|
export const isComponentNestedDataType: typeof Utils.isComponentNestedDataType;
|
|
16
22
|
export const componentPath: typeof Utils.componentPath;
|
|
17
|
-
export const
|
|
18
|
-
export const
|
|
19
|
-
export const
|
|
23
|
+
export const getComponentPaths: typeof Utils.getComponentPaths;
|
|
24
|
+
export const componentMatches: typeof Utils.componentMatches;
|
|
25
|
+
export const getBestMatch: typeof Utils.getBestMatch;
|
|
26
|
+
export const getComponentFromPath: typeof Utils.getComponentFromPath;
|
|
27
|
+
export const getComponentValue: typeof Utils.getComponentValue;
|
|
28
|
+
export const findComponents: typeof Utils.findComponents;
|
|
29
|
+
export const eachComponentDataAsync: (components: Component[], data: DataObject, fn: EachComponentDataAsyncCallback, includeAll?: boolean | undefined, local?: boolean | undefined, parent?: any, parentPaths?: any) => Promise<void>;
|
|
30
|
+
export const eachComponentData: (components: Component[], data: DataObject, fn: EachComponentDataCallback, includeAll?: boolean | undefined, local?: boolean | undefined, parent?: any, parentPaths?: any) => void;
|
|
20
31
|
export const getComponentKey: typeof Utils.getComponentKey;
|
|
21
32
|
export const getContextualRowPath: typeof Utils.getContextualRowPath;
|
|
22
33
|
export const getContextualRowData: typeof Utils.getContextualRowData;
|
|
@@ -24,7 +35,7 @@ export const componentInfo: typeof Utils.componentInfo;
|
|
|
24
35
|
export const eachComponent: typeof Utils.eachComponent;
|
|
25
36
|
export const eachComponentAsync: typeof Utils.eachComponentAsync;
|
|
26
37
|
export const getComponentData: typeof Utils.getComponentData;
|
|
27
|
-
export const getComponentActualValue:
|
|
38
|
+
export const getComponentActualValue: any;
|
|
28
39
|
export const isLayoutComponent: typeof Utils.isLayoutComponent;
|
|
29
40
|
export const matchComponent: typeof Utils.matchComponent;
|
|
30
41
|
export const getComponent: typeof Utils.getComponent;
|
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getItemTemplateKeys = exports.compareSelectResourceWithObjectTypeValues = exports.isSelectResourceWithObjectValue = exports.isComponentDataEmpty = exports.getEmptyValue = exports.findComponent = exports.applyFormChanges = exports.generateFormChange = exports.getStrings = exports.getValue = exports.escapeRegExCharacters = exports.formatAsCurrency = exports.parseFloatExt = exports.hasCondition = exports.removeComponent = exports.searchComponents = exports.getComponent = exports.matchComponent = exports.isLayoutComponent = exports.getComponentActualValue = exports.getComponentData = exports.eachComponentAsync = exports.eachComponent = exports.componentInfo = exports.getContextualRowData = exports.getContextualRowPath = exports.getComponentKey = exports.eachComponentData = exports.eachComponentDataAsync = exports.
|
|
3
|
+
exports.getItemTemplateKeys = exports.compareSelectResourceWithObjectTypeValues = exports.isSelectResourceWithObjectValue = exports.isComponentDataEmpty = exports.getEmptyValue = exports.findComponent = exports.applyFormChanges = exports.generateFormChange = exports.getStrings = exports.getValue = exports.escapeRegExCharacters = exports.formatAsCurrency = exports.parseFloatExt = exports.hasCondition = exports.removeComponent = exports.searchComponents = exports.getComponent = exports.matchComponent = exports.isLayoutComponent = exports.getComponentActualValue = exports.getComponentData = exports.eachComponentAsync = exports.eachComponent = exports.componentInfo = exports.getContextualRowData = exports.getContextualRowPath = exports.getComponentKey = exports.eachComponentData = exports.eachComponentDataAsync = exports.findComponents = exports.getComponentValue = exports.getComponentFromPath = exports.getBestMatch = exports.componentMatches = exports.getComponentPaths = exports.componentPath = exports.isComponentNestedDataType = exports.resetComponentScope = exports.setComponentScope = exports.getComponentPath = exports.getModelType = exports.MODEL_TYPES_OF_KNOWN_COMPONENTS = exports.uniqueName = exports.guid = exports.flattenComponents = void 0;
|
|
4
4
|
const core_1 = require("@formio/core");
|
|
5
|
-
const { flattenComponents, guid, uniqueName,
|
|
5
|
+
const { flattenComponents, guid, uniqueName, MODEL_TYPES_OF_KNOWN_COMPONENTS, getModelType, getComponentPath, setComponentScope, resetComponentScope, isComponentNestedDataType, componentPath, getComponentPaths, componentMatches, getBestMatch, getComponentFromPath, getComponentValue, findComponents, eachComponentDataAsync, eachComponentData, getComponentKey, getContextualRowPath, getContextualRowData, componentInfo, eachComponent, eachComponentAsync, getComponentData, getComponentActualValue, isLayoutComponent, matchComponent, getComponent, searchComponents, removeComponent, hasCondition, parseFloatExt, formatAsCurrency, escapeRegExCharacters, getValue, getStrings, generateFormChange, applyFormChanges, findComponent, getEmptyValue, isComponentDataEmpty, isSelectResourceWithObjectValue, compareSelectResourceWithObjectTypeValues, getItemTemplateKeys } = core_1.Utils;
|
|
6
6
|
exports.flattenComponents = flattenComponents;
|
|
7
7
|
exports.guid = guid;
|
|
8
8
|
exports.uniqueName = uniqueName;
|
|
9
|
-
exports.
|
|
9
|
+
exports.MODEL_TYPES_OF_KNOWN_COMPONENTS = MODEL_TYPES_OF_KNOWN_COMPONENTS;
|
|
10
10
|
exports.getModelType = getModelType;
|
|
11
|
-
exports.getComponentAbsolutePath = getComponentAbsolutePath;
|
|
12
11
|
exports.getComponentPath = getComponentPath;
|
|
12
|
+
exports.setComponentScope = setComponentScope;
|
|
13
|
+
exports.resetComponentScope = resetComponentScope;
|
|
13
14
|
exports.isComponentNestedDataType = isComponentNestedDataType;
|
|
14
15
|
exports.componentPath = componentPath;
|
|
15
|
-
exports.
|
|
16
|
+
exports.getComponentPaths = getComponentPaths;
|
|
17
|
+
exports.componentMatches = componentMatches;
|
|
18
|
+
exports.getBestMatch = getBestMatch;
|
|
19
|
+
exports.getComponentFromPath = getComponentFromPath;
|
|
20
|
+
exports.getComponentValue = getComponentValue;
|
|
21
|
+
exports.findComponents = findComponents;
|
|
16
22
|
exports.eachComponentDataAsync = eachComponentDataAsync;
|
|
17
23
|
exports.eachComponentData = eachComponentData;
|
|
18
24
|
exports.getComponentKey = getComponentKey;
|
|
@@ -42,14 +48,3 @@ exports.isComponentDataEmpty = isComponentDataEmpty;
|
|
|
42
48
|
exports.isSelectResourceWithObjectValue = isSelectResourceWithObjectValue;
|
|
43
49
|
exports.compareSelectResourceWithObjectTypeValues = compareSelectResourceWithObjectTypeValues;
|
|
44
50
|
exports.getItemTemplateKeys = getItemTemplateKeys;
|
|
45
|
-
/**
|
|
46
|
-
* Deprecated version of findComponents. Renamed to searchComponents.
|
|
47
|
-
* @param {import('@formio/core').Component[]} components - The components to find components within.
|
|
48
|
-
* @param {object} query - The query to use when searching for the components.
|
|
49
|
-
* @returns {import('@formio/core').Component[]} - The result of the component that is found.
|
|
50
|
-
*/
|
|
51
|
-
function findComponents(components, query) {
|
|
52
|
-
console.warn('formio.js/utils findComponents is deprecated. Use searchComponents instead.');
|
|
53
|
-
return searchComponents(components, query);
|
|
54
|
-
}
|
|
55
|
-
exports.findComponents = findComponents;
|
package/lib/cjs/utils/utils.d.ts
CHANGED
|
@@ -462,10 +462,9 @@ export function getComponentPathWithoutIndicies(path?: string): string;
|
|
|
462
462
|
/**
|
|
463
463
|
* Returns a path to the component which based on its schema
|
|
464
464
|
* @param {import('@formio/core').Component} component - Component containing link to its parent's schema in the 'parent' property
|
|
465
|
-
* @param {string} path - Path to the component
|
|
466
465
|
* @returns {string} - Path to the component
|
|
467
466
|
*/
|
|
468
|
-
export function getComponentPath(component: import('@formio/core').Component
|
|
467
|
+
export function getComponentPath(component: import('@formio/core').Component): string;
|
|
469
468
|
/**
|
|
470
469
|
* Returns a parent component of the passed component instance skipping all the Layout components
|
|
471
470
|
* @param {Component} componentInstance - The component to check for the parent.
|
package/lib/cjs/utils/utils.js
CHANGED
|
@@ -51,17 +51,6 @@ json_logic_js_1.default.add_operation('relativeMinDate', (relativeMinDate) => {
|
|
|
51
51
|
json_logic_js_1.default.add_operation('relativeMaxDate', (relativeMaxDate) => {
|
|
52
52
|
return (0, moment_timezone_1.default)().add(relativeMaxDate, 'days').toISOString();
|
|
53
53
|
});
|
|
54
|
-
/**
|
|
55
|
-
* Sets the path to the component and parent schema.
|
|
56
|
-
* @param {import('@formio/core').Component} component - The component to set the path for.
|
|
57
|
-
*/
|
|
58
|
-
function setPathToComponentAndPerentSchema(component) {
|
|
59
|
-
component.path = getComponentPath(component);
|
|
60
|
-
const dataParent = getDataParentComponent(component);
|
|
61
|
-
if (dataParent && typeof dataParent === 'object') {
|
|
62
|
-
dataParent.path = getComponentPath(dataParent);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
54
|
/**
|
|
66
55
|
* Evaluate a method.
|
|
67
56
|
* @param {Function|string|object} func - The function to evaluate.
|
|
@@ -262,7 +251,7 @@ function checkSimpleConditional(component, condition, row, data, instance) {
|
|
|
262
251
|
const value = getComponentActualValue(path, data, row);
|
|
263
252
|
const ConditionOperator = conditionOperators_1.default[operator];
|
|
264
253
|
return ConditionOperator
|
|
265
|
-
? new ConditionOperator().getResult({ value, comparedValue, instance, component,
|
|
254
|
+
? new ConditionOperator().getResult({ value, comparedValue, instance, component, path })
|
|
266
255
|
: true;
|
|
267
256
|
});
|
|
268
257
|
}
|
|
@@ -270,7 +259,7 @@ function checkSimpleConditional(component, condition, row, data, instance) {
|
|
|
270
259
|
const value = getComponentActualValue(conditionComponentPath, data, row);
|
|
271
260
|
const СonditionOperator = conditionOperators_1.default[operator];
|
|
272
261
|
return СonditionOperator
|
|
273
|
-
? new СonditionOperator().getResult({ value, comparedValue, instance, component, conditionComponentPath })
|
|
262
|
+
? new СonditionOperator().getResult({ value, comparedValue, instance, component, path: conditionComponentPath })
|
|
274
263
|
: true;
|
|
275
264
|
}
|
|
276
265
|
});
|
|
@@ -367,22 +356,23 @@ exports.checkJsonConditional = checkJsonConditional;
|
|
|
367
356
|
* @returns {*} - The contextual row data for the component.
|
|
368
357
|
*/
|
|
369
358
|
function getRow(component, row, instance, conditional) {
|
|
370
|
-
var _a;
|
|
359
|
+
var _a, _b, _c;
|
|
371
360
|
const condition = conditional || component.conditional;
|
|
372
361
|
// If no component's instance passed (happens only in 6.x server), calculate its path based on the schema
|
|
373
362
|
if (!instance) {
|
|
374
363
|
instance = lodash_1.default.cloneDeep(component);
|
|
375
|
-
setPathToComponentAndPerentSchema(instance);
|
|
376
364
|
}
|
|
377
365
|
const dataParent = getDataParentComponent(instance);
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
366
|
+
if (dataParent) {
|
|
367
|
+
const parentPath = (_a = dataParent.paths) === null || _a === void 0 ? void 0 : _a.localDataPath;
|
|
368
|
+
const isTriggerCondtionComponentPath = condition.when || !condition.conditions
|
|
369
|
+
? (_b = condition.when) === null || _b === void 0 ? void 0 : _b.startsWith((_c = dataParent.paths) === null || _c === void 0 ? void 0 : _c.localPath)
|
|
370
|
+
: lodash_1.default.some(condition.conditions, cond => { var _a; return cond.component.startsWith((_a = dataParent.paths) === null || _a === void 0 ? void 0 : _a.localPath); });
|
|
371
|
+
if (isTriggerCondtionComponentPath) {
|
|
372
|
+
const newRow = {};
|
|
373
|
+
lodash_1.default.set(newRow, parentPath, row);
|
|
374
|
+
row = newRow;
|
|
375
|
+
}
|
|
386
376
|
}
|
|
387
377
|
return row;
|
|
388
378
|
}
|
|
@@ -1566,16 +1556,10 @@ exports.getComponentPathWithoutIndicies = getComponentPathWithoutIndicies;
|
|
|
1566
1556
|
/**
|
|
1567
1557
|
* Returns a path to the component which based on its schema
|
|
1568
1558
|
* @param {import('@formio/core').Component} component - Component containing link to its parent's schema in the 'parent' property
|
|
1569
|
-
* @param {string} path - Path to the component
|
|
1570
1559
|
* @returns {string} - Path to the component
|
|
1571
1560
|
*/
|
|
1572
|
-
function getComponentPath(component
|
|
1573
|
-
|
|
1574
|
-
if (!component || !component.key || ((_a = component === null || component === void 0 ? void 0 : component._form) === null || _a === void 0 ? void 0 : _a.display) === 'wizard') { // unlike the Webform, the Wizard has the key and it is a duplicate of the panel key
|
|
1575
|
-
return path;
|
|
1576
|
-
}
|
|
1577
|
-
path = component.isInputComponent || component.input === true ? `${component.key}${path ? '.' : ''}${path}` : path;
|
|
1578
|
-
return getComponentPath(component.parent, path);
|
|
1561
|
+
function getComponentPath(component) {
|
|
1562
|
+
return component.paths.localDataPath;
|
|
1579
1563
|
}
|
|
1580
1564
|
exports.getComponentPath = getComponentPath;
|
|
1581
1565
|
/**
|
package/lib/mjs/Webform.d.ts
CHANGED
|
@@ -426,7 +426,7 @@ declare class Webform extends NestedDataComponent {
|
|
|
426
426
|
*/
|
|
427
427
|
cancel(noconfirm: boolean): boolean;
|
|
428
428
|
setMetadata(submission: any): void;
|
|
429
|
-
submitForm(options?: {}): Promise<any>;
|
|
429
|
+
submitForm(options?: {}, local?: boolean): Promise<any>;
|
|
430
430
|
setServerErrors(error: any): void;
|
|
431
431
|
serverErrors: any;
|
|
432
432
|
executeSubmit(options: any): Promise<object>;
|
package/lib/mjs/Webform.js
CHANGED
|
@@ -588,6 +588,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
588
588
|
try {
|
|
589
589
|
// Do not set the form again if it has been already set
|
|
590
590
|
if (isFormAlreadySet && JSON.stringify(this._form) === JSON.stringify(form)) {
|
|
591
|
+
this.formReadyResolve();
|
|
591
592
|
return Promise.resolve();
|
|
592
593
|
}
|
|
593
594
|
// Create the form.
|
|
@@ -595,13 +596,11 @@ export default class Webform extends NestedDataComponent {
|
|
|
595
596
|
if (this.onSetForm) {
|
|
596
597
|
this.onSetForm(_.cloneDeep(this._form), form);
|
|
597
598
|
}
|
|
598
|
-
if (this.parent?.component?.modalEdit) {
|
|
599
|
-
return Promise.resolve();
|
|
600
|
-
}
|
|
601
599
|
}
|
|
602
600
|
catch (err) {
|
|
603
601
|
console.warn(err);
|
|
604
602
|
// If provided form is not a valid JSON object, do not set it too
|
|
603
|
+
this.formReadyReject(err);
|
|
605
604
|
return Promise.resolve();
|
|
606
605
|
}
|
|
607
606
|
// Allow the form to provide component overrides.
|
|
@@ -850,6 +849,9 @@ export default class Webform extends NestedDataComponent {
|
|
|
850
849
|
return changed;
|
|
851
850
|
}
|
|
852
851
|
getValue() {
|
|
852
|
+
if (!this._submission) {
|
|
853
|
+
this._submission = {};
|
|
854
|
+
}
|
|
853
855
|
if (!this._submission.data) {
|
|
854
856
|
this._submission.data = {};
|
|
855
857
|
}
|
|
@@ -1111,29 +1113,23 @@ export default class Webform extends NestedDataComponent {
|
|
|
1111
1113
|
return;
|
|
1112
1114
|
}
|
|
1113
1115
|
// Mark any components as invalid if in a custom message.
|
|
1116
|
+
const componentErrors = {};
|
|
1114
1117
|
errors.forEach((err) => {
|
|
1115
|
-
const
|
|
1116
|
-
if (
|
|
1117
|
-
|
|
1118
|
+
const path = err.path || err.context?.path || err.component?.key;
|
|
1119
|
+
if (!componentErrors[path]) {
|
|
1120
|
+
componentErrors[path] = [];
|
|
1118
1121
|
}
|
|
1119
|
-
|
|
1120
|
-
components.push(err.path);
|
|
1121
|
-
}
|
|
1122
|
-
components.forEach((path) => {
|
|
1123
|
-
const originalPath = getStringFromComponentPath(path);
|
|
1124
|
-
const component = this.getComponent(path, _.identity, originalPath);
|
|
1125
|
-
if (err.fromServer) {
|
|
1126
|
-
if (component.serverErrors) {
|
|
1127
|
-
component.serverErrors.push(err);
|
|
1128
|
-
}
|
|
1129
|
-
else {
|
|
1130
|
-
component.serverErrors = [err];
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
const components = _.compact(Array.isArray(component) ? component : [component]);
|
|
1134
|
-
components.forEach((component) => component.setCustomValidity(err.message, true));
|
|
1135
|
-
});
|
|
1122
|
+
componentErrors[path].push(err);
|
|
1136
1123
|
});
|
|
1124
|
+
// Iterate through all of our component errors and apply them to the components.
|
|
1125
|
+
for (let path in componentErrors) {
|
|
1126
|
+
const component = this.getComponent(path);
|
|
1127
|
+
const errors = componentErrors[path];
|
|
1128
|
+
if (component) {
|
|
1129
|
+
component.serverErrors = errors.filter((err) => err.fromServer);
|
|
1130
|
+
component.setCustomValidity(errors, true);
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1137
1133
|
const displayedErrors = [];
|
|
1138
1134
|
if (errors.length) {
|
|
1139
1135
|
errors = _.uniqBy(errors, (error) => [error.message, error.component?.id, error.context?.path].join());
|
|
@@ -1326,7 +1322,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
1326
1322
|
onLine: navigator.onLine,
|
|
1327
1323
|
});
|
|
1328
1324
|
}
|
|
1329
|
-
submitForm(options = {}) {
|
|
1325
|
+
submitForm(options = {}, local = false) {
|
|
1330
1326
|
this.clearServerErrors();
|
|
1331
1327
|
return new Promise((resolve, reject) => {
|
|
1332
1328
|
// Read-only forms should never submit.
|
|
@@ -1351,6 +1347,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
1351
1347
|
return reject("Invalid Submission");
|
|
1352
1348
|
}
|
|
1353
1349
|
const errors = this.validate(submission.data, {
|
|
1350
|
+
local,
|
|
1354
1351
|
dirty: true,
|
|
1355
1352
|
silentCheck: false,
|
|
1356
1353
|
process: "submit",
|
|
@@ -1366,11 +1363,11 @@ export default class Webform extends NestedDataComponent {
|
|
|
1366
1363
|
}
|
|
1367
1364
|
this.everyComponent((comp) => {
|
|
1368
1365
|
if (submission._vnote && comp.type === "form" && comp.component.reference) {
|
|
1369
|
-
_.get(submission.data, comp.path, {})._vnote = submission._vnote;
|
|
1366
|
+
_.get(submission.data, local ? comp.paths?.localDataPath : comp.path, {})._vnote = submission._vnote;
|
|
1370
1367
|
}
|
|
1371
1368
|
const { persistent } = comp.component;
|
|
1372
1369
|
if (persistent === "client-only") {
|
|
1373
|
-
_.unset(submission.data, comp.path);
|
|
1370
|
+
_.unset(submission.data, local ? comp.paths?.localDataPath : comp.path);
|
|
1374
1371
|
}
|
|
1375
1372
|
});
|
|
1376
1373
|
this.hook("customValidation", { ...submission, component: options.component }, (err) => {
|
|
@@ -1536,7 +1533,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
1536
1533
|
return;
|
|
1537
1534
|
}
|
|
1538
1535
|
const captchaComponent = [];
|
|
1539
|
-
|
|
1536
|
+
this.eachComponent((component) => {
|
|
1540
1537
|
if (/^(re)?captcha$/.test(component.type) && component.component.eventType === 'formLoad') {
|
|
1541
1538
|
captchaComponent.push(component);
|
|
1542
1539
|
}
|
|
@@ -793,31 +793,18 @@ export default class WebformBuilder extends Component {
|
|
|
793
793
|
// Show an error if siblings are disabled for a component and such a component already exists.
|
|
794
794
|
const compKey = (group === 'resource') ? `component-${key}` : key;
|
|
795
795
|
const draggableComponent = this.groups[group]?.components[compKey] || {};
|
|
796
|
-
if (draggableComponent.disableSiblings) {
|
|
796
|
+
if (draggableComponent.disableSiblings || draggableComponent.uniqueComponent) {
|
|
797
797
|
let isCompAlreadyExists = false;
|
|
798
798
|
eachComponent(this.webform.components, (component) => {
|
|
799
|
-
if (component.type === draggableComponent.schema.type)
|
|
799
|
+
if ((draggableComponent.disableSiblings && component.type === draggableComponent.schema.type) ||
|
|
800
|
+
(draggableComponent.uniqueComponent && component.component.key === draggableComponent.schema.key)) {
|
|
800
801
|
isCompAlreadyExists = true;
|
|
801
802
|
return;
|
|
802
803
|
}
|
|
803
804
|
}, true);
|
|
804
805
|
if (isCompAlreadyExists) {
|
|
805
806
|
this.webform.redraw();
|
|
806
|
-
this.webform.setAlert('danger', `You cannot add more than one ${draggableComponent.key} component to one page.`);
|
|
807
|
-
return;
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
if (draggableComponent.uniqueComponent) {
|
|
811
|
-
let isCompAlreadyExists = false;
|
|
812
|
-
eachComponent(this.webform.components, (component) => {
|
|
813
|
-
if (component.key === draggableComponent.schema.key) {
|
|
814
|
-
isCompAlreadyExists = true;
|
|
815
|
-
return;
|
|
816
|
-
}
|
|
817
|
-
}, true);
|
|
818
|
-
if (isCompAlreadyExists) {
|
|
819
|
-
this.webform.redraw();
|
|
820
|
-
this.webform.setAlert('danger', `You cannot add more than one ${draggableComponent.title} component to one page.`);
|
|
807
|
+
this.webform.setAlert('danger', `You cannot add more than one ${_.get(draggableComponent, draggableComponent.uniqueComponent ? 'title' : 'key')} component to one page.`);
|
|
821
808
|
return;
|
|
822
809
|
}
|
|
823
810
|
}
|
|
@@ -1098,20 +1085,12 @@ export default class WebformBuilder extends Component {
|
|
|
1098
1085
|
findRepeatablePaths() {
|
|
1099
1086
|
const repeatablePaths = [];
|
|
1100
1087
|
const keys = new Map();
|
|
1101
|
-
eachComponent(this.form.components, (comp, path) => {
|
|
1102
|
-
if (
|
|
1103
|
-
|
|
1104
|
-
}
|
|
1105
|
-
if (keys.has(comp.key)) {
|
|
1106
|
-
if (keys.get(comp.key).includes(path)) {
|
|
1107
|
-
repeatablePaths.push(path);
|
|
1108
|
-
}
|
|
1109
|
-
else {
|
|
1110
|
-
keys.set(comp.key, [...keys.get(comp.key), path]);
|
|
1111
|
-
}
|
|
1088
|
+
eachComponent(this.form.components, (comp, path, components, parent, paths) => {
|
|
1089
|
+
if (keys.has(paths.dataPath)) {
|
|
1090
|
+
repeatablePaths.push(paths.dataPath);
|
|
1112
1091
|
}
|
|
1113
1092
|
else {
|
|
1114
|
-
keys.set(
|
|
1093
|
+
keys.set(paths.dataPath, true);
|
|
1115
1094
|
}
|
|
1116
1095
|
}, true);
|
|
1117
1096
|
return repeatablePaths;
|
|
@@ -1172,6 +1151,7 @@ export default class WebformBuilder extends Component {
|
|
|
1172
1151
|
}
|
|
1173
1152
|
const rebuild = parentComponent.rebuild() || Promise.resolve();
|
|
1174
1153
|
return rebuild.then(() => {
|
|
1154
|
+
parentComponent.resetValue();
|
|
1175
1155
|
const schema = parentContainer ? parentContainer[index] : (comp ? comp.schema : []);
|
|
1176
1156
|
this.emitSaveComponentEvent(schema, originalComp, parentComponent.schema, path, index, isNew, originalComponentSchema);
|
|
1177
1157
|
this.emit('change', this.form);
|