@formio/js 5.0.0-dev.5944.74e70b0 → 5.0.0-dev.5948.072adfa
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 +1 -0
- package/dist/formio.form.js +583 -593
- package/dist/formio.form.min.js +1 -1
- package/dist/formio.form.min.js.LICENSE.txt +1 -3
- package/dist/formio.full.js +584 -594
- 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 +41 -51
- 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 +6 -13
- package/lib/cjs/Wizard.js +4 -11
- 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 +39 -7
- package/lib/cjs/components/_classes/component/Component.js +97 -29
- package/lib/cjs/components/_classes/component/editForm/Component.edit.data.js +2 -2
- package/lib/cjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
- package/lib/cjs/components/_classes/componentModal/ComponentModal.js +1 -0
- package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +4 -19
- package/lib/cjs/components/_classes/nested/NestedComponent.js +54 -60
- 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 +2 -3
- package/lib/cjs/components/editgrid/EditGrid.js +13 -13
- package/lib/cjs/components/form/Form.d.ts +1 -3
- package/lib/cjs/components/form/Form.js +21 -28
- package/lib/cjs/components/html/HTML.js +15 -3
- package/lib/cjs/components/selectboxes/SelectBoxes.js +0 -1
- package/lib/cjs/formio.form.js +1 -0
- 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 +6 -13
- package/lib/mjs/Wizard.js +2 -8
- 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 +39 -7
- package/lib/mjs/components/_classes/component/Component.js +99 -30
- package/lib/mjs/components/_classes/component/editForm/Component.edit.data.js +2 -2
- package/lib/mjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
- package/lib/mjs/components/_classes/componentModal/ComponentModal.js +1 -0
- package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +4 -19
- package/lib/mjs/components/_classes/nested/NestedComponent.js +55 -61
- 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 +2 -3
- package/lib/mjs/components/editgrid/EditGrid.js +15 -12
- package/lib/mjs/components/form/Form.d.ts +1 -3
- package/lib/mjs/components/form/Form.js +22 -28
- package/lib/mjs/components/html/HTML.js +15 -3
- package/lib/mjs/components/selectboxes/SelectBoxes.js +0 -1
- package/lib/mjs/formio.form.js +1 -0
- 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 +4 -4
@@ -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
|
}
|
@@ -1096,20 +1096,12 @@ export default class WebformBuilder extends Component {
|
|
1096
1096
|
findRepeatablePaths() {
|
1097
1097
|
const repeatablePaths = [];
|
1098
1098
|
const keys = new Map();
|
1099
|
-
eachComponent(this.form.components, (comp, path) => {
|
1100
|
-
if (
|
1101
|
-
|
1102
|
-
}
|
1103
|
-
if (keys.has(comp.key)) {
|
1104
|
-
if (keys.get(comp.key).includes(path)) {
|
1105
|
-
repeatablePaths.push(path);
|
1106
|
-
}
|
1107
|
-
else {
|
1108
|
-
keys.set(comp.key, [...keys.get(comp.key), path]);
|
1109
|
-
}
|
1099
|
+
eachComponent(this.form.components, (comp, path, components, parent, paths) => {
|
1100
|
+
if (keys.has(paths.dataPath)) {
|
1101
|
+
repeatablePaths.push(paths.dataPath);
|
1110
1102
|
}
|
1111
1103
|
else {
|
1112
|
-
keys.set(
|
1104
|
+
keys.set(paths.dataPath, true);
|
1113
1105
|
}
|
1114
1106
|
}, true);
|
1115
1107
|
return repeatablePaths;
|
@@ -1241,7 +1233,8 @@ export default class WebformBuilder extends Component {
|
|
1241
1233
|
helplinks: this.helplinks,
|
1242
1234
|
}));
|
1243
1235
|
this.editForm.attach(this.componentEdit.querySelector(`[${this._referenceAttributeName}="editForm"]`));
|
1244
|
-
this.
|
1236
|
+
const editFormData = this.editForm.submission?.data;
|
1237
|
+
this.updateComponent(editFormData?.componentJson || editFormData || component);
|
1245
1238
|
this.attachEditComponentControls(component, parent, isNew, original, ComponentClass);
|
1246
1239
|
});
|
1247
1240
|
});
|
package/lib/mjs/Wizard.js
CHANGED
@@ -369,7 +369,7 @@ export default class Wizard extends Webform {
|
|
369
369
|
}
|
370
370
|
attachHeader() {
|
371
371
|
const isAllowPrevious = this.isAllowPrevious();
|
372
|
-
this.attachTooltips(this.refs[`${this.wizardKey}-tooltip`], this.currentPanel
|
372
|
+
this.attachTooltips(this.refs[`${this.wizardKey}-tooltip`], this.currentPanel?.tooltip);
|
373
373
|
if (this.isBreadcrumbClickable() || isAllowPrevious) {
|
374
374
|
this.refs[`${this.wizardKey}-link`]?.forEach((link, index) => {
|
375
375
|
if (!isAllowPrevious || index <= this.enabledIndex) {
|
@@ -717,7 +717,7 @@ export default class Wizard extends Webform {
|
|
717
717
|
validateCurrentPage(flags = {}) {
|
718
718
|
const components = this.currentPage?.components.map((component) => component.component);
|
719
719
|
// Accessing the parent ensures the right instance (whether it's the parent Wizard or a nested Wizard) performs its validation
|
720
|
-
return this.currentPage?.parent.validateComponents(components, this.
|
720
|
+
return this.currentPage?.parent.validateComponents(components, this.root.data, flags);
|
721
721
|
}
|
722
722
|
emitPrevPage() {
|
723
723
|
this.emit('prevPage', { page: this.page, submission: this.submission });
|
@@ -891,12 +891,6 @@ export default class Wizard extends Webform {
|
|
891
891
|
this.redraw();
|
892
892
|
}
|
893
893
|
}
|
894
|
-
redraw() {
|
895
|
-
if (this.parent?.component?.modalEdit) {
|
896
|
-
return this.parent.redraw();
|
897
|
-
}
|
898
|
-
return super.redraw();
|
899
|
-
}
|
900
894
|
rebuild() {
|
901
895
|
const currentPage = this.page;
|
902
896
|
const setCurrentPage = () => this.setPage(currentPage);
|
@@ -256,13 +256,6 @@ export default class Components {
|
|
256
256
|
static setComponents(comps: any): void;
|
257
257
|
static addComponent(name: any, comp: any): void;
|
258
258
|
static setComponent(name: any, comp: any): void;
|
259
|
-
/**
|
260
|
-
* Return a path of component's value.
|
261
|
-
* @param {Component} component - The component instance.
|
262
|
-
* @returns {string} - The component's value path.
|
263
|
-
*/
|
264
|
-
static getComponentPath(component: Component): string;
|
265
259
|
static create(component: any, options: any, data: any): any;
|
266
260
|
}
|
267
261
|
import BaseEditForm from './_classes/component/Component.form';
|
268
|
-
import Component from './_classes/component/Component';
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import Component from './_classes/component/Component';
|
2
2
|
import EditFormUtils from './_classes/component/editForm/utils';
|
3
3
|
import BaseEditForm from './_classes/component/Component.form';
|
4
|
-
import { getComponentKey, getModelType } from '../utils/utils';
|
5
4
|
import _ from 'lodash';
|
6
5
|
export default class Components {
|
7
6
|
static _editFormUtils = EditFormUtils;
|
@@ -46,34 +45,6 @@ export default class Components {
|
|
46
45
|
static setComponent(name, comp) {
|
47
46
|
Components.components[name] = comp;
|
48
47
|
}
|
49
|
-
/**
|
50
|
-
* Return a path of component's value.
|
51
|
-
* @param {Component} component - The component instance.
|
52
|
-
* @returns {string} - The component's value path.
|
53
|
-
*/
|
54
|
-
static getComponentPath(component) {
|
55
|
-
let path = '';
|
56
|
-
const componentKey = getComponentKey(component.component);
|
57
|
-
if (componentKey) {
|
58
|
-
let thisPath = component.options?.parent || component;
|
59
|
-
while (thisPath && !thisPath.allowData && thisPath.parent) {
|
60
|
-
thisPath = thisPath.parent;
|
61
|
-
}
|
62
|
-
// TODO: any component that is nested in e.g. a Data Grid or an Edit Grid is going to receive a row prop; the problem
|
63
|
-
// is that options.row is passed to each further nested component, which results in erroneous paths like
|
64
|
-
// `editGrid[0].container[0].textField` rather than `editGrid[0].container.textField`. This should be adapted for other
|
65
|
-
// components with a tree-like data model
|
66
|
-
const rowIndex = component.row;
|
67
|
-
const rowIndexPath = rowIndex && !['container'].includes(thisPath.component.type) ? `[${Number.parseInt(rowIndex)}]` : '';
|
68
|
-
path = `${thisPath.path}${rowIndexPath}.`;
|
69
|
-
if (rowIndexPath && getModelType(thisPath) === 'nestedDataArray') {
|
70
|
-
path = `${path}data.`;
|
71
|
-
}
|
72
|
-
path += componentKey;
|
73
|
-
return _.trim(path, '.');
|
74
|
-
}
|
75
|
-
return path;
|
76
|
-
}
|
77
48
|
static create(component, options, data) {
|
78
49
|
let comp = null;
|
79
50
|
if (component.type && Components.components.hasOwnProperty(component.type)) {
|
@@ -98,9 +69,7 @@ export default class Components {
|
|
98
69
|
else {
|
99
70
|
comp = new Component(component, options, data);
|
100
71
|
}
|
101
|
-
|
102
|
-
if (path) {
|
103
|
-
comp.path = path;
|
72
|
+
if (comp.path) {
|
104
73
|
comp.componentsMap[comp.path] = comp;
|
105
74
|
}
|
106
75
|
return comp;
|
@@ -42,14 +42,13 @@ declare class Component extends Element {
|
|
42
42
|
*/
|
43
43
|
private _hasCondition;
|
44
44
|
/**
|
45
|
-
*
|
45
|
+
* The row index for this component.
|
46
46
|
*/
|
47
|
-
|
47
|
+
_rowIndex: number | undefined;
|
48
48
|
/**
|
49
|
-
*
|
50
|
-
* @type {string}
|
49
|
+
* References to dom elements
|
51
50
|
*/
|
52
|
-
|
51
|
+
refs: {};
|
53
52
|
/**
|
54
53
|
* An array of all the children components errors.
|
55
54
|
*/
|
@@ -114,7 +113,19 @@ declare class Component extends Element {
|
|
114
113
|
* @type {Component}
|
115
114
|
*/
|
116
115
|
parent: Component;
|
116
|
+
/**
|
117
|
+
* The component paths for this component.
|
118
|
+
* @type {import('@formio/core').ComponentPaths} - The component paths.
|
119
|
+
*/
|
120
|
+
paths: import('@formio/core').ComponentPaths;
|
117
121
|
_path: string;
|
122
|
+
/**
|
123
|
+
* Determines if this component is conditionally hidden. Should generally not be set outside of conditional logic pipeline.
|
124
|
+
* This is necessary because of clearOnHide behavior that only clears when conditionally hidden - we need to track
|
125
|
+
* conditionallyHidden separately from "regular" visibility.
|
126
|
+
*/
|
127
|
+
_parentConditionallyHidden: any;
|
128
|
+
_conditionallyHidden: any;
|
118
129
|
/**
|
119
130
|
* Determines if this component is visible, or not.
|
120
131
|
*/
|
@@ -158,7 +169,7 @@ declare class Component extends Element {
|
|
158
169
|
* @type {*}
|
159
170
|
*/
|
160
171
|
info: any;
|
161
|
-
get componentsMap():
|
172
|
+
get componentsMap(): object;
|
162
173
|
set data(value: any);
|
163
174
|
get data(): any;
|
164
175
|
mergeSchema(component?: {}): any;
|
@@ -182,6 +193,17 @@ declare class Component extends Element {
|
|
182
193
|
* @returns {boolean} - TRUE if the component is disabled.
|
183
194
|
*/
|
184
195
|
get disabled(): boolean;
|
196
|
+
/**
|
197
|
+
* Set Row Index to row and update each component.
|
198
|
+
* @param {number} value - The row index.
|
199
|
+
* @returns {void}
|
200
|
+
*/
|
201
|
+
set rowIndex(value: number);
|
202
|
+
/**
|
203
|
+
* Get Row Index.
|
204
|
+
* @returns {number} - The row index.
|
205
|
+
*/
|
206
|
+
get rowIndex(): number;
|
185
207
|
afterComponentAssign(): void;
|
186
208
|
createAddon(addonConfiguration: any): any;
|
187
209
|
get shouldDisabled(): any;
|
@@ -190,6 +212,8 @@ declare class Component extends Element {
|
|
190
212
|
get hasInput(): any;
|
191
213
|
get defaultSchema(): any;
|
192
214
|
get key(): any;
|
215
|
+
set path(path: string | undefined);
|
216
|
+
get path(): string | undefined;
|
193
217
|
set parentVisible(value: any);
|
194
218
|
get parentVisible(): any;
|
195
219
|
set parentDisabled(value: boolean);
|
@@ -207,12 +231,20 @@ declare class Component extends Element {
|
|
207
231
|
* @returns {boolean} - Whether the component is visible or not.
|
208
232
|
*/
|
209
233
|
get visible(): boolean;
|
234
|
+
get conditionallyHidden(): any;
|
235
|
+
/**
|
236
|
+
* Evaluates whether the component is conditionally hidden (as opposed to intentionally hidden, e.g. via the `hidden` component schema property).
|
237
|
+
* @param {object} data - The data object to evaluate the condition against.
|
238
|
+
* @param {object} row - The row object to evaluate the condition against.
|
239
|
+
* @returns {boolean} - Whether the component is conditionally hidden.
|
240
|
+
*/
|
241
|
+
checkConditionallyHidden(data?: object, row?: object): boolean;
|
210
242
|
set currentForm(instance: any);
|
211
243
|
get currentForm(): any;
|
212
244
|
_currentForm: any;
|
213
245
|
get fullMode(): boolean;
|
214
246
|
get builderMode(): boolean;
|
215
|
-
get calculatedPath(): string;
|
247
|
+
get calculatedPath(): string | undefined;
|
216
248
|
get labelPosition(): any;
|
217
249
|
get labelWidth(): any;
|
218
250
|
get labelMargin(): any;
|