@formio/js 5.0.0-dev.5956.0e71b6d → 5.0.0-dev.5957.bed9ce0

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 (99) hide show
  1. package/dist/formio.form.js +70 -48
  2. package/dist/formio.form.min.js +1 -1
  3. package/dist/formio.full.js +73 -51
  4. package/dist/formio.full.min.js +1 -1
  5. package/lib/cjs/Form.js +4 -4
  6. package/lib/cjs/PDFBuilder.js +4 -4
  7. package/lib/cjs/Webform.d.ts +13 -13
  8. package/lib/cjs/Webform.js +132 -131
  9. package/lib/cjs/WebformBuilder.js +10 -10
  10. package/lib/cjs/Wizard.js +1 -1
  11. package/lib/cjs/WizardBuilder.js +1 -1
  12. package/lib/cjs/components/_classes/component/Component.js +11 -10
  13. package/lib/cjs/components/_classes/field/Field.d.ts +2 -2
  14. package/lib/cjs/components/_classes/field/Field.js +1 -1
  15. package/lib/cjs/components/_classes/list/ListComponent.js +4 -4
  16. package/lib/cjs/components/_classes/multivalue/Multivalue.js +2 -2
  17. package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +1 -1
  18. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +3 -3
  19. package/lib/cjs/components/address/Address.d.ts +2 -1
  20. package/lib/cjs/components/address/Address.js +1 -1
  21. package/lib/cjs/components/button/Button.d.ts +1 -1
  22. package/lib/cjs/components/button/Button.js +6 -6
  23. package/lib/cjs/components/checkbox/Checkbox.d.ts +1 -1
  24. package/lib/cjs/components/checkbox/Checkbox.js +1 -1
  25. package/lib/cjs/components/columns/Columns.d.ts +1 -1
  26. package/lib/cjs/components/datagrid/DataGrid.d.ts +1 -1
  27. package/lib/cjs/components/datagrid/DataGrid.js +1 -1
  28. package/lib/cjs/components/day/Day.d.ts +1 -1
  29. package/lib/cjs/components/day/Day.js +2 -2
  30. package/lib/cjs/components/editgrid/EditGrid.js +4 -4
  31. package/lib/cjs/components/file/File.d.ts +1 -1
  32. package/lib/cjs/components/file/File.js +15 -15
  33. package/lib/cjs/components/form/Form.js +4 -4
  34. package/lib/cjs/components/number/Number.js +1 -1
  35. package/lib/cjs/components/radio/Radio.d.ts +1 -1
  36. package/lib/cjs/components/recaptcha/ReCaptcha.js +2 -2
  37. package/lib/cjs/components/select/Select.d.ts +1 -1
  38. package/lib/cjs/components/select/Select.js +5 -5
  39. package/lib/cjs/components/selectboxes/SelectBoxes.js +2 -2
  40. package/lib/cjs/components/signature/Signature.d.ts +1 -1
  41. package/lib/cjs/components/signature/Signature.js +2 -2
  42. package/lib/cjs/components/survey/Survey.d.ts +1 -1
  43. package/lib/cjs/components/survey/Survey.js +2 -2
  44. package/lib/cjs/components/table/Table.d.ts +1 -1
  45. package/lib/cjs/components/tabs/Tabs.d.ts +1 -1
  46. package/lib/cjs/components/textarea/TextArea.js +6 -6
  47. package/lib/cjs/formio.form.js +4 -0
  48. package/lib/cjs/translations/en.d.ts +234 -81
  49. package/lib/cjs/translations/en.js +8 -81
  50. package/lib/cjs/utils/i18n.d.ts +5 -2
  51. package/lib/cjs/utils/i18n.js +32 -5
  52. package/lib/mjs/Form.js +4 -4
  53. package/lib/mjs/PDFBuilder.js +4 -4
  54. package/lib/mjs/Webform.d.ts +13 -13
  55. package/lib/mjs/Webform.js +142 -141
  56. package/lib/mjs/WebformBuilder.js +10 -10
  57. package/lib/mjs/Wizard.js +1 -1
  58. package/lib/mjs/WizardBuilder.js +1 -1
  59. package/lib/mjs/components/_classes/component/Component.js +11 -10
  60. package/lib/mjs/components/_classes/field/Field.d.ts +2 -2
  61. package/lib/mjs/components/_classes/field/Field.js +1 -1
  62. package/lib/mjs/components/_classes/list/ListComponent.js +4 -4
  63. package/lib/mjs/components/_classes/multivalue/Multivalue.js +2 -2
  64. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +1 -1
  65. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +3 -3
  66. package/lib/mjs/components/address/Address.d.ts +2 -1
  67. package/lib/mjs/components/address/Address.js +1 -1
  68. package/lib/mjs/components/button/Button.d.ts +1 -1
  69. package/lib/mjs/components/button/Button.js +6 -6
  70. package/lib/mjs/components/checkbox/Checkbox.d.ts +1 -1
  71. package/lib/mjs/components/checkbox/Checkbox.js +1 -1
  72. package/lib/mjs/components/columns/Columns.d.ts +1 -1
  73. package/lib/mjs/components/datagrid/DataGrid.d.ts +1 -1
  74. package/lib/mjs/components/datagrid/DataGrid.js +1 -1
  75. package/lib/mjs/components/day/Day.d.ts +1 -1
  76. package/lib/mjs/components/day/Day.js +2 -2
  77. package/lib/mjs/components/editgrid/EditGrid.js +4 -4
  78. package/lib/mjs/components/file/File.d.ts +1 -1
  79. package/lib/mjs/components/file/File.js +15 -15
  80. package/lib/mjs/components/form/Form.js +4 -4
  81. package/lib/mjs/components/number/Number.js +1 -1
  82. package/lib/mjs/components/radio/Radio.d.ts +1 -1
  83. package/lib/mjs/components/recaptcha/ReCaptcha.js +2 -2
  84. package/lib/mjs/components/select/Select.d.ts +1 -1
  85. package/lib/mjs/components/select/Select.js +7 -7
  86. package/lib/mjs/components/selectboxes/SelectBoxes.js +2 -2
  87. package/lib/mjs/components/signature/Signature.d.ts +1 -1
  88. package/lib/mjs/components/signature/Signature.js +2 -2
  89. package/lib/mjs/components/survey/Survey.d.ts +1 -1
  90. package/lib/mjs/components/survey/Survey.js +2 -2
  91. package/lib/mjs/components/table/Table.d.ts +1 -1
  92. package/lib/mjs/components/tabs/Tabs.d.ts +1 -1
  93. package/lib/mjs/components/textarea/TextArea.js +6 -6
  94. package/lib/mjs/formio.form.js +4 -0
  95. package/lib/mjs/translations/en.d.ts +234 -81
  96. package/lib/mjs/translations/en.js +87 -1
  97. package/lib/mjs/utils/i18n.d.ts +5 -2
  98. package/lib/mjs/utils/i18n.js +32 -5
  99. package/package.json +2 -2
@@ -210,7 +210,7 @@ export default class WebformBuilder extends Component {
210
210
  }
211
211
  }
212
212
  }).catch((err) => {
213
- console.warn(`Could not load project settings: ${err.message || err}`);
213
+ console.warn(`${this.t('loadingProjectSettingsError')}: ${err.message || err}`);
214
214
  });
215
215
  if (!formio.noProject && !isResourcesDisabled && formio.formsUrl) {
216
216
  const resourceOptions = this.options.builder && this.options.builder.resource;
@@ -320,18 +320,18 @@ export default class WebformBuilder extends Component {
320
320
  editJson: 'single'
321
321
  });
322
322
  if (component.refs.copyComponent) {
323
- this.attachTooltip(component.refs.copyComponent, this.t('Copy'));
323
+ this.attachTooltip(component.refs.copyComponent, this.t('copy'));
324
324
  component.addEventListener(component.refs.copyComponent, 'click', () => this.copyComponent(component));
325
325
  }
326
326
  if (component.refs.pasteComponent) {
327
- const pasteToolTip = this.attachTooltip(component.refs.pasteComponent, this.t('Paste below'));
327
+ const pasteToolTip = this.attachTooltip(component.refs.pasteComponent, this.t('pasteBelow'));
328
328
  component.addEventListener(component.refs.pasteComponent, 'click', () => {
329
329
  pasteToolTip.hide();
330
330
  this.pasteComponent(component);
331
331
  });
332
332
  }
333
333
  if (component.refs.moveComponent) {
334
- this.attachTooltip(component.refs.moveComponent, this.t('Move'));
334
+ this.attachTooltip(component.refs.moveComponent, this.t('move'));
335
335
  if (this.keyboardActionsEnabled) {
336
336
  component.addEventListener(component.refs.moveComponent, 'click', () => {
337
337
  this.moveComponent(component);
@@ -340,15 +340,15 @@ export default class WebformBuilder extends Component {
340
340
  }
341
341
  const parent = this.getParentElement(element);
342
342
  if (component.refs.editComponent) {
343
- this.attachTooltip(component.refs.editComponent, this.t('Edit'));
343
+ this.attachTooltip(component.refs.editComponent, this.t('edit'));
344
344
  component.addEventListener(component.refs.editComponent, 'click', () => this.editComponent(component.schema, parent, false, false, component.component, { inDataGrid: component.isInDataGrid }));
345
345
  }
346
346
  if (component.refs.editJson) {
347
- this.attachTooltip(component.refs.editJson, this.t('Edit JSON'));
347
+ this.attachTooltip(component.refs.editJson, this.t('editJson'));
348
348
  component.addEventListener(component.refs.editJson, 'click', () => this.editComponent(component.schema, parent, false, true, component.component));
349
349
  }
350
350
  if (component.refs.removeComponent) {
351
- this.attachTooltip(component.refs.removeComponent, this.t('Remove'));
351
+ this.attachTooltip(component.refs.removeComponent, this.t('remove'));
352
352
  component.addEventListener(component.refs.removeComponent, 'click', () => this.removeComponent(component.schema, parent, component.component, component));
353
353
  }
354
354
  return element;
@@ -804,7 +804,7 @@ export default class WebformBuilder extends Component {
804
804
  }, true);
805
805
  if (isCompAlreadyExists) {
806
806
  this.webform.redraw();
807
- this.webform.setAlert('danger', `You cannot add more than one ${_.get(draggableComponent, draggableComponent.uniqueComponent ? 'title' : 'key')} component to one page.`);
807
+ this.webform.setAlert('danger', this.t('builderUniqueError', { componentKeyOrTitle: _.get(draggableComponent, draggableComponent.uniqueComponent ? 'title' : 'key') }));
808
808
  return;
809
809
  }
810
810
  }
@@ -1519,7 +1519,7 @@ export default class WebformBuilder extends Component {
1519
1519
  */
1520
1520
  copyComponent(component) {
1521
1521
  if (!window.sessionStorage) {
1522
- return console.warn('Session storage is not supported in this browser.');
1522
+ return console.warn(this.t('sessionStorageSupportError'));
1523
1523
  }
1524
1524
  this.addClass(this.refs.form, 'builder-paste-mode');
1525
1525
  window.sessionStorage.setItem('formio.clipboard', JSON.stringify(component.schema));
@@ -1531,7 +1531,7 @@ export default class WebformBuilder extends Component {
1531
1531
  */
1532
1532
  pasteComponent(component) {
1533
1533
  if (!window.sessionStorage) {
1534
- return console.warn('Session storage is not supported in this browser.');
1534
+ return console.warn(this.t('sessionStorageSupportError'));
1535
1535
  }
1536
1536
  this.removeClass(this.refs.form, 'builder-paste-mode');
1537
1537
  if (window.sessionStorage) {
package/lib/mjs/Wizard.js CHANGED
@@ -605,7 +605,7 @@ export default class Wizard extends Webform {
605
605
  this.redraw();
606
606
  return Promise.resolve();
607
607
  }
608
- return Promise.reject('Page not found');
608
+ return Promise.reject(this.t('pageNotFound'));
609
609
  }
610
610
  pageFieldLogic(page) {
611
611
  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;
@@ -509,7 +509,10 @@ export default class Component extends Element {
509
509
  this.addons.push(addon);
510
510
  }
511
511
  else {
512
- console.warn(`Addon ${name.label} does not support component of type ${this.component.type}.`);
512
+ console.warn(this.t('addonSupportTypeError', {
513
+ type: this.component.type,
514
+ label: name.label
515
+ }));
513
516
  }
514
517
  }
515
518
  return addon;
@@ -561,7 +564,7 @@ export default class Component extends Element {
561
564
  return this.paths.dataPath;
562
565
  }
563
566
  set path(path) {
564
- throw new Error('Should not be setting the path of a component.');
567
+ throw new Error(this.t('setPathError'));
565
568
  }
566
569
  set parentVisible(value) {
567
570
  this._parentVisible = value;
@@ -656,7 +659,7 @@ export default class Component extends Element {
656
659
  return this.options.attachMode === 'builder';
657
660
  }
658
661
  get calculatedPath() {
659
- console.error('component.calculatedPath was deprecated, use component.path instead.');
662
+ console.error(this.t('calculatedPathDeprecation'));
660
663
  return this.path;
661
664
  }
662
665
  get labelPosition() {
@@ -822,7 +825,7 @@ export default class Component extends Element {
822
825
  const name = names[names.length - 1];
823
826
  const templatesByName = Templates.defaultTemplates[name];
824
827
  if (!templatesByName) {
825
- return { template: `Unknown template: ${name}` };
828
+ return { template: this.t('unknownTemplate', { name }) };
826
829
  }
827
830
  const templateByMode = this.checkTemplateMode(templatesByName, modes);
828
831
  if (templateByMode) {
@@ -879,9 +882,7 @@ export default class Component extends Element {
879
882
  data.disabled = this.disabled;
880
883
  data.builder = this.builderMode;
881
884
  data.render = (...args) => {
882
- console.warn(`Form.io 'render' template function is deprecated.
883
- If you need to render template (template A) inside of another template (template B),
884
- pass pre-compiled template A (use this.renderTemplate('template_A_name') as template context variable for template B`);
885
+ console.warn(this.t('renderTemplateFunctionDeprecation'));
885
886
  return this.renderTemplate(...args);
886
887
  };
887
888
  data.label = data.labelInfo || this.labelInfo;
@@ -1081,7 +1082,7 @@ export default class Component extends Element {
1081
1082
  modalLabel = { className: 'field-required' };
1082
1083
  }
1083
1084
  return this.renderModalPreview({
1084
- previewText: this.getValueAsString(dataValue, { modalPreview: true }) || this.t('Click to set value'),
1085
+ previewText: this.getValueAsString(dataValue, { modalPreview: true }) || this.t('clickToSetValue'),
1085
1086
  messages: '',
1086
1087
  labelInfo: modalLabel,
1087
1088
  });
@@ -1106,7 +1107,7 @@ export default class Component extends Element {
1106
1107
  * @param {boolean} topLevel - If this is the topmost component that is being rendered.
1107
1108
  * @returns {string} - The rendered HTML string of a component.
1108
1109
  */
1109
- render(children = `Unknown component: ${this.component.type}`, topLevel = false) {
1110
+ render(children = this.t('unknownComponent', { type: this.component.type }), topLevel = false) {
1110
1111
  const isVisible = this.visible;
1111
1112
  this.rendered = true;
1112
1113
  if (!this.builderMode && !this.previewMode && this.component.modalEdit) {
@@ -3306,7 +3307,7 @@ export default class Component extends Element {
3306
3307
  }
3307
3308
  // Maintain reverse compatibility.
3308
3309
  whenReady() {
3309
- console.warn('The whenReady() method has been deprecated. Please use the dataReady property instead.');
3310
+ console.warn(this.t('whenReadyDeprecation'));
3310
3311
  return this.dataReady;
3311
3312
  }
3312
3313
  get dataReady() {
@@ -1,9 +1,9 @@
1
1
  export default class Field extends Component {
2
2
  /**
3
3
  * @param {object} element - The component to create.
4
- * @returns {string} - The rendered HTML string of a component
4
+ * @returns {Field} - The created field.
5
5
  */
6
- render(element: object): string;
6
+ render(element: object): Field;
7
7
  /**
8
8
  /* Saves current caret position to restore it after the component is redrawn
9
9
  * @param {HTMLElement} element - The element to save the caret position for.
@@ -6,7 +6,7 @@ import Component from '../component/Component';
6
6
  export default class Field extends Component {
7
7
  /**
8
8
  * @param {object} element - The component to create.
9
- * @returns {string} - The rendered HTML string of a component
9
+ * @returns {Field} - The created field.
10
10
  */
11
11
  render(element) {
12
12
  if (this.noField) {
@@ -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);
@@ -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) {
@@ -146,7 +146,7 @@ export default class NestedComponent extends Field {
146
146
  */
147
147
  addComponent(component: import('@formio/core').Component, data?: object, before?: HTMLElement, noAdd?: boolean | undefined): any;
148
148
  beforeFocus(): void;
149
- render(children: any): string;
149
+ render(children: any): Field;
150
150
  renderComponents(components: any): any;
151
151
  attach(element: any): Promise<[void, void]>;
152
152
  /**
@@ -18,7 +18,7 @@ export default class NestedArrayComponent extends NestedDataComponent {
18
18
  return this.iteratableRows[component.rowIndex].data;
19
19
  }
20
20
  get iteratableRows() {
21
- throw new Error('Getter #iteratableRows() is not implemented');
21
+ throw new Error(this.t('iteratableRowsError'));
22
22
  }
23
23
  get rowIndex() {
24
24
  return this._rowIndex;
@@ -63,7 +63,7 @@ export default class NestedArrayComponent extends NestedDataComponent {
63
63
  return this.validateComponents([this.component], data, flags);
64
64
  }
65
65
  checkRow(...args) {
66
- console.log('Deprecation Warning: checkRow method has been replaced with processRow');
66
+ console.log(this.t('checkRowDeprecation'));
67
67
  return this.processRow.call(this, ...args);
68
68
  }
69
69
  processRow(method, data, opts, row, components, silentCheck) {
@@ -117,7 +117,7 @@ export default class NestedArrayComponent extends NestedDataComponent {
117
117
  return '';
118
118
  }
119
119
  const label = component.label || component.key;
120
- return `<th style="padding: 5px 10px;">${label}</th>`;
120
+ return `<th style="padding: 5px 10px;">${this.t(label, { _userInput: true })}</th>`;
121
121
  };
122
122
  const components = this.getComponents(0);
123
123
  for (const component of components) {
@@ -60,7 +60,7 @@ export default class AddressComponent extends ContainerComponent {
60
60
  renderElement(value: any): any;
61
61
  renderRow(value: any, index: any): any;
62
62
  renderGrid(): any;
63
- render(): string;
63
+ render(): Field;
64
64
  onSelectAddress(address: any, element: any, index: any): void;
65
65
  addRow(): void;
66
66
  attach(element: any): Promise<void>;
@@ -71,3 +71,4 @@ export default class AddressComponent extends ContainerComponent {
71
71
  getValueAsString(value: any, options: any): any;
72
72
  }
73
73
  import ContainerComponent from '../container/Container';
74
+ import Field from '../_classes/field/Field';
@@ -308,7 +308,7 @@ export default class AddressComponent extends ContainerComponent {
308
308
  return !this.isMultiple && (this.builderMode || this.manualModeEnabled);
309
309
  }
310
310
  get addAnother() {
311
- return this.t(this.component.addAnother || 'Add Another');
311
+ return this.t(this.component.addAnother || 'addAnother');
312
312
  }
313
313
  renderElement(value) {
314
314
  return this.renderTemplate(this.templateName, {
@@ -21,7 +21,7 @@ export default class ButtonComponent extends Field {
21
21
  get clicked(): any;
22
22
  get defaultValue(): boolean;
23
23
  get oauthConfig(): any;
24
- render(): string;
24
+ render(): Field;
25
25
  attachButton(): void;
26
26
  hasError: boolean | undefined;
27
27
  isDisabledOnInvalid: any;
@@ -336,17 +336,17 @@ export default class ButtonComponent extends Field {
336
336
  break;
337
337
  case 'oauth':
338
338
  if (this.root === this) {
339
- console.warn('You must add the OAuth button to a form for it to function properly');
339
+ console.warn(this.t('noOAuthBtn'));
340
340
  return;
341
341
  }
342
342
  // Display Alert if OAuth config is missing
343
343
  if (!this.oauthConfig) {
344
- this.root.setAlert('danger', 'OAuth not configured. You must configure oauth for your project before it will work.');
344
+ this.root.setAlert('danger', this.t('noOAuthConfiguration'));
345
345
  break;
346
346
  }
347
347
  // Display Alert if oAuth has an error is missing
348
348
  if (this.oauthConfig.error) {
349
- this.root.setAlert('danger', `The Following Error Has Occured ${this.oauthConfig.error}`);
349
+ this.root.setAlert('danger', `${this.t('oAuthErrorsTitle')} ${this.t(this.oauthConfig.error)}`);
350
350
  break;
351
351
  }
352
352
  this.openOauth(this.oauthConfig);
@@ -355,7 +355,7 @@ export default class ButtonComponent extends Field {
355
355
  }
356
356
  openOauth(settings) {
357
357
  if (!this.root.formio) {
358
- console.warn('You must attach a Form API url to your form in order to use OAuth buttons.');
358
+ console.warn(this.t('noOAuthFormUrl'));
359
359
  return;
360
360
  }
361
361
  /*eslint-disable camelcase */
@@ -403,7 +403,7 @@ export default class ButtonComponent extends Field {
403
403
  }
404
404
  // TODO: check for error response here
405
405
  if (settings.state !== params.state) {
406
- this.root.setAlert('danger', 'OAuth state does not match. Please try logging in again.');
406
+ this.root.setAlert('danger', this.t('oAuthStateError'));
407
407
  return;
408
408
  }
409
409
  // Depending on where the settings came from, submit to either the submission endpoint (old) or oauth endpoint (new).
@@ -436,7 +436,7 @@ export default class ButtonComponent extends Field {
436
436
  }
437
437
  catch (error) {
438
438
  if (error.name !== 'SecurityError' && (error.name !== 'Error' || error.message !== 'Permission denied')) {
439
- this.root.setAlert('danger', error.message || error);
439
+ this.root.setAlert('danger', this.t(`${error.message || error}`));
440
440
  }
441
441
  }
442
442
  if (!popup || popup.closed || popup.closed === undefined) {
@@ -39,7 +39,7 @@ export default class CheckBoxComponent extends Field {
39
39
  get labelInfo(): {
40
40
  hidden: boolean;
41
41
  };
42
- render(): string;
42
+ render(): Field;
43
43
  attach(element: any): Promise<void>;
44
44
  input: any;
45
45
  detach(element: any): void;
@@ -187,7 +187,7 @@ export default class CheckBoxComponent extends Field {
187
187
  if (_.isUndefined(value) && this.inDataTable) {
188
188
  return '';
189
189
  }
190
- return this.t(hasValue ? 'Yes' : 'No');
190
+ return this.t(hasValue ? 'yes' : 'no');
191
191
  }
192
192
  updateValue(value, flags) {
193
193
  // If this is a radio and is alredy checked, uncheck it.
@@ -14,7 +14,7 @@ export default class ColumnsComponent extends NestedComponent {
14
14
  get columnKey(): string;
15
15
  columns: any[] | undefined;
16
16
  labelIsHidden(): boolean;
17
- render(): string;
17
+ render(): import("../_classes/field/Field").default;
18
18
  justifyColumn(items: any, index: any): boolean;
19
19
  justify(): any;
20
20
  get gridSize(): number;
@@ -55,7 +55,7 @@ export default class DataGridComponent extends NestedArrayComponent {
55
55
  hasTopSubmit(): any;
56
56
  hasBottomSubmit(): any;
57
57
  get canAddColumn(): boolean;
58
- render(): string;
58
+ render(): import("../_classes/field/Field").default;
59
59
  getRows(): {}[];
60
60
  getColumns(): any[];
61
61
  hasHeader(): any;
@@ -339,7 +339,7 @@ export default class DataGridComponent extends NestedArrayComponent {
339
339
  }
340
340
  onReorder(element, _target, _source, sibling) {
341
341
  if (!element.dragInfo || (sibling && !sibling.dragInfo)) {
342
- console.warn('There is no Drag Info available for either dragged or sibling element');
342
+ console.warn(this.t('noDragInfoError'));
343
343
  return;
344
344
  }
345
345
  const oldPosition = element.dragInfo.index;
@@ -85,7 +85,7 @@ export default class DayComponent extends Field {
85
85
  }[] | undefined;
86
86
  setErrorClasses(elements: any, dirty: any, hasError: any): void;
87
87
  dayFirst: any;
88
- render(): string;
88
+ render(): Field;
89
89
  renderField(name: any): any;
90
90
  attach(element: any): Promise<void>;
91
91
  set disabled(disabled: any);
@@ -173,7 +173,7 @@ export default class DayComponent extends Field {
173
173
  this._months = [
174
174
  {
175
175
  value: '',
176
- label: _.get(this.component, 'fields.month.placeholder') || (this.hideInputLabels ? this.t('Month') : '')
176
+ label: _.get(this.component, 'fields.month.placeholder') || (this.hideInputLabels ? this.t('month') : '')
177
177
  },
178
178
  { value: 1, label: 'January' },
179
179
  { value: 2, label: 'February' },
@@ -267,7 +267,7 @@ export default class DayComponent extends Field {
267
267
  this.saveCaretPosition(element, name);
268
268
  }
269
269
  catch (err) {
270
- console.warn('An error occurred while trying to save caret position', err);
270
+ console.warn(this.t('caretPositionSavingError'), err);
271
271
  }
272
272
  this.updateValue(null, {
273
273
  modified: true,
@@ -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
  }
@@ -1030,7 +1030,7 @@ export default class EditGridComponent extends NestedArrayComponent {
1030
1030
  if (valid === null) {
1031
1031
  editRow.errors.push({
1032
1032
  type: 'error',
1033
- message: `Invalid row validation for ${this.key}`
1033
+ message: this.t('componentInvalidRowValidation', { componentKey: this.key })
1034
1034
  });
1035
1035
  }
1036
1036
  }
@@ -45,7 +45,7 @@ export default class FileComponent extends Field {
45
45
  type: number;
46
46
  actions: number;
47
47
  };
48
- render(): string;
48
+ render(): Field;
49
49
  getVideoStream(constraints: any): any;
50
50
  stopVideoStream(videoStream: any): void;
51
51
  getFrame(videoPlayer: any): Promise<any>;
@@ -201,7 +201,7 @@ export default class FileComponent extends Field {
201
201
  this.videoStream = stream;
202
202
  const { videoPlayer } = this.refs;
203
203
  if (!videoPlayer) {
204
- console.warn('Video player not found in template.');
204
+ console.warn(this.t('videoPlayerNotFound'));
205
205
  this.cameraMode = false;
206
206
  this.redraw();
207
207
  return;
@@ -226,7 +226,7 @@ export default class FileComponent extends Field {
226
226
  takePicture() {
227
227
  const { videoPlayer } = this.refs;
228
228
  if (!videoPlayer) {
229
- console.warn('Video player not found in template.');
229
+ console.warn(this.t('videoPlayerNotFound'));
230
230
  this.cameraMode = false;
231
231
  this.redraw();
232
232
  return;
@@ -631,7 +631,7 @@ export default class FileComponent extends Field {
631
631
  file,
632
632
  size: file.size,
633
633
  status: 'info',
634
- message: this.t('Processing file. Please wait...'),
634
+ message: this.t('waitFileProcessing'),
635
635
  hash: '',
636
636
  };
637
637
  }
@@ -660,7 +660,7 @@ export default class FileComponent extends Field {
660
660
  return fileWithSameNameUploaded || fileWithSameNameUploading
661
661
  ? {
662
662
  status: 'error',
663
- message: this.t(`File with the same name is already ${fileWithSameNameUploading ? 'being ' : ''}uploaded`),
663
+ message: this.t(fileWithSameNameUploading ? 'fileWithDuplicatedNameInProgress' : 'fileWithDuplicatedNameLoaded'),
664
664
  }
665
665
  : {};
666
666
  }
@@ -669,7 +669,7 @@ export default class FileComponent extends Field {
669
669
  if (this.component.filePattern && !this.validatePattern(file, this.component.filePattern)) {
670
670
  return {
671
671
  status: 'error',
672
- message: this.t('File is the wrong type; it must be {{ pattern }}', {
672
+ message: this.t('wrongFileType', {
673
673
  pattern: this.component.filePattern,
674
674
  }),
675
675
  };
@@ -678,7 +678,7 @@ export default class FileComponent extends Field {
678
678
  if (this.component.fileMinSize && !this.validateMinSize(file, this.component.fileMinSize)) {
679
679
  return {
680
680
  status: 'error',
681
- message: this.t('File is too small; it must be at least {{ size }}', {
681
+ message: this.t('fileTooSmall', {
682
682
  size: this.component.fileMinSize,
683
683
  }),
684
684
  };
@@ -687,7 +687,7 @@ export default class FileComponent extends Field {
687
687
  if (this.component.fileMaxSize && !this.validateMaxSize(file, this.component.fileMaxSize)) {
688
688
  return {
689
689
  status: 'error',
690
- message: this.t('File is too big; it must be at most {{ size }}', {
690
+ message: this.t('fileTooBig', {
691
691
  size: this.component.fileMaxSize,
692
692
  }),
693
693
  };
@@ -699,7 +699,7 @@ export default class FileComponent extends Field {
699
699
  return !fileService
700
700
  ? {
701
701
  status: 'error',
702
- message: this.t('File Service not provided.'),
702
+ message: this.t('noFileService'),
703
703
  }
704
704
  : {};
705
705
  }
@@ -747,7 +747,7 @@ export default class FileComponent extends Field {
747
747
  this.fileDropHidden = false;
748
748
  return {
749
749
  status: 'error',
750
- message: this.t('File processing has been failed.'),
750
+ message: this.t('fileProcessingFailed'),
751
751
  };
752
752
  }
753
753
  finally {
@@ -781,7 +781,7 @@ export default class FileComponent extends Field {
781
781
  return this.filesToSync.filesToUpload.push(fileToSync);
782
782
  }
783
783
  if (this.autoSync) {
784
- fileToSync.message = this.t('Ready to be uploaded into storage');
784
+ fileToSync.message = this.t('readyForUpload');
785
785
  }
786
786
  this.filesToSync.filesToUpload.push({
787
787
  ...fileToSync,
@@ -819,8 +819,8 @@ export default class FileComponent extends Field {
819
819
  ...fileInfo,
820
820
  status: 'info',
821
821
  message: this.autoSync
822
- ? this.t('Ready to be removed from storage')
823
- : this.t('Preparing file to remove'),
822
+ ? this.t('readyForRemovingFromStorage')
823
+ : this.t('preparingFileToRemove'),
824
824
  });
825
825
  const index = this.dataValue.findIndex(file => file.name === fileInfo.name);
826
826
  this.splice(index);
@@ -858,7 +858,7 @@ export default class FileComponent extends Field {
858
858
  }
859
859
  await this.deleteFile(fileToSync);
860
860
  fileToSync.status = 'success';
861
- fileToSync.message = this.t('Succefully removed');
861
+ fileToSync.message = this.t('succefullyRemoved');
862
862
  }
863
863
  catch (response) {
864
864
  fileToSync.status = 'error';
@@ -926,7 +926,7 @@ export default class FileComponent extends Field {
926
926
  }
927
927
  fileInfo = await this.uploadFile(fileToSync);
928
928
  fileToSync.status = 'success';
929
- fileToSync.message = this.t('Succefully uploaded');
929
+ fileToSync.message = this.t('succefullyUploaded');
930
930
  fileInfo.originalName = fileToSync.originalName;
931
931
  fileInfo.hash = fileToSync.hash;
932
932
  }
@@ -1025,7 +1025,7 @@ export default class FileComponent extends Field {
1025
1025
  }
1026
1026
  await this.syncFiles();
1027
1027
  return this.shouldSyncFiles
1028
- ? Promise.reject('Synchronization is failed')
1028
+ ? Promise.reject(this.t('synchronizationFailed'))
1029
1029
  : Promise.resolve();
1030
1030
  }
1031
1031
  catch (error) {
@@ -207,7 +207,7 @@ export default class FormComponent extends Component {
207
207
  /* eslint-enable max-statements */
208
208
  render() {
209
209
  if (this.builderMode) {
210
- return super.render(this.component.label || 'Nested form');
210
+ return super.render(this.t(this.component.label || 'nestedForm'));
211
211
  }
212
212
  const subform = this.subForm ? this.subForm.render() : this.renderTemplate('loading');
213
213
  return super.render(subform);
@@ -220,13 +220,13 @@ export default class FormComponent extends Component {
220
220
  */
221
221
  getValueAsString(value, options) {
222
222
  if (!value) {
223
- return 'No data provided';
223
+ return this.t('noDataProvided');
224
224
  }
225
225
  if (!value.data && value._id) {
226
226
  return value._id;
227
227
  }
228
228
  if (!value.data || !Object.keys(value.data).length) {
229
- return 'No data provided';
229
+ return this.t('noDataProvided');
230
230
  }
231
231
  if (options?.email) {
232
232
  let result = (`
@@ -630,7 +630,7 @@ export default class FormComponent extends Component {
630
630
  : {};
631
631
  this.subForm.setUrl(submissionUrl, { ...this.options, ...options });
632
632
  this.subForm.loadSubmission().catch((err) => {
633
- console.error(`Unable to load subform submission ${submission._id}:`, err);
633
+ console.error(this.t('subformSubmissionLoadingError', { submissionId: submission._id }), err);
634
634
  });
635
635
  }
636
636
  else {