@formio/js 5.0.0 → 5.1.0-rc.1

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 (80) hide show
  1. package/dist/formio.embed.js +1 -1
  2. package/dist/formio.embed.min.js +1 -1
  3. package/dist/formio.embed.min.js.LICENSE.txt +1 -1
  4. package/dist/formio.form.js +120 -109
  5. package/dist/formio.form.min.js +1 -1
  6. package/dist/formio.form.min.js.LICENSE.txt +3 -3
  7. package/dist/formio.full.js +121 -110
  8. package/dist/formio.full.min.js +1 -1
  9. package/dist/formio.full.min.js.LICENSE.txt +3 -3
  10. package/dist/formio.js +3011 -281
  11. package/dist/formio.min.js +1 -1
  12. package/dist/formio.min.js.LICENSE.txt +14 -2
  13. package/dist/formio.utils.js +55 -44
  14. package/dist/formio.utils.min.js +1 -1
  15. package/dist/formio.utils.min.js.LICENSE.txt +3 -3
  16. package/lib/cjs/Webform.d.ts +8 -1
  17. package/lib/cjs/Webform.js +40 -32
  18. package/lib/cjs/WebformBuilder.js +4 -12
  19. package/lib/cjs/Wizard.js +4 -11
  20. package/lib/cjs/components/Components.d.ts +0 -7
  21. package/lib/cjs/components/Components.js +1 -33
  22. package/lib/cjs/components/_classes/component/Component.d.ts +37 -7
  23. package/lib/cjs/components/_classes/component/Component.js +70 -26
  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 +38 -53
  28. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
  29. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +7 -44
  30. package/lib/cjs/components/datagrid/DataGrid.d.ts +0 -1
  31. package/lib/cjs/components/datagrid/DataGrid.js +1 -45
  32. package/lib/cjs/components/datamap/DataMap.js +1 -2
  33. package/lib/cjs/components/editgrid/EditGrid.js +6 -6
  34. package/lib/cjs/components/form/Form.d.ts +8 -3
  35. package/lib/cjs/components/form/Form.js +26 -25
  36. package/lib/cjs/components/selectboxes/SelectBoxes.js +0 -1
  37. package/lib/cjs/components/signature/Signature.d.ts +0 -1
  38. package/lib/cjs/components/signature/Signature.js +1 -1
  39. package/lib/cjs/utils/conditionOperators/DateGreaterThan.js +2 -2
  40. package/lib/cjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
  41. package/lib/cjs/utils/conditionOperators/IsEmptyValue.js +2 -2
  42. package/lib/cjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
  43. package/lib/cjs/utils/conditionOperators/IsEqualTo.js +2 -2
  44. package/lib/cjs/utils/formUtils.d.ts +25 -14
  45. package/lib/cjs/utils/formUtils.js +11 -16
  46. package/lib/cjs/utils/utils.d.ts +1 -3
  47. package/lib/cjs/utils/utils.js +19 -35
  48. package/lib/mjs/Webform.d.ts +8 -1
  49. package/lib/mjs/Webform.js +37 -31
  50. package/lib/mjs/WebformBuilder.js +4 -12
  51. package/lib/mjs/Wizard.js +2 -8
  52. package/lib/mjs/components/Components.d.ts +0 -7
  53. package/lib/mjs/components/Components.js +1 -32
  54. package/lib/mjs/components/_classes/component/Component.d.ts +37 -7
  55. package/lib/mjs/components/_classes/component/Component.js +80 -27
  56. package/lib/mjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
  57. package/lib/mjs/components/_classes/componentModal/ComponentModal.js +1 -0
  58. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +4 -19
  59. package/lib/mjs/components/_classes/nested/NestedComponent.js +39 -54
  60. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
  61. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +8 -43
  62. package/lib/mjs/components/datagrid/DataGrid.d.ts +0 -1
  63. package/lib/mjs/components/datagrid/DataGrid.js +1 -45
  64. package/lib/mjs/components/datamap/DataMap.js +1 -2
  65. package/lib/mjs/components/editgrid/EditGrid.js +9 -6
  66. package/lib/mjs/components/form/Form.d.ts +8 -3
  67. package/lib/mjs/components/form/Form.js +27 -25
  68. package/lib/mjs/components/selectboxes/SelectBoxes.js +0 -1
  69. package/lib/mjs/components/signature/Signature.d.ts +0 -1
  70. package/lib/mjs/components/signature/Signature.js +1 -1
  71. package/lib/mjs/utils/conditionOperators/DateGreaterThan.js +2 -2
  72. package/lib/mjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
  73. package/lib/mjs/utils/conditionOperators/IsEmptyValue.js +2 -2
  74. package/lib/mjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
  75. package/lib/mjs/utils/conditionOperators/IsEqualTo.js +2 -2
  76. package/lib/mjs/utils/formUtils.d.ts +25 -14
  77. package/lib/mjs/utils/formUtils.js +2 -12
  78. package/lib/mjs/utils/utils.d.ts +1 -3
  79. package/lib/mjs/utils/utils.js +18 -33
  80. package/package.json +4 -4
@@ -1,7 +1,6 @@
1
1
  import _ from 'lodash';
2
2
  import NestedArrayComponent from '../_classes/nestedarray/NestedArrayComponent';
3
3
  import { fastCloneDeep, getFocusableElements } from '../../utils/utils';
4
- import Components from '../Components';
5
4
  import dragula from 'dragula';
6
5
  export default class DataGridComponent extends NestedArrayComponent {
7
6
  static schema(...extend) {
@@ -407,7 +406,6 @@ export default class DataGridComponent extends NestedArrayComponent {
407
406
  }
408
407
  component.rowIndex = rowIndex;
409
408
  component.row = `${rowIndex}-${colIndex}`;
410
- component.path = Components.getComponentPath(component);
411
409
  });
412
410
  }
413
411
  updateRowsComponents(rowIndex) {
@@ -473,6 +471,7 @@ export default class DataGridComponent extends NestedArrayComponent {
473
471
  const options = _.clone(this.options);
474
472
  options.name += `[${rowIndex}]`;
475
473
  options.row = `${rowIndex}-${colIndex}`;
474
+ options.rowIndex = rowIndex;
476
475
  let columnComponent;
477
476
  if (this.builderMode) {
478
477
  col.id = col.id + rowIndex;
@@ -595,49 +594,6 @@ export default class DataGridComponent extends NestedArrayComponent {
595
594
  restoreComponentsContext() {
596
595
  this.rows.forEach((row, index) => _.forIn(row, (component) => component.data = this.dataValue[index]));
597
596
  }
598
- getComponent(path, fn) {
599
- path = Array.isArray(path) ? path : [path];
600
- const [key, ...remainingPath] = path;
601
- let result = [];
602
- if (_.isNumber(key) && remainingPath.length) {
603
- const compKey = remainingPath.pop();
604
- result = this.rows[key][compKey];
605
- // If the component is inside a Layout Component, try to find it among all the row's components
606
- if (!result) {
607
- Object.entries(this.rows[key]).forEach(([, comp]) => {
608
- if ('getComponent' in comp) {
609
- const possibleResult = comp.getComponent([compKey], fn);
610
- if (possibleResult) {
611
- result = possibleResult;
612
- }
613
- }
614
- });
615
- }
616
- if (result && _.isFunction(fn)) {
617
- fn(result, this.getComponents());
618
- }
619
- if (remainingPath.length && 'getComponent' in result) {
620
- return result.getComponent(remainingPath, fn);
621
- }
622
- return result;
623
- }
624
- if (!_.isString(key)) {
625
- return result;
626
- }
627
- this.everyComponent((component, components) => {
628
- if (component.component.key === key) {
629
- let comp = component;
630
- if (remainingPath.length > 0 && 'getComponent' in component) {
631
- comp = component.getComponent(remainingPath, fn);
632
- }
633
- else if (fn) {
634
- fn(component, components);
635
- }
636
- result = result.concat(comp);
637
- }
638
- });
639
- return result.length > 0 ? result : null;
640
- }
641
597
  toggleGroup(element, index) {
642
598
  element.classList.toggle('collapsed');
643
599
  _.each(this.refs.chunks[index], row => {
@@ -3,7 +3,6 @@ import DataGridComponent from '../datagrid/DataGrid';
3
3
  import _ from 'lodash';
4
4
  import EventEmitter from 'eventemitter3';
5
5
  import { componentValueTypes, getComponentSavedTypes, uniqueKey } from '../../utils/utils';
6
- import Components from '../Components';
7
6
  export default class DataMapComponent extends DataGridComponent {
8
7
  static schema(...extend) {
9
8
  return Component.schema({
@@ -227,6 +226,7 @@ export default class DataMapComponent extends DataGridComponent {
227
226
  options.events = new EventEmitter();
228
227
  options.name += `[${rowIndex}]`;
229
228
  options.row = `${rowIndex}`;
229
+ options.rowIndex = rowIndex;
230
230
  const components = {};
231
231
  components['__key'] = this.createComponent(this.keySchema, options, { __key: this.builderMode ? this.defaultRowKey : key });
232
232
  components['__key'].on('componentChange', (event) => {
@@ -236,7 +236,6 @@ export default class DataMapComponent extends DataGridComponent {
236
236
  delete dataValue[key];
237
237
  const comp = components[this.valueKey];
238
238
  comp.component.key = newKey;
239
- comp.path = Components.getComponentPath(comp);
240
239
  key = newKey;
241
240
  });
242
241
  const valueComponent = _.clone(this.component.valueComponent);
@@ -913,6 +913,7 @@ export default class EditGridComponent extends NestedArrayComponent {
913
913
  const options = _.clone(this.options);
914
914
  options.name += `[${rowIndex}]`;
915
915
  options.row = `${rowIndex}-${colIndex}`;
916
+ options.rowIndex = rowIndex;
916
917
  options.onChange = (flags = {}, changed, modified) => {
917
918
  if (changed.instance.root?.id && (this.root?.id !== changed.instance.root.id)) {
918
919
  changed.instance.root.triggerChange(flags, changed, modified);
@@ -929,7 +930,7 @@ export default class EditGridComponent extends NestedArrayComponent {
929
930
  ...flags,
930
931
  changed,
931
932
  }, editRow.data, editRow.components);
932
- this.validateRow(editRow, false);
933
+ this.validateRow(editRow, false, false);
933
934
  }
934
935
  if (this.variableTypeComponentsIndexes.length) {
935
936
  this.checkRowVariableTypeComponents(editRow, rowIndex);
@@ -969,22 +970,24 @@ export default class EditGridComponent extends NestedArrayComponent {
969
970
  validateRow(editRow, dirty, forceSilentCheck, fromSubmission) {
970
971
  editRow.errors = [];
971
972
  if (this.shouldValidateRow(editRow, dirty, fromSubmission)) {
972
- const silentCheck = (this.component.rowDrafts && !this.shouldValidateDraft(editRow)) || forceSilentCheck;
973
+ const silentCheck = forceSilentCheck === false ? false : ((this.component.rowDrafts && !this.shouldValidateDraft(editRow)) || forceSilentCheck);
973
974
  const rootValue = fastCloneDeep(this.rootValue);
974
975
  const editGridValue = _.get(rootValue, this.path, []);
975
976
  editGridValue[editRow.rowIndex] = editRow.data;
976
977
  _.set(rootValue, this.path, editGridValue);
977
978
  const validationProcessorProcess = (context) => this.validationProcessor(context, { dirty, silentCheck });
978
979
  const errors = processSync({
979
- components: fastCloneDeep(this.component.components).map((component) => {
980
- component.parentPath = `${this.path}[${editRow.rowIndex}]`;
981
- return component;
982
- }),
980
+ components: this.component.components,
983
981
  data: rootValue,
984
982
  row: editRow.data,
985
983
  process: 'validateRow',
986
984
  instances: this.componentsMap,
987
985
  scope: { errors: [] },
986
+ parent: this.component,
987
+ parentPaths: {
988
+ ...this.paths,
989
+ dataIndex: editRow.rowIndex
990
+ },
988
991
  processors: [
989
992
  {
990
993
  process: validationProcessorProcess,
@@ -21,7 +21,7 @@ export default class FormComponent extends Component {
21
21
  get useOriginalRevision(): any;
22
22
  setFormRevision(rev: any): void;
23
23
  subFormRevision: any;
24
- getComponent(path: any, fn: any): any;
24
+ getComponent(path: any): any;
25
25
  getSubOptions(options?: {}): {};
26
26
  render(): string;
27
27
  asString(value: any): any;
@@ -55,8 +55,6 @@ export default class FormComponent extends Component {
55
55
  */
56
56
  loadSubForm(fromAttach: boolean): Promise<any>;
57
57
  subFormLoading: boolean | undefined;
58
- get subFormData(): any;
59
- checkComponentValidity(data: any, dirty: any, row: any, options: any, errors?: any[]): any;
60
58
  checkComponentConditions(data: any, flags: any, row: any): any;
61
59
  calculateValue(data: any, flags: any, row: any): any;
62
60
  setPristine(pristine: any): void;
@@ -90,6 +88,13 @@ export default class FormComponent extends Component {
90
88
  isHidden(): boolean;
91
89
  setValue(submission: any, flags?: {}): boolean;
92
90
  setSubFormValue(submission: any, flags: any): void;
91
+ /**
92
+ * Sets the subform value
93
+ * @param {object|null|undefined} submission - The submission to set.
94
+ * @param {object|null|undefined} flags - Any flags to apply when setting the submission.
95
+ * @return {void}
96
+ */
97
+ onSetSubFormValue(submission: object | null | undefined, flags: object | null | undefined): void;
93
98
  areAllComponentsEmpty(data: any): boolean;
94
99
  updateSubFormVisibility(): void;
95
100
  /**
@@ -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,15 +127,11 @@ 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 = {}) {
@@ -203,6 +199,7 @@ export default class FormComponent extends Component {
203
199
  if (this.options.skipDraftRestore) {
204
200
  options.skipDraftRestore = this.options.skipDraftRestore;
205
201
  }
202
+ options.parent = this;
206
203
  return options;
207
204
  }
208
205
  /* eslint-enable max-statements */
@@ -294,6 +291,7 @@ export default class FormComponent extends Component {
294
291
  const modalShouldBeOpened = this.componentModal ? this.componentModal.isOpened : false;
295
292
  const currentValue = modalShouldBeOpened ? this.componentModal.currentValue : this.dataValue;
296
293
  this.componentModal = new ComponentModal(this, element, modalShouldBeOpened, currentValue, this._referenceAttributeName);
294
+ this.subForm.element = this.componentModal.refs.componentContent || this.subForm.element;
297
295
  this.setOpenModalElement();
298
296
  }
299
297
  this.calculateValue();
@@ -391,6 +389,10 @@ export default class FormComponent extends Component {
391
389
  return (new Form(form, this.getSubOptions())).ready.then((instance) => {
392
390
  this.subForm = instance;
393
391
  this.subForm.currentForm = this;
392
+ const componentsMap = this.componentsMap;
393
+ const formComponentsMap = this.subForm.componentsMap;
394
+ _.assign(componentsMap, formComponentsMap);
395
+ this.component.components = this.subForm.components.map((comp) => comp.component);
394
396
  this.subForm.parent = this;
395
397
  this.subForm.parentVisible = this.visible;
396
398
  this.subForm.on('change', () => {
@@ -409,6 +411,8 @@ export default class FormComponent extends Component {
409
411
  this.valueChanged = this.hasSetValue;
410
412
  this.onChange();
411
413
  return this.subForm;
414
+ }).catch((err) => {
415
+ console.log(err);
412
416
  });
413
417
  }).then((subForm) => {
414
418
  this.updateSubWizards(subForm);
@@ -464,17 +468,6 @@ export default class FormComponent extends Component {
464
468
  }
465
469
  return Promise.resolve();
466
470
  }
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
471
  checkComponentConditions(data, flags, row) {
479
472
  const visible = super.checkComponentConditions(data, flags, row);
480
473
  // Return if already hidden
@@ -482,14 +475,14 @@ export default class FormComponent extends Component {
482
475
  return visible;
483
476
  }
484
477
  if (this.subForm) {
485
- return this.subForm.checkConditions(this.subFormData);
478
+ return this.subForm.checkConditions(data, flags, row);
486
479
  }
487
480
  // There are few cases when subForm is not loaded when a change is triggered,
488
481
  // so we need to perform checkConditions after it is ready, or some conditional fields might be hidden in View mode
489
482
  else if (this.subFormReady) {
490
483
  this.subFormReady.then(() => {
491
484
  if (this.subForm) {
492
- return this.subForm.checkConditions(this.subFormData);
485
+ return this.subForm.checkConditions(data, flags, row);
493
486
  }
494
487
  });
495
488
  }
@@ -497,7 +490,7 @@ export default class FormComponent extends Component {
497
490
  }
498
491
  calculateValue(data, flags, row) {
499
492
  if (this.subForm) {
500
- return this.subForm.calculateValue(this.subFormData, flags);
493
+ return this.subForm.calculateValue(data, flags, row);
501
494
  }
502
495
  return super.calculateValue(data, flags, row);
503
496
  }
@@ -539,7 +532,7 @@ export default class FormComponent extends Component {
539
532
  }
540
533
  this.subForm.nosubmit = false;
541
534
  this.subForm.submitted = true;
542
- return this.subForm.submitForm().then(result => {
535
+ return this.subForm.submitForm({}, true).then(result => {
543
536
  this.subForm.loading = false;
544
537
  this.subForm.showAllErrors = false;
545
538
  this.dataValue = result.submission;
@@ -639,9 +632,18 @@ export default class FormComponent extends Component {
639
632
  });
640
633
  }
641
634
  else {
642
- this.subForm.setValue(submission, flags);
635
+ this.onSetSubFormValue(submission, flags);
643
636
  }
644
637
  }
638
+ /**
639
+ * Sets the subform value
640
+ * @param {object|null|undefined} submission - The submission to set.
641
+ * @param {object|null|undefined} flags - Any flags to apply when setting the submission.
642
+ * @return {void}
643
+ */
644
+ onSetSubFormValue(submission, flags) {
645
+ this.subForm.setValue(submission, flags);
646
+ }
645
647
  isEmpty(value = this.dataValue) {
646
648
  return value === null || _.isEqual(value, this.emptyValue) || (this.areAllComponentsEmpty(value?.data) && !value?._id);
647
649
  }
@@ -276,7 +276,6 @@ export default class SelectBoxesComponent extends RadioComponent {
276
276
  else {
277
277
  return super.setCustomValidity(messages, dirty, external);
278
278
  }
279
- ;
280
279
  }
281
280
  validateValueAvailability(setting, value) {
282
281
  if (!boolValue(setting) || !value) {
@@ -22,7 +22,6 @@ export default class SignatureComponent extends Input {
22
22
  showCanvas(show: any): void;
23
23
  onDisabled(): void;
24
24
  checkSize(force: any, scale: any): void;
25
- getModalPreviewTemplate(): any;
26
25
  signaturePad: SignaturePad | null | undefined;
27
26
  observer: any;
28
27
  getValueAsString(value: any): "" | "Yes" | "No";
@@ -169,7 +169,7 @@ export default class SignatureComponent extends Input {
169
169
  return false;
170
170
  }
171
171
  getModalPreviewTemplate() {
172
- return this.renderTemplate('modalPreview', {
172
+ return this.renderModalPreview({
173
173
  previewText: this.dataValue ?
174
174
  `<img src=${this.dataValue} ${this._referenceAttributeName}='openModal' style="width: 100%;height: 100%;" />` :
175
175
  this.t('Click to Sign')
@@ -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.
@@ -515,7 +514,6 @@ export namespace componentValueTypes {
515
514
  let any: string;
516
515
  }
517
516
  export function interpolateErrors(component: Component, errors: FieldError[], interpolateFn: Function): [];
518
- import jsonLogic from 'json-logic-js';
519
517
  import ConditionOperators from './conditionOperators';
520
518
  import { Evaluator } from './Evaluator';
521
519
  export const interpolate: typeof Evaluator.interpolate;
@@ -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
  });
@@ -259,12 +248,12 @@ export function checkSimpleConditional(component, condition, row, data, instance
259
248
  */
260
249
  export function getComponentActualValue(compPath, data, row) {
261
250
  let value = null;
262
- if (row) {
263
- value = getValue({ data: row }, compPath);
264
- }
265
- if (data && _.isNil(value)) {
251
+ if (data) {
266
252
  value = getValue({ data }, compPath);
267
253
  }
254
+ if (row && _.isNil(value)) {
255
+ value = getValue({ data: row }, compPath);
256
+ }
268
257
  // FOR-400 - Fix issue where falsey values were being evaluated as show=true
269
258
  if (_.isNil(value) || (_.isObject(value) && _.isEmpty(value))) {
270
259
  value = '';
@@ -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",
3
+ "version": "5.1.0-rc.1",
4
4
  "description": "JavaScript powered Forms with JSON Form Builder",
5
5
  "main": "lib/cjs/index.js",
6
6
  "exports": {
@@ -79,10 +79,10 @@
79
79
  },
80
80
  "homepage": "https://github.com/formio/formio.js#readme",
81
81
  "dependencies": {
82
- "@formio/bootstrap": "3.0.0",
82
+ "@formio/bootstrap": "3.1.0-rc.1",
83
83
  "@formio/choices.js": "^10.2.1",
84
- "@formio/core": "2.3.0",
85
- "@formio/text-mask-addons": "^3.8.0-formio.3",
84
+ "@formio/core": "2.4.0-rc.1",
85
+ "@formio/text-mask-addons": "^3.8.0-formio.4",
86
86
  "@formio/vanilla-text-mask": "^5.1.1-formio.1",
87
87
  "abortcontroller-polyfill": "^1.7.5",
88
88
  "autocompleter": "^8.0.4",