@formio/js 5.4.1 → 5.4.3

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 (227) hide show
  1. package/README.md +11 -5
  2. package/dist/formio.builder.css +1 -0
  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.embed.min.js.LICENSE.txt +1 -1
  7. package/dist/formio.form.css +1 -0
  8. package/dist/formio.form.js +137 -115
  9. package/dist/formio.form.min.css +1 -1
  10. package/dist/formio.form.min.js +1 -1
  11. package/dist/formio.form.min.js.LICENSE.txt +2 -2
  12. package/dist/formio.full.css +1 -0
  13. package/dist/formio.full.js +161 -139
  14. package/dist/formio.full.min.css +1 -1
  15. package/dist/formio.full.min.js +1 -1
  16. package/dist/formio.full.min.js.LICENSE.txt +2 -2
  17. package/dist/formio.js +27 -27
  18. package/dist/formio.min.js +1 -1
  19. package/dist/formio.min.js.LICENSE.txt +2 -2
  20. package/dist/formio.utils.js +19 -19
  21. package/dist/formio.utils.min.js +1 -1
  22. package/dist/formio.utils.min.js.LICENSE.txt +2 -2
  23. package/lib/cjs/Element.js +1 -1
  24. package/lib/cjs/Embed.js +8 -16
  25. package/lib/cjs/Form.js +4 -4
  26. package/lib/cjs/Formio.js +2 -9
  27. package/lib/cjs/InlineEmbed.js +1 -4
  28. package/lib/cjs/PDF.js +28 -8
  29. package/lib/cjs/PDFBuilder.js +6 -10
  30. package/lib/cjs/Webform.d.ts +1 -0
  31. package/lib/cjs/Webform.js +19 -34
  32. package/lib/cjs/WebformBuilder.js +27 -68
  33. package/lib/cjs/Wizard.d.ts +2 -0
  34. package/lib/cjs/Wizard.js +59 -31
  35. package/lib/cjs/WizardBuilder.js +5 -15
  36. package/lib/cjs/addons/PasswordStrength/PasswordStrengthAddon.form.js +2 -6
  37. package/lib/cjs/addons/PasswordStrength/PasswordStrengthAddon.js +3 -9
  38. package/lib/cjs/addons/index.js +1 -3
  39. package/lib/cjs/components/_classes/component/Component.d.ts +5 -5
  40. package/lib/cjs/components/_classes/component/Component.js +60 -132
  41. package/lib/cjs/components/_classes/component/editForm/Component.edit.data.js +2 -4
  42. package/lib/cjs/components/_classes/component/editForm/Component.edit.display.js +4 -16
  43. package/lib/cjs/components/_classes/component/editForm/Component.edit.validation.js +1 -4
  44. package/lib/cjs/components/_classes/field/Field.js +1 -4
  45. package/lib/cjs/components/_classes/input/Input.js +2 -2
  46. package/lib/cjs/components/_classes/list/ListComponent.js +4 -4
  47. package/lib/cjs/components/_classes/list/editForm/ListComponent.edit.data.js +6 -28
  48. package/lib/cjs/components/_classes/multivalue/Multivalue.js +8 -26
  49. package/lib/cjs/components/_classes/nested/NestedComponent.js +1 -4
  50. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +5 -9
  51. package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.js +1 -3
  52. package/lib/cjs/components/address/Address.js +10 -30
  53. package/lib/cjs/components/address/editForm/Address.edit.provider.js +8 -32
  54. package/lib/cjs/components/alert/Alert.js +3 -6
  55. package/lib/cjs/components/button/Button.js +10 -17
  56. package/lib/cjs/components/button/editForm/Button.edit.display.js +8 -32
  57. package/lib/cjs/components/checkbox/Checkbox.js +4 -10
  58. package/lib/cjs/components/checkbox/editForm/Checkbox.edit.display.js +2 -8
  59. package/lib/cjs/components/columns/Columns.js +5 -17
  60. package/lib/cjs/components/container/Container.js +1 -3
  61. package/lib/cjs/components/currency/Currency.js +2 -7
  62. package/lib/cjs/components/datagrid/DataGrid.js +31 -63
  63. package/lib/cjs/components/datamap/DataMap.js +4 -16
  64. package/lib/cjs/components/datetime/DateTime.js +2 -6
  65. package/lib/cjs/components/datetime/editForm/DateTime.edit.display.js +1 -4
  66. package/lib/cjs/components/day/Day.js +12 -70
  67. package/lib/cjs/components/day/editForm/Day.edit.day.js +1 -3
  68. package/lib/cjs/components/day/editForm/Day.edit.month.js +1 -3
  69. package/lib/cjs/components/editgrid/EditGrid.d.ts +1 -0
  70. package/lib/cjs/components/editgrid/EditGrid.js +18 -44
  71. package/lib/cjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -4
  72. package/lib/cjs/components/file/File.js +52 -75
  73. package/lib/cjs/components/file/editForm/File.edit.display.js +1 -5
  74. package/lib/cjs/components/file/editForm/File.edit.file.d.ts +9 -3
  75. package/lib/cjs/components/file/editForm/File.edit.file.js +27 -52
  76. package/lib/cjs/components/form/Form.js +5 -7
  77. package/lib/cjs/components/html/HTML.d.ts +1 -1
  78. package/lib/cjs/components/html/HTML.js +8 -10
  79. package/lib/cjs/components/number/Number.js +7 -5
  80. package/lib/cjs/components/panel/editForm/Panel.edit.display.js +3 -12
  81. package/lib/cjs/components/password/Password.js +1 -4
  82. package/lib/cjs/components/radio/Radio.js +17 -17
  83. package/lib/cjs/components/radio/editForm/Radio.edit.data.js +4 -14
  84. package/lib/cjs/components/recaptcha/ReCaptcha.js +3 -6
  85. package/lib/cjs/components/select/Select.js +48 -92
  86. package/lib/cjs/components/select/editForm/Select.edit.data.js +37 -182
  87. package/lib/cjs/components/select/editForm/Select.edit.validation.js +1 -9
  88. package/lib/cjs/components/selectboxes/SelectBoxes.js +3 -6
  89. package/lib/cjs/components/signature/Signature.d.ts +1 -1
  90. package/lib/cjs/components/signature/Signature.js +21 -24
  91. package/lib/cjs/components/signature/editForm/Signature.edit.display.d.ts +4 -10
  92. package/lib/cjs/components/signature/editForm/Signature.edit.display.js +8 -12
  93. package/lib/cjs/components/survey/Survey.js +6 -17
  94. package/lib/cjs/components/survey/editForm/Survey.edit.data.js +4 -12
  95. package/lib/cjs/components/table/editForm/Table.edit.display.js +3 -3
  96. package/lib/cjs/components/tabs/Tabs.js +4 -19
  97. package/lib/cjs/components/tabs/editForm/Tabs.edit.display.js +1 -3
  98. package/lib/cjs/components/tags/Tags.js +4 -14
  99. package/lib/cjs/components/textarea/TextArea.js +8 -15
  100. package/lib/cjs/components/textarea/editForm/TextArea.edit.display.js +14 -56
  101. package/lib/cjs/components/textfield/TextField.js +4 -4
  102. package/lib/cjs/components/textfield/editForm/TextField.edit.display.js +2 -8
  103. package/lib/cjs/components/time/Time.js +1 -4
  104. package/lib/cjs/components/time/editForm/Time.edit.display.js +1 -4
  105. package/lib/cjs/formio.form.js +5 -5
  106. package/lib/cjs/package.json +1 -1
  107. package/lib/cjs/providers/address/AddressProvider.js +1 -1
  108. package/lib/cjs/providers/address/GoogleAddressProvider.js +1 -3
  109. package/lib/cjs/providers/processor/fileProcessor.js +1 -3
  110. package/lib/cjs/providers/storage/azure.js +5 -6
  111. package/lib/cjs/providers/storage/indexeddb.js +17 -18
  112. package/lib/cjs/providers/storage/s3.js +3 -14
  113. package/lib/cjs/providers/storage/url.js +13 -2
  114. package/lib/cjs/providers/storage/xhr.js +19 -28
  115. package/lib/cjs/templates/Templates.js +1 -0
  116. package/lib/cjs/templates/index.d.ts +1 -0
  117. package/lib/cjs/translations/en.d.ts +237 -82
  118. package/lib/cjs/translations/en.js +9 -82
  119. package/lib/cjs/utils/ChoicesWrapper.js +1 -1
  120. package/lib/cjs/utils/builder.js +5 -26
  121. package/lib/cjs/utils/i18n.d.ts +5 -2
  122. package/lib/cjs/utils/i18n.js +33 -12
  123. package/lib/cjs/utils/utils.js +37 -47
  124. package/lib/cjs/widgets/CalendarWidget.js +2 -6
  125. package/lib/mjs/Element.js +1 -1
  126. package/lib/mjs/Embed.js +8 -16
  127. package/lib/mjs/Form.js +4 -4
  128. package/lib/mjs/Formio.js +2 -9
  129. package/lib/mjs/InlineEmbed.js +1 -4
  130. package/lib/mjs/PDF.js +27 -8
  131. package/lib/mjs/PDFBuilder.js +6 -10
  132. package/lib/mjs/Webform.d.ts +1 -0
  133. package/lib/mjs/Webform.js +19 -31
  134. package/lib/mjs/WebformBuilder.js +27 -68
  135. package/lib/mjs/Wizard.d.ts +2 -0
  136. package/lib/mjs/Wizard.js +54 -27
  137. package/lib/mjs/WizardBuilder.js +5 -15
  138. package/lib/mjs/addons/PasswordStrength/PasswordStrengthAddon.form.js +2 -6
  139. package/lib/mjs/addons/PasswordStrength/PasswordStrengthAddon.js +3 -9
  140. package/lib/mjs/addons/index.js +1 -3
  141. package/lib/mjs/components/_classes/component/Component.d.ts +5 -5
  142. package/lib/mjs/components/_classes/component/Component.js +59 -132
  143. package/lib/mjs/components/_classes/component/editForm/Component.edit.data.js +2 -4
  144. package/lib/mjs/components/_classes/component/editForm/Component.edit.display.js +4 -16
  145. package/lib/mjs/components/_classes/component/editForm/Component.edit.validation.js +1 -4
  146. package/lib/mjs/components/_classes/field/Field.js +1 -4
  147. package/lib/mjs/components/_classes/input/Input.js +2 -2
  148. package/lib/mjs/components/_classes/list/ListComponent.js +4 -4
  149. package/lib/mjs/components/_classes/list/editForm/ListComponent.edit.data.js +6 -28
  150. package/lib/mjs/components/_classes/multivalue/Multivalue.js +8 -26
  151. package/lib/mjs/components/_classes/nested/NestedComponent.js +1 -4
  152. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +5 -9
  153. package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.js +1 -3
  154. package/lib/mjs/components/address/Address.js +10 -30
  155. package/lib/mjs/components/address/editForm/Address.edit.provider.js +8 -32
  156. package/lib/mjs/components/alert/Alert.js +3 -6
  157. package/lib/mjs/components/button/Button.js +9 -16
  158. package/lib/mjs/components/button/editForm/Button.edit.display.js +8 -32
  159. package/lib/mjs/components/checkbox/Checkbox.js +4 -10
  160. package/lib/mjs/components/checkbox/editForm/Checkbox.edit.display.js +2 -8
  161. package/lib/mjs/components/columns/Columns.js +5 -17
  162. package/lib/mjs/components/container/Container.js +1 -3
  163. package/lib/mjs/components/currency/Currency.js +2 -7
  164. package/lib/mjs/components/datagrid/DataGrid.js +30 -63
  165. package/lib/mjs/components/datamap/DataMap.js +12 -18
  166. package/lib/mjs/components/datetime/DateTime.js +2 -6
  167. package/lib/mjs/components/datetime/editForm/DateTime.edit.display.js +1 -4
  168. package/lib/mjs/components/day/Day.js +12 -70
  169. package/lib/mjs/components/day/editForm/Day.edit.day.js +1 -3
  170. package/lib/mjs/components/day/editForm/Day.edit.month.js +1 -3
  171. package/lib/mjs/components/editgrid/EditGrid.d.ts +1 -0
  172. package/lib/mjs/components/editgrid/EditGrid.js +18 -44
  173. package/lib/mjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -4
  174. package/lib/mjs/components/file/File.js +52 -75
  175. package/lib/mjs/components/file/editForm/File.edit.display.js +1 -5
  176. package/lib/mjs/components/file/editForm/File.edit.file.d.ts +9 -3
  177. package/lib/mjs/components/file/editForm/File.edit.file.js +27 -52
  178. package/lib/mjs/components/form/Form.js +5 -7
  179. package/lib/mjs/components/html/HTML.d.ts +1 -1
  180. package/lib/mjs/components/html/HTML.js +8 -10
  181. package/lib/mjs/components/number/Number.js +7 -5
  182. package/lib/mjs/components/panel/editForm/Panel.edit.display.js +3 -12
  183. package/lib/mjs/components/password/Password.js +1 -4
  184. package/lib/mjs/components/radio/Radio.js +17 -17
  185. package/lib/mjs/components/radio/editForm/Radio.edit.data.js +4 -14
  186. package/lib/mjs/components/recaptcha/ReCaptcha.js +3 -6
  187. package/lib/mjs/components/select/Select.js +51 -95
  188. package/lib/mjs/components/select/editForm/Select.edit.data.js +37 -182
  189. package/lib/mjs/components/select/editForm/Select.edit.validation.js +1 -9
  190. package/lib/mjs/components/selectboxes/SelectBoxes.js +3 -6
  191. package/lib/mjs/components/signature/Signature.d.ts +1 -1
  192. package/lib/mjs/components/signature/Signature.js +20 -23
  193. package/lib/mjs/components/signature/editForm/Signature.edit.display.d.ts +4 -10
  194. package/lib/mjs/components/signature/editForm/Signature.edit.display.js +6 -12
  195. package/lib/mjs/components/survey/Survey.js +6 -17
  196. package/lib/mjs/components/survey/editForm/Survey.edit.data.js +4 -12
  197. package/lib/mjs/components/table/editForm/Table.edit.display.js +3 -3
  198. package/lib/mjs/components/tabs/Tabs.js +4 -19
  199. package/lib/mjs/components/tabs/editForm/Tabs.edit.display.js +1 -3
  200. package/lib/mjs/components/tags/Tags.js +4 -14
  201. package/lib/mjs/components/textarea/TextArea.js +8 -15
  202. package/lib/mjs/components/textarea/editForm/TextArea.edit.display.js +14 -56
  203. package/lib/mjs/components/textfield/TextField.js +4 -4
  204. package/lib/mjs/components/textfield/editForm/TextField.edit.display.js +2 -8
  205. package/lib/mjs/components/time/Time.js +1 -4
  206. package/lib/mjs/components/time/editForm/Time.edit.display.js +1 -4
  207. package/lib/mjs/formio.form.js +6 -6
  208. package/lib/mjs/package.json +1 -1
  209. package/lib/mjs/providers/address/AddressProvider.js +1 -1
  210. package/lib/mjs/providers/address/GoogleAddressProvider.js +1 -3
  211. package/lib/mjs/providers/processor/fileProcessor.js +1 -3
  212. package/lib/mjs/providers/storage/azure.js +5 -6
  213. package/lib/mjs/providers/storage/indexeddb.js +17 -18
  214. package/lib/mjs/providers/storage/s3.js +3 -14
  215. package/lib/mjs/providers/storage/url.js +13 -2
  216. package/lib/mjs/providers/storage/xhr.js +19 -32
  217. package/lib/mjs/templates/Templates.js +1 -0
  218. package/lib/mjs/templates/index.d.ts +1 -0
  219. package/lib/mjs/translations/en.d.ts +237 -82
  220. package/lib/mjs/translations/en.js +88 -0
  221. package/lib/mjs/utils/ChoicesWrapper.js +1 -1
  222. package/lib/mjs/utils/builder.js +5 -26
  223. package/lib/mjs/utils/i18n.d.ts +5 -2
  224. package/lib/mjs/utils/i18n.js +33 -12
  225. package/lib/mjs/utils/utils.js +37 -47
  226. package/lib/mjs/widgets/CalendarWidget.js +2 -6
  227. package/package.json +6 -4
@@ -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, screenReaderSpeech } from '../../utils';
7
+ import { fastCloneDeep, Evaluator, getArrayFromComponentPath, eachComponent, screenReaderSpeech, } from '../../utils';
8
8
  const EditRowState = {
9
9
  New: 'new',
10
10
  Editing: 'editing',
@@ -115,10 +115,10 @@ export default class EditGridComponent extends NestedArrayComponent {
115
115
  }
116
116
  get defaultDialogTemplate() {
117
117
  return `
118
- <h3 ${this._referenceAttributeName}="dialogHeader">${this.t('Do you want to clear data?')}</h3>
118
+ <h3 ${this._referenceAttributeName}="dialogHeader">${this.t('wantToClearData')}</h3>
119
119
  <div style="display:flex; justify-content: flex-end;">
120
- <button ${this._referenceAttributeName}="dialogCancelButton" class="btn btn-secondary" aria-label="${this.t('Cancel')}">${this.t('Cancel')}</button>
121
- <button ${this._referenceAttributeName}="dialogYesButton" class="btn btn-danger" aria-label="${this.t('Yes, delete it')}">${this.t('Yes, delete it')}</button>
120
+ <button ${this._referenceAttributeName}="dialogCancelButton" class="btn btn-secondary" aria-label="${this.t('cancel')}">${this.t('cancel')}</button>
121
+ <button ${this._referenceAttributeName}="dialogYesButton" class="btn btn-danger" aria-label="${this.t('yesDelete')}">${this.t('yesDelete')}</button>
122
122
  </div>
123
123
  `;
124
124
  }
@@ -253,6 +253,12 @@ export default class EditGridComponent extends NestedArrayComponent {
253
253
  this.fullMode &&
254
254
  this.dataValue.length > _.get(this.component, 'validate.minLength', 0));
255
255
  }
256
+ checkData(data, flags, row) {
257
+ super.checkData(data, flags, row);
258
+ if (this.type === 'editgrid' && flags?.fromSubmission) {
259
+ return this.redraw();
260
+ }
261
+ }
256
262
  init() {
257
263
  if (this.builderMode) {
258
264
  this.editRows = [];
@@ -302,19 +308,11 @@ export default class EditGridComponent extends NestedArrayComponent {
302
308
  });
303
309
  }
304
310
  isOpen(editRow) {
305
- return [
306
- EditRowState.New,
307
- EditRowState.Editing,
308
- EditRowState.Viewing,
309
- ].includes(editRow.state);
311
+ return [EditRowState.New, EditRowState.Editing, EditRowState.Viewing].includes(editRow.state);
310
312
  }
311
313
  isComponentVisibleInSomeRow(component) {
312
314
  const rows = this.editRows;
313
- const savedStates = [
314
- EditRowState.Saved,
315
- EditRowState.Editing,
316
- EditRowState.Draft,
317
- ];
315
+ const savedStates = [EditRowState.Saved, EditRowState.Editing, EditRowState.Draft];
318
316
  const savedRows = rows.filter((row) => _.includes(savedStates, row.state));
319
317
  this.visibleInHeader = this.visibleInHeader || [];
320
318
  const changeVisibleInHeader = (component, isVisible) => {
@@ -335,9 +333,7 @@ export default class EditGridComponent extends NestedArrayComponent {
335
333
  comp.checkConditions();
336
334
  });
337
335
  const isVisible = checkComponent ? checkComponent.visible : true;
338
- [
339
- ...this.components,
340
- ].forEach((comp) => this.removeComponent(comp, this.components));
336
+ [...this.components].forEach((comp) => this.removeComponent(comp, this.components));
341
337
  changeVisibleInHeader(component, isVisible);
342
338
  return isVisible;
343
339
  }
@@ -477,10 +473,7 @@ export default class EditGridComponent extends NestedArrayComponent {
477
473
  const elements = row.getElementsByClassName(className);
478
474
  Array.prototype.forEach.call(elements, (element) => {
479
475
  if (this.options.pdf &&
480
- _.intersection(element.classList, [
481
- 'editRow',
482
- 'removeRow',
483
- ]).length) {
476
+ _.intersection(element.classList, ['editRow', 'removeRow']).length) {
484
477
  element.style.display = 'none';
485
478
  }
486
479
  else {
@@ -536,7 +529,7 @@ export default class EditGridComponent extends NestedArrayComponent {
536
529
  flattenedComponents,
537
530
  displayValue: (component) => this.displayComponentValue(component),
538
531
  isVisibleInRow: (component) => this.isComponentVisibleInRow(component, flattenedComponents),
539
- getView: (component, data) => {
532
+ getView: (component, _data) => {
540
533
  const instance = flattenedComponents[component.key];
541
534
  const view = instance ? instance.getView(instance.dataValue) : '';
542
535
  // If there is an html tag in view, don't allow it to be injected in template
@@ -1047,10 +1040,7 @@ export default class EditGridComponent extends NestedArrayComponent {
1047
1040
  editRow.errors =
1048
1041
  this.component.modal || this.component.rowDrafts
1049
1042
  ? errors
1050
- : errors.filter((err) => _.find(this.visibleErrors, [
1051
- 'component.id',
1052
- err.component.id,
1053
- ]));
1043
+ : errors.filter((err) => _.find(this.visibleErrors, ['component.id', err.component.id]));
1054
1044
  }
1055
1045
  // TODO: this is essentially running its own custom validation and should be moved into a validation rule
1056
1046
  if (this.component.validate && this.component.validate.row) {
@@ -1068,7 +1058,7 @@ export default class EditGridComponent extends NestedArrayComponent {
1068
1058
  if (valid === null) {
1069
1059
  editRow.errors.push({
1070
1060
  type: 'error',
1071
- message: `Invalid row validation for ${this.key}`,
1061
+ message: this.t('componentInvalidRowValidation', { componentKey: this.key })
1072
1062
  });
1073
1063
  }
1074
1064
  }
@@ -1145,20 +1135,6 @@ export default class EditGridComponent extends NestedArrayComponent {
1145
1135
  errors.push(...this._errors);
1146
1136
  return false;
1147
1137
  }
1148
- // TODO: this is the only place invalidMessage gets called, and it's not clear why it's needed - we already validate the editGrid
1149
- // component above with super.checkComponentValidity
1150
- const message = this.invalid || this.invalidMessage(data, dirty, false, row, options);
1151
- if (allRowErrors.length && this.root?.submitted && !message) {
1152
- this._errors = this.setCustomValidity(message, dirty);
1153
- errors.push(...this._errors);
1154
- this.root?.showErrors([
1155
- message,
1156
- ]);
1157
- }
1158
- else {
1159
- this._errors = this.setCustomValidity(message, dirty);
1160
- errors.push(...this._errors);
1161
- }
1162
1138
  return superValid;
1163
1139
  }
1164
1140
  setRowInvalid(ref, index) {
@@ -1186,9 +1162,7 @@ export default class EditGridComponent extends NestedArrayComponent {
1186
1162
  }
1187
1163
  if (!Array.isArray(value)) {
1188
1164
  if (typeof value === 'object') {
1189
- value = [
1190
- value,
1191
- ];
1165
+ value = [value];
1192
1166
  }
1193
1167
  else {
1194
1168
  return false;
@@ -13,10 +13,7 @@ export default [
13
13
  input: true,
14
14
  conditional: {
15
15
  json: {
16
- '!==': [
17
- { var: 'data.modal' },
18
- true,
19
- ],
16
+ '!==': [{ var: 'data.modal' }, true],
20
17
  },
21
18
  },
22
19
  },
@@ -23,9 +23,7 @@ if (htmlCanvasElement && !htmlCanvasElement.prototype.toBlob) {
23
23
  for (var i = 0; i < len; i++) {
24
24
  arr[i] = binStr.charCodeAt(i);
25
25
  }
26
- callback(new Blob([
27
- arr,
28
- ], { type: type || 'image/png' }));
26
+ callback(new Blob([arr], { type: type || 'image/png' }));
29
27
  });
30
28
  },
31
29
  });
@@ -44,6 +42,7 @@ export default class FileComponent extends Field {
44
42
  fileMinSize: '0KB',
45
43
  fileMaxSize: '1GB',
46
44
  uploadOnly: false,
45
+ options: {},
47
46
  }, ...extend);
48
47
  }
49
48
  static get builderInfo() {
@@ -62,17 +61,12 @@ export default class FileComponent extends Field {
62
61
  static get conditionOperatorsSettings() {
63
62
  return {
64
63
  ...super.conditionOperatorsSettings,
65
- operators: [
66
- 'isEmpty',
67
- 'isNotEmpty',
68
- ],
64
+ operators: ['isEmpty', 'isNotEmpty'],
69
65
  };
70
66
  }
71
67
  static savedValueTypes(schema) {
72
68
  schema = schema || {};
73
- return (getComponentSavedTypes(schema) || [
74
- componentValueTypes.object,
75
- ]);
69
+ return getComponentSavedTypes(schema) || [componentValueTypes.object];
76
70
  }
77
71
  init() {
78
72
  super.init();
@@ -116,7 +110,7 @@ export default class FileComponent extends Field {
116
110
  return [];
117
111
  }
118
112
  getValueAsString(value, options) {
119
- if (options?.review && !this.component.uploadOnly) {
113
+ if (options?.review && !this.component.uploadOnly && !options?.pdf) {
120
114
  return _.map(value, (val, index) => {
121
115
  return `<a href="${val.url || '#'}" target="_blank" data-path='${this.path}' data-fileindex='${index}'>${val.originalName}</a>`;
122
116
  }).join(', ');
@@ -213,7 +207,7 @@ export default class FileComponent extends Field {
213
207
  this.videoStream = stream;
214
208
  const { videoPlayer } = this.refs;
215
209
  if (!videoPlayer) {
216
- console.warn('Video player not found in template.');
210
+ console.warn(this.t('videoPlayerNotFound'));
217
211
  this.cameraMode = false;
218
212
  this.redraw();
219
213
  return;
@@ -238,16 +232,14 @@ export default class FileComponent extends Field {
238
232
  takePicture() {
239
233
  const { videoPlayer } = this.refs;
240
234
  if (!videoPlayer) {
241
- console.warn('Video player not found in template.');
235
+ console.warn(this.t('videoPlayerNotFound'));
242
236
  this.cameraMode = false;
243
237
  this.redraw();
244
238
  return;
245
239
  }
246
240
  this.getFrame(videoPlayer).then((frame) => {
247
241
  frame.name = `photo-${Date.now()}.png`;
248
- this.handleFilesToUpload([
249
- frame,
250
- ]);
242
+ this.handleFilesToUpload([frame]);
251
243
  this.cameraMode = false;
252
244
  this.redraw();
253
245
  });
@@ -426,13 +418,9 @@ export default class FileComponent extends Field {
426
418
  fileEntry.file((file) => {
427
419
  const reader = new FileReader();
428
420
  reader.onloadend = (evt) => {
429
- const blob = new Blob([
430
- new Uint8Array(evt.target.result),
431
- ], { type: file.type });
421
+ const blob = new Blob([new Uint8Array(evt.target.result)], { type: file.type });
432
422
  blob.name = file.name;
433
- this.handleFilesToUpload([
434
- blob,
435
- ]);
423
+ this.handleFilesToUpload([blob]);
436
424
  };
437
425
  reader.readAsArrayBuffer(file);
438
426
  });
@@ -452,13 +440,9 @@ export default class FileComponent extends Field {
452
440
  fileEntry.file((file) => {
453
441
  const reader = new FileReader();
454
442
  reader.onloadend = (evt) => {
455
- const blob = new Blob([
456
- new Uint8Array(evt.target.result),
457
- ], { type: file.type });
443
+ const blob = new Blob([new Uint8Array(evt.target.result)], { type: file.type });
458
444
  blob.name = file.name;
459
- this.handleFilesToUpload([
460
- blob,
461
- ]);
445
+ this.handleFilesToUpload([blob]);
462
446
  };
463
447
  reader.readAsArrayBuffer(file);
464
448
  });
@@ -629,7 +613,7 @@ export default class FileComponent extends Field {
629
613
  if (!target.id) {
630
614
  return;
631
615
  }
632
- const [action, id,] = target.id.split('-');
616
+ const [action, id] = target.id.split('-');
633
617
  if (!action || !id || !this.actions[action]) {
634
618
  return;
635
619
  }
@@ -650,11 +634,13 @@ export default class FileComponent extends Field {
650
634
  originalName: escapedFileName,
651
635
  fileKey: this.component.fileKey || 'file',
652
636
  storage: this.component.storage,
653
- options: this.component.options,
637
+ options: this.component.storage === 'url'
638
+ ? (this.component.urlRequestOptions || this.component.options)
639
+ : this.component.options,
654
640
  file,
655
641
  size: file.size,
656
642
  status: 'info',
657
- message: this.t('Processing file. Please wait...'),
643
+ message: this.t('waitFileProcessing'),
658
644
  hash: '',
659
645
  };
660
646
  }
@@ -682,7 +668,7 @@ export default class FileComponent extends Field {
682
668
  return fileWithSameNameUploaded || fileWithSameNameUploading
683
669
  ? {
684
670
  status: 'error',
685
- message: this.t(`File with the same name is already ${fileWithSameNameUploading ? 'being ' : ''}uploaded`),
671
+ message: this.t(fileWithSameNameUploading ? 'fileWithDuplicatedNameInProgress' : 'fileWithDuplicatedNameLoaded'),
686
672
  }
687
673
  : {};
688
674
  }
@@ -691,7 +677,7 @@ export default class FileComponent extends Field {
691
677
  if (this.component.filePattern && !this.validatePattern(file, this.component.filePattern)) {
692
678
  return {
693
679
  status: 'error',
694
- message: this.t('File is the wrong type; it must be {{ pattern }}', {
680
+ message: this.t('wrongFileType', {
695
681
  pattern: this.component.filePattern,
696
682
  }),
697
683
  };
@@ -704,7 +690,7 @@ export default class FileComponent extends Field {
704
690
  if (!interpolatedMinSize) {
705
691
  return {
706
692
  status: 'error',
707
- message: 'Please, check the entered parameters',
693
+ message: this.t('checkEnteredParameters'),
708
694
  };
709
695
  }
710
696
  if (!this.validateMinSize(file, interpolatedMinSize)) {
@@ -722,7 +708,7 @@ export default class FileComponent extends Field {
722
708
  if (!interpolatedMaxSize) {
723
709
  return {
724
710
  status: 'error',
725
- message: 'Please, check the entered parameters',
711
+ message: this.t('checkEnteredParameters'),
726
712
  };
727
713
  }
728
714
  if (!this.validateMaxSize(file, interpolatedMaxSize)) {
@@ -741,7 +727,7 @@ export default class FileComponent extends Field {
741
727
  return !fileService
742
728
  ? {
743
729
  status: 'error',
744
- message: this.t('File Service not provided.'),
730
+ message: this.t('noFileService'),
745
731
  }
746
732
  : {};
747
733
  }
@@ -771,11 +757,7 @@ export default class FileComponent extends Field {
771
757
  ]
772
758
  : element.component.submissionAccess;
773
759
  groupPermissions.forEach((permission) => {
774
- groupKey = [
775
- 'admin',
776
- 'write',
777
- 'create',
778
- ].includes(permission.type)
760
+ groupKey = ['admin', 'write', 'create'].includes(permission.type)
779
761
  ? element.component.key
780
762
  : null;
781
763
  });
@@ -797,7 +779,7 @@ export default class FileComponent extends Field {
797
779
  this.fileDropHidden = false;
798
780
  return {
799
781
  status: 'error',
800
- message: this.t('File processing has been failed.'),
782
+ message: this.t('fileProcessingFailed'),
801
783
  };
802
784
  }
803
785
  finally {
@@ -831,7 +813,7 @@ export default class FileComponent extends Field {
831
813
  return this.filesToSync.filesToUpload.push(fileToSync);
832
814
  }
833
815
  if (this.autoSync) {
834
- fileToSync.message = this.t('Ready to be uploaded into storage');
816
+ fileToSync.message = this.t('readyForUpload');
835
817
  }
836
818
  this.filesToSync.filesToUpload.push({
837
819
  ...fileToSync,
@@ -849,9 +831,7 @@ export default class FileComponent extends Field {
849
831
  }
850
832
  if (this.component.storage && files && files.length) {
851
833
  this.fileDropHidden = true;
852
- return Promise.all([
853
- ...files,
854
- ].map(async (file) => {
834
+ return Promise.all([...files].map(async (file) => {
855
835
  await this.prepareFileToUpload(file);
856
836
  this.redraw();
857
837
  }));
@@ -871,8 +851,8 @@ export default class FileComponent extends Field {
871
851
  ...fileInfo,
872
852
  status: 'info',
873
853
  message: this.autoSync
874
- ? this.t('Ready to be removed from storage')
875
- : this.t('Preparing file to remove'),
854
+ ? this.t('readyForRemovingFromStorage')
855
+ : this.t('preparingFileToRemove'),
876
856
  });
877
857
  const index = this.dataValue.findIndex((file) => file.name === fileInfo.name);
878
858
  this.splice(index);
@@ -885,15 +865,11 @@ export default class FileComponent extends Field {
885
865
  }
886
866
  }
887
867
  async deleteFile(fileInfo) {
888
- const { options = {} } = this.component;
868
+ const options = this.component.storage === 'url'
869
+ ? (this.component.urlRequestOptions || this.component.options || {})
870
+ : (this.component.options || {});
889
871
  if (fileInfo &&
890
- [
891
- 'url',
892
- 'indexeddb',
893
- 's3',
894
- 'azure',
895
- 'googledrive',
896
- ].includes(this.component.storage)) {
872
+ ['url', 'indexeddb', 's3', 'azure', 'googledrive'].includes(this.component.storage)) {
897
873
  const { fileService } = this;
898
874
  if (fileService && typeof fileService.deleteFile === 'function') {
899
875
  return await fileService.deleteFile(fileInfo, options);
@@ -917,7 +893,7 @@ export default class FileComponent extends Field {
917
893
  }
918
894
  await this.deleteFile(fileToSync);
919
895
  fileToSync.status = 'success';
920
- fileToSync.message = this.t('Succefully removed');
896
+ fileToSync.message = this.t('succefullyRemoved');
921
897
  }
922
898
  catch (response) {
923
899
  fileToSync.status = 'error';
@@ -988,14 +964,14 @@ export default class FileComponent extends Field {
988
964
  fileInfo,
989
965
  };
990
966
  }
991
- if (fileToSync.status === "success") {
992
- const uploadedFile = this.resolvedFiles.find(x => x.fileToSync.originalName === fileToSync.originalName);
967
+ if (fileToSync.status === 'success') {
968
+ const uploadedFile = this.resolvedFiles.find((x) => x.fileToSync.originalName === fileToSync.originalName);
993
969
  return {
994
970
  fileToSync: uploadedFile.fileToSync,
995
971
  fileInfo: uploadedFile.fileInfo,
996
972
  };
997
973
  }
998
- const pendingFile = this.pendingfiles.find(x => x.name === fileToSync.name);
974
+ const pendingFile = this.pendingfiles.find((x) => x.name === fileToSync.name);
999
975
  if (pendingFile) {
1000
976
  fileInfo = await pendingFile.fileInfoProm;
1001
977
  }
@@ -1004,9 +980,9 @@ export default class FileComponent extends Field {
1004
980
  this.pendingfiles.push({ name: fileToSync.name, fileInfoProm: promInfo });
1005
981
  fileInfo = await promInfo;
1006
982
  }
1007
- this.pendingfiles = this.pendingfiles.filter(x => x.name !== fileToSync.name);
983
+ this.pendingfiles = this.pendingfiles.filter((x) => x.name !== fileToSync.name);
1008
984
  fileToSync.status = 'success';
1009
- fileToSync.message = this.t('Succefully uploaded');
985
+ fileToSync.message = this.t('succefullyUploaded');
1010
986
  fileInfo.originalName = fileToSync.originalName;
1011
987
  fileInfo.hash = fileToSync.hash;
1012
988
  this.emit('fileUploadingEnd', Promise.resolve(fileInfo));
@@ -1018,8 +994,8 @@ export default class FileComponent extends Field {
1018
994
  typeof response === 'string'
1019
995
  ? response
1020
996
  : response.type === 'abort'
1021
- ? this.t('Request was aborted')
1022
- : response.toString();
997
+ ? this.t('requestAborted')
998
+ : response.message || response.toString();
1023
999
  this.emit('fileUploadingEnd', Promise.reject(response));
1024
1000
  this.emit(_.get(response, 'type') === 'abort' ? 'fileUploadCanceled' : 'fileUploadError', {
1025
1001
  fileToSync,
@@ -1029,9 +1005,11 @@ export default class FileComponent extends Field {
1029
1005
  finally {
1030
1006
  delete fileToSync.progress;
1031
1007
  this.redraw();
1032
- const fileExists = this.resolvedFiles.find(x => x.fileInfo.originalName === fileToSync.originalName);
1033
- if (!fileExists && fileToSync.status !== 'error') {
1034
- this.resolvedFiles.push({ fileToSync, fileInfo });
1008
+ if (fileInfo) {
1009
+ const fileExists = this.resolvedFiles.find(x => x.fileInfo.originalName === fileToSync.originalName);
1010
+ if (!fileExists && fileToSync.status !== 'error') {
1011
+ this.resolvedFiles.push({ fileToSync, fileInfo });
1012
+ }
1035
1013
  }
1036
1014
  }
1037
1015
  return {
@@ -1045,7 +1023,7 @@ export default class FileComponent extends Field {
1045
1023
  this.fileDropHidden = true;
1046
1024
  this.redraw();
1047
1025
  try {
1048
- const [filesToDelete = [], filesToUpload = [],] = await Promise.all([
1026
+ const [filesToDelete = [], filesToUpload = []] = await Promise.all([
1049
1027
  this.delete(),
1050
1028
  this.upload(),
1051
1029
  ]);
@@ -1081,10 +1059,12 @@ export default class FileComponent extends Field {
1081
1059
  }
1082
1060
  }
1083
1061
  getFile(fileInfo) {
1084
- const { options = {} } = this.component;
1062
+ const options = this.component.storage === 'url'
1063
+ ? (this.component.urlRequestOptions || this.component.options || {})
1064
+ : (this.component.options || {});
1085
1065
  const { fileService } = this;
1086
1066
  if (!fileService) {
1087
- return alert('File Service not provided');
1067
+ return alert(this.t('noFileService'));
1088
1068
  }
1089
1069
  if (this.component.privateDownload) {
1090
1070
  fileInfo.private = true;
@@ -1093,10 +1073,7 @@ export default class FileComponent extends Field {
1093
1073
  .downloadFile(fileInfo, options)
1094
1074
  .then((file) => {
1095
1075
  if (file) {
1096
- if ([
1097
- 'base64',
1098
- 'indexeddb',
1099
- ].includes(file.storage)) {
1076
+ if (['base64', 'indexeddb'].includes(file.storage)) {
1100
1077
  download(file.url, file.originalName || file.name, file.type);
1101
1078
  }
1102
1079
  else {
@@ -1124,7 +1101,7 @@ export default class FileComponent extends Field {
1124
1101
  return Promise.resolve();
1125
1102
  }
1126
1103
  await this.syncFiles();
1127
- return this.shouldSyncFiles ? Promise.reject('Synchronization is failed') : Promise.resolve();
1104
+ return this.shouldSyncFiles ? Promise.reject(this.t('synchronizationFailed')) : Promise.resolve();
1128
1105
  }
1129
1106
  catch (error) {
1130
1107
  return Promise.reject(error.message);
@@ -15,11 +15,7 @@ export default [
15
15
  {
16
16
  var: 'data.storage',
17
17
  },
18
- [
19
- 's3',
20
- 'azure',
21
- 'googledrive',
22
- ],
18
+ ['s3', 'azure', 'googledrive'],
23
19
  ],
24
20
  },
25
21
  },
@@ -131,11 +131,10 @@ declare const _default: ({
131
131
  values?: undefined;
132
132
  } | {
133
133
  type: string;
134
- input: boolean;
135
134
  key: string;
136
135
  label: string;
137
136
  weight: number;
138
- placeholder: string;
137
+ input: boolean;
139
138
  conditional: {
140
139
  json: {
141
140
  in: (string[] | {
@@ -145,12 +144,19 @@ declare const _default: ({
145
144
  '=='?: undefined;
146
145
  };
147
146
  };
147
+ components: {
148
+ type: string;
149
+ input: boolean;
150
+ key: string;
151
+ label: string;
152
+ placeholder: string;
153
+ }[];
154
+ placeholder?: undefined;
148
155
  tooltip?: undefined;
149
156
  valueProperty?: undefined;
150
157
  dataSrc?: undefined;
151
158
  data?: undefined;
152
159
  tableView?: undefined;
153
- components?: undefined;
154
160
  rows?: undefined;
155
161
  editor?: undefined;
156
162
  as?: undefined;