@formio/js 5.1.0-dev.6094.c49181e → 5.1.0-dev.6100.6a7b450

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 (139) hide show
  1. package/README.md +7 -0
  2. package/dist/formio.form.js +125 -125
  3. package/dist/formio.form.min.js +1 -1
  4. package/dist/formio.form.min.js.LICENSE.txt +2 -0
  5. package/dist/formio.full.js +132 -132
  6. package/dist/formio.full.min.js +1 -1
  7. package/dist/formio.full.min.js.LICENSE.txt +2 -0
  8. package/dist/formio.js +74 -63
  9. package/dist/formio.min.js +1 -1
  10. package/dist/formio.utils.js +86 -75
  11. package/dist/formio.utils.min.js +1 -1
  12. package/dist/formio.utils.min.js.LICENSE.txt +2 -0
  13. package/lib/cjs/Element.js +13 -36
  14. package/lib/cjs/EventEmitter.js +2 -25
  15. package/lib/cjs/Form.js +2 -25
  16. package/lib/cjs/PDF.js +1 -1
  17. package/lib/cjs/PDFBuilder.js +4 -5
  18. package/lib/cjs/Webform.js +3 -4
  19. package/lib/cjs/WebformBuilder.d.ts +1 -0
  20. package/lib/cjs/WebformBuilder.js +33 -14
  21. package/lib/cjs/Wizard.d.ts +1 -2
  22. package/lib/cjs/Wizard.js +18 -24
  23. package/lib/cjs/WizardBuilder.js +1 -1
  24. package/lib/cjs/components/_classes/component/Component.d.ts +0 -1
  25. package/lib/cjs/components/_classes/component/Component.js +36 -57
  26. package/lib/cjs/components/_classes/component/editForm/Component.edit.conditional.js +1 -1
  27. package/lib/cjs/components/_classes/component/editForm/Component.edit.logic.js +1 -1
  28. package/lib/cjs/components/_classes/componentModal/ComponentModal.js +1 -1
  29. package/lib/cjs/components/_classes/input/Input.js +1 -1
  30. package/lib/cjs/components/_classes/list/ListComponent.js +1 -1
  31. package/lib/cjs/components/_classes/nested/NestedComponent.js +7 -7
  32. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
  33. package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.js +1 -1
  34. package/lib/cjs/components/address/Address.js +1 -1
  35. package/lib/cjs/components/alert/Alert.js +1 -1
  36. package/lib/cjs/components/button/Button.d.ts +1 -1
  37. package/lib/cjs/components/button/Button.js +7 -11
  38. package/lib/cjs/components/checkbox/Checkbox.js +1 -1
  39. package/lib/cjs/components/container/Container.js +1 -1
  40. package/lib/cjs/components/currency/Currency.js +1 -1
  41. package/lib/cjs/components/datagrid/DataGrid.js +5 -1
  42. package/lib/cjs/components/datetime/DateTime.js +1 -1
  43. package/lib/cjs/components/day/Day.js +2 -2
  44. package/lib/cjs/components/editgrid/EditGrid.js +1 -1
  45. package/lib/cjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -1
  46. package/lib/cjs/components/file/File.js +5 -6
  47. package/lib/cjs/components/form/Form.js +14 -2
  48. package/lib/cjs/components/form/editForm/Form.edit.form.js +4 -3
  49. package/lib/cjs/components/number/Number.js +1 -1
  50. package/lib/cjs/components/panel/Panel.js +1 -1
  51. package/lib/cjs/components/radio/Radio.js +1 -1
  52. package/lib/cjs/components/recaptcha/editForm/ReCaptcha.edit.display.js +1 -1
  53. package/lib/cjs/components/select/Select.js +1 -1
  54. package/lib/cjs/components/select/editForm/Select.edit.data.js +1 -1
  55. package/lib/cjs/components/selectboxes/SelectBoxes.js +1 -1
  56. package/lib/cjs/components/signature/Signature.js +1 -1
  57. package/lib/cjs/components/survey/Survey.js +1 -1
  58. package/lib/cjs/components/tags/Tags.js +1 -1
  59. package/lib/cjs/components/textarea/TextArea.js +3 -3
  60. package/lib/cjs/components/textfield/TextField.js +7 -30
  61. package/lib/cjs/components/time/Time.js +1 -1
  62. package/lib/cjs/formio.form.js +3 -3
  63. package/lib/cjs/i18n.js +1 -1
  64. package/lib/cjs/providers/storage/uploadAdapter.js +3 -3
  65. package/lib/cjs/utils/Evaluator.d.ts +20 -6
  66. package/lib/cjs/utils/Evaluator.js +38 -15
  67. package/lib/cjs/utils/builder.js +5 -5
  68. package/lib/cjs/utils/conditionOperators/IsEqualTo.js +3 -3
  69. package/lib/cjs/utils/i18n.js +3 -3
  70. package/lib/cjs/utils/index.d.ts +169 -2
  71. package/lib/cjs/utils/index.js +22 -2
  72. package/lib/cjs/utils/utils.d.ts +4 -9
  73. package/lib/cjs/utils/utils.js +20 -51
  74. package/lib/cjs/widgets/CalendarWidget.d.ts +1 -1
  75. package/lib/cjs/widgets/CalendarWidget.js +5 -7
  76. package/lib/mjs/Element.js +6 -6
  77. package/lib/mjs/EventEmitter.js +2 -2
  78. package/lib/mjs/Form.js +1 -1
  79. package/lib/mjs/PDF.js +1 -1
  80. package/lib/mjs/PDFBuilder.js +1 -2
  81. package/lib/mjs/Webform.js +1 -2
  82. package/lib/mjs/WebformBuilder.d.ts +1 -0
  83. package/lib/mjs/WebformBuilder.js +25 -7
  84. package/lib/mjs/Wizard.d.ts +1 -2
  85. package/lib/mjs/Wizard.js +17 -23
  86. package/lib/mjs/WizardBuilder.js +1 -1
  87. package/lib/mjs/components/_classes/component/Component.d.ts +0 -1
  88. package/lib/mjs/components/_classes/component/Component.js +9 -7
  89. package/lib/mjs/components/_classes/component/editForm/Component.edit.conditional.js +1 -1
  90. package/lib/mjs/components/_classes/component/editForm/Component.edit.logic.js +1 -1
  91. package/lib/mjs/components/_classes/componentModal/ComponentModal.js +1 -1
  92. package/lib/mjs/components/_classes/input/Input.js +1 -1
  93. package/lib/mjs/components/_classes/list/ListComponent.js +1 -1
  94. package/lib/mjs/components/_classes/nested/NestedComponent.js +7 -7
  95. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
  96. package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.js +1 -1
  97. package/lib/mjs/components/address/Address.js +1 -1
  98. package/lib/mjs/components/alert/Alert.js +1 -1
  99. package/lib/mjs/components/button/Button.d.ts +1 -1
  100. package/lib/mjs/components/button/Button.js +7 -10
  101. package/lib/mjs/components/checkbox/Checkbox.js +1 -1
  102. package/lib/mjs/components/container/Container.js +1 -1
  103. package/lib/mjs/components/currency/Currency.js +1 -1
  104. package/lib/mjs/components/datagrid/DataGrid.js +5 -1
  105. package/lib/mjs/components/datetime/DateTime.js +1 -1
  106. package/lib/mjs/components/day/Day.js +2 -2
  107. package/lib/mjs/components/editgrid/EditGrid.js +1 -1
  108. package/lib/mjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -1
  109. package/lib/mjs/components/file/File.js +5 -6
  110. package/lib/mjs/components/form/Form.js +13 -2
  111. package/lib/mjs/components/form/editForm/Form.edit.form.js +3 -2
  112. package/lib/mjs/components/number/Number.js +1 -1
  113. package/lib/mjs/components/panel/Panel.js +1 -1
  114. package/lib/mjs/components/radio/Radio.js +1 -1
  115. package/lib/mjs/components/recaptcha/editForm/ReCaptcha.edit.display.js +1 -1
  116. package/lib/mjs/components/select/Select.js +1 -1
  117. package/lib/mjs/components/select/editForm/Select.edit.data.js +1 -1
  118. package/lib/mjs/components/selectboxes/SelectBoxes.js +1 -1
  119. package/lib/mjs/components/signature/Signature.js +1 -1
  120. package/lib/mjs/components/survey/Survey.js +1 -1
  121. package/lib/mjs/components/tags/Tags.js +1 -1
  122. package/lib/mjs/components/textarea/TextArea.js +3 -3
  123. package/lib/mjs/components/textfield/TextField.js +1 -1
  124. package/lib/mjs/components/time/Time.js +1 -1
  125. package/lib/mjs/formio.form.js +2 -2
  126. package/lib/mjs/i18n.js +1 -1
  127. package/lib/mjs/providers/storage/uploadAdapter.js +3 -3
  128. package/lib/mjs/utils/Evaluator.d.ts +20 -6
  129. package/lib/mjs/utils/Evaluator.js +31 -13
  130. package/lib/mjs/utils/builder.js +1 -1
  131. package/lib/mjs/utils/conditionOperators/IsEqualTo.js +1 -1
  132. package/lib/mjs/utils/i18n.js +1 -1
  133. package/lib/mjs/utils/index.d.ts +169 -2
  134. package/lib/mjs/utils/index.js +18 -1
  135. package/lib/mjs/utils/utils.d.ts +4 -9
  136. package/lib/mjs/utils/utils.js +16 -30
  137. package/lib/mjs/widgets/CalendarWidget.d.ts +1 -1
  138. package/lib/mjs/widgets/CalendarWidget.js +5 -7
  139. package/package.json +6 -5
package/lib/mjs/Wizard.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash';
2
2
  import Webform from './Webform';
3
3
  import { Formio } from './Formio';
4
- import { fastCloneDeep, checkCondition, firstNonNil, uniqueKey, eachComponent, } from './utils/utils';
4
+ import { fastCloneDeep, checkCondition, firstNonNil, uniqueKey, eachComponent, } from './utils';
5
5
  export default class Wizard extends Webform {
6
6
  /**
7
7
  * Constructor for wizard-based forms.
@@ -29,7 +29,6 @@ export default class Wizard extends Webform {
29
29
  this.originalComponents = [];
30
30
  this.page = 0;
31
31
  this.currentPanel = null;
32
- this.currentPanels = null;
33
32
  this.currentNextPage = 0;
34
33
  this._seenPages = [0];
35
34
  this.subWizards = [];
@@ -48,12 +47,12 @@ export default class Wizard extends Webform {
48
47
  }
49
48
  getPages(args = {}) {
50
49
  const { all = false } = args;
51
- const pages = this.hasExtraPages ? this.components : this.pages;
50
+ const pages = this.hasSubWizards ? this.components : this.pages;
52
51
  const filteredPages = pages
53
52
  .filter(all ? _.identity : (p, index) => this._seenPages.includes(index));
54
53
  return filteredPages;
55
54
  }
56
- get hasExtraPages() {
55
+ get hasSubWizards() {
57
56
  return !_.isEmpty(this.subWizards);
58
57
  }
59
58
  get data() {
@@ -177,9 +176,9 @@ export default class Wizard extends Webform {
177
176
  }
178
177
  render() {
179
178
  const ctx = this.renderContext;
180
- if (this.component.key) {
181
- ctx.panels.map(panel => {
182
- if (panel.key === this.component.key) {
179
+ if (this.component.id) {
180
+ ctx.panels.forEach(panel => {
181
+ if (panel.id === this.component.id) {
183
182
  this.currentPanel = panel;
184
183
  ctx.wizardPageTooltip = this.getFormattedTooltip(panel.tooltip);
185
184
  }
@@ -580,7 +579,7 @@ export default class Wizard extends Webform {
580
579
  this.pageFieldLogic(num);
581
580
  this.getNextPage();
582
581
  let parentNum = num;
583
- if (this.hasExtraPages) {
582
+ if (this.hasSubWizards) {
584
583
  const pageFromPages = this.pages[num];
585
584
  const pageFromComponents = this.components[num];
586
585
  if (!pageFromComponents || pageFromPages?.id !== pageFromComponents.id) {
@@ -869,23 +868,18 @@ export default class Wizard extends Webform {
869
868
  this.showErrors(errors, true, true);
870
869
  }
871
870
  // If the pages change, need to redraw the header.
872
- let currentPanels;
873
- let panels;
871
+ const currentPanels = this.pages;
872
+ // calling this.establishPages() updates/mutates this.pages to be the current pages
873
+ this.establishPages();
874
+ const newPanels = this.pages;
874
875
  const currentNextPage = this.currentNextPage;
875
- if (this.hasExtraPages) {
876
- currentPanels = this.pages.map(page => page.component.key);
877
- this.establishPages();
878
- panels = this.pages.map(page => page.component.key);
879
- }
880
- else {
881
- currentPanels = this.currentPanels || this.pages.map(page => page.component.key);
882
- panels = this.establishPages().map(panel => panel.key);
883
- this.currentPanels = panels;
884
- if (this.currentPanel?.key && this.currentPanels?.length) {
885
- this.setPage(this.currentPanels.findIndex(panel => panel === this.currentPanel.key));
886
- }
876
+ const panelsUpdated = !_.isEqual(newPanels, currentPanels);
877
+ if (this.currentPanel?.id && this.pages.length && (!this.hasSubWizards || (this.hasSubWizards && panelsUpdated))) {
878
+ const newIndex = this.pages.findIndex(page => page.id === this.currentPanel.id);
879
+ if (newIndex !== -1)
880
+ this.setPage(newIndex);
887
881
  }
888
- if (!_.isEqual(panels, currentPanels) || (flags && flags.fromSubmission)) {
882
+ if (panelsUpdated || (flags && flags.fromSubmission)) {
889
883
  this.redrawHeader();
890
884
  }
891
885
  // If the next page changes, then make sure to redraw navigation.
@@ -2,7 +2,7 @@ import WebformBuilder from './WebformBuilder';
2
2
  import Webform from './Webform';
3
3
  import BuilderUtils from './utils/builder';
4
4
  import _ from 'lodash';
5
- import { fastCloneDeep } from './utils/utils';
5
+ import { fastCloneDeep } from './utils';
6
6
  export default class WizardBuilder extends WebformBuilder {
7
7
  constructor() {
8
8
  let element, options;
@@ -165,7 +165,6 @@ declare class Component extends Element {
165
165
  get componentsMap(): object;
166
166
  /**
167
167
  * Returns if the parent should conditionally clear.
168
- *
169
168
  * @returns {boolean} - If the parent should conditionally clear.
170
169
  */
171
170
  parentShouldConditionallyClear(): boolean;
@@ -5,8 +5,8 @@ import _ from 'lodash';
5
5
  import isMobile from 'ismobilejs';
6
6
  import { processOne, processOneSync, validateProcessInfo } from '@formio/core/process';
7
7
  import { Formio } from '../../../Formio';
8
- import * as FormioUtils from '../../../utils/utils';
9
- import { fastCloneDeep, boolValue, currentTimezone, getScriptPlugin, getContextualRowData } from '../../../utils/utils';
8
+ import FormioUtils from '../../../utils';
9
+ import { fastCloneDeep, boolValue, currentTimezone, getScriptPlugin, getContextualRowData } from '../../../utils';
10
10
  import Element from '../../../Element';
11
11
  import ComponentModal from '../componentModal/ComponentModal';
12
12
  import Widgets from '../../../widgets';
@@ -424,7 +424,6 @@ export default class Component extends Element {
424
424
  }
425
425
  /**
426
426
  * Returns if the parent should conditionally clear.
427
- *
428
427
  * @returns {boolean} - If the parent should conditionally clear.
429
428
  */
430
429
  parentShouldConditionallyClear() {
@@ -2683,13 +2682,16 @@ export default class Component extends Element {
2683
2682
  }
2684
2683
  const isArray = Array.isArray(value);
2685
2684
  const valueInput = this.refs.fileLink || this.refs.input;
2685
+ const isFilelink = !!this.refs.fileLink;
2686
2686
  if (isArray &&
2687
2687
  Array.isArray(this.defaultValue) &&
2688
2688
  this.refs.hasOwnProperty('input') &&
2689
2689
  valueInput &&
2690
2690
  (valueInput.length !== value.length) &&
2691
2691
  this.visible) {
2692
- this.redraw();
2692
+ if (isFilelink || valueInput.length) {
2693
+ this.redraw();
2694
+ }
2693
2695
  }
2694
2696
  if (this.isHtmlRenderMode() && flags && flags.fromSubmission && changed) {
2695
2697
  this.redraw();
@@ -3196,6 +3198,9 @@ export default class Component extends Element {
3196
3198
  data = data || this.rootValue;
3197
3199
  flags = flags || {};
3198
3200
  row = row || this.data;
3201
+ if (flags.noCheck) {
3202
+ return true;
3203
+ }
3199
3204
  // Some components (for legacy reasons) have calls to "checkData" in inappropriate places such
3200
3205
  // as setValue. Historically, this was bypassed by a series of cached states around the data model
3201
3206
  // which caused its own problems. We need to ensure that premium and custom components do not fall into
@@ -3210,9 +3215,6 @@ export default class Component extends Element {
3210
3215
  if (!flags.fromBlur) {
3211
3216
  this.checkRefreshOn(flags.changes, flags);
3212
3217
  }
3213
- if (flags.noCheck) {
3214
- return true;
3215
- }
3216
3218
  this.checkComponentConditions(data, flags, row);
3217
3219
  if (this.id !== flags.triggeredComponentId) {
3218
3220
  this.calculateComponentValue(data, flags, row);
@@ -1,5 +1,5 @@
1
1
  import EditFormUtils from './utils';
2
- import { getContextComponents } from '../../../../utils/utils';
2
+ import { getContextComponents } from '../../../../utils';
3
3
  /* eslint-disable quotes, max-len */
4
4
  export default [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  import EditFormUtils from './utils';
2
- import { getContextComponents } from '../../../../utils/utils';
2
+ import { getContextComponents } from '../../../../utils';
3
3
  /* eslint-disable quotes, max-len */
4
4
  export default [
5
5
  {
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { fastCloneDeep } from '../../../utils/utils';
2
+ import { fastCloneDeep } from '../../../utils';
3
3
  export default class ComponentModal {
4
4
  static render(component, data, topLevel) {
5
5
  const children = component.renderTemplate('component', data, topLevel);
@@ -1,5 +1,5 @@
1
1
  import Multivalue from '../multivalue/Multivalue';
2
- import { convertStringToHTMLElement } from '../../../utils/utils';
2
+ import { convertStringToHTMLElement } from '../../../utils';
3
3
  import Widgets from '../../../widgets';
4
4
  import _ from 'lodash';
5
5
  export default class Input extends Multivalue {
@@ -1,7 +1,7 @@
1
1
  import Field from '../field/Field';
2
2
  import { Formio } from '../../../Formio';
3
3
  import _ from 'lodash';
4
- import { getItemTemplateKeys } from '../../../utils/utils';
4
+ import { getItemTemplateKeys } from '../../../utils';
5
5
  export default class ListComponent extends Field {
6
6
  static schema(...extend) {
7
7
  return Field.schema({
@@ -3,7 +3,7 @@ import _ from 'lodash';
3
3
  import Field from '../field/Field';
4
4
  import Components from '../../Components';
5
5
  '';
6
- import { getComponentPaths, getRandomComponentId, componentMatches, getBestMatch, getStringFromComponentPath } from '../../../utils/utils';
6
+ import FormioUtils from '../../../utils';
7
7
  import { process as processAsync, processSync } from '@formio/core/process';
8
8
  /**
9
9
  * NestedComponent class.
@@ -204,7 +204,7 @@ export default class NestedComponent extends Field {
204
204
  */
205
205
  set rowIndex(value) {
206
206
  this._rowIndex = value;
207
- this.paths = getComponentPaths(this.component, this.parent?.component, {
207
+ this.paths = FormioUtils.getComponentPaths(this.component, this.parent?.component, {
208
208
  ...(this.parent?.paths || {}),
209
209
  ...{ dataIndex: value }
210
210
  });
@@ -308,7 +308,7 @@ export default class NestedComponent extends Field {
308
308
  * @returns {any} - The component that is located.
309
309
  */
310
310
  getComponent(path) {
311
- path = getStringFromComponentPath(path);
311
+ path = FormioUtils.getStringFromComponentPath(path);
312
312
  const matches = {
313
313
  path: undefined,
314
314
  fullPath: undefined,
@@ -320,7 +320,7 @@ export default class NestedComponent extends Field {
320
320
  };
321
321
  this.everyComponent((component) => {
322
322
  // All searches are relative to this component so replace this path from the child paths.
323
- componentMatches(component.component, {
323
+ FormioUtils.componentMatches(component.component, {
324
324
  path: component.paths?.path?.replace(new RegExp(`^${this.paths?.path}\\.?`), ''),
325
325
  fullPath: component.paths?.fullPath?.replace(new RegExp(`^${this.paths?.fullPath}\\.?`), ''),
326
326
  localPath: component.paths?.localPath?.replace(new RegExp(`^${this.paths?.localPath}\\.?`), ''),
@@ -332,7 +332,7 @@ export default class NestedComponent extends Field {
332
332
  return match;
333
333
  });
334
334
  });
335
- return getBestMatch(matches)?.instance;
335
+ return FormioUtils.getBestMatch(matches)?.instance;
336
336
  }
337
337
  /**
338
338
  * Return a component provided the Id of the component.
@@ -374,7 +374,7 @@ export default class NestedComponent extends Field {
374
374
  options.localRoot = this.localRoot;
375
375
  options.skipInit = true;
376
376
  if (!(options.display === 'pdf' && this.builderMode)) {
377
- component.id = getRandomComponentId();
377
+ component.id = FormioUtils.getRandomComponentId();
378
378
  }
379
379
  const comp = Components.create(component, options, data, true);
380
380
  comp.init();
@@ -659,7 +659,7 @@ export default class NestedComponent extends Field {
659
659
  }
660
660
  validationProcessor({ scope, data, row, instance, paths }, flags) {
661
661
  const { dirty } = flags;
662
- if (this.root.hasExtraPages && this.page !== this.root.page) {
662
+ if (this.root.hasSubWizards && this.page !== this.root.page) {
663
663
  instance = this.componentsMap?.hasOwnProperty(paths.dataPath)
664
664
  ? this.componentsMap[paths.dataPath]
665
665
  : this.getComponent(paths.dataPath);
@@ -2,7 +2,7 @@
2
2
  import _ from 'lodash';
3
3
  import { Utils } from '@formio/core/utils';
4
4
  const { getComponentPaths } = Utils;
5
- import { componentValueTypes, isLayoutComponent } from '../../../utils/utils';
5
+ import { componentValueTypes, isLayoutComponent } from '../../../utils';
6
6
  import Component from '../component/Component';
7
7
  import NestedDataComponent from '../nesteddata/NestedDataComponent';
8
8
  export default class NestedArrayComponent extends NestedDataComponent {
@@ -2,7 +2,7 @@
2
2
  import Component from '../component/Component';
3
3
  import NestedComponent from '../nested/NestedComponent';
4
4
  import _ from 'lodash';
5
- import { componentValueTypes, getComponentSavedTypes } from '../../../utils/utils';
5
+ import { componentValueTypes, getComponentSavedTypes } from '../../../utils';
6
6
  export default class NestedDataComponent extends NestedComponent {
7
7
  hasChanged(newValue, oldValue) {
8
8
  // If we do not have a value and are getting set to anything other than undefined or null, then we changed.
@@ -5,7 +5,7 @@ import { GoogleAddressProvider } from '../../providers/address/GoogleAddressProv
5
5
  import Field from '../_classes/field/Field';
6
6
  import NestedComponent from '../_classes/nested/NestedComponent';
7
7
  import ContainerComponent from '../container/Container';
8
- import { componentValueTypes, getComponentSavedTypes } from '../../utils/utils';
8
+ import { componentValueTypes, getComponentSavedTypes } from '../../utils';
9
9
  export const AddressComponentMode = {
10
10
  Autocomplete: 'autocomplete',
11
11
  Manual: 'manual',
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { getStringFromComponentPath } from '../../utils/utils';
2
+ import { getStringFromComponentPath } from '../../utils';
3
3
  export default class Alert {
4
4
  constructor(container, component) {
5
5
  this.container = container;
@@ -9,7 +9,7 @@ export default class ButtonComponent extends Field {
9
9
  };
10
10
  static savedValueTypes(schema: any): string[];
11
11
  constructor(component: any, options: any, data: any);
12
- filesUploading: any[];
12
+ filesUploading: number;
13
13
  get inputInfo(): any;
14
14
  get labelInfo(): {
15
15
  hidden: boolean;
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash';
2
2
  import Field from '../_classes/field/Field';
3
3
  import Input from '../_classes/input/Input';
4
- import { componentValueTypes, eachComponent, getArrayFromComponentPath, getComponentSavedTypes } from '../../utils/utils';
4
+ import { componentValueTypes, eachComponent, getArrayFromComponentPath, getComponentSavedTypes } from '../../utils';
5
5
  export default class ButtonComponent extends Field {
6
6
  static schema(...extend) {
7
7
  return Input.schema({
@@ -34,7 +34,7 @@ export default class ButtonComponent extends Field {
34
34
  }
35
35
  constructor(component, options, data) {
36
36
  super(component, options, data);
37
- this.filesUploading = [];
37
+ this.filesUploading = 0;
38
38
  }
39
39
  get defaultSchema() {
40
40
  return ButtonComponent.schema();
@@ -142,16 +142,13 @@ export default class ButtonComponent extends Field {
142
142
  this.addClass(this.refs.buttonMessageContainer, 'has-error');
143
143
  this.setContent(this.refs.buttonMessage, resultMessage);
144
144
  }, true);
145
- this.on('fileUploadingStart', (filePromise) => {
146
- this.filesUploading.push(filePromise);
145
+ this.on('fileUploadingStart', () => {
146
+ this.filesUploading++;
147
147
  this.disabled = true;
148
148
  this.setDisabled(this.refs.button, this.disabled);
149
149
  }, true);
150
- this.on('fileUploadingEnd', (filePromise) => {
151
- const index = this.filesUploading.indexOf(filePromise);
152
- if (index !== -1) {
153
- this.filesUploading.splice(index, 1);
154
- }
150
+ this.on('fileUploadingEnd', () => {
151
+ this.filesUploading--;
155
152
  this.disabled = this.shouldDisabled ? true : false;
156
153
  this.setDisabled(this.refs.button, this.disabled);
157
154
  }, true);
@@ -247,7 +244,7 @@ export default class ButtonComponent extends Field {
247
244
  }
248
245
  }
249
246
  get shouldDisabled() {
250
- return super.shouldDisabled || !!this.filesUploading?.length || this.isDisabledOnInvalid;
247
+ return super.shouldDisabled || this.filesUploading > 0 || this.isDisabledOnInvalid;
251
248
  }
252
249
  attach(element) {
253
250
  this.loadRefs(element, {
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { componentValueTypes, getComponentSavedTypes } from '../../utils/utils';
2
+ import { componentValueTypes, getComponentSavedTypes } from '../../utils';
3
3
  import Field from '../_classes/field/Field';
4
4
  export default class CheckBoxComponent extends Field {
5
5
  static schema(...extend) {
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { componentValueTypes, getComponentSavedTypes, getFocusableElements } from '../../utils/utils';
2
+ import { componentValueTypes, getComponentSavedTypes, getFocusableElements } from '../../utils';
3
3
  import Component from '../_classes/component/Component';
4
4
  import Field from '../_classes/field/Field';
5
5
  import NestedDataComponent from '../_classes/nesteddata/NestedDataComponent';
@@ -1,7 +1,7 @@
1
1
  import { createNumberMask } from '@formio/text-mask-addons';
2
2
  import { maskInput } from '@formio/vanilla-text-mask';
3
3
  import _ from 'lodash';
4
- import { getCurrencyAffixes } from '../../utils/utils';
4
+ import { getCurrencyAffixes } from '../../utils';
5
5
  import NumberComponent from '../number/Number';
6
6
  export default class CurrencyComponent extends NumberComponent {
7
7
  static schema(...extend) {
@@ -1,6 +1,6 @@
1
1
  import _ from 'lodash';
2
2
  import NestedArrayComponent from '../_classes/nestedarray/NestedArrayComponent';
3
- import { fastCloneDeep, getFocusableElements } from '../../utils/utils';
3
+ import { fastCloneDeep, getFocusableElements, getComponent } from '../../utils';
4
4
  export default class DataGridComponent extends NestedArrayComponent {
5
5
  static schema(...extend) {
6
6
  return NestedArrayComponent.schema({
@@ -488,6 +488,10 @@ export default class DataGridComponent extends NestedArrayComponent {
488
488
  options.row = `${rowIndex}-${colIndex}`;
489
489
  options.rowIndex = rowIndex;
490
490
  options.onChange = (flags, changed, modified) => {
491
+ if (changed.component.type === 'form') {
492
+ const formComp = getComponent(this.component.components, changed.component.key);
493
+ _.set(formComp, 'components', changed.component.components);
494
+ }
491
495
  this.triggerChange({ modified });
492
496
  };
493
497
  let columnComponent;
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash';
2
2
  import dayjs from 'dayjs';
3
3
  import FormioUtils from '../../utils';
4
- import { componentValueTypes, fastCloneDeep, getComponentSavedTypes } from '../../utils/utils';
4
+ import { componentValueTypes, fastCloneDeep, getComponentSavedTypes } from '../../utils';
5
5
  import Input from '../_classes/input/Input';
6
6
  export default class DateTimeComponent extends Input {
7
7
  static schema(...extend) {
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash';
2
2
  import moment from 'moment';
3
3
  import Field from '../_classes/field/Field';
4
- import { boolValue, componentValueTypes, getComponentSavedTypes, getLocaleDateFormatInfo } from '../../utils/utils';
4
+ import { boolValue, componentValueTypes, getComponentSavedTypes, getLocaleDateFormatInfo } from '../../utils';
5
5
  import { getDayFormat } from '@formio/core';
6
6
  export default class DayComponent extends Field {
7
7
  static schema(...extend) {
@@ -53,7 +53,7 @@ export default class DayComponent extends Field {
53
53
  // Empty value used before 9.3.x
54
54
  static oldEmptyValue = '00/00/0000';
55
55
  constructor(component, options, data) {
56
- if (!options.inFormBuilder && !options.building) {
56
+ if (options && !options.inFormBuilder && !options.building) {
57
57
  if (component.maxDate && component.maxDate.indexOf('moment(') === -1) {
58
58
  component.maxDate = moment(component.maxDate, 'YYYY-MM-DD').toISOString();
59
59
  }
@@ -4,7 +4,7 @@ import { editgrid as templates } from '@formio/bootstrap/components';
4
4
  import NestedArrayComponent from '../_classes/nestedarray/NestedArrayComponent';
5
5
  import Component from '../_classes/component/Component';
6
6
  import Alert from '../alert/Alert';
7
- import { fastCloneDeep, Evaluator, getArrayFromComponentPath, eachComponent } from '../../utils/utils';
7
+ import { fastCloneDeep, Evaluator, getArrayFromComponentPath, eachComponent } from '../../utils';
8
8
  const EditRowState = {
9
9
  New: 'new',
10
10
  Editing: 'editing',
@@ -33,7 +33,7 @@ export default [
33
33
  weight: 1002,
34
34
  input: false,
35
35
  customConditional() {
36
- return !Evaluator.noeval;
36
+ return !Evaluator.noeval || !Evaluator.protectedEval;
37
37
  },
38
38
  },
39
39
  {
@@ -1,5 +1,5 @@
1
1
  import Field from '../_classes/field/Field';
2
- import { componentValueTypes, getComponentSavedTypes, uniqueName } from '../../utils/utils';
2
+ import { componentValueTypes, getComponentSavedTypes, uniqueName } from '../../utils';
3
3
  import download from 'downloadjs';
4
4
  import _ from 'lodash';
5
5
  import fileProcessor from '../../providers/processor/fileProcessor';
@@ -903,17 +903,16 @@ export default class FileComponent extends Field {
903
903
  } : false;
904
904
  }
905
905
  async uploadFile(fileToSync) {
906
- const filePromise = this.fileService.uploadFile(fileToSync.storage, fileToSync.file, fileToSync.name, fileToSync.dir,
906
+ return await this.fileService.uploadFile(fileToSync.storage, fileToSync.file, fileToSync.name, fileToSync.dir,
907
907
  // Progress callback
908
908
  this.updateProgress.bind(this, fileToSync), fileToSync.url, fileToSync.options, fileToSync.fileKey, fileToSync.groupPermissions, fileToSync.groupResourceId, () => {
909
- this.emit('fileUploadingStart', filePromise);
909
+ this.emit('fileUploadingStart');
910
910
  },
911
911
  // Abort upload callback
912
912
  (abort) => this.abortUploads.push({
913
913
  id: fileToSync.id,
914
914
  abort,
915
915
  }), this.getMultipartOptions(fileToSync));
916
- return await filePromise;
917
916
  }
918
917
  async upload() {
919
918
  if (!this.filesToSync.filesToUpload.length) {
@@ -933,7 +932,7 @@ export default class FileComponent extends Field {
933
932
  fileToSync.message = this.t('succefullyUploaded');
934
933
  fileInfo.originalName = fileToSync.originalName;
935
934
  fileInfo.hash = fileToSync.hash;
936
- this.emit('fileUploadingEnd', Promise.resolve(fileInfo));
935
+ this.emit('fileUploadingEnd');
937
936
  }
938
937
  catch (response) {
939
938
  fileToSync.status = 'error';
@@ -943,7 +942,7 @@ export default class FileComponent extends Field {
943
942
  : response.type === 'abort'
944
943
  ? this.t('Request was aborted')
945
944
  : response.toString();
946
- this.emit('fileUploadingEnd', Promise.reject(response));
945
+ this.emit('fileUploadingEnd');
947
946
  this.emit('fileUploadError', {
948
947
  fileToSync,
949
948
  response,
@@ -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, componentValueTypes } from '../../utils/utils';
6
+ import { isMongoId, eachComponent, componentValueTypes } from '../../utils';
7
7
  import { Formio } from '../../Formio';
8
8
  import Form from '../../Form';
9
9
  export default class FormComponent extends Component {
@@ -274,6 +274,9 @@ export default class FormComponent extends Component {
274
274
  if (this.isSubFormLazyLoad() && !this.hasLoadedForm && !this.subFormLoading) {
275
275
  this.createSubForm(true);
276
276
  }
277
+ if (!this.subFormReady) {
278
+ return Promise.resolve();
279
+ }
277
280
  return this.subFormReady.then(() => {
278
281
  this.empty(element);
279
282
  if (this.options.builder) {
@@ -408,7 +411,8 @@ export default class FormComponent extends Component {
408
411
  const componentsMap = this.componentsMap;
409
412
  const formComponentsMap = this.subForm.componentsMap;
410
413
  _.assign(componentsMap, formComponentsMap);
411
- this.component.components = this.subForm.components.map((comp) => comp.component);
414
+ this.component.components = this.subForm._form?.components;
415
+ this.component.display = this.subForm._form?.display;
412
416
  this.subForm.on('change', () => {
413
417
  if (this.subForm && !this.shouldConditionallyClear()) {
414
418
  this.dataValue = this.subForm.getValue();
@@ -688,6 +692,13 @@ export default class FormComponent extends Component {
688
692
  }
689
693
  return errors;
690
694
  }
695
+ conditionallyHidden() {
696
+ const conditionallyHidden = super.conditionallyHidden();
697
+ if (this.subForm) {
698
+ this.subForm._conditionallyHidden = conditionallyHidden;
699
+ }
700
+ return conditionallyHidden;
701
+ }
691
702
  updateSubFormVisibility() {
692
703
  if (this.subForm) {
693
704
  this.subForm.parentVisible = this.visible;
@@ -30,9 +30,10 @@ export default [
30
30
  tooltip: 'if it is checked, the subform is loaded after navigation to the page with this component within the wizard.',
31
31
  input: true,
32
32
  customConditional({ instance, data }) {
33
- const formInfo = instance.root?.getComponent('form')?.defaultDownloadedResources.find(res => res._id === data.form);
33
+ const formComp = instance.root?.getComponent('form');
34
+ const formInfo = formComp?.defaultDownloadedResources.find(res => res._id === data.form);
34
35
  const displayMode = 'wizard';
35
- return instance.options?.editForm?.display === displayMode && formInfo && formInfo.display !== displayMode;
36
+ return instance.options?.editForm?.display === displayMode && ((data.form && !formInfo) || (formInfo && formInfo.display !== displayMode));
36
37
  },
37
38
  },
38
39
  {
@@ -2,7 +2,7 @@ import { createNumberMask } from '@formio/text-mask-addons';
2
2
  import { conformToMask, maskInput } from '@formio/vanilla-text-mask';
3
3
  import _ from 'lodash';
4
4
  import Input from '../_classes/input/Input';
5
- import { getNumberSeparators, getNumberDecimalLimit, componentValueTypes, getComponentSavedTypes } from '../../utils/utils';
5
+ import { getNumberSeparators, getNumberDecimalLimit, componentValueTypes, getComponentSavedTypes } from '../../utils/';
6
6
  export default class NumberComponent extends Input {
7
7
  static schema(...extend) {
8
8
  return Input.schema({
@@ -1,5 +1,5 @@
1
1
  import NestedComponent from '../_classes/nested/NestedComponent';
2
- import { isChildOf } from '../../utils/utils';
2
+ import { isChildOf } from '../../utils';
3
3
  export default class PanelComponent extends NestedComponent {
4
4
  static schema(...extend) {
5
5
  return NestedComponent.schema({
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash';
2
2
  import ListComponent from '../_classes/list/ListComponent';
3
3
  import { Formio } from '../../Formio';
4
- import { boolValue, componentValueTypes, getComponentSavedTypes } from '../../utils/utils';
4
+ import { boolValue, componentValueTypes, getComponentSavedTypes } from '../../utils';
5
5
  export default class RadioComponent extends ListComponent {
6
6
  static schema(...extend) {
7
7
  return ListComponent.schema({
@@ -1,4 +1,4 @@
1
- import { getContextButtons } from '../../../utils/utils';
1
+ import { getContextButtons } from '../../../utils';
2
2
  export default [
3
3
  {
4
4
  key: 'recaptchaInfo',
@@ -2,7 +2,7 @@ import _ from 'lodash';
2
2
  import { Formio } from '../../Formio';
3
3
  import ListComponent from '../_classes/list/ListComponent';
4
4
  import Form from '../../Form';
5
- import { getRandomComponentId, boolValue, isPromise, componentValueTypes, getComponentSavedTypes, isSelectResourceWithObjectValue, removeHTML } from '../../utils/utils';
5
+ import { getRandomComponentId, boolValue, isPromise, componentValueTypes, getComponentSavedTypes, isSelectResourceWithObjectValue, removeHTML } from '../../utils';
6
6
  import Choices from '../../utils/ChoicesWrapper';
7
7
  export default class SelectComponent extends ListComponent {
8
8
  static schema(...extend) {
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { eachComponent } from '../../../utils/utils';
2
+ import { eachComponent } from '../../../utils';
3
3
  const calculateSingleSelectData = (context, defaultValue) => {
4
4
  const { instance, data } = context;
5
5
  const rawDefaultValue = instance.downloadedResources.find(resource => _.get(resource, data.valueProperty) === defaultValue);
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { componentValueTypes, getComponentSavedTypes, boolValue, getComponent } from '../../utils/utils';
2
+ import { componentValueTypes, getComponentSavedTypes, boolValue, getComponent } from '../../utils';
3
3
  import RadioComponent from '../radio/Radio';
4
4
  export default class SelectBoxesComponent extends RadioComponent {
5
5
  static schema(...extend) {