@formio/js 5.0.0-dev.5925.ef39512 → 5.0.0-dev.5933.3445318

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/Changelog.md +302 -10
  2. package/README.md +28 -1
  3. package/dist/formio.form.js +585 -595
  4. package/dist/formio.form.min.js +1 -1
  5. package/dist/formio.form.min.js.LICENSE.txt +2 -4
  6. package/dist/formio.full.js +586 -596
  7. package/dist/formio.full.min.js +1 -1
  8. package/dist/formio.full.min.js.LICENSE.txt +2 -4
  9. package/dist/formio.js +3006 -287
  10. package/dist/formio.min.js +1 -1
  11. package/dist/formio.min.js.LICENSE.txt +13 -1
  12. package/dist/formio.utils.js +41 -51
  13. package/dist/formio.utils.min.js +1 -1
  14. package/dist/formio.utils.min.js.LICENSE.txt +2 -4
  15. package/lib/cjs/Webform.d.ts +1 -1
  16. package/lib/cjs/Webform.js +27 -28
  17. package/lib/cjs/WebformBuilder.js +13 -13
  18. package/lib/cjs/Wizard.js +15 -20
  19. package/lib/cjs/components/Components.d.ts +0 -7
  20. package/lib/cjs/components/Components.js +1 -33
  21. package/lib/cjs/components/_classes/component/Component.d.ts +39 -7
  22. package/lib/cjs/components/_classes/component/Component.js +97 -29
  23. package/lib/cjs/components/_classes/component/editForm/Component.edit.data.js +2 -2
  24. package/lib/cjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
  25. package/lib/cjs/components/_classes/componentModal/ComponentModal.js +1 -0
  26. package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +4 -19
  27. package/lib/cjs/components/_classes/nested/NestedComponent.js +54 -60
  28. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
  29. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +9 -46
  30. package/lib/cjs/components/datagrid/DataGrid.d.ts +0 -1
  31. package/lib/cjs/components/datagrid/DataGrid.js +5 -46
  32. package/lib/cjs/components/datamap/DataMap.js +2 -3
  33. package/lib/cjs/components/editgrid/EditGrid.d.ts +1 -1
  34. package/lib/cjs/components/editgrid/EditGrid.js +20 -15
  35. package/lib/cjs/components/form/Form.d.ts +2 -3
  36. package/lib/cjs/components/form/Form.js +26 -28
  37. package/lib/cjs/components/html/HTML.js +15 -3
  38. package/lib/cjs/components/number/Number.js +11 -4
  39. package/lib/cjs/components/selectboxes/SelectBoxes.d.ts +1 -2
  40. package/lib/cjs/components/selectboxes/SelectBoxes.js +14 -1
  41. package/lib/cjs/formio.form.js +1 -0
  42. package/lib/cjs/utils/conditionOperators/DateGreaterThan.js +2 -2
  43. package/lib/cjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
  44. package/lib/cjs/utils/conditionOperators/IsEmptyValue.js +2 -2
  45. package/lib/cjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
  46. package/lib/cjs/utils/conditionOperators/IsEqualTo.js +2 -2
  47. package/lib/cjs/utils/formUtils.d.ts +25 -14
  48. package/lib/cjs/utils/formUtils.js +11 -16
  49. package/lib/cjs/utils/utils.d.ts +1 -2
  50. package/lib/cjs/utils/utils.js +15 -31
  51. package/lib/mjs/Webform.d.ts +1 -1
  52. package/lib/mjs/Webform.js +24 -27
  53. package/lib/mjs/WebformBuilder.js +13 -13
  54. package/lib/mjs/Wizard.js +13 -17
  55. package/lib/mjs/components/Components.d.ts +0 -7
  56. package/lib/mjs/components/Components.js +1 -32
  57. package/lib/mjs/components/_classes/component/Component.d.ts +39 -7
  58. package/lib/mjs/components/_classes/component/Component.js +99 -30
  59. package/lib/mjs/components/_classes/component/editForm/Component.edit.data.js +2 -2
  60. package/lib/mjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
  61. package/lib/mjs/components/_classes/componentModal/ComponentModal.js +1 -0
  62. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +4 -19
  63. package/lib/mjs/components/_classes/nested/NestedComponent.js +55 -61
  64. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
  65. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +8 -43
  66. package/lib/mjs/components/datagrid/DataGrid.d.ts +0 -1
  67. package/lib/mjs/components/datagrid/DataGrid.js +5 -46
  68. package/lib/mjs/components/datamap/DataMap.js +2 -3
  69. package/lib/mjs/components/editgrid/EditGrid.d.ts +1 -1
  70. package/lib/mjs/components/editgrid/EditGrid.js +22 -14
  71. package/lib/mjs/components/form/Form.d.ts +2 -3
  72. package/lib/mjs/components/form/Form.js +26 -28
  73. package/lib/mjs/components/html/HTML.js +15 -3
  74. package/lib/mjs/components/number/Number.js +11 -4
  75. package/lib/mjs/components/selectboxes/SelectBoxes.d.ts +1 -2
  76. package/lib/mjs/components/selectboxes/SelectBoxes.js +14 -1
  77. package/lib/mjs/formio.form.js +1 -0
  78. package/lib/mjs/utils/conditionOperators/DateGreaterThan.js +2 -2
  79. package/lib/mjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
  80. package/lib/mjs/utils/conditionOperators/IsEmptyValue.js +2 -2
  81. package/lib/mjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
  82. package/lib/mjs/utils/conditionOperators/IsEqualTo.js +2 -2
  83. package/lib/mjs/utils/formUtils.d.ts +25 -14
  84. package/lib/mjs/utils/formUtils.js +2 -12
  85. package/lib/mjs/utils/utils.d.ts +1 -2
  86. package/lib/mjs/utils/utils.js +14 -29
  87. package/package.json +4 -4
@@ -3,7 +3,7 @@ import _ from 'lodash';
3
3
  import Component from '../_classes/component/Component';
4
4
  import ComponentModal from '../_classes/componentModal/ComponentModal';
5
5
  import EventEmitter from 'eventemitter3';
6
- import { isMongoId, eachComponent, getStringFromComponentPath, getArrayFromComponentPath, componentValueTypes } from '../../utils/utils';
6
+ import { isMongoId, eachComponent, componentValueTypes } from '../../utils/utils';
7
7
  import { Formio } from '../../Formio';
8
8
  import Form from '../../Form';
9
9
  export default class FormComponent extends Component {
@@ -127,21 +127,19 @@ export default class FormComponent extends Component {
127
127
  this.subFormRevision = undefined;
128
128
  }
129
129
  }
130
- getComponent(path, fn) {
131
- path = getArrayFromComponentPath(path);
132
- if (path[0] === 'data') {
133
- path.shift();
134
- }
135
- const originalPathStr = `${this.path}.data.${getStringFromComponentPath(path)}`;
136
- if (this.subForm) {
137
- return this.subForm.getComponent(path, fn, originalPathStr);
130
+ getComponent(path) {
131
+ if (!this.subForm) {
132
+ return null;
138
133
  }
134
+ return this.subForm.getComponent(path);
139
135
  }
140
136
  /* eslint-disable max-statements */
141
137
  getSubOptions(options = {}) {
142
138
  options.events = this.createEmitter();
143
139
  // Make sure to not show the submit button in wizards in the nested forms.
144
140
  _.set(options, 'buttonSettings.showSubmit', false);
141
+ // Set the parent option to the subform so those references are stable when the subform is created
142
+ options.parent = this;
145
143
  if (!this.options) {
146
144
  return options;
147
145
  }
@@ -203,6 +201,7 @@ export default class FormComponent extends Component {
203
201
  if (this.options.skipDraftRestore) {
204
202
  options.skipDraftRestore = this.options.skipDraftRestore;
205
203
  }
204
+ options.parent = this;
206
205
  return options;
207
206
  }
208
207
  /* eslint-enable max-statements */
@@ -294,6 +293,7 @@ export default class FormComponent extends Component {
294
293
  const modalShouldBeOpened = this.componentModal ? this.componentModal.isOpened : false;
295
294
  const currentValue = modalShouldBeOpened ? this.componentModal.currentValue : this.dataValue;
296
295
  this.componentModal = new ComponentModal(this, element, modalShouldBeOpened, currentValue, this._referenceAttributeName);
296
+ this.subForm.element = this.componentModal.refs.componentContent || this.subForm.element;
297
297
  this.setOpenModalElement();
298
298
  }
299
299
  this.calculateValue();
@@ -329,6 +329,9 @@ export default class FormComponent extends Component {
329
329
  && _.isNumber(this.formObj._vid)
330
330
  && this.formObj._vid !== this.subFormRevision;
331
331
  }
332
+ get subFormData() {
333
+ return this.dataValue?.data || {};
334
+ }
332
335
  destroy(all = false) {
333
336
  if (this.subForm) {
334
337
  this.subForm.destroy(all);
@@ -391,8 +394,11 @@ export default class FormComponent extends Component {
391
394
  return (new Form(form, this.getSubOptions())).ready.then((instance) => {
392
395
  this.subForm = instance;
393
396
  this.subForm.currentForm = this;
394
- this.subForm.parent = this;
395
397
  this.subForm.parentVisible = this.visible;
398
+ const componentsMap = this.componentsMap;
399
+ const formComponentsMap = this.subForm.componentsMap;
400
+ _.assign(componentsMap, formComponentsMap);
401
+ this.component.components = this.subForm.components.map((comp) => comp.component);
396
402
  this.subForm.on('change', () => {
397
403
  if (this.subForm) {
398
404
  this.dataValue = this.subForm.getValue();
@@ -409,6 +415,8 @@ export default class FormComponent extends Component {
409
415
  this.valueChanged = this.hasSetValue;
410
416
  this.onChange();
411
417
  return this.subForm;
418
+ }).catch((err) => {
419
+ console.log(err);
412
420
  });
413
421
  }).then((subForm) => {
414
422
  this.updateSubWizards(subForm);
@@ -417,10 +425,11 @@ export default class FormComponent extends Component {
417
425
  return this.subFormReady;
418
426
  }
419
427
  hideSubmitButton(component) {
420
- const isSubmitButton = (component.type === 'button') &&
421
- ((component.action === 'submit') || !component.action);
428
+ const isSubmitButton = component.type === 'button' && (component.action === 'submit' || !component.action);
422
429
  if (isSubmitButton) {
423
430
  component.hidden = true;
431
+ // clearOnHide no longer clears from the JSON `hidden` flag, so we make the button conditionally hidden to clear its data
432
+ component.customConditional = 'show = false';
424
433
  }
425
434
  }
426
435
  /**
@@ -429,7 +438,7 @@ export default class FormComponent extends Component {
429
438
  * @returns {Promise} - The promise that resolves when the subform is loaded.
430
439
  */
431
440
  loadSubForm(fromAttach) {
432
- if (this.builderMode || this.isHidden() || (this.isSubFormLazyLoad() && !fromAttach)) {
441
+ if (this.builderMode || this.conditionallyHidden || (this.isSubFormLazyLoad() && !fromAttach)) {
433
442
  return Promise.resolve();
434
443
  }
435
444
  if (this.hasLoadedForm && !this.isRevisionChanged &&
@@ -464,17 +473,6 @@ export default class FormComponent extends Component {
464
473
  }
465
474
  return Promise.resolve();
466
475
  }
467
- get subFormData() {
468
- return this.dataValue?.data || {};
469
- }
470
- checkComponentValidity(data, dirty, row, options, errors = []) {
471
- options = options || {};
472
- const silentCheck = options.silentCheck || false;
473
- if (this.subForm) {
474
- return this.subForm.checkValidity(this.subFormData, dirty, null, silentCheck, errors);
475
- }
476
- return super.checkComponentValidity(data, dirty, row, options, errors);
477
- }
478
476
  checkComponentConditions(data, flags, row) {
479
477
  const visible = super.checkComponentConditions(data, flags, row);
480
478
  // Return if already hidden
@@ -482,14 +480,14 @@ export default class FormComponent extends Component {
482
480
  return visible;
483
481
  }
484
482
  if (this.subForm) {
485
- return this.subForm.checkConditions(this.subFormData);
483
+ return this.subForm.checkConditions(this.subFormData, flags);
486
484
  }
487
485
  // There are few cases when subForm is not loaded when a change is triggered,
488
486
  // so we need to perform checkConditions after it is ready, or some conditional fields might be hidden in View mode
489
487
  else if (this.subFormReady) {
490
488
  this.subFormReady.then(() => {
491
489
  if (this.subForm) {
492
- return this.subForm.checkConditions(this.subFormData);
490
+ return this.subForm.checkConditions(this.subFormData, flags);
493
491
  }
494
492
  });
495
493
  }
@@ -512,7 +510,7 @@ export default class FormComponent extends Component {
512
510
  * @returns {*|boolean} - TRUE if the subform should be submitted, FALSE if it should not.
513
511
  */
514
512
  get shouldSubmit() {
515
- return this.subFormReady && (!this.component.hasOwnProperty('reference') || this.component.reference) && !this.isHidden();
513
+ return this.subFormReady && (!this.component.hasOwnProperty('reference') || this.component.reference) && !this.conditionallyHidden;
516
514
  }
517
515
  /**
518
516
  * Returns the data for the subform.
@@ -539,7 +537,7 @@ export default class FormComponent extends Component {
539
537
  }
540
538
  this.subForm.nosubmit = false;
541
539
  this.subForm.submitted = true;
542
- return this.subForm.submitForm().then(result => {
540
+ return this.subForm.submitForm({}, true).then(result => {
543
541
  this.subForm.loading = false;
544
542
  this.subForm.showAllErrors = false;
545
543
  this.dataValue = result.submission;
@@ -51,9 +51,21 @@ export default class HTMLComponent extends Component {
51
51
  }
52
52
  checkRefreshOn(changed) {
53
53
  super.checkRefreshOn(changed);
54
- if (!this.builderMode && this.component.refreshOnChange && this.element &&
55
- !_.isUndefined(changed) && ((_.isBoolean(changed) && changed) || !_.isEmpty(changed)) &&
56
- this.conditionallyVisible(this.data, this.row)) {
54
+ let visible;
55
+ if (this.hasCondition()) {
56
+ this._conditionallyHidden = this.checkConditionallyHidden();
57
+ visible = !this.conditionallyHidden;
58
+ }
59
+ else {
60
+ visible = !this.component.hidden;
61
+ }
62
+ const shouldSetContent = !this.builderMode
63
+ && this.component.refreshOnChange
64
+ && this.element
65
+ && !_.isUndefined(changed)
66
+ && ((_.isBoolean(changed) && changed) || !_.isEmpty(changed))
67
+ && visible;
68
+ if (shouldSetContent) {
57
69
  this.setContent(this.element, this.renderContent());
58
70
  }
59
71
  }
@@ -168,14 +168,21 @@ export default class NumberComponent extends Input {
168
168
  if (typeof input === 'string') {
169
169
  input = input.split(this.delimiter).join('').replace(this.decimalSeparator, '.');
170
170
  }
171
- let value = parseFloat(input);
172
- if (!_.isNaN(value)) {
171
+ let value;
172
+ if (!_.isNaN(input)) {
173
173
  // Format scientific notation
174
- if (/e/i.test(String(value))) {
174
+ if (/[0-9]+[eE]/.test(String(input))) {
175
+ // Convert to exponential notation will depend on the decimal limit set in the component
176
+ // Example: 1.23e-5 will be converted to 1.23e-5 if decimal limit is set to 2
177
+ // Example: 1.23e5 will be converted to 1.23e+5 if decimal limit is set to 2
178
+ // if decimal limit is 3, 1.23e5 will be converted to 1.230e+5
179
+ // if decimal limit is not set, 1.23e5 will be converted to 1.23000000000000000000e+5
180
+ value = parseFloat(input);
175
181
  value = value.toExponential(this.decimalLimit);
176
182
  }
177
183
  else {
178
- value = String(value).replace('.', this.decimalSeparator);
184
+ value = parseFloat(input);
185
+ value = !_.isNaN(value) ? String(value).replace('.', this.decimalSeparator) : null;
179
186
  }
180
187
  }
181
188
  else {
@@ -1,8 +1,7 @@
1
1
  export default class SelectBoxesComponent extends RadioComponent {
2
2
  static savedValueTypes(schema: any): string[];
3
3
  constructor(...args: any[]);
4
- get emptyValue(): {};
5
- get defaultValue(): {};
4
+ get emptyValue(): any;
6
5
  /**
7
6
  * Only empty if the values are all false.
8
7
  * @param {any} value - The value to check if empty.
@@ -67,7 +67,12 @@ export default class SelectBoxesComponent extends RadioComponent {
67
67
  return info;
68
68
  }
69
69
  get emptyValue() {
70
- return {};
70
+ return this.component.values.reduce((prev, value) => {
71
+ if (value.value) {
72
+ prev[value.value] = false;
73
+ }
74
+ return prev;
75
+ }, {});
71
76
  }
72
77
  get defaultValue() {
73
78
  let defaultValue = this.emptyValue;
@@ -136,6 +141,14 @@ export default class SelectBoxesComponent extends RadioComponent {
136
141
  checkedValues.forEach((value) => selectData.push(this.templateData[value]));
137
142
  _.set(submission.metadata.selectData, this.path, selectData);
138
143
  }
144
+ // Ensure that for dataSrc == 'values' that there are not any other superfluous values.
145
+ if (this.component.dataSrc === 'values') {
146
+ for (const key in value) {
147
+ if (!this.component.values.find((val) => val.value === key)) {
148
+ delete value[key];
149
+ }
150
+ }
151
+ }
139
152
  return value;
140
153
  }
141
154
  /**
@@ -56,6 +56,7 @@ export function registerModule(mod, defaultFn = null, options = {}) {
56
56
  case 'templates':
57
57
  for (const framework of Object.keys(mod.templates)) {
58
58
  Formio.Templates.extendTemplate(framework, mod.templates[framework]);
59
+ Formio.Templates.defaultTemplates = _.defaults(mod.templates[framework], Formio.Templates.defaultTemplates);
59
60
  }
60
61
  if (mod.templates[current]) {
61
62
  Formio.Templates.current = mod.templates[current];
@@ -14,13 +14,13 @@ export default class DateGeaterThan extends ConditionOperator {
14
14
  return { date, comparedDate };
15
15
  }
16
16
  execute(options, functionName = 'isAfter') {
17
- const { value, instance, conditionComponentPath } = options;
17
+ const { value, instance, path } = options;
18
18
  if (!value) {
19
19
  return false;
20
20
  }
21
21
  let conditionTriggerComponent = null;
22
22
  if (instance?.root?.getComponent) {
23
- conditionTriggerComponent = instance.root.getComponent(conditionComponentPath);
23
+ conditionTriggerComponent = instance.root.getComponent(path);
24
24
  }
25
25
  if (conditionTriggerComponent && conditionTriggerComponent.isPartialDay && conditionTriggerComponent.isPartialDay(value)) {
26
26
  return false;
@@ -1,8 +1,8 @@
1
1
  export default class IsEmptyValue extends ConditionOperator {
2
- execute({ value, instance, conditionComponentPath }: {
2
+ execute({ value, instance, path }: {
3
3
  value: any;
4
4
  instance: any;
5
- conditionComponentPath: any;
5
+ path: any;
6
6
  }): any;
7
7
  getResult(options: any): any;
8
8
  }
@@ -10,10 +10,10 @@ export default class IsEmptyValue extends ConditionOperator {
10
10
  static get requireValue() {
11
11
  return false;
12
12
  }
13
- execute({ value, instance, conditionComponentPath }) {
13
+ execute({ value, instance, path }) {
14
14
  const isEmptyValue = _.isEmpty(_.isNumber(value) ? String(value) : value);
15
15
  if (instance?.root?.getComponent) {
16
- const conditionTriggerComponent = instance.root.getComponent(conditionComponentPath);
16
+ const conditionTriggerComponent = instance.root.getComponent(path);
17
17
  return conditionTriggerComponent?.isEmpty ? conditionTriggerComponent.isEmpty() : isEmptyValue;
18
18
  }
19
19
  return isEmptyValue;
@@ -1,9 +1,9 @@
1
1
  export default class IsEqualTo extends ConditionOperator {
2
- execute({ value, comparedValue, instance, conditionComponentPath }: {
2
+ execute({ value, comparedValue, instance, path }: {
3
3
  value: any;
4
4
  comparedValue: any;
5
5
  instance: any;
6
- conditionComponentPath: any;
6
+ path: any;
7
7
  }): any;
8
8
  }
9
9
  import ConditionOperator from './ConditionOperator';
@@ -8,7 +8,7 @@ export default class IsEqualTo extends ConditionOperator {
8
8
  static get displayedName() {
9
9
  return 'Is Equal To';
10
10
  }
11
- execute({ value, comparedValue, instance, conditionComponentPath }) {
11
+ execute({ value, comparedValue, instance, path }) {
12
12
  if ((value || value === false) && comparedValue && typeof value !== typeof comparedValue && _.isString(comparedValue)) {
13
13
  try {
14
14
  comparedValue = JSON.parse(comparedValue);
@@ -17,7 +17,7 @@ export default class IsEqualTo extends ConditionOperator {
17
17
  catch (e) { }
18
18
  }
19
19
  if (instance?.root?.getComponent) {
20
- const conditionTriggerComponent = instance.root.getComponent(conditionComponentPath);
20
+ const conditionTriggerComponent = instance.root.getComponent(path);
21
21
  if (conditionTriggerComponent
22
22
  && isSelectResourceWithObjectValue(conditionTriggerComponent.component)
23
23
  && conditionTriggerComponent.component?.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 MODEL_TYPES: any;
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 getComponentAbsolutePath: typeof Utils.getComponentAbsolutePath;
14
- export const getComponentPath: typeof Utils.getComponentPath;
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 componentChildPath: any;
18
- export const eachComponentDataAsync: (components: Component[], data: DataObject, fn: EachComponentDataAsyncCallback, path?: string | undefined, index?: number | undefined, parent?: any, includeAll?: boolean | undefined) => Promise<void>;
19
- export const eachComponentData: (components: Component[], data: DataObject, fn: EachComponentDataCallback, path?: string | undefined, index?: number | undefined, parent?: any, includeAll?: boolean | undefined) => void;
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: typeof Utils.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,13 +1,3 @@
1
1
  import { Utils } from '@formio/core';
2
- const { flattenComponents, guid, uniqueName, MODEL_TYPES, getModelType, getComponentAbsolutePath, getComponentPath, isComponentNestedDataType, componentPath, componentChildPath, 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 } = Utils;
3
- /**
4
- * Deprecated version of findComponents. Renamed to searchComponents.
5
- * @param {import('@formio/core').Component[]} components - The components to find components within.
6
- * @param {object} query - The query to use when searching for the components.
7
- * @returns {import('@formio/core').Component[]} - The result of the component that is found.
8
- */
9
- export function findComponents(components, query) {
10
- console.warn('formio.js/utils findComponents is deprecated. Use searchComponents instead.');
11
- return searchComponents(components, query);
12
- }
13
- export { flattenComponents, guid, uniqueName, MODEL_TYPES, getModelType, getComponentAbsolutePath, getComponentPath, isComponentNestedDataType, componentPath, componentChildPath, 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 };
2
+ 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 } = Utils;
3
+ export { 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 };
@@ -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, path?: string): string;
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.
@@ -25,17 +25,6 @@ jsonLogic.add_operation('relativeMaxDate', (relativeMaxDate) => {
25
25
  return moment().add(relativeMaxDate, 'days').toISOString();
26
26
  });
27
27
  export { jsonLogic, ConditionOperators, moment };
28
- /**
29
- * Sets the path to the component and parent schema.
30
- * @param {import('@formio/core').Component} component - The component to set the path for.
31
- */
32
- function setPathToComponentAndPerentSchema(component) {
33
- component.path = getComponentPath(component);
34
- const dataParent = getDataParentComponent(component);
35
- if (dataParent && typeof dataParent === 'object') {
36
- dataParent.path = getComponentPath(dataParent);
37
- }
38
- }
39
28
  /**
40
29
  * Evaluate a method.
41
30
  * @param {Function|string|object} func - The function to evaluate.
@@ -227,7 +216,7 @@ export function checkSimpleConditional(component, condition, row, data, instance
227
216
  const value = getComponentActualValue(path, data, row);
228
217
  const ConditionOperator = ConditionOperators[operator];
229
218
  return ConditionOperator
230
- ? new ConditionOperator().getResult({ value, comparedValue, instance, component, conditionComponentPath })
219
+ ? new ConditionOperator().getResult({ value, comparedValue, instance, component, path })
231
220
  : true;
232
221
  });
233
222
  }
@@ -235,7 +224,7 @@ export function checkSimpleConditional(component, condition, row, data, instance
235
224
  const value = getComponentActualValue(conditionComponentPath, data, row);
236
225
  const СonditionOperator = ConditionOperators[operator];
237
226
  return СonditionOperator
238
- ? new СonditionOperator().getResult({ value, comparedValue, instance, component, conditionComponentPath })
227
+ ? new СonditionOperator().getResult({ value, comparedValue, instance, component, path: conditionComponentPath })
239
228
  : true;
240
229
  }
241
230
  });
@@ -332,17 +321,18 @@ function getRow(component, row, instance, conditional) {
332
321
  // If no component's instance passed (happens only in 6.x server), calculate its path based on the schema
333
322
  if (!instance) {
334
323
  instance = _.cloneDeep(component);
335
- setPathToComponentAndPerentSchema(instance);
336
324
  }
337
325
  const dataParent = getDataParentComponent(instance);
338
- const parentPath = dataParent ? getComponentPath(dataParent) : null;
339
- const isTriggerCondtionComponentPath = condition.when || !condition.conditions
340
- ? condition.when?.startsWith(parentPath)
341
- : _.some(condition.conditions, cond => cond.component.startsWith(parentPath));
342
- if (dataParent && isTriggerCondtionComponentPath) {
343
- const newRow = {};
344
- _.set(newRow, parentPath, row);
345
- row = newRow;
326
+ if (dataParent) {
327
+ const parentPath = dataParent.paths?.localDataPath;
328
+ const isTriggerCondtionComponentPath = condition.when || !condition.conditions
329
+ ? condition.when?.startsWith(dataParent.paths?.localPath)
330
+ : _.some(condition.conditions, cond => cond.component.startsWith(dataParent.paths?.localPath));
331
+ if (isTriggerCondtionComponentPath) {
332
+ const newRow = {};
333
+ _.set(newRow, parentPath, row);
334
+ row = newRow;
335
+ }
346
336
  }
347
337
  return row;
348
338
  }
@@ -1478,15 +1468,10 @@ export function getComponentPathWithoutIndicies(path = '') {
1478
1468
  /**
1479
1469
  * Returns a path to the component which based on its schema
1480
1470
  * @param {import('@formio/core').Component} component - Component containing link to its parent's schema in the 'parent' property
1481
- * @param {string} path - Path to the component
1482
1471
  * @returns {string} - Path to the component
1483
1472
  */
1484
- export function getComponentPath(component, path = '') {
1485
- if (!component || !component.key || component?._form?.display === 'wizard') { // unlike the Webform, the Wizard has the key and it is a duplicate of the panel key
1486
- return path;
1487
- }
1488
- path = component.isInputComponent || component.input === true ? `${component.key}${path ? '.' : ''}${path}` : path;
1489
- return getComponentPath(component.parent, path);
1473
+ export function getComponentPath(component) {
1474
+ return component.paths.localDataPath;
1490
1475
  }
1491
1476
  /**
1492
1477
  * Returns a parent component of the passed component instance skipping all the Layout components
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formio/js",
3
- "version": "5.0.0-dev.5925.ef39512",
3
+ "version": "5.0.0-dev.5933.3445318",
4
4
  "description": "JavaScript powered Forms with JSON Form Builder",
5
5
  "main": "lib/cjs/index.js",
6
6
  "exports": {
@@ -80,10 +80,10 @@
80
80
  },
81
81
  "homepage": "https://github.com/formio/formio.js#readme",
82
82
  "dependencies": {
83
- "@formio/bootstrap": "3.0.0-dev.98.17ba6ea",
83
+ "@formio/bootstrap": "3.0.0-dev.119.c4cb299",
84
84
  "@formio/choices.js": "^10.2.1",
85
- "@formio/core": "2.1.0-dev.191.8c609ab",
86
- "@formio/text-mask-addons": "^3.8.0-formio.3",
85
+ "@formio/core": "2.1.0-dev.193.68cf8c3",
86
+ "@formio/text-mask-addons": "3.8.0-formio.4",
87
87
  "@formio/vanilla-text-mask": "^5.1.1-formio.1",
88
88
  "abortcontroller-polyfill": "^1.7.5",
89
89
  "autocompleter": "^8.0.4",