@formio/js 5.0.0 → 5.1.0-rc.2

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 (84) 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 +127 -116
  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 +128 -117
  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 +3013 -283
  11. package/dist/formio.min.js +1 -1
  12. package/dist/formio.min.js.LICENSE.txt +14 -2
  13. package/dist/formio.utils.js +60 -49
  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 +52 -7
  23. package/lib/cjs/components/_classes/component/Component.js +120 -42
  24. package/lib/cjs/components/_classes/component/editForm/Component.edit.data.js +2 -2
  25. package/lib/cjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
  26. package/lib/cjs/components/_classes/componentModal/ComponentModal.js +1 -0
  27. package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +4 -19
  28. package/lib/cjs/components/_classes/nested/NestedComponent.js +54 -60
  29. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
  30. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +7 -44
  31. package/lib/cjs/components/datagrid/DataGrid.d.ts +0 -1
  32. package/lib/cjs/components/datagrid/DataGrid.js +1 -45
  33. package/lib/cjs/components/datamap/DataMap.js +2 -3
  34. package/lib/cjs/components/editgrid/EditGrid.js +8 -11
  35. package/lib/cjs/components/form/Form.d.ts +8 -3
  36. package/lib/cjs/components/form/Form.js +31 -29
  37. package/lib/cjs/components/html/HTML.js +15 -3
  38. package/lib/cjs/components/selectboxes/SelectBoxes.js +0 -1
  39. package/lib/cjs/components/signature/Signature.d.ts +0 -1
  40. package/lib/cjs/components/signature/Signature.js +1 -1
  41. package/lib/cjs/utils/conditionOperators/DateGreaterThan.js +2 -2
  42. package/lib/cjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
  43. package/lib/cjs/utils/conditionOperators/IsEmptyValue.js +2 -2
  44. package/lib/cjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
  45. package/lib/cjs/utils/conditionOperators/IsEqualTo.js +2 -2
  46. package/lib/cjs/utils/formUtils.d.ts +25 -14
  47. package/lib/cjs/utils/formUtils.js +11 -16
  48. package/lib/cjs/utils/utils.d.ts +1 -3
  49. package/lib/cjs/utils/utils.js +19 -35
  50. package/lib/mjs/Webform.d.ts +8 -1
  51. package/lib/mjs/Webform.js +37 -31
  52. package/lib/mjs/WebformBuilder.js +4 -12
  53. package/lib/mjs/Wizard.js +2 -8
  54. package/lib/mjs/components/Components.d.ts +0 -7
  55. package/lib/mjs/components/Components.js +1 -32
  56. package/lib/mjs/components/_classes/component/Component.d.ts +52 -7
  57. package/lib/mjs/components/_classes/component/Component.js +130 -43
  58. package/lib/mjs/components/_classes/component/editForm/Component.edit.data.js +2 -2
  59. package/lib/mjs/components/_classes/componentModal/ComponentModal.d.ts +1 -0
  60. package/lib/mjs/components/_classes/componentModal/ComponentModal.js +1 -0
  61. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +4 -19
  62. package/lib/mjs/components/_classes/nested/NestedComponent.js +55 -61
  63. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -1
  64. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +8 -43
  65. package/lib/mjs/components/datagrid/DataGrid.d.ts +0 -1
  66. package/lib/mjs/components/datagrid/DataGrid.js +1 -45
  67. package/lib/mjs/components/datamap/DataMap.js +2 -3
  68. package/lib/mjs/components/editgrid/EditGrid.js +11 -11
  69. package/lib/mjs/components/form/Form.d.ts +8 -3
  70. package/lib/mjs/components/form/Form.js +32 -29
  71. package/lib/mjs/components/html/HTML.js +15 -3
  72. package/lib/mjs/components/selectboxes/SelectBoxes.js +0 -1
  73. package/lib/mjs/components/signature/Signature.d.ts +0 -1
  74. package/lib/mjs/components/signature/Signature.js +1 -1
  75. package/lib/mjs/utils/conditionOperators/DateGreaterThan.js +2 -2
  76. package/lib/mjs/utils/conditionOperators/IsEmptyValue.d.ts +2 -2
  77. package/lib/mjs/utils/conditionOperators/IsEmptyValue.js +2 -2
  78. package/lib/mjs/utils/conditionOperators/IsEqualTo.d.ts +2 -2
  79. package/lib/mjs/utils/conditionOperators/IsEqualTo.js +2 -2
  80. package/lib/mjs/utils/formUtils.d.ts +25 -14
  81. package/lib/mjs/utils/formUtils.js +2 -12
  82. package/lib/mjs/utils/utils.d.ts +1 -3
  83. package/lib/mjs/utils/utils.js +18 -33
  84. package/package.json +4 -4
@@ -2,7 +2,8 @@
2
2
  import _ from 'lodash';
3
3
  import Field from '../field/Field';
4
4
  import Components from '../../Components';
5
- import { getArrayFromComponentPath, getStringFromComponentPath, getRandomComponentId } from '../../../utils/utils';
5
+ '';
6
+ import { getComponentPaths, getRandomComponentId, componentMatches, getBestMatch, getStringFromComponentPath } from '../../../utils/utils';
6
7
  import { process as processAsync, processSync } from '@formio/core/process';
7
8
  /**
8
9
  * NestedComponent class.
@@ -80,17 +81,26 @@ export default class NestedComponent extends Field {
80
81
  const visibilityChanged = this._visible !== value;
81
82
  this._visible = value;
82
83
  const isVisible = this.visible;
84
+ const isConditionallyHidden = this.checkConditionallyHidden();
83
85
  const forceShow = this.shouldForceShow();
84
86
  const forceHide = this.shouldForceHide();
85
- this.components.forEach(component => {
87
+ this.components.forEach((component) => {
86
88
  // Set the parent visibility first since we may have nested components within nested components
87
89
  // and they need to be able to determine their visibility based on the parent visibility.
88
90
  component.parentVisible = isVisible;
89
- const conditionallyVisible = component.conditionallyVisible();
90
- if (forceShow || conditionallyVisible) {
91
+ component._parentConditionallyHidden = isConditionallyHidden;
92
+ let visible;
93
+ if (component.hasCondition()) {
94
+ component._conditionallyHidden = component.checkConditionallyHidden() || component._parentConditionallyHidden;
95
+ visible = !component.conditionallyHidden;
96
+ }
97
+ else {
98
+ visible = !component.component.hidden;
99
+ }
100
+ if (forceShow || visible) {
91
101
  component.visible = true;
92
102
  }
93
- else if (forceHide || !isVisible || !conditionallyVisible) {
103
+ else if (forceHide || !isVisible || !visible) {
94
104
  component.visible = false;
95
105
  }
96
106
  // If hiding a nested component, clear all errors below.
@@ -99,7 +109,6 @@ export default class NestedComponent extends Field {
99
109
  }
100
110
  });
101
111
  if (visibilityChanged) {
102
- this.clearOnHide();
103
112
  this.redraw();
104
113
  }
105
114
  }
@@ -198,6 +207,10 @@ export default class NestedComponent extends Field {
198
207
  */
199
208
  set rowIndex(value) {
200
209
  this._rowIndex = value;
210
+ this.paths = getComponentPaths(this.component, this.parent?.component, {
211
+ ...(this.parent?.paths || {}),
212
+ ...{ dataIndex: value }
213
+ });
201
214
  this.eachComponent((component) => {
202
215
  component.rowIndex = value;
203
216
  });
@@ -293,56 +306,36 @@ export default class NestedComponent extends Field {
293
306
  });
294
307
  }
295
308
  /**
296
- * Returns a component provided a key. This performs a deep search within the
297
- * component tree.
309
+ * Returns a component provided a key. This performs a deep search within the component tree.
298
310
  * @param {string} path - The path to the component.
299
- * @param {Function} [fn] - Called with the component once found.
300
- * @param {string} [originalPath] - The original path to the component.
301
311
  * @returns {any} - The component that is located.
302
312
  */
303
- getComponent(path, fn, originalPath) {
304
- originalPath = originalPath || getStringFromComponentPath(path);
305
- if (this.componentsMap.hasOwnProperty(originalPath)) {
306
- if (fn) {
307
- return fn(this.componentsMap[originalPath]);
308
- }
309
- else {
310
- return this.componentsMap[originalPath];
311
- }
312
- }
313
- path = getArrayFromComponentPath(path);
314
- const pathStr = originalPath;
315
- const newPath = _.clone(path);
316
- let key = newPath.shift();
317
- const remainingPath = newPath;
318
- let comp = null;
319
- let possibleComp = null;
320
- if (_.isNumber(key)) {
321
- key = remainingPath.shift();
322
- }
323
- if (!_.isString(key)) {
324
- return comp;
325
- }
326
- this.everyComponent((component, components) => {
327
- const matchPath = component.hasInput && component.path ? pathStr.includes(component.path) : true;
328
- if (component.component.key === key) {
329
- possibleComp = component;
330
- if (matchPath) {
331
- comp = component;
332
- if (remainingPath.length > 0 && 'getComponent' in component) {
333
- comp = component.getComponent(remainingPath, fn, originalPath);
334
- }
335
- else if (fn) {
336
- fn(component, components);
337
- }
338
- return false;
339
- }
340
- }
313
+ getComponent(path) {
314
+ path = getStringFromComponentPath(path);
315
+ const matches = {
316
+ path: undefined,
317
+ fullPath: undefined,
318
+ localPath: undefined,
319
+ fullLocalPath: undefined,
320
+ dataPath: undefined,
321
+ localDataPath: undefined,
322
+ key: undefined,
323
+ };
324
+ this.everyComponent((component) => {
325
+ // All searches are relative to this component so replace this path from the child paths.
326
+ componentMatches(component.component, {
327
+ path: component.paths?.path?.replace(new RegExp(`^${this.paths?.path}\\.?`), ''),
328
+ fullPath: component.paths?.fullPath?.replace(new RegExp(`^${this.paths?.fullPath}\\.?`), ''),
329
+ localPath: component.paths?.localPath?.replace(new RegExp(`^${this.paths?.localPath}\\.?`), ''),
330
+ fullLocalPath: component.paths?.fullLocalPath?.replace(new RegExp(`^${this.paths?.fullLocalPath}\\.?`), ''),
331
+ dataPath: component.paths?.dataPath?.replace(new RegExp(`^${this.paths?.dataPath}\\.?`), ''),
332
+ localDataPath: component.paths?.localDataPath?.replace(new RegExp(`^${this.paths?.localDataPath}\\.?`), ''),
333
+ }, path, this.rowIndex, matches, (type, match) => {
334
+ match.instance = component;
335
+ return match;
336
+ });
341
337
  });
342
- if (!comp) {
343
- comp = possibleComp;
344
- }
345
- return comp;
338
+ return getBestMatch(matches)?.instance;
346
339
  }
347
340
  /**
348
341
  * Return a component provided the Id of the component.
@@ -380,6 +373,7 @@ export default class NestedComponent extends Field {
380
373
  data = data || this.data;
381
374
  options.parent = this;
382
375
  options.parentVisible = this.visible;
376
+ options.parentConditionallyHidden = this.conditionallyHidden;
383
377
  options.root = options?.root || this.root || this;
384
378
  options.localRoot = this.localRoot;
385
379
  options.skipInit = true;
@@ -638,7 +632,7 @@ export default class NestedComponent extends Field {
638
632
  clearOnHide(show) {
639
633
  super.clearOnHide(show);
640
634
  if (this.component.clearOnHide) {
641
- if (this.allowData && !this.hasValue() && !(this.options.server && !this.visible)) {
635
+ if (this.allowData && !this.hasValue() && !this.conditionallyHidden) {
642
636
  this.dataValue = this.defaultValue;
643
637
  }
644
638
  if (this.hasValue()) {
@@ -667,7 +661,7 @@ export default class NestedComponent extends Field {
667
661
  }
668
662
  calculateValue(data, flags, row) {
669
663
  // Do not iterate into children and calculateValues if this nested component is conditionally hidden.
670
- if (!this.conditionallyVisible()) {
664
+ if (this.conditionallyHidden) {
671
665
  return false;
672
666
  }
673
667
  return this.getComponents().reduce((changed, comp) => comp.calculateValue(data, flags, row) || changed, super.calculateValue(data, flags, row));
@@ -678,19 +672,16 @@ export default class NestedComponent extends Field {
678
672
  isValid(data, dirty) {
679
673
  return this.getComponents().reduce((valid, comp) => comp.isValid(data, dirty) && valid, super.isValid(data, dirty));
680
674
  }
681
- validationProcessor({ scope, data, row, instance, component }, flags) {
675
+ validationProcessor({ scope, data, row, instance, paths }, flags) {
682
676
  const { dirty } = flags;
683
677
  if (this.root.hasExtraPages && this.page !== this.root.page) {
684
- instance = this.childComponentsMap?.hasOwnProperty(component.path)
685
- ? this.childComponentsMap[component.path]
686
- : this.getComponent(component.path);
678
+ instance = this.componentsMap?.hasOwnProperty(paths.dataPath)
679
+ ? this.componentsMap[paths.dataPath]
680
+ : this.getComponent(paths.dataPath);
687
681
  }
688
682
  if (!instance) {
689
683
  return;
690
684
  }
691
- if (!instance.component.path) {
692
- instance.component.path = component.path;
693
- }
694
685
  instance.checkComponentValidity(data, dirty, row, flags, scope.errors);
695
686
  if (instance.processOwnValidation) {
696
687
  scope.noRecurse = true;
@@ -722,7 +713,10 @@ export default class NestedComponent extends Field {
722
713
  components,
723
714
  instances: this.componentsMap,
724
715
  data: data,
716
+ local: !!flags.local,
725
717
  scope: { errors: [] },
718
+ parent: this.component,
719
+ parentPaths: this.paths,
726
720
  processors: [
727
721
  {
728
722
  process: validationProcessorProcess,
@@ -2,6 +2,8 @@ export default class NestedArrayComponent extends NestedDataComponent {
2
2
  static savedValueTypes(): string[];
3
3
  componentContext(component: any): any;
4
4
  get iteratableRows(): void;
5
+ set rowIndex(value: number | undefined);
6
+ get rowIndex(): number | undefined;
5
7
  prevHasAddButton: any;
6
8
  checkAddButtonChanged(): void;
7
9
  checkData(data: any, flags: any, row: any): any;
@@ -10,7 +12,6 @@ export default class NestedArrayComponent extends NestedDataComponent {
10
12
  checkRow(...args: any[]): any;
11
13
  processRow(method: any, data: any, opts: any, row: any, components: any, silentCheck: any): any;
12
14
  hasAddButton(): any;
13
- getComponent(path: any, fn: any, originalPath: any): any;
14
15
  everyComponent(fn: any, rowIndex: any, options?: {}): void;
15
16
  getComponents(rowIndex: any): any;
16
17
  removeSubmissionMetadataRow(index: any): void;
@@ -1,6 +1,8 @@
1
1
  'use strict';
2
2
  import _ from 'lodash';
3
- import { componentValueTypes, getStringFromComponentPath } from '../../../utils/utils';
3
+ import { Utils } from '@formio/core/utils';
4
+ const { getComponentPaths } = Utils;
5
+ import { componentValueTypes, isLayoutComponent } from '../../../utils/utils';
4
6
  import Component from '../component/Component';
5
7
  import NestedDataComponent from '../nesteddata/NestedDataComponent';
6
8
  export default class NestedArrayComponent extends NestedDataComponent {
@@ -19,9 +21,13 @@ export default class NestedArrayComponent extends NestedDataComponent {
19
21
  throw new Error('Getter #iteratableRows() is not implemented');
20
22
  }
21
23
  get rowIndex() {
22
- return super.rowIndex;
24
+ return this._rowIndex;
23
25
  }
24
26
  set rowIndex(value) {
27
+ this.paths = getComponentPaths(this.component, this.parent?.component, {
28
+ ...(this.parent?.paths || {}),
29
+ ...{ dataIndex: value }
30
+ });
25
31
  this._rowIndex = value;
26
32
  }
27
33
  init() {
@@ -84,47 +90,6 @@ export default class NestedArrayComponent extends NestedDataComponent {
84
90
  value: this.dataValue,
85
91
  }, 'show'));
86
92
  }
87
- getComponent(path, fn, originalPath) {
88
- originalPath = originalPath || getStringFromComponentPath(path);
89
- if (this.componentsMap.hasOwnProperty(originalPath)) {
90
- if (fn) {
91
- return fn(this.componentsMap[originalPath]);
92
- }
93
- else {
94
- return this.componentsMap[originalPath];
95
- }
96
- }
97
- path = Array.isArray(path) ? path : [path];
98
- let key = path.shift();
99
- const remainingPath = path;
100
- let result = [];
101
- let possibleComp = null;
102
- let comp = null;
103
- let rowIndex = null;
104
- if (_.isNumber(key)) {
105
- rowIndex = key;
106
- key = remainingPath.shift();
107
- }
108
- if (!_.isString(key)) {
109
- return result;
110
- }
111
- this.everyComponent((component, components) => {
112
- if (component.component.key === key) {
113
- possibleComp = component;
114
- if (remainingPath.length > 0 && 'getComponent' in component) {
115
- comp = component.getComponent(remainingPath, fn, originalPath);
116
- }
117
- else if (fn) {
118
- fn(component, components);
119
- }
120
- result = rowIndex !== null ? comp : result.concat(comp || possibleComp);
121
- }
122
- }, rowIndex);
123
- if ((!result || result.length === 0) && possibleComp) {
124
- result = rowIndex !== null ? possibleComp : [possibleComp];
125
- }
126
- return result;
127
- }
128
93
  everyComponent(fn, rowIndex, options = {}) {
129
94
  if (_.isObject(rowIndex)) {
130
95
  options = rowIndex;
@@ -85,7 +85,6 @@ export default class DataGridComponent extends NestedArrayComponent {
85
85
  show: boolean;
86
86
  };
87
87
  checkComponentConditions(data: any, flags: any, row: any): boolean;
88
- getComponent(path: any, fn: any): any;
89
88
  toggleGroup(element: any, index: any): void;
90
89
  }
91
90
  import NestedArrayComponent from '../_classes/nestedarray/NestedArrayComponent';
@@ -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({
@@ -70,7 +69,7 @@ export default class DataMapComponent extends DataGridComponent {
70
69
  }
71
70
  get dataValue() {
72
71
  if (!this.key ||
73
- (!this.visible && this.component.clearOnHide)) {
72
+ (this.conditionallyHidden && this.component.clearOnHide)) {
74
73
  return this.emptyValue;
75
74
  }
76
75
  if (!this.hasValue() && this.shouldAddDefaultValue) {
@@ -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,
@@ -1129,7 +1132,7 @@ export default class EditGridComponent extends NestedArrayComponent {
1129
1132
  }
1130
1133
  }
1131
1134
  const changed = this.hasChanged(value, this.dataValue);
1132
- if (this.parent && !this.options.server) {
1135
+ if (this.parent) {
1133
1136
  this.parent.checkComponentConditions();
1134
1137
  }
1135
1138
  this.dataValue = value;
@@ -1162,10 +1165,7 @@ export default class EditGridComponent extends NestedArrayComponent {
1162
1165
  this.editRows = this.editRows.slice(0, dataLength);
1163
1166
  this.openWhenEmpty();
1164
1167
  this.updateOnChange(flags, changed);
1165
- // do not call checkData with server option, it is called when change is triggered in updateOnChange
1166
- if (!this.options.server) {
1167
- this.checkData();
1168
- }
1168
+ this.checkData();
1169
1169
  this.changeState(changed, flags);
1170
1170
  return changed;
1171
1171
  }
@@ -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
  /**