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