@formio/js 5.0.0-dev.5672.279701a → 5.0.0-dev.5673.ae99c16

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 (279) hide show
  1. package/Changelog.md +63 -1
  2. package/dist/formio.builder.css +0 -1
  3. package/dist/formio.builder.min.css +1 -1
  4. package/dist/formio.embed.js +1 -1
  5. package/dist/formio.embed.min.js +1 -1
  6. package/dist/formio.form.css +0 -1
  7. package/dist/formio.form.js +648 -596
  8. package/dist/formio.form.min.css +1 -1
  9. package/dist/formio.form.min.js +1 -1
  10. package/dist/formio.form.min.js.LICENSE.txt +1 -9
  11. package/dist/formio.full.css +0 -1
  12. package/dist/formio.full.js +635 -603
  13. package/dist/formio.full.min.css +1 -1
  14. package/dist/formio.full.min.js +1 -1
  15. package/dist/formio.full.min.js.LICENSE.txt +1 -9
  16. package/dist/formio.js +4 -4
  17. package/dist/formio.min.js +1 -1
  18. package/dist/formio.utils.js +102 -40
  19. package/dist/formio.utils.min.js +1 -1
  20. package/dist/formio.utils.min.js.LICENSE.txt +5 -3
  21. package/lib/cjs/CDN.d.ts +1 -0
  22. package/lib/cjs/CDN.js +2 -2
  23. package/lib/cjs/Form.d.ts +2 -2
  24. package/lib/cjs/Form.js +11 -5
  25. package/lib/cjs/Formio.js +1 -0
  26. package/lib/cjs/PDF.js +1 -1
  27. package/lib/cjs/PDFBuilder.js +2 -1
  28. package/lib/cjs/Webform.d.ts +1 -1
  29. package/lib/cjs/Webform.js +11 -6
  30. package/lib/cjs/WebformBuilder.js +13 -3
  31. package/lib/cjs/Wizard.js +1 -1
  32. package/lib/cjs/components/_classes/component/Component.d.ts +4 -3
  33. package/lib/cjs/components/_classes/component/Component.js +31 -8
  34. package/lib/cjs/components/_classes/component/editForm/Component.edit.display.js +8 -0
  35. package/lib/cjs/components/_classes/component/fixtures/comp7.d.ts +84 -0
  36. package/lib/cjs/components/_classes/component/fixtures/comp7.js +86 -0
  37. package/lib/cjs/components/_classes/component/fixtures/index.d.ts +2 -1
  38. package/lib/cjs/components/_classes/component/fixtures/index.js +3 -1
  39. package/lib/cjs/components/_classes/input/Input.js +23 -1
  40. package/lib/cjs/components/_classes/multivalue/Multivalue.d.ts +8 -1
  41. package/lib/cjs/components/_classes/multivalue/Multivalue.js +45 -25
  42. package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +2 -1
  43. package/lib/cjs/components/_classes/nested/NestedComponent.js +5 -1
  44. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +3 -0
  45. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +56 -29
  46. package/lib/cjs/components/address/Address.d.ts +6 -0
  47. package/lib/cjs/components/address/Address.js +11 -1
  48. package/lib/cjs/components/address/editForm/Address.edit.provider.js +1 -1
  49. package/lib/cjs/components/checkbox/Checkbox.d.ts +1 -1
  50. package/lib/cjs/components/checkbox/Checkbox.js +1 -1
  51. package/lib/cjs/components/checkbox/fixtures/comp6.d.ts +32 -0
  52. package/lib/cjs/components/checkbox/fixtures/comp6.js +30 -0
  53. package/lib/cjs/components/checkbox/fixtures/index.d.ts +2 -1
  54. package/lib/cjs/components/checkbox/fixtures/index.js +3 -1
  55. package/lib/cjs/components/currency/Currency.d.ts +2 -0
  56. package/lib/cjs/components/datagrid/DataGrid.d.ts +11 -1
  57. package/lib/cjs/components/datagrid/DataGrid.js +59 -36
  58. package/lib/cjs/components/datagrid/fixtures/comp-with-reorder.d.ts +100 -0
  59. package/lib/cjs/components/datagrid/fixtures/comp-with-reorder.js +139 -0
  60. package/lib/cjs/components/datagrid/fixtures/comp10.d.ts +81 -0
  61. package/lib/cjs/components/datagrid/fixtures/comp10.js +87 -0
  62. package/lib/cjs/components/datagrid/fixtures/comp11.d.ts +50 -0
  63. package/lib/cjs/components/datagrid/fixtures/comp11.js +55 -0
  64. package/lib/cjs/components/datagrid/fixtures/comp9.d.ts +41 -0
  65. package/lib/cjs/components/datagrid/fixtures/comp9.js +44 -0
  66. package/lib/cjs/components/datagrid/fixtures/index.d.ts +5 -1
  67. package/lib/cjs/components/datagrid/fixtures/index.js +9 -1
  68. package/lib/cjs/components/datamap/DataMap.js +2 -2
  69. package/lib/cjs/components/datetime/fixtures/comp14.d.ts +35 -0
  70. package/lib/cjs/components/datetime/fixtures/comp14.js +38 -0
  71. package/lib/cjs/components/datetime/fixtures/index.d.ts +6 -5
  72. package/lib/cjs/components/datetime/fixtures/index.js +3 -1
  73. package/lib/cjs/components/day/Day.d.ts +3 -4
  74. package/lib/cjs/components/day/Day.js +31 -10
  75. package/lib/cjs/components/day/fixtures/comp8.d.ts +41 -0
  76. package/lib/cjs/components/day/fixtures/comp8.js +40 -0
  77. package/lib/cjs/components/day/fixtures/index.d.ts +2 -1
  78. package/lib/cjs/components/day/fixtures/index.js +3 -1
  79. package/lib/cjs/components/editgrid/EditGrid.js +16 -8
  80. package/lib/cjs/components/editgrid/fixtures/comp-test-events.d.ts +54 -0
  81. package/lib/cjs/components/editgrid/fixtures/comp-test-events.js +54 -0
  82. package/lib/cjs/components/editgrid/fixtures/comp16.d.ts +52 -0
  83. package/lib/cjs/components/editgrid/fixtures/comp16.js +71 -0
  84. package/lib/cjs/components/editgrid/fixtures/comp17.d.ts +80 -0
  85. package/lib/cjs/components/editgrid/fixtures/comp17.js +99 -0
  86. package/lib/cjs/components/editgrid/fixtures/index.d.ts +10 -7
  87. package/lib/cjs/components/editgrid/fixtures/index.js +7 -1
  88. package/lib/cjs/components/file/File.d.ts +2 -2
  89. package/lib/cjs/components/file/File.js +13 -2
  90. package/lib/cjs/components/file/editForm/File.edit.display.js +1 -1
  91. package/lib/cjs/components/form/Form.d.ts +1 -1
  92. package/lib/cjs/components/form/Form.js +1 -1
  93. package/lib/cjs/components/form/editForm/Form.edit.form.js +1 -1
  94. package/lib/cjs/components/form/fixtures/index.d.ts +2 -1
  95. package/lib/cjs/components/form/fixtures/index.js +3 -1
  96. package/lib/cjs/components/form/fixtures/nestedWizardForm.d.ts +771 -0
  97. package/lib/cjs/components/form/fixtures/nestedWizardForm.js +765 -0
  98. package/lib/cjs/components/html/HTML.js +1 -1
  99. package/lib/cjs/components/number/Number.d.ts +17 -2
  100. package/lib/cjs/components/number/Number.js +27 -7
  101. package/lib/cjs/components/number/fixtures/comp10.d.ts +18 -0
  102. package/lib/cjs/components/number/fixtures/comp10.js +21 -0
  103. package/lib/cjs/components/number/fixtures/comp8.d.ts +32 -0
  104. package/lib/cjs/components/number/fixtures/comp8.js +28 -0
  105. package/lib/cjs/components/number/fixtures/comp9.d.ts +18 -0
  106. package/lib/cjs/components/number/fixtures/comp9.js +21 -0
  107. package/lib/cjs/components/number/fixtures/index.d.ts +4 -1
  108. package/lib/cjs/components/number/fixtures/index.js +7 -1
  109. package/lib/cjs/components/panel/Panel.d.ts +1 -0
  110. package/lib/cjs/components/panel/Panel.js +1 -0
  111. package/lib/cjs/components/radio/Radio.d.ts +2 -18
  112. package/lib/cjs/components/radio/Radio.js +29 -27
  113. package/lib/cjs/components/radio/fixtures/comp12.d.ts +29 -0
  114. package/lib/cjs/components/radio/fixtures/comp12.js +36 -0
  115. package/lib/cjs/components/radio/fixtures/index.d.ts +2 -1
  116. package/lib/cjs/components/radio/fixtures/index.js +3 -1
  117. package/lib/cjs/components/recaptcha/ReCaptcha.d.ts +6 -0
  118. package/lib/cjs/components/recaptcha/ReCaptcha.js +6 -0
  119. package/lib/cjs/components/select/Select.d.ts +38 -0
  120. package/lib/cjs/components/select/Select.js +14 -5
  121. package/lib/cjs/components/select/fixtures/comp25.d.ts +59 -0
  122. package/lib/cjs/components/select/fixtures/comp25.js +66 -0
  123. package/lib/cjs/components/select/fixtures/comp26.d.ts +44 -0
  124. package/lib/cjs/components/select/fixtures/comp26.js +59 -0
  125. package/lib/cjs/components/select/fixtures/index.d.ts +3 -1
  126. package/lib/cjs/components/select/fixtures/index.js +5 -1
  127. package/lib/cjs/components/selectboxes/SelectBoxes.d.ts +0 -22
  128. package/lib/cjs/components/selectboxes/SelectBoxes.js +12 -9
  129. package/lib/cjs/components/signature/editForm/Signature.edit.display.d.ts +0 -6
  130. package/lib/cjs/components/signature/editForm/Signature.edit.display.js +0 -1
  131. package/lib/cjs/components/tags/Tags.js +3 -3
  132. package/lib/cjs/components/time/Time.d.ts +2 -2
  133. package/lib/cjs/components/time/Time.form.js +2 -2
  134. package/lib/cjs/components/time/Time.js +3 -7
  135. package/lib/cjs/components/time/fixtures/comp4.d.ts +166 -0
  136. package/lib/cjs/components/time/fixtures/comp4.js +171 -0
  137. package/lib/cjs/components/time/fixtures/index.d.ts +2 -1
  138. package/lib/cjs/components/time/fixtures/index.js +3 -1
  139. package/lib/cjs/providers/address/GoogleAddressProvider.d.ts +5 -0
  140. package/lib/cjs/providers/address/GoogleAddressProvider.js +23 -1
  141. package/lib/cjs/templates/Templates.js +1 -1
  142. package/lib/cjs/translations/en.d.ts +4 -0
  143. package/lib/cjs/translations/en.js +5 -1
  144. package/lib/cjs/utils/conditionOperators/DateGreaterThan.js +2 -1
  145. package/lib/cjs/utils/conditionOperators/IsEmptyValue.js +4 -3
  146. package/lib/cjs/utils/conditionOperators/IsEqualTo.js +3 -3
  147. package/lib/cjs/utils/utils.d.ts +2 -11
  148. package/lib/cjs/utils/utils.js +60 -24
  149. package/lib/cjs/widgets/CalendarWidget.js +24 -10
  150. package/lib/mjs/CDN.d.ts +1 -0
  151. package/lib/mjs/CDN.js +2 -2
  152. package/lib/mjs/Form.d.ts +2 -2
  153. package/lib/mjs/Form.js +11 -5
  154. package/lib/mjs/Formio.js +1 -0
  155. package/lib/mjs/PDF.js +1 -1
  156. package/lib/mjs/PDFBuilder.js +1 -1
  157. package/lib/mjs/Webform.d.ts +1 -1
  158. package/lib/mjs/Webform.js +15 -6
  159. package/lib/mjs/WebformBuilder.js +12 -3
  160. package/lib/mjs/Wizard.js +1 -1
  161. package/lib/mjs/components/_classes/component/Component.d.ts +4 -3
  162. package/lib/mjs/components/_classes/component/Component.js +17 -5
  163. package/lib/mjs/components/_classes/component/editForm/Component.edit.display.js +8 -0
  164. package/lib/mjs/components/_classes/component/fixtures/comp7.d.ts +84 -0
  165. package/lib/mjs/components/_classes/component/fixtures/comp7.js +84 -0
  166. package/lib/mjs/components/_classes/component/fixtures/index.d.ts +2 -1
  167. package/lib/mjs/components/_classes/component/fixtures/index.js +2 -1
  168. package/lib/mjs/components/_classes/input/Input.js +22 -1
  169. package/lib/mjs/components/_classes/multivalue/Multivalue.d.ts +8 -1
  170. package/lib/mjs/components/_classes/multivalue/Multivalue.js +45 -25
  171. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +2 -1
  172. package/lib/mjs/components/_classes/nested/NestedComponent.js +5 -1
  173. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +3 -0
  174. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +57 -29
  175. package/lib/mjs/components/address/Address.d.ts +6 -0
  176. package/lib/mjs/components/address/Address.js +14 -1
  177. package/lib/mjs/components/address/editForm/Address.edit.provider.js +1 -1
  178. package/lib/mjs/components/checkbox/Checkbox.d.ts +1 -1
  179. package/lib/mjs/components/checkbox/Checkbox.js +1 -1
  180. package/lib/mjs/components/checkbox/fixtures/comp6.d.ts +32 -0
  181. package/lib/mjs/components/checkbox/fixtures/comp6.js +28 -0
  182. package/lib/mjs/components/checkbox/fixtures/index.d.ts +2 -1
  183. package/lib/mjs/components/checkbox/fixtures/index.js +2 -1
  184. package/lib/mjs/components/currency/Currency.d.ts +2 -0
  185. package/lib/mjs/components/datagrid/DataGrid.d.ts +11 -1
  186. package/lib/mjs/components/datagrid/DataGrid.js +58 -35
  187. package/lib/mjs/components/datagrid/fixtures/comp-with-reorder.d.ts +100 -0
  188. package/lib/mjs/components/datagrid/fixtures/comp-with-reorder.js +137 -0
  189. package/lib/mjs/components/datagrid/fixtures/comp10.d.ts +81 -0
  190. package/lib/mjs/components/datagrid/fixtures/comp10.js +85 -0
  191. package/lib/mjs/components/datagrid/fixtures/comp11.d.ts +50 -0
  192. package/lib/mjs/components/datagrid/fixtures/comp11.js +53 -0
  193. package/lib/mjs/components/datagrid/fixtures/comp9.d.ts +41 -0
  194. package/lib/mjs/components/datagrid/fixtures/comp9.js +42 -0
  195. package/lib/mjs/components/datagrid/fixtures/index.d.ts +5 -1
  196. package/lib/mjs/components/datagrid/fixtures/index.js +5 -1
  197. package/lib/mjs/components/datamap/DataMap.js +2 -2
  198. package/lib/mjs/components/datetime/fixtures/comp14.d.ts +35 -0
  199. package/lib/mjs/components/datetime/fixtures/comp14.js +36 -0
  200. package/lib/mjs/components/datetime/fixtures/index.d.ts +6 -5
  201. package/lib/mjs/components/datetime/fixtures/index.js +2 -1
  202. package/lib/mjs/components/day/Day.d.ts +3 -4
  203. package/lib/mjs/components/day/Day.js +30 -10
  204. package/lib/mjs/components/day/fixtures/comp8.d.ts +41 -0
  205. package/lib/mjs/components/day/fixtures/comp8.js +38 -0
  206. package/lib/mjs/components/day/fixtures/index.d.ts +2 -1
  207. package/lib/mjs/components/day/fixtures/index.js +2 -1
  208. package/lib/mjs/components/editgrid/EditGrid.js +16 -8
  209. package/lib/mjs/components/editgrid/fixtures/comp-test-events.d.ts +54 -0
  210. package/lib/mjs/components/editgrid/fixtures/comp-test-events.js +52 -0
  211. package/lib/mjs/components/editgrid/fixtures/comp16.d.ts +52 -0
  212. package/lib/mjs/components/editgrid/fixtures/comp16.js +69 -0
  213. package/lib/mjs/components/editgrid/fixtures/comp17.d.ts +80 -0
  214. package/lib/mjs/components/editgrid/fixtures/comp17.js +97 -0
  215. package/lib/mjs/components/editgrid/fixtures/index.d.ts +10 -7
  216. package/lib/mjs/components/editgrid/fixtures/index.js +4 -1
  217. package/lib/mjs/components/file/File.d.ts +2 -2
  218. package/lib/mjs/components/file/File.js +13 -2
  219. package/lib/mjs/components/file/editForm/File.edit.display.js +1 -1
  220. package/lib/mjs/components/form/Form.d.ts +1 -1
  221. package/lib/mjs/components/form/Form.js +1 -1
  222. package/lib/mjs/components/form/editForm/Form.edit.form.js +1 -1
  223. package/lib/mjs/components/form/fixtures/index.d.ts +2 -1
  224. package/lib/mjs/components/form/fixtures/index.js +2 -1
  225. package/lib/mjs/components/form/fixtures/nestedWizardForm.d.ts +771 -0
  226. package/lib/mjs/components/form/fixtures/nestedWizardForm.js +763 -0
  227. package/lib/mjs/components/html/HTML.js +1 -1
  228. package/lib/mjs/components/number/Number.d.ts +17 -2
  229. package/lib/mjs/components/number/Number.js +26 -6
  230. package/lib/mjs/components/number/fixtures/comp10.d.ts +18 -0
  231. package/lib/mjs/components/number/fixtures/comp10.js +19 -0
  232. package/lib/mjs/components/number/fixtures/comp8.d.ts +32 -0
  233. package/lib/mjs/components/number/fixtures/comp8.js +26 -0
  234. package/lib/mjs/components/number/fixtures/comp9.d.ts +18 -0
  235. package/lib/mjs/components/number/fixtures/comp9.js +19 -0
  236. package/lib/mjs/components/number/fixtures/index.d.ts +4 -1
  237. package/lib/mjs/components/number/fixtures/index.js +4 -1
  238. package/lib/mjs/components/panel/Panel.d.ts +1 -0
  239. package/lib/mjs/components/panel/Panel.js +1 -0
  240. package/lib/mjs/components/radio/Radio.d.ts +2 -18
  241. package/lib/mjs/components/radio/Radio.js +32 -30
  242. package/lib/mjs/components/radio/fixtures/comp12.d.ts +29 -0
  243. package/lib/mjs/components/radio/fixtures/comp12.js +34 -0
  244. package/lib/mjs/components/radio/fixtures/index.d.ts +2 -1
  245. package/lib/mjs/components/radio/fixtures/index.js +2 -1
  246. package/lib/mjs/components/recaptcha/ReCaptcha.d.ts +6 -0
  247. package/lib/mjs/components/recaptcha/ReCaptcha.js +9 -0
  248. package/lib/mjs/components/select/Select.d.ts +38 -0
  249. package/lib/mjs/components/select/Select.js +17 -6
  250. package/lib/mjs/components/select/fixtures/comp25.d.ts +59 -0
  251. package/lib/mjs/components/select/fixtures/comp25.js +64 -0
  252. package/lib/mjs/components/select/fixtures/comp26.d.ts +44 -0
  253. package/lib/mjs/components/select/fixtures/comp26.js +57 -0
  254. package/lib/mjs/components/select/fixtures/index.d.ts +3 -1
  255. package/lib/mjs/components/select/fixtures/index.js +3 -1
  256. package/lib/mjs/components/selectboxes/SelectBoxes.d.ts +0 -22
  257. package/lib/mjs/components/selectboxes/SelectBoxes.js +16 -9
  258. package/lib/mjs/components/signature/editForm/Signature.edit.display.d.ts +0 -6
  259. package/lib/mjs/components/signature/editForm/Signature.edit.display.js +0 -1
  260. package/lib/mjs/components/tags/Tags.js +3 -3
  261. package/lib/mjs/components/time/Time.d.ts +2 -2
  262. package/lib/mjs/components/time/Time.form.js +2 -2
  263. package/lib/mjs/components/time/Time.js +3 -13
  264. package/lib/mjs/components/time/fixtures/comp4.d.ts +166 -0
  265. package/lib/mjs/components/time/fixtures/comp4.js +169 -0
  266. package/lib/mjs/components/time/fixtures/index.d.ts +2 -1
  267. package/lib/mjs/components/time/fixtures/index.js +2 -1
  268. package/lib/mjs/providers/address/GoogleAddressProvider.d.ts +5 -0
  269. package/lib/mjs/providers/address/GoogleAddressProvider.js +22 -1
  270. package/lib/mjs/templates/Templates.js +1 -1
  271. package/lib/mjs/translations/en.d.ts +4 -0
  272. package/lib/mjs/translations/en.js +5 -1
  273. package/lib/mjs/utils/conditionOperators/DateGreaterThan.js +1 -1
  274. package/lib/mjs/utils/conditionOperators/IsEmptyValue.js +3 -3
  275. package/lib/mjs/utils/conditionOperators/IsEqualTo.js +1 -1
  276. package/lib/mjs/utils/utils.d.ts +2 -11
  277. package/lib/mjs/utils/utils.js +59 -13
  278. package/lib/mjs/widgets/CalendarWidget.js +24 -10
  279. package/package.json +5 -6
@@ -493,6 +493,7 @@ export default class NestedComponent extends Field {
493
493
  header: 'single',
494
494
  collapsed: this.collapsed,
495
495
  [this.nestedKey]: 'single',
496
+ messageContainer: 'single-scope',
496
497
  });
497
498
  let childPromise = Promise.resolve();
498
499
  if (this.refs[this.nestedKey]) {
@@ -677,8 +678,11 @@ export default class NestedComponent extends Field {
677
678
  isValid(data, dirty) {
678
679
  return this.getComponents().reduce((valid, comp) => comp.isValid(data, dirty) && valid, super.isValid(data, dirty));
679
680
  }
680
- validationProcessor({ scope, data, row, instance }, flags) {
681
+ validationProcessor({ scope, data, row, instance, component }, flags) {
681
682
  const { dirty } = flags;
683
+ if (this.root.hasExtraPages && this.page !== this.root.page) {
684
+ instance = this.getComponent(component.path);
685
+ }
682
686
  if (!instance) {
683
687
  return;
684
688
  }
@@ -12,6 +12,9 @@ export default class NestedArrayComponent extends NestedDataComponent {
12
12
  hasAddButton(): any;
13
13
  getComponent(path: any, fn: any, originalPath: any): any;
14
14
  everyComponent(fn: any, rowIndex: any, options?: {}): void;
15
+ _getEmailTableHeader(options: any): string;
16
+ _getEmailTableBody(options: any): string;
15
17
  getComponents(rowIndex: any): any;
18
+ removeSubmissionMetadataRow(index: any): void;
16
19
  }
17
20
  import NestedDataComponent from '../nesteddata/NestedDataComponent';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  import _ from 'lodash';
3
- import { componentValueTypes, getStringFromComponentPath } from '../../../utils/utils';
3
+ import { componentValueTypes, getStringFromComponentPath, isLayoutComponent } from '../../../utils/utils';
4
4
  import Component from '../component/Component';
5
5
  import NestedDataComponent from '../nesteddata/NestedDataComponent';
6
6
  export default class NestedArrayComponent extends NestedDataComponent {
@@ -145,38 +145,60 @@ export default class NestedArrayComponent extends NestedDataComponent {
145
145
  }
146
146
  });
147
147
  }
148
+ _getEmailTableHeader(options) {
149
+ let row = '';
150
+ const getHeaderCell = (component) => {
151
+ if (!component.isInputComponent || !component.visible || component.skipInEmail) {
152
+ return '';
153
+ }
154
+ const label = component.label || component.key;
155
+ return `<th style="padding: 5px 10px;">${label}</th>`;
156
+ };
157
+ const components = this.getComponents(0);
158
+ for (const component of components) {
159
+ if (component.isInputComponent) {
160
+ row += getHeaderCell(component);
161
+ }
162
+ else if (isLayoutComponent(component) && typeof component.everyComponent === 'function') {
163
+ component.everyComponent((comp) => {
164
+ row += getHeaderCell(comp);
165
+ }, options);
166
+ }
167
+ }
168
+ return `<thead><tr>${row}</tr></thead>`;
169
+ }
170
+ _getEmailTableBody(options) {
171
+ const getBodyCell = (component) => {
172
+ if (!component.isInputComponent || !component.visible || component.skipInEmail) {
173
+ return '';
174
+ }
175
+ return `<td style="padding: 5px 10px;">${component.getView(component.dataValue, options)}</td>`;
176
+ };
177
+ const rows = [];
178
+ for (const { components } of this.iteratableRows) {
179
+ let row = '';
180
+ for (const component of components) {
181
+ if (component.isInputComponent) {
182
+ row += getBodyCell(component);
183
+ }
184
+ else if (isLayoutComponent(component) && typeof component.everyComponent === 'function') {
185
+ component.everyComponent((comp) => {
186
+ row += getBodyCell(comp);
187
+ }, options);
188
+ }
189
+ }
190
+ rows.push(`<tr>${row}</tr>`);
191
+ }
192
+ return `<tbody>${rows.join('')}</tbody>`;
193
+ }
148
194
  getValueAsString(value, options) {
149
195
  if (options?.email) {
150
- let result = (`
196
+ return `
151
197
  <table border="1" style="width:100%">
152
- <thead>
153
- <tr>
154
- `);
155
- this.component.components?.forEach((component) => {
156
- const label = component.label || component.key;
157
- result += `<th style="padding: 5px 10px;">${label}</th>`;
158
- });
159
- result += (`
160
- </tr>
161
- </thead>
162
- <tbody>
163
- `);
164
- this.iteratableRows.forEach(({ components }) => {
165
- result += '<tr>';
166
- _.each(components, (component) => {
167
- result += '<td style="padding:5px 10px;">';
168
- if (component.isInputComponent && component.visible && !component.skipInEmail) {
169
- result += component.getView(component.dataValue, options);
170
- }
171
- result += '</td>';
172
- });
173
- result += '</tr>';
174
- });
175
- result += (`
176
- </tbody>
198
+ ${this._getEmailTableHeader(options)}
199
+ ${this._getEmailTableBody(options)}
177
200
  </table>
178
- `);
179
- return result;
201
+ `;
180
202
  }
181
203
  if (!value || !value.length) {
182
204
  return '';
@@ -192,4 +214,10 @@ export default class NestedArrayComponent extends NestedDataComponent {
192
214
  }
193
215
  return super.getComponents();
194
216
  }
217
+ removeSubmissionMetadataRow(index) {
218
+ const componentMetadata = _.get(this.root, `submission.metadata.selectData.${this.path}`, null);
219
+ if (_.isArray(componentMetadata)) {
220
+ componentMetadata.splice(index, 1);
221
+ }
222
+ }
195
223
  }
@@ -11,6 +11,12 @@ export default class AddressComponent extends ContainerComponent {
11
11
  weight: number;
12
12
  schema: any;
13
13
  };
14
+ static get serverConditionSettings(): {
15
+ operators: string[];
16
+ };
17
+ static get conditionOperatorsSettings(): {
18
+ operators: string[];
19
+ };
14
20
  static get modeSwitcherRef(): string;
15
21
  static get removeValueIconRef(): string;
16
22
  static get searchInputRef(): string;
@@ -91,6 +91,15 @@ export default class AddressComponent extends ContainerComponent {
91
91
  schema: AddressComponent.schema(),
92
92
  };
93
93
  }
94
+ static get serverConditionSettings() {
95
+ return AddressComponent.conditionOperatorsSettings;
96
+ }
97
+ static get conditionOperatorsSettings() {
98
+ return {
99
+ ...super.conditionOperatorsSettings,
100
+ operators: ['isEmpty', 'isNotEmpty'],
101
+ };
102
+ }
94
103
  mergeSchema(component = {}) {
95
104
  let { defaultSchema } = this;
96
105
  if (component.components) {
@@ -107,6 +116,10 @@ export default class AddressComponent extends ContainerComponent {
107
116
  if (!this.builderMode) {
108
117
  if (this.component.provider) {
109
118
  const { provider, providerOptions, } = this.component;
119
+ if (_.get(providerOptions, 'params.subscriptionKey')) {
120
+ _.set(providerOptions, "params['subscription-key']", _.get(providerOptions, 'params.subscriptionKey'));
121
+ _.unset(providerOptions, 'params.subscriptionKey');
122
+ }
110
123
  this.provider = this.initializeProvider(provider, providerOptions);
111
124
  }
112
125
  else if (this.component.map) {
@@ -177,7 +190,7 @@ export default class AddressComponent extends ContainerComponent {
177
190
  return (this.manualModeEnabled && this.dataValue) ? this.dataValue.address : this.dataValue;
178
191
  }
179
192
  set address(value) {
180
- if (this.manualModeEnabled && !this.isMultiple) {
193
+ if (this.manualModeEnabled && !this.isMultiple && !_.isEqual(value, this.emptyValue)) {
181
194
  this.dataValue.address = value;
182
195
  }
183
196
  else {
@@ -26,7 +26,7 @@ export default [
26
26
  {
27
27
  type: 'textfield',
28
28
  input: true,
29
- key: "providerOptions.params['subscription-key']",
29
+ key: "providerOptions.params.subscriptionKey",
30
30
  label: 'Subscription Key',
31
31
  placeholder: 'Enter Subscription Key',
32
32
  weight: 10,
@@ -43,7 +43,7 @@ export default class CheckBoxComponent extends Field {
43
43
  attach(element: any): Promise<void>;
44
44
  input: any;
45
45
  detach(element: any): void;
46
- get emptyValue(): false | null;
46
+ get emptyValue(): false | "";
47
47
  getValueAt(index: any): any;
48
48
  get checked(): boolean;
49
49
  setCheckedState(value: any): any;
@@ -116,7 +116,7 @@ export default class CheckBoxComponent extends Field {
116
116
  super.detach();
117
117
  }
118
118
  get emptyValue() {
119
- return this.component.inputType === 'radio' ? null : false;
119
+ return this.component.inputType === 'radio' ? '' : false;
120
120
  }
121
121
  isEmpty(value = this.dataValue) {
122
122
  return super.isEmpty(value) || value === false;
@@ -0,0 +1,32 @@
1
+ declare namespace _default {
2
+ let name: string;
3
+ let path: string;
4
+ let type: string;
5
+ let display: string;
6
+ let components: ({
7
+ label: string;
8
+ inputType: string;
9
+ tableView: boolean;
10
+ defaultValue: boolean;
11
+ key: string;
12
+ type: string;
13
+ name: string;
14
+ value: string;
15
+ input: boolean;
16
+ 'some name': boolean;
17
+ disableOnInvalid?: undefined;
18
+ } | {
19
+ type: string;
20
+ label: string;
21
+ key: string;
22
+ disableOnInvalid: boolean;
23
+ input: boolean;
24
+ tableView: boolean;
25
+ inputType?: undefined;
26
+ defaultValue?: undefined;
27
+ name?: undefined;
28
+ value?: undefined;
29
+ 'some name'?: undefined;
30
+ })[];
31
+ }
32
+ export default _default;
@@ -0,0 +1,28 @@
1
+ export default {
2
+ name: 'ckeckbox',
3
+ path: 'ckeckbox',
4
+ type: 'form',
5
+ display: 'form',
6
+ components: [
7
+ {
8
+ label: 'Checkbox',
9
+ inputType: 'radio',
10
+ tableView: false,
11
+ defaultValue: false,
12
+ key: 'checkbox',
13
+ type: 'checkbox',
14
+ name: 'some name',
15
+ value: 'ok',
16
+ input: true,
17
+ 'some name': false
18
+ },
19
+ {
20
+ type: 'button',
21
+ label: 'Submit',
22
+ key: 'submit',
23
+ disableOnInvalid: true,
24
+ input: true,
25
+ tableView: false
26
+ }
27
+ ],
28
+ };
@@ -3,5 +3,6 @@ import comp2 from './comp2';
3
3
  import comp3 from './comp3';
4
4
  import comp4 from './comp4';
5
5
  import comp5 from './comp5';
6
+ import comp6 from './comp6';
6
7
  import customDefaultComponent from './customDefaultComponent';
7
- export { comp1, comp2, comp3, comp4, comp5, customDefaultComponent };
8
+ export { comp1, comp2, comp3, comp4, comp5, comp6, customDefaultComponent };
@@ -4,4 +4,5 @@ import comp2 from './comp2';
4
4
  import comp3 from './comp3';
5
5
  import comp4 from './comp4';
6
6
  import comp5 from './comp5';
7
- export { comp1, comp2, comp3, comp4, comp5, customDefaultComponent };
7
+ import comp6 from './comp6';
8
+ export { comp1, comp2, comp3, comp4, comp5, comp6, customDefaultComponent };
@@ -2,6 +2,8 @@ export default class CurrencyComponent extends NumberComponent {
2
2
  constructor(component: any, options: any, data: any);
3
3
  currencyPrefix: any;
4
4
  currencySuffix: any;
5
+ parseNumber(value: any): number;
6
+ parseValue(value: any): string | null;
5
7
  addZerosAndFormatValue(value: any): any;
6
8
  stripPrefixSuffix(value: any): any;
7
9
  }
@@ -12,6 +12,7 @@ export default class DataGridComponent extends NestedArrayComponent {
12
12
  tabIndex: number;
13
13
  rows: any[] | undefined;
14
14
  columns: any[] | undefined;
15
+ dragulaReady: Promise<any> | undefined;
15
16
  visibleColumns: {} | undefined;
16
17
  set dataValue(value: any[]);
17
18
  get dataValue(): any[];
@@ -58,10 +59,19 @@ export default class DataGridComponent extends NestedArrayComponent {
58
59
  getRows(): {}[];
59
60
  getColumns(): any[];
60
61
  hasHeader(): any;
61
- loadRefs(element: any, refs: any): void;
62
62
  dragula: any;
63
63
  getComponentsContainer(): any;
64
+ /**
65
+ * Reorder values in array based on the old and new position
66
+ * @param {any} valuesArr - An array of values.
67
+ * @param {number} oldPosition - The index of the value in array before reordering.
68
+ * @param {number} newPosition - The index of the value in array after reordering.
69
+ * @param {boolean|any} movedBelow - Whether or not the value is moved below.
70
+ * @returns {void}
71
+ */
72
+ reorderValues(valuesArr: any, oldPosition: number, newPosition: number, movedBelow: boolean | any): void;
64
73
  onReorder(element: any, _target: any, _source: any, sibling: any): void;
74
+ onCloned(el: any, original: any): void;
65
75
  focusOnNewRowElement(row: any): void;
66
76
  addRow(): void;
67
77
  updateComponentsRowIndex(components: any, rowIndex: any): void;
@@ -1,7 +1,7 @@
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';
4
+ import Components from '../Components';
5
5
  export default class DataGridComponent extends NestedArrayComponent {
6
6
  static schema(...extend) {
7
7
  return NestedArrayComponent.schema({
@@ -38,6 +38,9 @@ export default class DataGridComponent extends NestedArrayComponent {
38
38
  if (this.initRows || !_.isEqual(this.dataValue, this.emptyValue)) {
39
39
  this.createRows(true);
40
40
  }
41
+ if (this.allowReorder) {
42
+ this.dragulaReady = this.getDragula();
43
+ }
41
44
  this.visibleColumns = {};
42
45
  this.prevHasAddButton = this.hasAddButton();
43
46
  this.checkColumns();
@@ -257,13 +260,6 @@ export default class DataGridComponent extends NestedArrayComponent {
257
260
  return hasHeader || ((col.label || col.title) && !col.hideLabel);
258
261
  }, false);
259
262
  }
260
- loadRefs(element, refs) {
261
- super.loadRefs(element, refs);
262
- if (refs['messageContainer'] === 'single') {
263
- const container = _.last(element.querySelectorAll(`[${this._referenceAttributeName}=messageContainer]`));
264
- this.refs['messageContainer'] = container || this.refs['messageContainer'];
265
- }
266
- }
267
263
  attach(element) {
268
264
  this.loadRefs(element, {
269
265
  [`${this.datagridKey}-row`]: 'multiple',
@@ -272,14 +268,20 @@ export default class DataGridComponent extends NestedArrayComponent {
272
268
  [`${this.datagridKey}-removeRow`]: 'multiple',
273
269
  [`${this.datagridKey}-group-header`]: 'multiple',
274
270
  [this.datagridKey]: 'multiple',
275
- 'messageContainer': 'single'
276
271
  });
277
272
  if (this.allowReorder) {
278
273
  this.refs[`${this.datagridKey}-row`].forEach((row, index) => {
279
274
  row.dragInfo = { index };
280
275
  });
281
- if (this.root.dragulaLib) {
282
- this.dragula = this.root.dragulaLib([this.refs[`${this.datagridKey}-tbody`]], {
276
+ this.dragulaReady.then((dragula) => {
277
+ // The drop event may call redraw twice which calls attach twice and because this block of code is asynchronous
278
+ // BOTH redraws may be called before this block of code runs (which causes this block of code to run twice sequentially).
279
+ // This causes two dragula() calls on the same container which breaks dragula. To fix this the return value must
280
+ // be saved in this.dragula and have its container contents reset if it exists
281
+ if (this.dragula && this.dragula.containers) {
282
+ this.dragula.containers = [];
283
+ }
284
+ this.dragula = dragula([this.refs[`${this.datagridKey}-tbody`]], {
283
285
  moves: (_draggedElement, _oldParent, clickedElement) => {
284
286
  const clickedElementKey = clickedElement.getAttribute('data-key');
285
287
  const oldParentKey = _oldParent.getAttribute('data-key');
@@ -288,24 +290,9 @@ export default class DataGridComponent extends NestedArrayComponent {
288
290
  return clickedElement.classList.contains('formio-drag-button');
289
291
  }
290
292
  }
291
- }).on('drop', this.onReorder.bind(this));
292
- this.dragula.on('cloned', (el, original) => {
293
- if (el && el.children && original && original.children) {
294
- _.each(original.children, (child, index) => {
295
- const styles = getComputedStyle(child, null);
296
- if (styles.cssText !== '') {
297
- el.children[index].style.cssText = styles.cssText;
298
- }
299
- else {
300
- const cssText = Object.values(styles).reduce((css, propertyName) => {
301
- return `${css}${propertyName}:${styles.getPropertyValue(propertyName)};`;
302
- }, '');
303
- el.children[index].style.cssText = cssText;
304
- }
305
- });
306
- }
307
- });
308
- }
293
+ }).on('drop', this.onReorder.bind(this))
294
+ .on('cloned', this.onCloned.bind(this));
295
+ });
309
296
  }
310
297
  this.refs[`${this.datagridKey}-addRow`].forEach((addButton) => {
311
298
  this.addEventListener(addButton, 'click', this.addRow.bind(this));
@@ -333,6 +320,24 @@ export default class DataGridComponent extends NestedArrayComponent {
333
320
  getComponentsContainer() {
334
321
  return this.component.components;
335
322
  }
323
+ /**
324
+ * Reorder values in array based on the old and new position
325
+ * @param {any} valuesArr - An array of values.
326
+ * @param {number} oldPosition - The index of the value in array before reordering.
327
+ * @param {number} newPosition - The index of the value in array after reordering.
328
+ * @param {boolean|any} movedBelow - Whether or not the value is moved below.
329
+ * @returns {void}
330
+ */
331
+ reorderValues(valuesArr, oldPosition, newPosition, movedBelow) {
332
+ if (!_.isArray(valuesArr) || _.isEmpty(valuesArr)) {
333
+ return;
334
+ }
335
+ const draggedRowData = valuesArr[oldPosition];
336
+ //insert element at new position
337
+ valuesArr.splice(newPosition, 0, draggedRowData);
338
+ //remove element from old position (if was moved above, after insertion it's at +1 index)
339
+ valuesArr.splice(movedBelow ? oldPosition : oldPosition + 1, 1);
340
+ }
336
341
  onReorder(element, _target, _source, sibling) {
337
342
  if (!element.dragInfo || (sibling && !sibling.dragInfo)) {
338
343
  console.warn('There is no Drag Info available for either dragged or sibling element');
@@ -343,15 +348,32 @@ export default class DataGridComponent extends NestedArrayComponent {
343
348
  const newPosition = sibling ? sibling.dragInfo.index : this.dataValue.length;
344
349
  const movedBelow = newPosition > oldPosition;
345
350
  const dataValue = fastCloneDeep(this.dataValue);
346
- const draggedRowData = dataValue[oldPosition];
347
- //insert element at new position
348
- dataValue.splice(newPosition, 0, draggedRowData);
349
- //remove element from old position (if was moved above, after insertion it's at +1 index)
350
- dataValue.splice(movedBelow ? oldPosition : oldPosition + 1, 1);
351
+ this.reorderValues(dataValue, oldPosition, newPosition, movedBelow);
352
+ //reorder select data
353
+ this.reorderValues(_.get(this.root, `submission.metadata.selectData.${this.path}`, []), oldPosition, newPosition, movedBelow);
354
+ // When components are reordered we need to set the dataGrid and form pristine properties to false
355
+ this.root.pristine = false;
356
+ this.pristine = false;
351
357
  //need to re-build rows to re-calculate indexes and other indexed fields for component instance (like rows for ex.)
352
358
  this.setValue(dataValue, { isReordered: true });
353
359
  this.rebuild();
354
360
  }
361
+ onCloned(el, original) {
362
+ if (el && el.children && original && original.children) {
363
+ _.each(original.children, (child, index) => {
364
+ const styles = getComputedStyle(child, null);
365
+ if (styles.cssText !== '') {
366
+ el.children[index].style.cssText = styles.cssText;
367
+ }
368
+ else {
369
+ const cssText = Object.values(styles).reduce((css, propertyName) => {
370
+ return `${css}${propertyName}:${styles.getPropertyValue(propertyName)};`;
371
+ }, '');
372
+ el.children[index].style.cssText = cssText;
373
+ }
374
+ });
375
+ }
376
+ }
355
377
  focusOnNewRowElement(row) {
356
378
  Object.keys(row).find((key) => {
357
379
  const element = row[key].element;
@@ -410,10 +432,11 @@ export default class DataGridComponent extends NestedArrayComponent {
410
432
  }
411
433
  removeRow(index) {
412
434
  const makeEmpty = index === 0 && this.rows.length === 1;
413
- const flags = { isReordered: !makeEmpty, resetValue: makeEmpty };
435
+ const flags = { isReordered: !makeEmpty, resetValue: makeEmpty, modified: true };
414
436
  this.splice(index, flags);
415
437
  this.emit('dataGridDeleteRow', { index });
416
438
  const [row] = this.rows.splice(index, 1);
439
+ this.removeSubmissionMetadataRow(index);
417
440
  this.removeRowComponents(row);
418
441
  this.updateRowsComponents(index);
419
442
  this.setValue(this.dataValue, flags);
@@ -0,0 +1,100 @@
1
+ declare namespace _default {
2
+ export { form };
3
+ export { submission };
4
+ }
5
+ export default _default;
6
+ declare namespace form {
7
+ let _id: string;
8
+ let title: string;
9
+ let name: string;
10
+ let path: string;
11
+ let type: string;
12
+ let display: string;
13
+ let components: ({
14
+ label: string;
15
+ reorder: boolean;
16
+ addAnotherPosition: string;
17
+ layoutFixed: boolean;
18
+ enableRowGroups: boolean;
19
+ initEmpty: boolean;
20
+ tableView: boolean;
21
+ defaultValue: {
22
+ select: string;
23
+ }[];
24
+ key: string;
25
+ type: string;
26
+ input: boolean;
27
+ components: {
28
+ label: string;
29
+ widget: string;
30
+ tableView: boolean;
31
+ dataSrc: string;
32
+ data: {
33
+ resource: string;
34
+ };
35
+ dataType: string;
36
+ valueProperty: string;
37
+ template: string;
38
+ validate: {
39
+ select: boolean;
40
+ };
41
+ key: string;
42
+ type: string;
43
+ searchField: string;
44
+ limit: number;
45
+ noRefreshOnScroll: boolean;
46
+ addResource: boolean;
47
+ reference: boolean;
48
+ input: boolean;
49
+ }[];
50
+ disableOnInvalid?: undefined;
51
+ } | {
52
+ type: string;
53
+ label: string;
54
+ key: string;
55
+ disableOnInvalid: boolean;
56
+ input: boolean;
57
+ tableView: boolean;
58
+ reorder?: undefined;
59
+ addAnotherPosition?: undefined;
60
+ layoutFixed?: undefined;
61
+ enableRowGroups?: undefined;
62
+ initEmpty?: undefined;
63
+ defaultValue?: undefined;
64
+ components?: undefined;
65
+ })[];
66
+ let created: string;
67
+ let modified: string;
68
+ let machineName: string;
69
+ }
70
+ declare namespace submission {
71
+ let form_1: string;
72
+ export { form_1 as form };
73
+ export namespace metadata {
74
+ namespace selectData {
75
+ let dataGrid: {
76
+ select: {
77
+ data: {
78
+ number: number;
79
+ };
80
+ };
81
+ }[];
82
+ }
83
+ }
84
+ export namespace data {
85
+ let dataGrid_1: {
86
+ select: string;
87
+ }[];
88
+ export { dataGrid_1 as dataGrid };
89
+ export let dataTable: never[];
90
+ export let submit: boolean;
91
+ }
92
+ let _id_1: string;
93
+ export { _id_1 as _id };
94
+ export let project: string;
95
+ export let state: string;
96
+ let created_1: string;
97
+ export { created_1 as created };
98
+ let modified_1: string;
99
+ export { modified_1 as modified };
100
+ }