@formio/js 5.1.0-dev.6059.845a6e3 → 5.1.0-dev.6060.19e3bfc

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 (196) hide show
  1. package/Changelog.md +131 -13
  2. package/README.md +28 -1
  3. package/dist/formio.builder.css +19 -17
  4. package/dist/formio.builder.min.css +1 -1
  5. package/dist/formio.embed.js +1 -1
  6. package/dist/formio.embed.min.js +1 -1
  7. package/dist/formio.embed.min.js.LICENSE.txt +1 -1
  8. package/dist/formio.form.css +19 -17
  9. package/dist/formio.form.js +102 -176
  10. package/dist/formio.form.min.css +1 -1
  11. package/dist/formio.form.min.js +1 -1
  12. package/dist/formio.form.min.js.LICENSE.txt +3 -3
  13. package/dist/formio.full.css +19 -17
  14. package/dist/formio.full.js +123 -101
  15. package/dist/formio.full.min.css +2 -2
  16. package/dist/formio.full.min.js +1 -1
  17. package/dist/formio.full.min.js.LICENSE.txt +3 -3
  18. package/dist/formio.js +10 -10
  19. package/dist/formio.min.js +1 -1
  20. package/dist/formio.min.js.LICENSE.txt +1 -1
  21. package/dist/formio.utils.js +3 -3
  22. package/dist/formio.utils.min.js +1 -1
  23. package/dist/formio.utils.min.js.LICENSE.txt +1 -1
  24. package/lib/cjs/CDN.d.ts +1 -1
  25. package/lib/cjs/CDN.js +2 -2
  26. package/lib/cjs/Embed.js +1 -1
  27. package/lib/cjs/Form.d.ts +4 -6
  28. package/lib/cjs/Form.js +16 -8
  29. package/lib/cjs/Formio.js +1 -1
  30. package/lib/cjs/PDFBuilder.js +4 -4
  31. package/lib/cjs/Webform.d.ts +16 -13
  32. package/lib/cjs/Webform.js +162 -148
  33. package/lib/cjs/WebformBuilder.js +17 -28
  34. package/lib/cjs/Wizard.js +1 -1
  35. package/lib/cjs/WizardBuilder.js +15 -2
  36. package/lib/cjs/components/Components.d.ts +3 -0
  37. package/lib/cjs/components/_classes/component/Component.d.ts +1 -0
  38. package/lib/cjs/components/_classes/component/Component.js +38 -11
  39. package/lib/cjs/components/_classes/component/editForm/Component.edit.conditional.js +1 -1
  40. package/lib/cjs/components/_classes/component/editForm/Component.edit.data.d.ts +37 -0
  41. package/lib/cjs/components/_classes/component/editForm/Component.edit.data.js +32 -2
  42. package/lib/cjs/components/_classes/component/editForm/utils.d.ts +1 -0
  43. package/lib/cjs/components/_classes/component/editForm/utils.js +3 -0
  44. package/lib/cjs/components/_classes/input/Input.js +23 -1
  45. package/lib/cjs/components/_classes/list/ListComponent.js +4 -4
  46. package/lib/cjs/components/_classes/multivalue/Multivalue.d.ts +1 -1
  47. package/lib/cjs/components/_classes/multivalue/Multivalue.js +10 -3
  48. package/lib/cjs/components/_classes/nested/NestedComponent.form.js +13 -0
  49. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -0
  50. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +52 -31
  51. package/lib/cjs/components/address/Address.js +14 -1
  52. package/lib/cjs/components/button/Button.js +6 -6
  53. package/lib/cjs/components/checkbox/Checkbox.d.ts +1 -1
  54. package/lib/cjs/components/checkbox/Checkbox.js +2 -2
  55. package/lib/cjs/components/content/editForm/Content.edit.display.js +8 -0
  56. package/lib/cjs/components/currency/editForm/Currency.edit.display.js +12 -0
  57. package/lib/cjs/components/datagrid/DataGrid.d.ts +2 -0
  58. package/lib/cjs/components/datagrid/DataGrid.js +41 -26
  59. package/lib/cjs/components/day/Day.js +9 -7
  60. package/lib/cjs/components/day/editForm/Day.edit.display.js +8 -0
  61. package/lib/cjs/components/editgrid/EditGrid.d.ts +1 -1
  62. package/lib/cjs/components/editgrid/EditGrid.js +26 -8
  63. package/lib/cjs/components/email/editForm/Email.edit.display.js +12 -0
  64. package/lib/cjs/components/fieldset/editForm/Fieldset.edit.display.js +8 -0
  65. package/lib/cjs/components/file/File.d.ts +1 -1
  66. package/lib/cjs/components/file/File.js +30 -19
  67. package/lib/cjs/components/form/Form.d.ts +1 -1
  68. package/lib/cjs/components/form/Form.js +9 -5
  69. package/lib/cjs/components/form/editForm/Form.edit.form.js +3 -3
  70. package/lib/cjs/components/hidden/Hidden.d.ts +0 -1
  71. package/lib/cjs/components/hidden/Hidden.js +1 -1
  72. package/lib/cjs/components/hidden/editForm/Hidden.edit.display.js +8 -0
  73. package/lib/cjs/components/html/editForm/HTML.edit.display.js +8 -0
  74. package/lib/cjs/components/number/Number.js +12 -5
  75. package/lib/cjs/components/number/editForm/Number.edit.display.js +12 -0
  76. package/lib/cjs/components/password/editForm/Password.edit.display.js +13 -1
  77. package/lib/cjs/components/phonenumber/PhoneNumber.form.js +9 -1
  78. package/lib/cjs/components/radio/Radio.js +10 -0
  79. package/lib/cjs/components/recaptcha/ReCaptcha.js +2 -2
  80. package/lib/cjs/components/select/Select.d.ts +0 -1
  81. package/lib/cjs/components/select/Select.js +12 -33
  82. package/lib/cjs/components/select/editForm/Select.edit.data.d.ts +1 -1
  83. package/lib/cjs/components/select/editForm/Select.edit.data.js +3 -2
  84. package/lib/cjs/components/selectboxes/SelectBoxes.js +2 -2
  85. package/lib/cjs/components/signature/Signature.d.ts +1 -1
  86. package/lib/cjs/components/signature/Signature.js +5 -3
  87. package/lib/cjs/components/signature/editForm/Signature.edit.display.d.ts +0 -6
  88. package/lib/cjs/components/signature/editForm/Signature.edit.display.js +0 -1
  89. package/lib/cjs/components/survey/Survey.js +2 -2
  90. package/lib/cjs/components/tabs/editForm/Tabs.edit.display.js +8 -0
  91. package/lib/cjs/components/tags/Tags.d.ts +1 -1
  92. package/lib/cjs/components/tags/Tags.js +2 -2
  93. package/lib/cjs/components/textarea/TextArea.js +6 -6
  94. package/lib/cjs/components/textarea/editForm/TextArea.edit.display.js +12 -0
  95. package/lib/cjs/components/url/editForm/Url.edit.display.js +12 -0
  96. package/lib/cjs/components/well/editForm/Well.edit.display.js +8 -0
  97. package/lib/cjs/formio.form.js +5 -0
  98. package/lib/cjs/providers/storage/googleDrive.js +3 -2
  99. package/lib/cjs/providers/storage/s3.js +3 -3
  100. package/lib/cjs/providers/storage/xhr.d.ts +1 -0
  101. package/lib/cjs/providers/storage/xhr.js +6 -1
  102. package/lib/cjs/translations/en.d.ts +234 -81
  103. package/lib/cjs/translations/en.js +8 -81
  104. package/lib/cjs/utils/ChoicesWrapper.d.ts +4 -25
  105. package/lib/cjs/utils/ChoicesWrapper.js +47 -124
  106. package/lib/cjs/utils/formUtils.d.ts +2 -2
  107. package/lib/cjs/utils/i18n.d.ts +5 -2
  108. package/lib/cjs/utils/i18n.js +32 -5
  109. package/lib/cjs/widgets/CalendarWidget.js +27 -27
  110. package/lib/mjs/CDN.d.ts +1 -1
  111. package/lib/mjs/CDN.js +2 -2
  112. package/lib/mjs/Embed.js +1 -1
  113. package/lib/mjs/Form.d.ts +4 -6
  114. package/lib/mjs/Form.js +17 -9
  115. package/lib/mjs/Formio.js +1 -1
  116. package/lib/mjs/PDFBuilder.js +4 -4
  117. package/lib/mjs/Webform.d.ts +16 -13
  118. package/lib/mjs/Webform.js +171 -158
  119. package/lib/mjs/WebformBuilder.js +17 -28
  120. package/lib/mjs/Wizard.js +1 -1
  121. package/lib/mjs/WizardBuilder.js +15 -2
  122. package/lib/mjs/components/Components.d.ts +3 -0
  123. package/lib/mjs/components/_classes/component/Component.d.ts +1 -0
  124. package/lib/mjs/components/_classes/component/Component.js +27 -11
  125. package/lib/mjs/components/_classes/component/editForm/Component.edit.conditional.js +1 -1
  126. package/lib/mjs/components/_classes/component/editForm/Component.edit.data.d.ts +37 -0
  127. package/lib/mjs/components/_classes/component/editForm/Component.edit.data.js +32 -2
  128. package/lib/mjs/components/_classes/component/editForm/utils.d.ts +1 -0
  129. package/lib/mjs/components/_classes/component/editForm/utils.js +3 -0
  130. package/lib/mjs/components/_classes/input/Input.js +22 -1
  131. package/lib/mjs/components/_classes/list/ListComponent.js +4 -4
  132. package/lib/mjs/components/_classes/multivalue/Multivalue.d.ts +1 -1
  133. package/lib/mjs/components/_classes/multivalue/Multivalue.js +10 -3
  134. package/lib/mjs/components/_classes/nested/NestedComponent.form.js +13 -0
  135. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -0
  136. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +53 -31
  137. package/lib/mjs/components/address/Address.js +14 -1
  138. package/lib/mjs/components/button/Button.js +6 -6
  139. package/lib/mjs/components/checkbox/Checkbox.d.ts +1 -1
  140. package/lib/mjs/components/checkbox/Checkbox.js +2 -2
  141. package/lib/mjs/components/content/editForm/Content.edit.display.js +8 -0
  142. package/lib/mjs/components/currency/editForm/Currency.edit.display.js +12 -0
  143. package/lib/mjs/components/datagrid/DataGrid.d.ts +2 -0
  144. package/lib/mjs/components/datagrid/DataGrid.js +41 -26
  145. package/lib/mjs/components/day/Day.js +9 -7
  146. package/lib/mjs/components/day/editForm/Day.edit.display.js +8 -0
  147. package/lib/mjs/components/editgrid/EditGrid.d.ts +1 -1
  148. package/lib/mjs/components/editgrid/EditGrid.js +25 -7
  149. package/lib/mjs/components/email/editForm/Email.edit.display.js +12 -0
  150. package/lib/mjs/components/fieldset/editForm/Fieldset.edit.display.js +8 -0
  151. package/lib/mjs/components/file/File.d.ts +1 -1
  152. package/lib/mjs/components/file/File.js +30 -19
  153. package/lib/mjs/components/form/Form.d.ts +1 -1
  154. package/lib/mjs/components/form/Form.js +8 -5
  155. package/lib/mjs/components/form/editForm/Form.edit.form.js +3 -3
  156. package/lib/mjs/components/hidden/Hidden.d.ts +0 -1
  157. package/lib/mjs/components/hidden/Hidden.js +1 -1
  158. package/lib/mjs/components/hidden/editForm/Hidden.edit.display.js +8 -0
  159. package/lib/mjs/components/html/editForm/HTML.edit.display.js +8 -0
  160. package/lib/mjs/components/number/Number.js +12 -5
  161. package/lib/mjs/components/number/editForm/Number.edit.display.js +12 -0
  162. package/lib/mjs/components/password/editForm/Password.edit.display.js +13 -1
  163. package/lib/mjs/components/phonenumber/PhoneNumber.form.js +9 -1
  164. package/lib/mjs/components/radio/Radio.js +10 -0
  165. package/lib/mjs/components/recaptcha/ReCaptcha.js +2 -2
  166. package/lib/mjs/components/select/Select.d.ts +0 -1
  167. package/lib/mjs/components/select/Select.js +14 -34
  168. package/lib/mjs/components/select/editForm/Select.edit.data.d.ts +1 -1
  169. package/lib/mjs/components/select/editForm/Select.edit.data.js +3 -2
  170. package/lib/mjs/components/selectboxes/SelectBoxes.js +2 -2
  171. package/lib/mjs/components/signature/Signature.d.ts +1 -1
  172. package/lib/mjs/components/signature/Signature.js +5 -3
  173. package/lib/mjs/components/signature/editForm/Signature.edit.display.d.ts +0 -6
  174. package/lib/mjs/components/signature/editForm/Signature.edit.display.js +0 -1
  175. package/lib/mjs/components/survey/Survey.js +2 -2
  176. package/lib/mjs/components/tabs/editForm/Tabs.edit.display.js +8 -0
  177. package/lib/mjs/components/tags/Tags.d.ts +1 -1
  178. package/lib/mjs/components/tags/Tags.js +2 -2
  179. package/lib/mjs/components/textarea/TextArea.js +6 -6
  180. package/lib/mjs/components/textarea/editForm/TextArea.edit.display.js +12 -0
  181. package/lib/mjs/components/url/editForm/Url.edit.display.js +12 -0
  182. package/lib/mjs/components/well/editForm/Well.edit.display.js +8 -0
  183. package/lib/mjs/formio.form.js +5 -0
  184. package/lib/mjs/providers/storage/googleDrive.js +3 -2
  185. package/lib/mjs/providers/storage/s3.js +3 -3
  186. package/lib/mjs/providers/storage/xhr.d.ts +1 -0
  187. package/lib/mjs/providers/storage/xhr.js +6 -1
  188. package/lib/mjs/translations/en.d.ts +234 -81
  189. package/lib/mjs/translations/en.js +87 -1
  190. package/lib/mjs/utils/ChoicesWrapper.d.ts +4 -25
  191. package/lib/mjs/utils/ChoicesWrapper.js +26 -119
  192. package/lib/mjs/utils/formUtils.d.ts +2 -2
  193. package/lib/mjs/utils/i18n.d.ts +5 -2
  194. package/lib/mjs/utils/i18n.js +32 -5
  195. package/lib/mjs/widgets/CalendarWidget.js +27 -27
  196. package/package.json +27 -11
@@ -189,7 +189,8 @@ export default class WebformBuilder extends Component {
189
189
  params: {
190
190
  type: 'resource',
191
191
  limit: 1000000,
192
- select: '_id,title,name,components'
192
+ select: '_id,title,name,components',
193
+ 'tags__ne': 'noBuilderResource'
193
194
  }
194
195
  };
195
196
  if (this.options && this.options.resourceTag) {
@@ -211,7 +212,7 @@ export default class WebformBuilder extends Component {
211
212
  }
212
213
  }
213
214
  }).catch((err) => {
214
- console.warn(`Could not load project settings: ${err.message || err}`);
215
+ console.warn(`${this.t('loadingProjectSettingsError')}: ${err.message || err}`);
215
216
  });
216
217
  if (!formio.noProject && !isResourcesDisabled && formio.formsUrl) {
217
218
  const resourceOptions = this.options.builder && this.options.builder.resource;
@@ -321,18 +322,18 @@ export default class WebformBuilder extends Component {
321
322
  editJson: 'single'
322
323
  });
323
324
  if (component.refs.copyComponent) {
324
- this.attachTooltip(component.refs.copyComponent, this.t('Copy'));
325
+ this.attachTooltip(component.refs.copyComponent, this.t('copy'));
325
326
  component.addEventListener(component.refs.copyComponent, 'click', () => this.copyComponent(component));
326
327
  }
327
328
  if (component.refs.pasteComponent) {
328
- const pasteToolTip = this.attachTooltip(component.refs.pasteComponent, this.t('Paste below'));
329
+ const pasteToolTip = this.attachTooltip(component.refs.pasteComponent, this.t('pasteBelow'));
329
330
  component.addEventListener(component.refs.pasteComponent, 'click', () => {
330
331
  pasteToolTip.hide();
331
332
  this.pasteComponent(component);
332
333
  });
333
334
  }
334
335
  if (component.refs.moveComponent) {
335
- this.attachTooltip(component.refs.moveComponent, this.t('Move'));
336
+ this.attachTooltip(component.refs.moveComponent, this.t('move'));
336
337
  if (this.keyboardActionsEnabled) {
337
338
  component.addEventListener(component.refs.moveComponent, 'click', () => {
338
339
  this.moveComponent(component);
@@ -341,15 +342,15 @@ export default class WebformBuilder extends Component {
341
342
  }
342
343
  const parent = this.getParentElement(element);
343
344
  if (component.refs.editComponent) {
344
- this.attachTooltip(component.refs.editComponent, this.t('Edit'));
345
+ this.attachTooltip(component.refs.editComponent, this.t('edit'));
345
346
  component.addEventListener(component.refs.editComponent, 'click', () => this.editComponent(component.schema, parent, false, false, component.component, { inDataGrid: component.isInDataGrid }));
346
347
  }
347
348
  if (component.refs.editJson) {
348
- this.attachTooltip(component.refs.editJson, this.t('Edit JSON'));
349
+ this.attachTooltip(component.refs.editJson, this.t('editJson'));
349
350
  component.addEventListener(component.refs.editJson, 'click', () => this.editComponent(component.schema, parent, false, true, component.component));
350
351
  }
351
352
  if (component.refs.removeComponent) {
352
- this.attachTooltip(component.refs.removeComponent, this.t('Remove'));
353
+ this.attachTooltip(component.refs.removeComponent, this.t('remove'));
353
354
  component.addEventListener(component.refs.removeComponent, 'click', () => this.removeComponent(component.schema, parent, component.component, component));
354
355
  }
355
356
  return element;
@@ -794,31 +795,18 @@ export default class WebformBuilder extends Component {
794
795
  // Show an error if siblings are disabled for a component and such a component already exists.
795
796
  const compKey = (group === 'resource') ? `component-${key}` : key;
796
797
  const draggableComponent = this.groups[group]?.components[compKey] || {};
797
- if (draggableComponent.disableSiblings) {
798
+ if (draggableComponent.disableSiblings || draggableComponent.uniqueComponent) {
798
799
  let isCompAlreadyExists = false;
799
800
  eachComponent(this.webform.components, (component) => {
800
- if (component.type === draggableComponent.schema.type) {
801
+ if ((draggableComponent.disableSiblings && component.type === draggableComponent.schema.type) ||
802
+ (draggableComponent.uniqueComponent && component.component.key === draggableComponent.schema.key)) {
801
803
  isCompAlreadyExists = true;
802
804
  return;
803
805
  }
804
806
  }, true);
805
807
  if (isCompAlreadyExists) {
806
808
  this.webform.redraw();
807
- this.webform.setAlert('danger', `You cannot add more than one ${draggableComponent.key} component to one page.`);
808
- return;
809
- }
810
- }
811
- if (draggableComponent.uniqueComponent) {
812
- let isCompAlreadyExists = false;
813
- eachComponent(this.webform.components, (component) => {
814
- if (component.key === draggableComponent.schema.key) {
815
- isCompAlreadyExists = true;
816
- return;
817
- }
818
- }, true);
819
- if (isCompAlreadyExists) {
820
- this.webform.redraw();
821
- this.webform.setAlert('danger', `You cannot add more than one ${draggableComponent.title} component to one page.`);
809
+ this.webform.setAlert('danger', this.t('builderUniqueError', { componentKeyOrTitle: _.get(draggableComponent, draggableComponent.uniqueComponent ? 'title' : 'key') }));
822
810
  return;
823
811
  }
824
812
  }
@@ -1251,7 +1239,8 @@ export default class WebformBuilder extends Component {
1251
1239
  helplinks: this.helplinks,
1252
1240
  }));
1253
1241
  this.editForm.attach(this.componentEdit.querySelector(`[${this._referenceAttributeName}="editForm"]`));
1254
- this.updateComponent(this.editForm.submission.data ?? component);
1242
+ const editFormData = this.editForm.submission?.data;
1243
+ this.updateComponent(editFormData?.componentJson || editFormData || component);
1255
1244
  this.attachEditComponentControls(component, parent, isNew, original, ComponentClass);
1256
1245
  });
1257
1246
  });
@@ -1536,7 +1525,7 @@ export default class WebformBuilder extends Component {
1536
1525
  */
1537
1526
  copyComponent(component) {
1538
1527
  if (!window.sessionStorage) {
1539
- return console.warn('Session storage is not supported in this browser.');
1528
+ return console.warn(this.t('sessionStorageSupportError'));
1540
1529
  }
1541
1530
  this.addClass(this.refs.form, 'builder-paste-mode');
1542
1531
  window.sessionStorage.setItem('formio.clipboard', JSON.stringify(component.schema));
@@ -1548,7 +1537,7 @@ export default class WebformBuilder extends Component {
1548
1537
  */
1549
1538
  pasteComponent(component) {
1550
1539
  if (!window.sessionStorage) {
1551
- return console.warn('Session storage is not supported in this browser.');
1540
+ return console.warn(this.t('sessionStorageSupportError'));
1552
1541
  }
1553
1542
  this.removeClass(this.refs.form, 'builder-paste-mode');
1554
1543
  if (window.sessionStorage) {
package/lib/mjs/Wizard.js CHANGED
@@ -606,7 +606,7 @@ export default class Wizard extends Webform {
606
606
  this.redraw();
607
607
  return Promise.resolve();
608
608
  }
609
- return Promise.reject('Page not found');
609
+ return Promise.reject(this.t('pageNotFound'));
610
610
  }
611
611
  pageFieldLogic(page) {
612
612
  if (this.pages?.[page]) {
@@ -217,7 +217,7 @@ export default class WizardBuilder extends WebformBuilder {
217
217
  const isSiblingAnAddPageButton = sibling?.classList.contains('wizard-add-page');
218
218
  // We still can paste before Add Page button
219
219
  if (!element.dragInfo || (sibling && !sibling.dragInfo && !isSiblingAnAddPageButton)) {
220
- console.warn('There is no Drag Info available for either dragged or sibling element');
220
+ console.warn(this.t('noDragInfoError'));
221
221
  return;
222
222
  }
223
223
  const oldPosition = element.dragInfo.index;
@@ -255,10 +255,23 @@ export default class WizardBuilder extends WebformBuilder {
255
255
  if (component instanceof WizardBuilder) {
256
256
  return;
257
257
  }
258
+ if (!window.sessionStorage) {
259
+ return console.warn(this.t('sessionStorageSupportError'));
260
+ }
261
+ // If pasting after the Wizard's page, check if a full Wizard page was copied and pass it to addPage method
258
262
  if (this._form.components.find(comp => _.isEqual(component.component, comp))) {
259
- this.addPage(component);
263
+ const data = window.sessionStorage.getItem('formio.clipboard');
264
+ if (data) {
265
+ const schema = JSON.parse(data);
266
+ // If the copied component is not a Wizard's page, do nothing since we can't paste outside the panel in Wizard
267
+ if (schema.type !== 'panel') {
268
+ return;
269
+ }
270
+ this.addPage(schema);
271
+ }
260
272
  }
261
273
  else {
274
+ // If we are not trying to paster after the current Wizard's page, just pass it to the WebformBuilder
262
275
  return super.pasteComponent(component);
263
276
  }
264
277
  }
@@ -2,6 +2,7 @@ export default class Components {
2
2
  static _editFormUtils: {
3
3
  sortAndFilterComponents(components: any): any;
4
4
  unifyComponents(objValue: any, srcValue: any): any;
5
+ tokenVariableDescription(): string;
5
6
  logicVariablesTable(additional: any): {
6
7
  type: string;
7
8
  tag: string;
@@ -86,6 +87,7 @@ export default class Components {
86
87
  static set EditFormUtils(value: {
87
88
  sortAndFilterComponents(components: any): any;
88
89
  unifyComponents(objValue: any, srcValue: any): any;
90
+ tokenVariableDescription(): string;
89
91
  logicVariablesTable(additional: any): {
90
92
  type: string;
91
93
  tag: string;
@@ -169,6 +171,7 @@ export default class Components {
169
171
  static get EditFormUtils(): {
170
172
  sortAndFilterComponents(components: any): any;
171
173
  unifyComponents(objValue: any, srcValue: any): any;
174
+ tokenVariableDescription(): string;
172
175
  logicVariablesTable(additional: any): {
173
176
  type: string;
174
177
  tag: string;
@@ -855,6 +855,7 @@ declare class Component extends Element {
855
855
  quill: any;
856
856
  get shouldSanitizeValue(): boolean;
857
857
  addAce(element: any, settings: any, onChange: any): any;
858
+ getDragula(): Promise<any>;
858
859
  get tree(): any;
859
860
  /**
860
861
  * The empty value for this component.
@@ -161,6 +161,7 @@ export default class Component extends Element {
161
161
  properties: {},
162
162
  allowMultipleMasks: false,
163
163
  addons: [],
164
+ serverOverride: {},
164
165
  }, ...sources);
165
166
  }
166
167
  /**
@@ -411,6 +412,9 @@ export default class Component extends Element {
411
412
  // Allow anyone to hook into the component creation.
412
413
  this.hook('component');
413
414
  if (!this.options.skipInit) {
415
+ if (typeof this.beforeInit === 'function') {
416
+ this.beforeInit();
417
+ }
414
418
  this.init();
415
419
  }
416
420
  }
@@ -511,7 +515,10 @@ export default class Component extends Element {
511
515
  this.addons.push(addon);
512
516
  }
513
517
  else {
514
- console.warn(`Addon ${name.label} does not support component of type ${this.component.type}.`);
518
+ console.warn(this.t('addonSupportTypeError', {
519
+ type: this.component.type,
520
+ label: name.label
521
+ }));
515
522
  }
516
523
  }
517
524
  return addon;
@@ -563,7 +570,7 @@ export default class Component extends Element {
563
570
  return this.paths.dataPath;
564
571
  }
565
572
  set path(path) {
566
- throw new Error('Should not be setting the path of a component.');
573
+ throw new Error(this.t('setPathError'));
567
574
  }
568
575
  set parentVisible(value) {
569
576
  this._parentVisible = value;
@@ -655,7 +662,7 @@ export default class Component extends Element {
655
662
  return this.options.attachMode === 'builder';
656
663
  }
657
664
  get calculatedPath() {
658
- console.error('component.calculatedPath was deprecated, use component.path instead.');
665
+ console.error(this.t('calculatedPathDeprecation'));
659
666
  return this.path;
660
667
  }
661
668
  get labelPosition() {
@@ -821,7 +828,7 @@ export default class Component extends Element {
821
828
  const name = names[names.length - 1];
822
829
  const templatesByName = Templates.defaultTemplates[name];
823
830
  if (!templatesByName) {
824
- return { template: `Unknown template: ${name}` };
831
+ return { template: this.t('unknownTemplate', { name }) };
825
832
  }
826
833
  const templateByMode = this.checkTemplateMode(templatesByName, modes);
827
834
  if (templateByMode) {
@@ -878,9 +885,7 @@ export default class Component extends Element {
878
885
  data.disabled = this.disabled;
879
886
  data.builder = this.builderMode;
880
887
  data.render = (...args) => {
881
- console.warn(`Form.io 'render' template function is deprecated.
882
- If you need to render template (template A) inside of another template (template B),
883
- pass pre-compiled template A (use this.renderTemplate('template_A_name') as template context variable for template B`);
888
+ console.warn(this.t('renderTemplateFunctionDeprecation'));
884
889
  return this.renderTemplate(...args);
885
890
  };
886
891
  data.label = data.labelInfo || this.labelInfo;
@@ -1080,7 +1085,7 @@ export default class Component extends Element {
1080
1085
  modalLabel = { className: 'field-required' };
1081
1086
  }
1082
1087
  return this.renderModalPreview({
1083
- previewText: this.getValueAsString(dataValue, { modalPreview: true }) || this.t('Click to set value'),
1088
+ previewText: this.getValueAsString(dataValue, { modalPreview: true }) || this.t('clickToSetValue'),
1084
1089
  messages: '',
1085
1090
  labelInfo: modalLabel,
1086
1091
  });
@@ -1105,7 +1110,7 @@ export default class Component extends Element {
1105
1110
  * @param {boolean} topLevel - If this is the topmost component that is being rendered.
1106
1111
  * @returns {string} - The rendered HTML string of a component.
1107
1112
  */
1108
- render(children = `Unknown component: ${this.component.type}`, topLevel = false) {
1113
+ render(children = this.t('unknownComponent', { type: this.component.type }), topLevel = false) {
1109
1114
  const isVisible = this.visible;
1110
1115
  this.rendered = true;
1111
1116
  if (!this.builderMode && !this.previewMode && this.component.modalEdit) {
@@ -2407,6 +2412,13 @@ export default class Component extends Element {
2407
2412
  return editor;
2408
2413
  });
2409
2414
  }
2415
+ async getDragula() {
2416
+ return new Promise((resolve) => {
2417
+ return Formio.requireLibrary('dragula', 'dragula', `${Formio.cdn.dragula}/dragula.js`, true, (ready) => {
2418
+ return ready.then(resolve);
2419
+ });
2420
+ });
2421
+ }
2410
2422
  get tree() {
2411
2423
  return this.component.tree || false;
2412
2424
  }
@@ -2536,7 +2548,7 @@ export default class Component extends Element {
2536
2548
  }
2537
2549
  return value;
2538
2550
  };
2539
- if (this.defaultMask) {
2551
+ if (Array.isArray(this.defaultMask) ? this.defaultMask.length > 0 : this.defaultMask) {
2540
2552
  if (Array.isArray(defaultValue)) {
2541
2553
  defaultValue = defaultValue.map(checkMask);
2542
2554
  }
@@ -3309,7 +3321,7 @@ export default class Component extends Element {
3309
3321
  }
3310
3322
  // Maintain reverse compatibility.
3311
3323
  whenReady() {
3312
- console.warn('The whenReady() method has been deprecated. Please use the dataReady property instead.');
3324
+ console.warn(this.t('whenReadyDeprecation'));
3313
3325
  return this.dataReady;
3314
3326
  }
3315
3327
  get dataReady() {
@@ -3444,6 +3456,10 @@ export default class Component extends Element {
3444
3456
  const disabled = this.shouldDisabled;
3445
3457
  // Change states which won't be recalculated during redrawing
3446
3458
  if (this.visible !== visible) {
3459
+ // If the logic is triggered by an event and the action sets the hidden state then the original
3460
+ // component definition must be changed so that the components hidden state does not get flipped back by
3461
+ // the fieldLogic function
3462
+ this.originalComponent.hidden = !visible;
3447
3463
  this.visible = visible;
3448
3464
  }
3449
3465
  if (this.disabled !== disabled) {
@@ -45,6 +45,6 @@ export default [
45
45
  },
46
46
  EditFormUtils.javaScriptValue('Advanced Conditions', 'customConditional', 'conditional.json', 110, '<p>You must assign the <strong>show</strong> variable a boolean result.</p>' +
47
47
  '<p><strong>Note: Advanced Conditional logic will override the results of the Simple Conditional logic.</strong></p>' +
48
- '<h5>Example</h5><pre>show = !!data.showMe;</pre>', '<p><a href="https://help.form.io/userguide/form-building/logic-and-conditions" target="_blank" rel="noopener noreferrer">Click here for an example</a></p>')
48
+ '<h5>Example</h5><pre>show = !!data.showMe;</pre>', '<p><a href="https://help.form.io/userguide/form-building/logic-and-conditions" target="_blank" rel="noopener noreferrer">Click here for an example</a></p>', EditFormUtils.tokenVariableDescription())
49
49
  ];
50
50
  /* eslint-enable quotes, max-len */
@@ -87,6 +87,9 @@ declare const _default: ({
87
87
  valueProperty?: undefined;
88
88
  data?: undefined;
89
89
  conditional?: undefined;
90
+ as?: undefined;
91
+ editor?: undefined;
92
+ description?: undefined;
90
93
  } | {
91
94
  type: string;
92
95
  label: string;
@@ -103,6 +106,9 @@ declare const _default: ({
103
106
  valueProperty?: undefined;
104
107
  data?: undefined;
105
108
  conditional?: undefined;
109
+ as?: undefined;
110
+ editor?: undefined;
111
+ description?: undefined;
106
112
  } | {
107
113
  weight: number;
108
114
  type: string;
@@ -125,6 +131,9 @@ declare const _default: ({
125
131
  valueProperty?: undefined;
126
132
  data?: undefined;
127
133
  conditional?: undefined;
134
+ as?: undefined;
135
+ editor?: undefined;
136
+ description?: undefined;
128
137
  } | {
129
138
  weight: number;
130
139
  type: string;
@@ -173,6 +182,9 @@ declare const _default: ({
173
182
  valueProperty?: undefined;
174
183
  data?: undefined;
175
184
  conditional?: undefined;
185
+ as?: undefined;
186
+ editor?: undefined;
187
+ description?: undefined;
176
188
  } | {
177
189
  type: string;
178
190
  input: boolean;
@@ -200,6 +212,9 @@ declare const _default: ({
200
212
  defaultValue?: undefined;
201
213
  values?: undefined;
202
214
  logic?: undefined;
215
+ as?: undefined;
216
+ editor?: undefined;
217
+ description?: undefined;
203
218
  } | {
204
219
  weight: number;
205
220
  type: string;
@@ -216,5 +231,27 @@ declare const _default: ({
216
231
  valueProperty?: undefined;
217
232
  data?: undefined;
218
233
  conditional?: undefined;
234
+ as?: undefined;
235
+ editor?: undefined;
236
+ description?: undefined;
237
+ } | {
238
+ type: string;
239
+ as: string;
240
+ editor: string;
241
+ weight: number;
242
+ input: boolean;
243
+ key: string;
244
+ label: string;
245
+ tooltip: string;
246
+ defaultValue: {};
247
+ description: string;
248
+ placeholder?: undefined;
249
+ inline?: undefined;
250
+ values?: undefined;
251
+ logic?: undefined;
252
+ dataSrc?: undefined;
253
+ valueProperty?: undefined;
254
+ data?: undefined;
255
+ conditional?: undefined;
219
256
  })[];
220
257
  export default _default;
@@ -76,6 +76,25 @@ export default [
76
76
  }
77
77
  ]
78
78
  },
79
+ {
80
+ name: 'hide',
81
+ trigger: {
82
+ type: 'javascript',
83
+ javascript: 'result = instance.root.options.editJson === false;'
84
+ },
85
+ actions: [
86
+ {
87
+ name: 'hide',
88
+ type: 'property',
89
+ property: {
90
+ label: 'Hidden',
91
+ value: 'hidden',
92
+ type: 'boolean'
93
+ },
94
+ state: true
95
+ }
96
+ ]
97
+ },
79
98
  {
80
99
  name: 'disabledToolTip',
81
100
  trigger: {
@@ -135,7 +154,7 @@ export default [
135
154
  input: true
136
155
  },
137
156
  EditFormUtils.javaScriptValue('Custom Default Value', 'customDefaultValue', 'customDefaultValue', 1000, '<p><h4>Example:</h4><pre>value = data.firstName + " " + data.lastName;</pre></p>', '<p><h4>Example:</h4><pre>{"cat": [{"var": "data.firstName"}, " ", {"var": "data.lastName"}]}</pre>'),
138
- EditFormUtils.javaScriptValue('Calculated Value', 'calculateValue', 'calculateValue', 1100, '<p><h4>Example:</h4><pre>value = data.a + data.b + data.c;</pre></p>', '<p><h4>Example:</h4><pre>{"+": [{"var": "data.a"}, {"var": "data.b"}, {"var": "data.c"}]}</pre><p><a href="https://help.form.io/userguide/form-building/logic-and-conditions#calculated-values" target="_blank" rel="noopener noreferrer">Click here for an example</a></p>', '<tr><th>token</th><td>The decoded JWT token for the authenticated user.</td></tr>'),
157
+ EditFormUtils.javaScriptValue('Calculated Value', 'calculateValue', 'calculateValue', 1100, '<p><h4>Example:</h4><pre>value = data.a + data.b + data.c;</pre></p>', '<p><h4>Example:</h4><pre>{"+": [{"var": "data.a"}, {"var": "data.b"}, {"var": "data.c"}]}</pre><p><a href="https://help.form.io/userguide/form-building/logic-and-conditions#calculated-values" target="_blank" rel="noopener noreferrer">Click here for an example</a></p>', EditFormUtils.tokenVariableDescription()),
139
158
  {
140
159
  type: 'checkbox',
141
160
  input: true,
@@ -152,5 +171,16 @@ export default [
152
171
  label: 'Allow Manual Override of Calculated Value',
153
172
  tooltip: 'When checked, this will allow the user to manually override the calculated value.'
154
173
  },
174
+ {
175
+ type: 'textarea',
176
+ as: 'json',
177
+ editor: 'ace',
178
+ weight: 1400,
179
+ input: true,
180
+ key: 'serverOverride',
181
+ label: 'Server Override',
182
+ tooltip: 'A JSON object containing the component settings that should be overriden when the form submission is processed on the server side.',
183
+ defaultValue: {},
184
+ description: '<b>Example</b>: { "clearOnHide": true }',
185
+ }
155
186
  ];
156
- /* eslint-enable max-len */
@@ -2,6 +2,7 @@ export default EditFormUtils;
2
2
  declare namespace EditFormUtils {
3
3
  function sortAndFilterComponents(components: any): any;
4
4
  function unifyComponents(objValue: any, srcValue: any): any;
5
+ function tokenVariableDescription(): string;
5
6
  function logicVariablesTable(additional: any): {
6
7
  type: string;
7
8
  tag: string;
@@ -32,6 +32,9 @@ const EditFormUtils = {
32
32
  }
33
33
  return _.isEqual(objValue, srcValue);
34
34
  },
35
+ tokenVariableDescription() {
36
+ return '<tr><th>token</th><td>The decoded JWT token for the authenticated user.</td></tr>';
37
+ },
35
38
  logicVariablesTable(additional) {
36
39
  additional = additional || '';
37
40
  return {
@@ -233,7 +233,28 @@ export default class Input extends Multivalue {
233
233
  if (key === 13) {
234
234
  event.preventDefault();
235
235
  event.stopPropagation();
236
- this.emit('submitButton');
236
+ let submitButton = null;
237
+ if (this.root?.everyComponent) {
238
+ this.root.everyComponent((component) => {
239
+ if (component?.component.type === 'button' &&
240
+ component?.component.action === 'submit') {
241
+ submitButton = component;
242
+ return false;
243
+ }
244
+ });
245
+ }
246
+ const options = {};
247
+ if (submitButton) {
248
+ options.instance = submitButton;
249
+ options.component = submitButton.component;
250
+ options.noValidate = this.component.state === 'draft';
251
+ options.state = this.component.state || 'submitted';
252
+ submitButton.loading = true;
253
+ this.emit('submitButton', options);
254
+ }
255
+ else {
256
+ this.emit('submitButton', options);
257
+ }
237
258
  }
238
259
  });
239
260
  }
@@ -133,12 +133,12 @@ export default class ListComponent extends Field {
133
133
  component: this.component,
134
134
  message: err.toString(),
135
135
  });
136
- console.warn(`Unable to load resources for ${this.key}`);
136
+ console.warn(this.t('loadResourcesError', { componentKey: this.key }));
137
137
  }
138
138
  /* eslint-disable max-statements */
139
139
  updateItems(searchInput, forceUpdate) {
140
140
  if (!this.component.data) {
141
- console.warn(`Select component ${this.key} does not have data configuration.`);
141
+ console.warn(this.t('noSelectDataConfiguration', { componentKey: this.key }));
142
142
  this.itemsLoadedResolve();
143
143
  return;
144
144
  }
@@ -170,7 +170,7 @@ export default class ListComponent extends Field {
170
170
  this.loadItems(resourceUrl, searchInput, this.requestHeaders);
171
171
  }
172
172
  catch (err) {
173
- console.warn(`Unable to load resources for ${this.key}`);
173
+ console.warn(this.t('loadResourcesError', { componentKey: this.key }));
174
174
  }
175
175
  }
176
176
  else {
@@ -214,7 +214,7 @@ export default class ListComponent extends Field {
214
214
  return;
215
215
  }
216
216
  if (!window.indexedDB) {
217
- window.alert("Your browser doesn't support current version of indexedDB");
217
+ window.alert(this.t('indexedDBSupportError'));
218
218
  }
219
219
  if (this.component.indexeddb && this.component.indexeddb.database && this.component.indexeddb.table) {
220
220
  const request = window.indexedDB.open(this.component.indexeddb.database);
@@ -51,7 +51,7 @@ export default class Multivalue extends Field {
51
51
  attachMultiMask(index: number): boolean;
52
52
  /**
53
53
  * @param {any} input - The input element on which the mask is to be applied.
54
- * @param {string} mask - The mask pattern to apply to the input element. Exit early if no mask.
54
+ * @param {string} mask - The mask pattern to apply to the input element. Exit early and remove previous mask if no mask.
55
55
  */
56
56
  updateMask(input: any, mask: string): void;
57
57
  /**
@@ -61,7 +61,7 @@ export default class Multivalue extends Field {
61
61
  return value;
62
62
  }
63
63
  get addAnother() {
64
- return this.t(this.component.addAnother || 'Add Another');
64
+ return this.t(this.component.addAnother || 'addAnother');
65
65
  }
66
66
  /**
67
67
  * @returns {Field} - The created field.
@@ -180,7 +180,7 @@ export default class Multivalue extends Field {
180
180
  this.saveCaretPosition(element, index);
181
181
  }
182
182
  catch (err) {
183
- console.warn('An error occurred while trying to save caret position', err);
183
+ console.warn(this.t('caretPositionSavingError'), err);
184
184
  }
185
185
  // If a mask is present, delay the update to allow mask to update first.
186
186
  if (element.mask) {
@@ -259,10 +259,17 @@ export default class Multivalue extends Field {
259
259
  }
260
260
  /**
261
261
  * @param {any} input - The input element on which the mask is to be applied.
262
- * @param {string} mask - The mask pattern to apply to the input element. Exit early if no mask.
262
+ * @param {string} mask - The mask pattern to apply to the input element. Exit early and remove previous mask if no mask.
263
263
  */
264
264
  updateMask(input, mask) {
265
265
  if (!mask) {
266
+ if (input.mask) {
267
+ input.mask.destroy();
268
+ }
269
+ if (!this.component.placeholder) {
270
+ input.removeAttribute('placeholder');
271
+ }
272
+ input.value = '';
266
273
  return;
267
274
  }
268
275
  this.setInputMask(input, mask, !this.component.placeholder);
@@ -6,6 +6,19 @@ import Components from '../../Components';
6
6
  */
7
7
  export default function (...extend) {
8
8
  return Components.baseEditForm([
9
+ {
10
+ key: 'display',
11
+ components: [
12
+ {
13
+ key: 'labelWidth',
14
+ ignore: true
15
+ },
16
+ {
17
+ key: 'labelMargin',
18
+ ignore: true
19
+ }
20
+ ]
21
+ },
9
22
  {
10
23
  key: 'data',
11
24
  ignore: true
@@ -13,6 +13,8 @@ export default class NestedArrayComponent extends NestedDataComponent {
13
13
  processRow(method: any, data: any, opts: any, row: any, components: any, silentCheck: any): any;
14
14
  hasAddButton(): any;
15
15
  everyComponent(fn: any, rowIndex: any, options?: {}): void;
16
+ _getEmailTableHeader(options: any): string;
17
+ _getEmailTableBody(options: any): string;
16
18
  getComponents(rowIndex: any): any;
17
19
  removeSubmissionMetadataRow(index: any): void;
18
20
  }