@formio/js 5.0.0-dev.5610.da13e39 → 5.0.0-dev.5613.3476921
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/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.js +1199 -651
- package/dist/formio.form.min.js +1 -1
- package/dist/formio.form.min.js.LICENSE.txt +11 -3
- package/dist/formio.full.js +919 -691
- package/dist/formio.full.min.js +1 -1
- package/dist/formio.full.min.js.LICENSE.txt +11 -3
- package/dist/formio.js +16 -16
- package/dist/formio.min.js +1 -1
- package/dist/formio.min.js.LICENSE.txt +1 -1
- package/dist/formio.utils.js +493 -1861
- package/dist/formio.utils.min.js +1 -1
- package/dist/formio.utils.min.js.LICENSE.txt +2 -12
- package/lib/cjs/Element.d.ts +96 -86
- package/lib/cjs/Element.js +78 -68
- package/lib/cjs/Form.d.ts +36 -365
- package/lib/cjs/Form.js +64 -50
- package/lib/cjs/FormBuilder.d.ts +2 -187
- package/lib/cjs/FormBuilder.js +8 -30
- package/lib/cjs/PDF.d.ts +13 -11
- package/lib/cjs/PDF.js +8 -6
- package/lib/cjs/Webform.d.ts +139 -180
- package/lib/cjs/Webform.js +298 -313
- package/lib/cjs/WebformBuilder.d.ts +14 -16
- package/lib/cjs/WebformBuilder.js +11 -17
- package/lib/cjs/Wizard.d.ts +21 -31
- package/lib/cjs/Wizard.js +19 -42
- package/lib/cjs/WizardBuilder.d.ts +1 -1
- package/lib/cjs/addons/PasswordStrength/PasswordStrengthAddon.d.ts +5 -8
- package/lib/cjs/addons/PasswordStrength/PasswordStrengthAddon.js +3 -6
- package/lib/cjs/components/Components.d.ts +4 -4
- package/lib/cjs/components/Components.js +3 -3
- package/lib/cjs/components/_classes/component/Component.d.ts +269 -502
- package/lib/cjs/components/_classes/component/Component.form.d.ts +3 -6
- package/lib/cjs/components/_classes/component/Component.form.js +0 -5
- package/lib/cjs/components/_classes/component/Component.js +189 -433
- package/lib/cjs/components/_classes/component/editForm/Component.edit.display.js +8 -0
- package/lib/cjs/components/_classes/component/editForm/Component.edit.validation.js +2 -2
- package/lib/cjs/components/_classes/component/editForm/utils.js +2 -2
- package/lib/cjs/components/_classes/field/Field.d.ts +2 -11
- package/lib/cjs/components/_classes/field/Field.js +1 -13
- package/lib/cjs/components/_classes/input/Input.d.ts +3 -4
- package/lib/cjs/components/_classes/input/Input.js +2 -2
- package/lib/cjs/components/_classes/list/ListComponent.d.ts +2 -2
- package/lib/cjs/components/_classes/list/ListComponent.form.d.ts +3 -6
- package/lib/cjs/components/_classes/list/ListComponent.form.js +0 -5
- package/lib/cjs/components/_classes/multivalue/Multivalue.d.ts +12 -43
- package/lib/cjs/components/_classes/multivalue/Multivalue.js +3 -37
- package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +67 -163
- package/lib/cjs/components/_classes/nested/NestedComponent.form.d.ts +3 -6
- package/lib/cjs/components/_classes/nested/NestedComponent.form.js +0 -5
- package/lib/cjs/components/_classes/nested/NestedComponent.js +54 -175
- package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -2
- package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
- package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.d.ts +1 -7
- package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.js +3 -2
- package/lib/cjs/components/address/Address.d.ts +2 -4
- package/lib/cjs/components/address/Address.form.d.ts +3 -6
- package/lib/cjs/components/address/Address.form.js +0 -5
- package/lib/cjs/components/button/Button.d.ts +12 -3
- package/lib/cjs/components/button/Button.form.d.ts +3 -6
- package/lib/cjs/components/button/Button.form.js +0 -5
- package/lib/cjs/components/button/Button.js +0 -5
- package/lib/cjs/components/checkbox/Checkbox.d.ts +27 -4
- package/lib/cjs/components/checkbox/Checkbox.form.d.ts +3 -6
- package/lib/cjs/components/checkbox/Checkbox.form.js +0 -5
- package/lib/cjs/components/columns/Columns.d.ts +2 -3
- package/lib/cjs/components/columns/Columns.form.d.ts +3 -6
- package/lib/cjs/components/columns/Columns.form.js +0 -5
- package/lib/cjs/components/columns/Columns.js +1 -1
- package/lib/cjs/components/container/Container.form.d.ts +3 -6
- package/lib/cjs/components/container/Container.form.js +0 -5
- package/lib/cjs/components/content/Content.d.ts +1 -2
- package/lib/cjs/components/content/Content.form.d.ts +3 -6
- package/lib/cjs/components/content/Content.form.js +0 -5
- package/lib/cjs/components/currency/Currency.form.d.ts +3 -6
- package/lib/cjs/components/currency/Currency.form.js +0 -5
- package/lib/cjs/components/currency/Currency.js +2 -1
- package/lib/cjs/components/datagrid/DataGrid.d.ts +7 -8
- package/lib/cjs/components/datagrid/DataGrid.form.d.ts +3 -6
- package/lib/cjs/components/datagrid/DataGrid.form.js +0 -5
- package/lib/cjs/components/datagrid/DataGrid.js +5 -5
- package/lib/cjs/components/datamap/DataMap.d.ts +0 -1
- package/lib/cjs/components/datamap/DataMap.form.d.ts +3 -6
- package/lib/cjs/components/datamap/DataMap.form.js +0 -5
- package/lib/cjs/components/datetime/DateTime.d.ts +14 -0
- package/lib/cjs/components/datetime/DateTime.form.d.ts +3 -6
- package/lib/cjs/components/datetime/DateTime.form.js +0 -5
- package/lib/cjs/components/datetime/editForm/DateTime.edit.date.js +2 -2
- package/lib/cjs/components/day/Day.d.ts +48 -22
- package/lib/cjs/components/day/Day.form.d.ts +3 -6
- package/lib/cjs/components/day/Day.form.js +0 -5
- package/lib/cjs/components/day/Day.js +20 -15
- package/lib/cjs/components/editgrid/EditGrid.d.ts +3 -7
- package/lib/cjs/components/editgrid/EditGrid.form.d.ts +3 -6
- package/lib/cjs/components/editgrid/EditGrid.form.js +0 -5
- package/lib/cjs/components/editgrid/EditGrid.js +3 -3
- package/lib/cjs/components/editgrid/editForm/EditGrid.edit.display.js +5 -2
- package/lib/cjs/components/editgrid/editForm/EditGrid.edit.templates.js +9 -6
- package/lib/cjs/components/email/Email.form.d.ts +3 -6
- package/lib/cjs/components/email/Email.form.js +0 -5
- package/lib/cjs/components/fieldset/Fieldset.form.d.ts +3 -6
- package/lib/cjs/components/fieldset/Fieldset.form.js +0 -5
- package/lib/cjs/components/file/File.d.ts +22 -9
- package/lib/cjs/components/file/File.form.d.ts +3 -6
- package/lib/cjs/components/file/File.form.js +0 -5
- package/lib/cjs/components/form/Form.d.ts +20 -31
- package/lib/cjs/components/form/Form.form.d.ts +3 -6
- package/lib/cjs/components/form/Form.form.js +0 -5
- package/lib/cjs/components/form/Form.js +10 -13
- package/lib/cjs/components/hidden/Hidden.d.ts +11 -1
- package/lib/cjs/components/hidden/Hidden.form.d.ts +3 -6
- package/lib/cjs/components/hidden/Hidden.form.js +0 -5
- package/lib/cjs/components/hidden/Hidden.js +2 -1
- package/lib/cjs/components/html/HTML.d.ts +1 -2
- package/lib/cjs/components/html/HTML.form.d.ts +3 -6
- package/lib/cjs/components/html/HTML.form.js +0 -5
- package/lib/cjs/components/number/Number.d.ts +17 -3
- package/lib/cjs/components/number/Number.form.d.ts +3 -6
- package/lib/cjs/components/number/Number.form.js +0 -5
- package/lib/cjs/components/number/Number.js +2 -1
- package/lib/cjs/components/panel/Panel.form.d.ts +3 -6
- package/lib/cjs/components/panel/Panel.form.js +0 -5
- package/lib/cjs/components/panel/Panel.js +1 -0
- package/lib/cjs/components/password/Password.form.d.ts +3 -6
- package/lib/cjs/components/password/Password.form.js +0 -5
- package/lib/cjs/components/phonenumber/PhoneNumber.form.d.ts +3 -6
- package/lib/cjs/components/phonenumber/PhoneNumber.form.js +0 -5
- package/lib/cjs/components/radio/Radio.d.ts +26 -3
- package/lib/cjs/components/radio/Radio.form.d.ts +3 -6
- package/lib/cjs/components/radio/Radio.form.js +0 -5
- package/lib/cjs/components/radio/Radio.js +4 -3
- package/lib/cjs/components/recaptcha/ReCaptcha.d.ts +1 -1
- package/lib/cjs/components/recaptcha/ReCaptcha.form.d.ts +3 -5
- package/lib/cjs/components/recaptcha/ReCaptcha.form.js +0 -4
- package/lib/cjs/components/select/Select.d.ts +39 -16
- package/lib/cjs/components/select/Select.form.d.ts +3 -6
- package/lib/cjs/components/select/Select.form.js +0 -5
- package/lib/cjs/components/select/Select.js +16 -13
- package/lib/cjs/components/selectboxes/SelectBoxes.d.ts +17 -2
- package/lib/cjs/components/selectboxes/SelectBoxes.form.d.ts +3 -6
- package/lib/cjs/components/selectboxes/SelectBoxes.form.js +0 -5
- package/lib/cjs/components/selectboxes/SelectBoxes.js +9 -7
- package/lib/cjs/components/signature/Signature.d.ts +14 -1
- package/lib/cjs/components/signature/Signature.form.d.ts +3 -6
- package/lib/cjs/components/signature/Signature.form.js +0 -5
- package/lib/cjs/components/survey/Survey.d.ts +15 -3
- package/lib/cjs/components/survey/Survey.form.d.ts +3 -6
- package/lib/cjs/components/survey/Survey.form.js +0 -5
- package/lib/cjs/components/table/Table.d.ts +1 -2
- package/lib/cjs/components/table/Table.form.d.ts +3 -6
- package/lib/cjs/components/table/Table.form.js +0 -5
- package/lib/cjs/components/tabs/Tabs.d.ts +4 -4
- package/lib/cjs/components/tabs/Tabs.form.d.ts +3 -6
- package/lib/cjs/components/tabs/Tabs.form.js +0 -5
- package/lib/cjs/components/tabs/Tabs.js +2 -1
- package/lib/cjs/components/tags/Tags.d.ts +14 -0
- package/lib/cjs/components/tags/Tags.form.d.ts +3 -6
- package/lib/cjs/components/tags/Tags.form.js +0 -5
- package/lib/cjs/components/textarea/TextArea.d.ts +9 -4
- package/lib/cjs/components/textarea/TextArea.form.d.ts +3 -6
- package/lib/cjs/components/textarea/TextArea.form.js +0 -5
- package/lib/cjs/components/textarea/TextArea.js +2 -2
- package/lib/cjs/components/textfield/TextField.d.ts +30 -14
- package/lib/cjs/components/textfield/TextField.form.d.ts +3 -6
- package/lib/cjs/components/textfield/TextField.form.js +0 -5
- package/lib/cjs/components/textfield/TextField.js +16 -13
- package/lib/cjs/components/time/Time.form.d.ts +3 -6
- package/lib/cjs/components/time/Time.form.js +0 -5
- package/lib/cjs/components/unknown/Unknown.form.d.ts +34 -5
- package/lib/cjs/components/unknown/Unknown.form.js +0 -4
- package/lib/cjs/components/url/Url.form.d.ts +3 -6
- package/lib/cjs/components/url/Url.form.js +0 -5
- package/lib/cjs/components/well/Well.form.d.ts +3 -6
- package/lib/cjs/components/well/Well.form.js +0 -5
- package/lib/cjs/formio.embed.d.ts +2 -1
- package/lib/cjs/formio.embed.js +100 -2
- package/lib/cjs/formio.form.d.ts +4 -11
- package/lib/cjs/formio.form.js +5 -13
- package/lib/cjs/providers/Providers.d.ts +5 -36
- package/lib/cjs/providers/Providers.js +0 -29
- package/lib/cjs/providers/address/AddressProvider.d.ts +12 -131
- package/lib/cjs/providers/address/AddressProvider.js +2 -88
- package/lib/cjs/providers/address/AzureAddressProvider.d.ts +1 -48
- package/lib/cjs/providers/address/AzureAddressProvider.js +0 -37
- package/lib/cjs/providers/address/CustomAddressProvider.d.ts +4 -27
- package/lib/cjs/providers/address/CustomAddressProvider.js +0 -34
- package/lib/cjs/providers/address/GoogleAddressProvider.d.ts +6 -130
- package/lib/cjs/providers/address/GoogleAddressProvider.js +0 -72
- package/lib/cjs/providers/address/NominatimAddressProvider.d.ts +7 -32
- package/lib/cjs/providers/address/NominatimAddressProvider.js +0 -33
- package/lib/cjs/providers/address/index.d.ts +1 -3
- package/lib/cjs/providers/processor/fileProcessor.d.ts +1 -7
- package/lib/cjs/providers/processor/fileProcessor.js +0 -6
- package/lib/cjs/providers/storage/azure.d.ts +13 -6
- package/lib/cjs/providers/storage/azure.js +0 -5
- package/lib/cjs/providers/storage/base64.d.ts +6 -5
- package/lib/cjs/providers/storage/base64.js +0 -4
- package/lib/cjs/providers/storage/dropbox.d.ts +4 -6
- package/lib/cjs/providers/storage/dropbox.js +0 -5
- package/lib/cjs/providers/storage/googleDrive.d.ts +5 -7
- package/lib/cjs/providers/storage/googleDrive.js +0 -6
- package/lib/cjs/providers/storage/indexeddb.d.ts +7 -5
- package/lib/cjs/providers/storage/indexeddb.js +0 -4
- package/lib/cjs/providers/storage/s3.d.ts +20 -6
- package/lib/cjs/providers/storage/s3.js +0 -5
- package/lib/cjs/providers/storage/url.d.ts +7 -6
- package/lib/cjs/providers/storage/url.js +0 -10
- package/lib/cjs/providers/storage/util.d.ts +1 -24
- package/lib/cjs/providers/storage/util.js +0 -18
- package/lib/cjs/templates/Templates.d.ts +0 -1
- package/lib/cjs/translations/en.d.ts +1 -0
- package/lib/cjs/translations/en.js +1 -0
- package/lib/cjs/utils/Evaluator.d.ts +3 -6
- package/lib/cjs/utils/Evaluator.js +20 -11
- package/lib/cjs/utils/builder.d.ts +7 -9
- package/lib/cjs/utils/builder.js +5 -10
- package/lib/cjs/utils/calendarUtils.d.ts +13 -7
- package/lib/cjs/utils/calendarUtils.js +17 -10
- package/lib/cjs/utils/formUtils.d.ts +171 -43
- package/lib/cjs/utils/formUtils.js +569 -38
- package/lib/cjs/utils/utils.d.ts +216 -362
- package/lib/cjs/utils/utils.js +224 -331
- package/lib/cjs/widgets/CalendarWidget.d.ts +10 -9
- package/lib/cjs/widgets/CalendarWidget.js +11 -9
- package/lib/mjs/Element.d.ts +96 -86
- package/lib/mjs/Element.js +78 -68
- package/lib/mjs/Form.d.ts +36 -365
- package/lib/mjs/Form.js +57 -140
- package/lib/mjs/FormBuilder.d.ts +2 -187
- package/lib/mjs/FormBuilder.js +8 -32
- package/lib/mjs/PDF.d.ts +13 -11
- package/lib/mjs/PDF.js +8 -6
- package/lib/mjs/Webform.d.ts +139 -180
- package/lib/mjs/Webform.js +310 -325
- package/lib/mjs/WebformBuilder.d.ts +14 -16
- package/lib/mjs/WebformBuilder.js +11 -16
- package/lib/mjs/Wizard.d.ts +21 -31
- package/lib/mjs/Wizard.js +18 -41
- package/lib/mjs/WizardBuilder.d.ts +1 -1
- package/lib/mjs/addons/PasswordStrength/PasswordStrengthAddon.d.ts +5 -8
- package/lib/mjs/addons/PasswordStrength/PasswordStrengthAddon.js +3 -6
- package/lib/mjs/components/Components.d.ts +4 -4
- package/lib/mjs/components/Components.js +3 -3
- package/lib/mjs/components/_classes/component/Component.d.ts +269 -502
- package/lib/mjs/components/_classes/component/Component.form.d.ts +3 -6
- package/lib/mjs/components/_classes/component/Component.form.js +0 -5
- package/lib/mjs/components/_classes/component/Component.js +189 -433
- package/lib/mjs/components/_classes/component/editForm/Component.edit.display.js +8 -0
- package/lib/mjs/components/_classes/component/editForm/Component.edit.validation.js +1 -1
- package/lib/mjs/components/_classes/component/editForm/utils.js +1 -1
- package/lib/mjs/components/_classes/field/Field.d.ts +2 -11
- package/lib/mjs/components/_classes/field/Field.js +1 -13
- package/lib/mjs/components/_classes/input/Input.d.ts +3 -4
- package/lib/mjs/components/_classes/input/Input.js +2 -2
- package/lib/mjs/components/_classes/list/ListComponent.d.ts +2 -2
- package/lib/mjs/components/_classes/list/ListComponent.form.d.ts +3 -6
- package/lib/mjs/components/_classes/list/ListComponent.form.js +0 -5
- package/lib/mjs/components/_classes/multivalue/Multivalue.d.ts +12 -43
- package/lib/mjs/components/_classes/multivalue/Multivalue.js +3 -37
- package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +67 -163
- package/lib/mjs/components/_classes/nested/NestedComponent.form.d.ts +3 -6
- package/lib/mjs/components/_classes/nested/NestedComponent.form.js +0 -5
- package/lib/mjs/components/_classes/nested/NestedComponent.js +54 -175
- package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -2
- package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +1 -1
- package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.d.ts +1 -7
- package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.js +3 -2
- package/lib/mjs/components/address/Address.d.ts +2 -4
- package/lib/mjs/components/address/Address.form.d.ts +3 -6
- package/lib/mjs/components/address/Address.form.js +0 -5
- package/lib/mjs/components/button/Button.d.ts +12 -3
- package/lib/mjs/components/button/Button.form.d.ts +3 -6
- package/lib/mjs/components/button/Button.form.js +0 -5
- package/lib/mjs/components/button/Button.js +0 -5
- package/lib/mjs/components/checkbox/Checkbox.d.ts +27 -4
- package/lib/mjs/components/checkbox/Checkbox.form.d.ts +3 -6
- package/lib/mjs/components/checkbox/Checkbox.form.js +0 -5
- package/lib/mjs/components/columns/Columns.d.ts +2 -3
- package/lib/mjs/components/columns/Columns.form.d.ts +3 -6
- package/lib/mjs/components/columns/Columns.form.js +0 -5
- package/lib/mjs/components/columns/Columns.js +1 -1
- package/lib/mjs/components/container/Container.form.d.ts +3 -6
- package/lib/mjs/components/container/Container.form.js +0 -5
- package/lib/mjs/components/content/Content.d.ts +1 -2
- package/lib/mjs/components/content/Content.form.d.ts +3 -6
- package/lib/mjs/components/content/Content.form.js +0 -5
- package/lib/mjs/components/currency/Currency.form.d.ts +3 -6
- package/lib/mjs/components/currency/Currency.form.js +0 -5
- package/lib/mjs/components/currency/Currency.js +2 -1
- package/lib/mjs/components/datagrid/DataGrid.d.ts +7 -8
- package/lib/mjs/components/datagrid/DataGrid.form.d.ts +3 -6
- package/lib/mjs/components/datagrid/DataGrid.form.js +0 -5
- package/lib/mjs/components/datagrid/DataGrid.js +5 -5
- package/lib/mjs/components/datamap/DataMap.d.ts +0 -1
- package/lib/mjs/components/datamap/DataMap.form.d.ts +3 -6
- package/lib/mjs/components/datamap/DataMap.form.js +0 -5
- package/lib/mjs/components/datetime/DateTime.d.ts +14 -0
- package/lib/mjs/components/datetime/DateTime.form.d.ts +3 -6
- package/lib/mjs/components/datetime/DateTime.form.js +0 -5
- package/lib/mjs/components/datetime/editForm/DateTime.edit.date.js +1 -1
- package/lib/mjs/components/day/Day.d.ts +48 -22
- package/lib/mjs/components/day/Day.form.d.ts +3 -6
- package/lib/mjs/components/day/Day.form.js +0 -5
- package/lib/mjs/components/day/Day.js +20 -15
- package/lib/mjs/components/editgrid/EditGrid.d.ts +3 -7
- package/lib/mjs/components/editgrid/EditGrid.form.d.ts +3 -6
- package/lib/mjs/components/editgrid/EditGrid.form.js +0 -5
- package/lib/mjs/components/editgrid/EditGrid.js +3 -3
- package/lib/mjs/components/editgrid/editForm/EditGrid.edit.display.js +1 -1
- package/lib/mjs/components/editgrid/editForm/EditGrid.edit.templates.js +1 -1
- package/lib/mjs/components/email/Email.form.d.ts +3 -6
- package/lib/mjs/components/email/Email.form.js +0 -5
- package/lib/mjs/components/fieldset/Fieldset.form.d.ts +3 -6
- package/lib/mjs/components/fieldset/Fieldset.form.js +0 -5
- package/lib/mjs/components/file/File.d.ts +22 -9
- package/lib/mjs/components/file/File.form.d.ts +3 -6
- package/lib/mjs/components/file/File.form.js +0 -5
- package/lib/mjs/components/form/Form.d.ts +20 -31
- package/lib/mjs/components/form/Form.form.d.ts +3 -6
- package/lib/mjs/components/form/Form.form.js +0 -5
- package/lib/mjs/components/form/Form.js +10 -13
- package/lib/mjs/components/hidden/Hidden.d.ts +11 -1
- package/lib/mjs/components/hidden/Hidden.form.d.ts +3 -6
- package/lib/mjs/components/hidden/Hidden.form.js +0 -5
- package/lib/mjs/components/hidden/Hidden.js +2 -1
- package/lib/mjs/components/html/HTML.d.ts +1 -2
- package/lib/mjs/components/html/HTML.form.d.ts +3 -6
- package/lib/mjs/components/html/HTML.form.js +0 -5
- package/lib/mjs/components/number/Number.d.ts +17 -3
- package/lib/mjs/components/number/Number.form.d.ts +3 -6
- package/lib/mjs/components/number/Number.form.js +0 -5
- package/lib/mjs/components/number/Number.js +2 -1
- package/lib/mjs/components/panel/Panel.form.d.ts +3 -6
- package/lib/mjs/components/panel/Panel.form.js +0 -5
- package/lib/mjs/components/panel/Panel.js +1 -0
- package/lib/mjs/components/password/Password.form.d.ts +3 -6
- package/lib/mjs/components/password/Password.form.js +0 -5
- package/lib/mjs/components/phonenumber/PhoneNumber.form.d.ts +3 -6
- package/lib/mjs/components/phonenumber/PhoneNumber.form.js +0 -5
- package/lib/mjs/components/radio/Radio.d.ts +26 -3
- package/lib/mjs/components/radio/Radio.form.d.ts +3 -6
- package/lib/mjs/components/radio/Radio.form.js +0 -5
- package/lib/mjs/components/radio/Radio.js +4 -3
- package/lib/mjs/components/recaptcha/ReCaptcha.d.ts +1 -1
- package/lib/mjs/components/recaptcha/ReCaptcha.form.d.ts +3 -5
- package/lib/mjs/components/recaptcha/ReCaptcha.form.js +0 -4
- package/lib/mjs/components/select/Select.d.ts +39 -16
- package/lib/mjs/components/select/Select.form.d.ts +3 -6
- package/lib/mjs/components/select/Select.form.js +0 -5
- package/lib/mjs/components/select/Select.js +16 -13
- package/lib/mjs/components/selectboxes/SelectBoxes.d.ts +17 -2
- package/lib/mjs/components/selectboxes/SelectBoxes.form.d.ts +3 -6
- package/lib/mjs/components/selectboxes/SelectBoxes.form.js +0 -5
- package/lib/mjs/components/selectboxes/SelectBoxes.js +9 -7
- package/lib/mjs/components/signature/Signature.d.ts +14 -1
- package/lib/mjs/components/signature/Signature.form.d.ts +3 -6
- package/lib/mjs/components/signature/Signature.form.js +0 -5
- package/lib/mjs/components/survey/Survey.d.ts +15 -3
- package/lib/mjs/components/survey/Survey.form.d.ts +3 -6
- package/lib/mjs/components/survey/Survey.form.js +0 -5
- package/lib/mjs/components/table/Table.d.ts +1 -2
- package/lib/mjs/components/table/Table.form.d.ts +3 -6
- package/lib/mjs/components/table/Table.form.js +0 -5
- package/lib/mjs/components/tabs/Tabs.d.ts +4 -4
- package/lib/mjs/components/tabs/Tabs.form.d.ts +3 -6
- package/lib/mjs/components/tabs/Tabs.form.js +0 -5
- package/lib/mjs/components/tabs/Tabs.js +2 -1
- package/lib/mjs/components/tags/Tags.d.ts +14 -0
- package/lib/mjs/components/tags/Tags.form.d.ts +3 -6
- package/lib/mjs/components/tags/Tags.form.js +0 -5
- package/lib/mjs/components/textarea/TextArea.d.ts +9 -4
- package/lib/mjs/components/textarea/TextArea.form.d.ts +3 -6
- package/lib/mjs/components/textarea/TextArea.form.js +0 -5
- package/lib/mjs/components/textarea/TextArea.js +2 -2
- package/lib/mjs/components/textfield/TextField.d.ts +30 -14
- package/lib/mjs/components/textfield/TextField.form.d.ts +3 -6
- package/lib/mjs/components/textfield/TextField.form.js +0 -5
- package/lib/mjs/components/textfield/TextField.js +16 -13
- package/lib/mjs/components/time/Time.form.d.ts +3 -6
- package/lib/mjs/components/time/Time.form.js +0 -5
- package/lib/mjs/components/unknown/Unknown.form.d.ts +34 -5
- package/lib/mjs/components/unknown/Unknown.form.js +0 -4
- package/lib/mjs/components/url/Url.form.d.ts +3 -6
- package/lib/mjs/components/url/Url.form.js +0 -5
- package/lib/mjs/components/well/Well.form.d.ts +3 -6
- package/lib/mjs/components/well/Well.form.js +0 -5
- package/lib/mjs/formio.embed.d.ts +2 -1
- package/lib/mjs/formio.embed.js +99 -2
- package/lib/mjs/formio.form.d.ts +4 -11
- package/lib/mjs/formio.form.js +3 -10
- package/lib/mjs/providers/Providers.d.ts +5 -36
- package/lib/mjs/providers/Providers.js +0 -29
- package/lib/mjs/providers/address/AddressProvider.d.ts +12 -131
- package/lib/mjs/providers/address/AddressProvider.js +2 -88
- package/lib/mjs/providers/address/AzureAddressProvider.d.ts +1 -48
- package/lib/mjs/providers/address/AzureAddressProvider.js +0 -37
- package/lib/mjs/providers/address/CustomAddressProvider.d.ts +4 -27
- package/lib/mjs/providers/address/CustomAddressProvider.js +0 -34
- package/lib/mjs/providers/address/GoogleAddressProvider.d.ts +6 -130
- package/lib/mjs/providers/address/GoogleAddressProvider.js +0 -72
- package/lib/mjs/providers/address/NominatimAddressProvider.d.ts +7 -32
- package/lib/mjs/providers/address/NominatimAddressProvider.js +0 -33
- package/lib/mjs/providers/address/index.d.ts +1 -3
- package/lib/mjs/providers/processor/fileProcessor.d.ts +1 -7
- package/lib/mjs/providers/processor/fileProcessor.js +0 -6
- package/lib/mjs/providers/storage/azure.d.ts +13 -6
- package/lib/mjs/providers/storage/azure.js +0 -5
- package/lib/mjs/providers/storage/base64.d.ts +6 -5
- package/lib/mjs/providers/storage/base64.js +0 -4
- package/lib/mjs/providers/storage/dropbox.d.ts +4 -6
- package/lib/mjs/providers/storage/dropbox.js +0 -5
- package/lib/mjs/providers/storage/googleDrive.d.ts +5 -7
- package/lib/mjs/providers/storage/googleDrive.js +0 -6
- package/lib/mjs/providers/storage/indexeddb.d.ts +7 -5
- package/lib/mjs/providers/storage/indexeddb.js +0 -4
- package/lib/mjs/providers/storage/s3.d.ts +20 -6
- package/lib/mjs/providers/storage/s3.js +0 -5
- package/lib/mjs/providers/storage/url.d.ts +7 -6
- package/lib/mjs/providers/storage/url.js +0 -10
- package/lib/mjs/providers/storage/util.d.ts +1 -24
- package/lib/mjs/providers/storage/util.js +0 -18
- package/lib/mjs/templates/Templates.d.ts +0 -1
- package/lib/mjs/translations/en.d.ts +1 -0
- package/lib/mjs/translations/en.js +1 -0
- package/lib/mjs/utils/Evaluator.d.ts +3 -6
- package/lib/mjs/utils/Evaluator.js +20 -9
- package/lib/mjs/utils/builder.d.ts +7 -9
- package/lib/mjs/utils/builder.js +5 -10
- package/lib/mjs/utils/calendarUtils.d.ts +13 -7
- package/lib/mjs/utils/calendarUtils.js +17 -10
- package/lib/mjs/utils/formUtils.d.ts +171 -43
- package/lib/mjs/utils/formUtils.js +554 -6
- package/lib/mjs/utils/utils.d.ts +216 -362
- package/lib/mjs/utils/utils.js +218 -325
- package/lib/mjs/widgets/CalendarWidget.d.ts +10 -9
- package/lib/mjs/widgets/CalendarWidget.js +11 -9
- package/package.json +22 -22
- package/embed.d.ts +0 -1
- package/form.d.ts +0 -1
- package/lib/cjs/InlineEmbed.d.ts +0 -7
- package/lib/cjs/InlineEmbed.js +0 -109
- package/lib/mjs/InlineEmbed.d.ts +0 -7
- package/lib/mjs/InlineEmbed.js +0 -105
- package/sdk.d.ts +0 -1
- package/utils.d.ts +0 -1
package/lib/mjs/Webform.js
CHANGED
|
@@ -1,43 +1,34 @@
|
|
|
1
|
-
import _ from
|
|
2
|
-
import moment from
|
|
3
|
-
import { compareVersions } from
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import moment from 'moment';
|
|
3
|
+
import { compareVersions } from 'compare-versions';
|
|
4
|
+
import { Component } from '@formio/core';
|
|
5
|
+
import EventEmitter from './EventEmitter';
|
|
6
|
+
import i18nDefaults from './i18n';
|
|
7
|
+
import { Formio } from './Formio';
|
|
8
|
+
import Components from './components/Components';
|
|
9
|
+
import NestedDataComponent from './components/_classes/nesteddata/NestedDataComponent';
|
|
10
|
+
import { fastCloneDeep, currentTimezone, unescapeHTML, getStringFromComponentPath, searchComponents, convertStringToHTMLElement, getArrayFromComponentPath, } from './utils/utils';
|
|
11
|
+
import { eachComponent } from './utils/formUtils';
|
|
11
12
|
// Initialize the available forms.
|
|
12
13
|
Formio.forms = {};
|
|
13
14
|
// Allow people to register components.
|
|
14
15
|
Formio.registerComponent = Components.setComponent;
|
|
15
|
-
/**
|
|
16
|
-
*
|
|
17
|
-
* @param {any} icons - The icons to use.
|
|
18
|
-
* @returns {any} - The icon set.
|
|
19
|
-
*/
|
|
20
16
|
function getIconSet(icons) {
|
|
21
|
-
if (icons ===
|
|
22
|
-
return
|
|
17
|
+
if (icons === 'fontawesome') {
|
|
18
|
+
return 'fa';
|
|
23
19
|
}
|
|
24
|
-
return icons ||
|
|
20
|
+
return icons || '';
|
|
25
21
|
}
|
|
26
|
-
/**
|
|
27
|
-
*
|
|
28
|
-
* @param {any} options - The options to get.
|
|
29
|
-
* @returns {any} - The options.
|
|
30
|
-
*/
|
|
31
22
|
function getOptions(options) {
|
|
32
23
|
options = _.defaults(options, {
|
|
33
24
|
submitOnEnter: false,
|
|
34
|
-
iconset: getIconSet(options && options.icons ? options.icons : Formio.icons),
|
|
25
|
+
iconset: getIconSet((options && options.icons) ? options.icons : Formio.icons),
|
|
35
26
|
i18next: null,
|
|
36
27
|
saveDraft: false,
|
|
37
28
|
alwaysDirty: false,
|
|
38
29
|
saveDraftThrottle: 5000,
|
|
39
|
-
display:
|
|
40
|
-
cdnUrl: Formio.cdn.baseUrl
|
|
30
|
+
display: 'form',
|
|
31
|
+
cdnUrl: Formio.cdn.baseUrl
|
|
41
32
|
});
|
|
42
33
|
if (!options.events) {
|
|
43
34
|
options.events = new EventEmitter();
|
|
@@ -57,36 +48,36 @@ function getOptions(options) {
|
|
|
57
48
|
* @typedef {{[key: string]: JSON}} JSONObject
|
|
58
49
|
*/
|
|
59
50
|
/**
|
|
60
|
-
* @typedef {
|
|
61
|
-
* @property {
|
|
62
|
-
* @property {
|
|
63
|
-
* @property {
|
|
64
|
-
* @property {
|
|
65
|
-
* @property {
|
|
66
|
-
* @property {
|
|
67
|
-
* @property {
|
|
68
|
-
* @property {
|
|
69
|
-
* @property {
|
|
70
|
-
* @property {
|
|
51
|
+
* @typedef {Object} FormioHooks
|
|
52
|
+
* @property {function} [beforeSubmit]
|
|
53
|
+
* @property {function} [beforeCancel]
|
|
54
|
+
* @property {function} [beforeNext]
|
|
55
|
+
* @property {function} [beforePrev]
|
|
56
|
+
* @property {function} [attachComponent]
|
|
57
|
+
* @property {function} [setDataValue]
|
|
58
|
+
* @property {function} [addComponents]
|
|
59
|
+
* @property {function} [addComponent]
|
|
60
|
+
* @property {function} [customValidation]
|
|
61
|
+
* @property {function} [attachWebform]
|
|
71
62
|
*/
|
|
72
63
|
/**
|
|
73
|
-
* @typedef {
|
|
74
|
-
* @property {string[]} [addAttr]
|
|
75
|
-
* @property {string[]} [addTags]
|
|
76
|
-
* @property {string[]} [allowedAttrs]
|
|
77
|
-
* @property {string[]} [allowedTags]
|
|
78
|
-
* @property {string[]} [allowedUriRegex]
|
|
79
|
-
* @property {string[]} [addUriSafeAttr]
|
|
64
|
+
* @typedef {Object} SanitizeConfig
|
|
65
|
+
* @property {string[]} [addAttr]
|
|
66
|
+
* @property {string[]} [addTags]
|
|
67
|
+
* @property {string[]} [allowedAttrs]
|
|
68
|
+
* @property {string[]} [allowedTags]
|
|
69
|
+
* @property {string[]} [allowedUriRegex]
|
|
70
|
+
* @property {string[]} [addUriSafeAttr]
|
|
80
71
|
*/
|
|
81
72
|
/**
|
|
82
|
-
* @typedef {
|
|
83
|
-
* @property {boolean} [showPrevious]
|
|
84
|
-
* @property {boolean} [showNext]
|
|
85
|
-
* @property {boolean} [showCancel]
|
|
86
|
-
* @property {boolean} [showSubmit]
|
|
73
|
+
* @typedef {Object} ButtonSettings
|
|
74
|
+
* @property {boolean} [showPrevious]
|
|
75
|
+
* @property {boolean} [showNext]
|
|
76
|
+
* @property {boolean} [showCancel]
|
|
77
|
+
* @property {boolean} [showSubmit]
|
|
87
78
|
*/
|
|
88
79
|
/**
|
|
89
|
-
* @typedef {
|
|
80
|
+
* @typedef {Object} FormOptions
|
|
90
81
|
* @property {boolean} [saveDraft] - Enable the save draft feature.
|
|
91
82
|
* @property {number} [saveDraftThrottle] - The throttle for the save draft feature.
|
|
92
83
|
* @property {boolean} [readOnly] - Set this form to readOnly.
|
|
@@ -104,7 +95,7 @@ function getOptions(options) {
|
|
|
104
95
|
* @property {string} [componentErrorClass] - The error class for components.
|
|
105
96
|
* @property {any} [templates] - The templates for this form.
|
|
106
97
|
* @property {string} [iconset] - The iconset for this form.
|
|
107
|
-
* @property {
|
|
98
|
+
* @property {Component[]} [components] - The components for this form.
|
|
108
99
|
* @property {{[key: string]: boolean}} [disabled] - Disabled components for this form.
|
|
109
100
|
* @property {boolean} [showHiddenFields] - Show hidden fields.
|
|
110
101
|
* @property {{[key: string]: boolean}} [hide] - Hidden components for this form.
|
|
@@ -121,32 +112,34 @@ function getOptions(options) {
|
|
|
121
112
|
* @property {boolean} [sanitize] - Sanitize the form.
|
|
122
113
|
* @property {SanitizeConfig} [sanitizeConfig] - The sanitize configuration for this form.
|
|
123
114
|
* @property {ButtonSettings} [buttonSettings] - The button settings for this form.
|
|
124
|
-
* @property {
|
|
115
|
+
* @property {Object} [breadCrumbSettings] - The breadcrumb settings for this form.
|
|
125
116
|
* @property {boolean} [allowPrevious] - Allow the previous button (for Wizard forms).
|
|
126
117
|
* @property {string[]} [wizardButtonOrder] - The order of the buttons (for Wizard forms).
|
|
127
118
|
* @property {boolean} [showCheckboxBackground] - Show the checkbox background.
|
|
128
|
-
* @property {boolean} [inputsOnly] - Only show inputs in the form and no labels.
|
|
129
|
-
* @property {boolean} [building] - If we are in the process of building the form.
|
|
130
119
|
* @property {number} [zoom] - The zoom for PDF forms.
|
|
131
120
|
*/
|
|
121
|
+
/**
|
|
122
|
+
* Renders a Form.io form within the webpage.
|
|
123
|
+
*/
|
|
132
124
|
export default class Webform extends NestedDataComponent {
|
|
133
125
|
/**
|
|
134
|
-
* @type {
|
|
126
|
+
* @type {FormOptions} - the options for this Webform.
|
|
135
127
|
*/
|
|
136
128
|
options;
|
|
137
129
|
/**
|
|
138
130
|
* Creates a new Form instance.
|
|
139
|
-
*
|
|
140
|
-
* @param {
|
|
131
|
+
*
|
|
132
|
+
* @param {HTMLElement | Object | FormOptions} [elementOrOptions] - The DOM element to render this form within or the options to create this form instance.
|
|
133
|
+
* @param {FormOptions} [options] - The options to create a new form instance.
|
|
141
134
|
*/
|
|
142
|
-
constructor(elementOrOptions, options
|
|
135
|
+
constructor(elementOrOptions, options) {
|
|
143
136
|
let element, formOptions;
|
|
144
137
|
if (elementOrOptions instanceof HTMLElement || options) {
|
|
145
138
|
element = elementOrOptions;
|
|
146
|
-
formOptions = options
|
|
139
|
+
formOptions = options;
|
|
147
140
|
}
|
|
148
141
|
else {
|
|
149
|
-
formOptions = elementOrOptions
|
|
142
|
+
formOptions = elementOrOptions;
|
|
150
143
|
}
|
|
151
144
|
super(null, getOptions(formOptions));
|
|
152
145
|
this.setElement(element);
|
|
@@ -160,12 +153,12 @@ export default class Webform extends NestedDataComponent {
|
|
|
160
153
|
* The type of this element.
|
|
161
154
|
* @type {string}
|
|
162
155
|
*/
|
|
163
|
-
this.type =
|
|
164
|
-
this._src =
|
|
156
|
+
this.type = 'form';
|
|
157
|
+
this._src = '';
|
|
165
158
|
this._loading = false;
|
|
166
159
|
this._form = {};
|
|
167
160
|
this.draftEnabled = false;
|
|
168
|
-
this.savingDraft =
|
|
161
|
+
this.savingDraft = true;
|
|
169
162
|
if (this.options.saveDraftThrottle) {
|
|
170
163
|
this.triggerSaveDraft = _.throttle(this.saveDraft.bind(this), this.options.saveDraftThrottle);
|
|
171
164
|
}
|
|
@@ -179,11 +172,13 @@ export default class Webform extends NestedDataComponent {
|
|
|
179
172
|
this.nosubmit = false;
|
|
180
173
|
/**
|
|
181
174
|
* Determines if the form has tried to be submitted, error or not.
|
|
175
|
+
*
|
|
182
176
|
* @type {boolean}
|
|
183
177
|
*/
|
|
184
178
|
this.submitted = false;
|
|
185
179
|
/**
|
|
186
180
|
* Determines if the form is being submitted at the moment.
|
|
181
|
+
*
|
|
187
182
|
* @type {boolean}
|
|
188
183
|
*/
|
|
189
184
|
this.submitting = false;
|
|
@@ -215,6 +210,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
215
210
|
/**
|
|
216
211
|
* Promise that executes when the form is ready and rendered.
|
|
217
212
|
* @type {Promise}
|
|
213
|
+
*
|
|
218
214
|
* @example
|
|
219
215
|
* import Webform from '@formio/js/Webform';
|
|
220
216
|
* let form = new Webform(document.getElementById('formio'));
|
|
@@ -226,18 +222,21 @@ export default class Webform extends NestedDataComponent {
|
|
|
226
222
|
this.formReady = new Promise((resolve, reject) => {
|
|
227
223
|
/**
|
|
228
224
|
* Called when the formReady state of this form has been resolved.
|
|
229
|
-
*
|
|
225
|
+
*
|
|
226
|
+
* @type {function}
|
|
230
227
|
*/
|
|
231
228
|
this.formReadyResolve = resolve;
|
|
232
229
|
/**
|
|
233
230
|
* Called when this form could not load and is rejected.
|
|
234
|
-
*
|
|
231
|
+
*
|
|
232
|
+
* @type {function}
|
|
235
233
|
*/
|
|
236
234
|
this.formReadyReject = reject;
|
|
237
235
|
});
|
|
238
236
|
/**
|
|
239
237
|
* Promise that executes when the submission is ready and rendered.
|
|
240
238
|
* @type {Promise}
|
|
239
|
+
*
|
|
241
240
|
* @example
|
|
242
241
|
* import Webform from '@formio/js/Webform';
|
|
243
242
|
* let form = new Webform(document.getElementById('formio'));
|
|
@@ -249,12 +248,14 @@ export default class Webform extends NestedDataComponent {
|
|
|
249
248
|
this.submissionReady = new Promise((resolve, reject) => {
|
|
250
249
|
/**
|
|
251
250
|
* Called when the formReady state of this form has been resolved.
|
|
252
|
-
*
|
|
251
|
+
*
|
|
252
|
+
* @type {function}
|
|
253
253
|
*/
|
|
254
254
|
this.submissionReadyResolve = resolve;
|
|
255
255
|
/**
|
|
256
256
|
* Called when this form could not load and is rejected.
|
|
257
|
-
*
|
|
257
|
+
*
|
|
258
|
+
* @type {function}
|
|
258
259
|
*/
|
|
259
260
|
this.submissionReadyReject = reject;
|
|
260
261
|
});
|
|
@@ -263,19 +264,20 @@ export default class Webform extends NestedDataComponent {
|
|
|
263
264
|
this.language = this.i18next.language;
|
|
264
265
|
// See if we need to restore the draft from a user.
|
|
265
266
|
if (this.options.saveDraft) {
|
|
266
|
-
|
|
267
|
-
this.
|
|
268
|
-
this.savingDraft = false;
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
this.formReady.then(() => {
|
|
267
|
+
this.formReady.then(() => {
|
|
268
|
+
if (!this.options.skipDraftRestore) {
|
|
272
269
|
const user = Formio.getUser();
|
|
273
270
|
// Only restore a draft if the submission isn't explicitly set.
|
|
274
271
|
if (user && !this.submissionSet) {
|
|
275
272
|
this.restoreDraft(user._id);
|
|
276
273
|
}
|
|
277
|
-
}
|
|
278
|
-
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
// Enable drafts
|
|
277
|
+
this.draftEnabled = true;
|
|
278
|
+
this.savingDraft = false;
|
|
279
|
+
}
|
|
280
|
+
});
|
|
279
281
|
}
|
|
280
282
|
this.component.clearOnHide = false;
|
|
281
283
|
// Ensure the root is set to this component.
|
|
@@ -294,7 +296,9 @@ export default class Webform extends NestedDataComponent {
|
|
|
294
296
|
}
|
|
295
297
|
/**
|
|
296
298
|
* Sets the language for this form.
|
|
297
|
-
*
|
|
299
|
+
*
|
|
300
|
+
* @param lang
|
|
301
|
+
* @return {Promise}
|
|
298
302
|
*/
|
|
299
303
|
set language(lang) {
|
|
300
304
|
if (!this.i18next) {
|
|
@@ -309,7 +313,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
309
313
|
return;
|
|
310
314
|
}
|
|
311
315
|
this.rebuild();
|
|
312
|
-
this.emit(
|
|
316
|
+
this.emit('languageChanged');
|
|
313
317
|
});
|
|
314
318
|
}
|
|
315
319
|
get componentComponents() {
|
|
@@ -320,25 +324,31 @@ export default class Webform extends NestedDataComponent {
|
|
|
320
324
|
}
|
|
321
325
|
/**
|
|
322
326
|
* Add a language for translations
|
|
323
|
-
*
|
|
324
|
-
* @param
|
|
325
|
-
* @param
|
|
327
|
+
*
|
|
328
|
+
* @param code
|
|
329
|
+
* @param lang
|
|
330
|
+
* @param active
|
|
331
|
+
* @return {*}
|
|
326
332
|
*/
|
|
327
333
|
addLanguage(code, lang, active = false) {
|
|
328
334
|
if (this.i18next) {
|
|
329
335
|
var translations = _.assign(fastCloneDeep(i18nDefaults.resources.en.translation), lang);
|
|
330
|
-
this.i18next.addResourceBundle(code,
|
|
336
|
+
this.i18next.addResourceBundle(code, 'translation', translations, true, true);
|
|
331
337
|
if (active) {
|
|
332
338
|
this.language = code;
|
|
333
339
|
}
|
|
334
340
|
}
|
|
335
341
|
}
|
|
336
342
|
keyboardCatchableElement(element) {
|
|
337
|
-
if (element.nodeName ===
|
|
343
|
+
if (element.nodeName === 'TEXTAREA') {
|
|
338
344
|
return false;
|
|
339
345
|
}
|
|
340
|
-
if (element.nodeName ===
|
|
341
|
-
return [
|
|
346
|
+
if (element.nodeName === 'INPUT') {
|
|
347
|
+
return [
|
|
348
|
+
'text',
|
|
349
|
+
'email',
|
|
350
|
+
'password'
|
|
351
|
+
].indexOf(element.type) === -1;
|
|
342
352
|
}
|
|
343
353
|
return true;
|
|
344
354
|
}
|
|
@@ -349,15 +359,15 @@ export default class Webform extends NestedDataComponent {
|
|
|
349
359
|
}
|
|
350
360
|
const ctrl = event.ctrlKey || event.metaKey;
|
|
351
361
|
const keyCode = event.keyCode;
|
|
352
|
-
let char =
|
|
362
|
+
let char = '';
|
|
353
363
|
if (65 <= keyCode && keyCode <= 90) {
|
|
354
364
|
char = String.fromCharCode(keyCode);
|
|
355
365
|
}
|
|
356
366
|
else if (keyCode === 13) {
|
|
357
|
-
char =
|
|
367
|
+
char = 'Enter';
|
|
358
368
|
}
|
|
359
369
|
else if (keyCode === 27) {
|
|
360
|
-
char =
|
|
370
|
+
char = 'Esc';
|
|
361
371
|
}
|
|
362
372
|
_.each(this.shortcuts, (shortcut) => {
|
|
363
373
|
if (shortcut.ctrl && !ctrl) {
|
|
@@ -374,21 +384,21 @@ export default class Webform extends NestedDataComponent {
|
|
|
374
384
|
return;
|
|
375
385
|
}
|
|
376
386
|
shortcut = _.capitalize(shortcut);
|
|
377
|
-
if (shortcut ===
|
|
387
|
+
if (shortcut === 'Enter' || shortcut === 'Esc') {
|
|
378
388
|
// Restrict Enter and Esc only for buttons
|
|
379
|
-
if (element.tagName !==
|
|
389
|
+
if (element.tagName !== 'BUTTON') {
|
|
380
390
|
return;
|
|
381
391
|
}
|
|
382
392
|
this.shortcuts.push({
|
|
383
393
|
shortcut,
|
|
384
|
-
element
|
|
394
|
+
element
|
|
385
395
|
});
|
|
386
396
|
}
|
|
387
397
|
else {
|
|
388
398
|
this.shortcuts.push({
|
|
389
399
|
ctrl: true,
|
|
390
400
|
shortcut,
|
|
391
|
-
element
|
|
401
|
+
element
|
|
392
402
|
});
|
|
393
403
|
}
|
|
394
404
|
}
|
|
@@ -398,27 +408,24 @@ export default class Webform extends NestedDataComponent {
|
|
|
398
408
|
}
|
|
399
409
|
_.remove(this.shortcuts, {
|
|
400
410
|
shortcut,
|
|
401
|
-
element
|
|
411
|
+
element
|
|
402
412
|
});
|
|
403
413
|
}
|
|
404
414
|
/**
|
|
405
415
|
* Get the embed source of the form.
|
|
406
|
-
*
|
|
416
|
+
*
|
|
417
|
+
* @returns {string}
|
|
407
418
|
*/
|
|
408
419
|
get src() {
|
|
409
420
|
return this._src;
|
|
410
421
|
}
|
|
411
422
|
/**
|
|
412
423
|
* Loads the submission if applicable.
|
|
413
|
-
* @returns {Promise} - The promise that is triggered when the submission is loaded.
|
|
414
424
|
*/
|
|
415
425
|
loadSubmission() {
|
|
416
426
|
this.loadingSubmission = true;
|
|
417
427
|
if (this.formio.submissionId) {
|
|
418
|
-
this.onSubmission = this.formio
|
|
419
|
-
.loadSubmission()
|
|
420
|
-
.then((submission) => this.setSubmission(submission), (err) => this.submissionReadyReject(err))
|
|
421
|
-
.catch((err) => this.submissionReadyReject(err));
|
|
428
|
+
this.onSubmission = this.formio.loadSubmission().then((submission) => this.setSubmission(submission), (err) => this.submissionReadyReject(err)).catch((err) => this.submissionReadyReject(err));
|
|
422
429
|
}
|
|
423
430
|
else {
|
|
424
431
|
this.submissionReadyResolve();
|
|
@@ -427,21 +434,18 @@ export default class Webform extends NestedDataComponent {
|
|
|
427
434
|
}
|
|
428
435
|
/**
|
|
429
436
|
* Set the src of the form renderer.
|
|
430
|
-
*
|
|
431
|
-
* @param
|
|
432
|
-
* @
|
|
437
|
+
*
|
|
438
|
+
* @param value
|
|
439
|
+
* @param options
|
|
433
440
|
*/
|
|
434
441
|
setSrc(value, options) {
|
|
435
442
|
if (this.setUrl(value, options)) {
|
|
436
443
|
this.nosubmit = false;
|
|
437
|
-
return this.formio
|
|
438
|
-
.loadForm({ params: { live: 1 } })
|
|
439
|
-
.then((form) => {
|
|
444
|
+
return this.formio.loadForm({ params: { live: 1 } }).then((form) => {
|
|
440
445
|
const setForm = this.setForm(form);
|
|
441
446
|
this.loadSubmission();
|
|
442
447
|
return setForm;
|
|
443
|
-
})
|
|
444
|
-
.catch((err) => {
|
|
448
|
+
}).catch((err) => {
|
|
445
449
|
console.warn(err);
|
|
446
450
|
this.formReadyReject(err);
|
|
447
451
|
});
|
|
@@ -450,7 +454,9 @@ export default class Webform extends NestedDataComponent {
|
|
|
450
454
|
}
|
|
451
455
|
/**
|
|
452
456
|
* Set the Form source, which is typically the Form.io embed URL.
|
|
457
|
+
*
|
|
453
458
|
* @param {string} value - The value of the form embed url.
|
|
459
|
+
*
|
|
454
460
|
* @example
|
|
455
461
|
* import Webform from '@formio/js/Webform';
|
|
456
462
|
* let form = new Webform(document.getElementById('formio'));
|
|
@@ -464,25 +470,28 @@ export default class Webform extends NestedDataComponent {
|
|
|
464
470
|
}
|
|
465
471
|
/**
|
|
466
472
|
* Get the embed source of the form.
|
|
467
|
-
*
|
|
473
|
+
*
|
|
474
|
+
* @returns {string}
|
|
468
475
|
*/
|
|
469
476
|
get url() {
|
|
470
477
|
return this._src;
|
|
471
478
|
}
|
|
472
479
|
/**
|
|
473
480
|
* Sets the url of the form renderer.
|
|
474
|
-
*
|
|
475
|
-
* @param
|
|
476
|
-
* @
|
|
481
|
+
*
|
|
482
|
+
* @param value
|
|
483
|
+
* @param options
|
|
477
484
|
*/
|
|
478
485
|
setUrl(value, options) {
|
|
479
|
-
if (!value ||
|
|
486
|
+
if (!value ||
|
|
487
|
+
(typeof value !== 'string') ||
|
|
488
|
+
(value === this._src)) {
|
|
480
489
|
return false;
|
|
481
490
|
}
|
|
482
491
|
this._src = value;
|
|
483
492
|
this.nosubmit = true;
|
|
484
493
|
this.formio = this.options.formio = new Formio(value, options);
|
|
485
|
-
if (this.type ===
|
|
494
|
+
if (this.type === 'form') {
|
|
486
495
|
// Set the options source so this can be passed to other components.
|
|
487
496
|
this.options.src = value;
|
|
488
497
|
}
|
|
@@ -490,6 +499,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
490
499
|
}
|
|
491
500
|
/**
|
|
492
501
|
* Set the form source but don't initialize the form and submission from the url.
|
|
502
|
+
*
|
|
493
503
|
* @param {string} value - The value of the form embed url.
|
|
494
504
|
*/
|
|
495
505
|
set url(value) {
|
|
@@ -497,6 +507,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
497
507
|
}
|
|
498
508
|
/**
|
|
499
509
|
* Called when both the form and submission have been loaded.
|
|
510
|
+
*
|
|
500
511
|
* @returns {Promise} - The promise to trigger when both form and submission have loaded.
|
|
501
512
|
*/
|
|
502
513
|
get ready() {
|
|
@@ -508,6 +519,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
508
519
|
}
|
|
509
520
|
/**
|
|
510
521
|
* Returns if this form is loading.
|
|
522
|
+
*
|
|
511
523
|
* @returns {boolean} - TRUE means the form is loading, FALSE otherwise.
|
|
512
524
|
*/
|
|
513
525
|
get loading() {
|
|
@@ -515,17 +527,18 @@ export default class Webform extends NestedDataComponent {
|
|
|
515
527
|
}
|
|
516
528
|
/**
|
|
517
529
|
* Set the loading state for this form, and also show the loader spinner.
|
|
530
|
+
*
|
|
518
531
|
* @param {boolean} loading - If this form should be "loading" or not.
|
|
519
532
|
*/
|
|
520
533
|
set loading(loading) {
|
|
521
534
|
if (this._loading !== loading) {
|
|
522
535
|
this._loading = loading;
|
|
523
536
|
if (!this.loader && loading) {
|
|
524
|
-
this.loader = this.ce(
|
|
525
|
-
class:
|
|
537
|
+
this.loader = this.ce('div', {
|
|
538
|
+
class: 'loader-wrapper'
|
|
526
539
|
});
|
|
527
|
-
const spinner = this.ce(
|
|
528
|
-
class:
|
|
540
|
+
const spinner = this.ce('div', {
|
|
541
|
+
class: 'loader text-center'
|
|
529
542
|
});
|
|
530
543
|
this.loader.appendChild(spinner);
|
|
531
544
|
}
|
|
@@ -548,6 +561,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
548
561
|
}
|
|
549
562
|
/**
|
|
550
563
|
* Sets the JSON schema for the form to be rendered.
|
|
564
|
+
*
|
|
551
565
|
* @example
|
|
552
566
|
* import Webform from '@formio/js/Webform';
|
|
553
567
|
* let form = new Webform(document.getElementById('formio'));
|
|
@@ -575,9 +589,10 @@ export default class Webform extends NestedDataComponent {
|
|
|
575
589
|
* }
|
|
576
590
|
* ]
|
|
577
591
|
* });
|
|
578
|
-
*
|
|
579
|
-
* @param {
|
|
580
|
-
* @
|
|
592
|
+
*
|
|
593
|
+
* @param {Object} form - The JSON schema of the form @see https://examples.form.io/example for an example JSON schema.
|
|
594
|
+
* @param flags
|
|
595
|
+
* @returns {*}
|
|
581
596
|
*/
|
|
582
597
|
setForm(form, flags) {
|
|
583
598
|
const isFormAlreadySet = this._form && this._form.components?.length;
|
|
@@ -609,19 +624,17 @@ export default class Webform extends NestedDataComponent {
|
|
|
609
624
|
}
|
|
610
625
|
// Use the sanitize config from the form settings or the global sanitize config if it is not provided in the options
|
|
611
626
|
if (!this.options.sanitizeConfig && !this.builderMode) {
|
|
612
|
-
this.options.sanitizeConfig =
|
|
613
|
-
_.get(form, "settings.sanitizeConfig") ||
|
|
614
|
-
_.get(form, "globalSettings.sanitizeConfig");
|
|
627
|
+
this.options.sanitizeConfig = _.get(form, 'settings.sanitizeConfig') || _.get(form, 'globalSettings.sanitizeConfig');
|
|
615
628
|
}
|
|
616
|
-
if (
|
|
629
|
+
if ('schema' in form && compareVersions(form.schema, '1.x') > 0) {
|
|
617
630
|
this.ready.then(() => {
|
|
618
|
-
this.setAlert(
|
|
631
|
+
this.setAlert('alert alert-danger', 'Form schema is for a newer version, please upgrade your renderer. Some functionality may not work.');
|
|
619
632
|
});
|
|
620
633
|
}
|
|
621
634
|
// See if they pass a module, and evaluate it if so.
|
|
622
635
|
if (form && form.module) {
|
|
623
636
|
let formModule = null;
|
|
624
|
-
if (typeof form.module ===
|
|
637
|
+
if (typeof form.module === 'string') {
|
|
625
638
|
try {
|
|
626
639
|
formModule = this.evaluate(`return ${form.module}`);
|
|
627
640
|
}
|
|
@@ -643,7 +656,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
643
656
|
this.initialized = false;
|
|
644
657
|
const rebuild = this.rebuild() || Promise.resolve();
|
|
645
658
|
return rebuild.then(() => {
|
|
646
|
-
this.emit(
|
|
659
|
+
this.emit('formLoad', form);
|
|
647
660
|
this.triggerRecaptcha();
|
|
648
661
|
// Make sure to trigger onChange after a render event occurs to speed up form rendering.
|
|
649
662
|
setTimeout(() => {
|
|
@@ -655,33 +668,37 @@ export default class Webform extends NestedDataComponent {
|
|
|
655
668
|
}
|
|
656
669
|
/**
|
|
657
670
|
* Gets the form object.
|
|
658
|
-
*
|
|
671
|
+
*
|
|
672
|
+
* @returns {Object} - The form JSON schema.
|
|
659
673
|
*/
|
|
660
674
|
get form() {
|
|
661
675
|
if (!this._form) {
|
|
662
676
|
this._form = {
|
|
663
|
-
components: []
|
|
677
|
+
components: []
|
|
664
678
|
};
|
|
665
679
|
}
|
|
666
680
|
return this._form;
|
|
667
681
|
}
|
|
668
682
|
/**
|
|
669
683
|
* Sets the form value.
|
|
684
|
+
*
|
|
670
685
|
* @alias setForm
|
|
671
|
-
* @param {
|
|
686
|
+
* @param {Object} form - The form schema object.
|
|
672
687
|
*/
|
|
673
688
|
set form(form) {
|
|
674
689
|
this.setForm(form);
|
|
675
690
|
}
|
|
676
691
|
/**
|
|
677
692
|
* Returns the submission object that was set within this form.
|
|
678
|
-
*
|
|
693
|
+
*
|
|
694
|
+
* @returns {Object}
|
|
679
695
|
*/
|
|
680
696
|
get submission() {
|
|
681
697
|
return this.getValue();
|
|
682
698
|
}
|
|
683
699
|
/**
|
|
684
700
|
* Sets the submission of a form.
|
|
701
|
+
*
|
|
685
702
|
* @example
|
|
686
703
|
* import Webform from '@formio/js/Webform';
|
|
687
704
|
* let form = new Webform(document.getElementById('formio'));
|
|
@@ -691,123 +708,120 @@ export default class Webform extends NestedDataComponent {
|
|
|
691
708
|
* lastName: 'Smith',
|
|
692
709
|
* email: 'joe@example.com'
|
|
693
710
|
* }};
|
|
694
|
-
*
|
|
711
|
+
*
|
|
712
|
+
* @param {Object} submission - The Form.io submission object.
|
|
695
713
|
*/
|
|
696
714
|
set submission(submission) {
|
|
697
715
|
this.setSubmission(submission);
|
|
698
716
|
}
|
|
699
717
|
/**
|
|
700
718
|
* Sets a submission and returns the promise when it is ready.
|
|
701
|
-
* @param
|
|
702
|
-
* @param
|
|
703
|
-
* @
|
|
719
|
+
* @param submission
|
|
720
|
+
* @param flags
|
|
721
|
+
* @return {Promise.<TResult>}
|
|
704
722
|
*/
|
|
705
723
|
setSubmission(submission, flags = {}) {
|
|
706
724
|
flags = {
|
|
707
725
|
...flags,
|
|
708
|
-
fromSubmission: _.has(flags,
|
|
726
|
+
fromSubmission: _.has(flags, 'fromSubmission') ? flags.fromSubmission : true,
|
|
709
727
|
};
|
|
710
|
-
return
|
|
711
|
-
.then((resolveFlags) => {
|
|
728
|
+
return this.onSubmission = this.formReady.then((resolveFlags) => {
|
|
712
729
|
if (resolveFlags) {
|
|
713
730
|
flags = {
|
|
714
731
|
...flags,
|
|
715
|
-
...resolveFlags
|
|
732
|
+
...resolveFlags
|
|
716
733
|
};
|
|
717
734
|
}
|
|
718
735
|
this.submissionSet = true;
|
|
719
736
|
this.triggerChange(flags);
|
|
720
|
-
this.emit(
|
|
737
|
+
this.emit('beforeSetSubmission', submission);
|
|
721
738
|
this.setValue(submission, flags);
|
|
722
739
|
return this.submissionReadyResolve(submission);
|
|
723
|
-
}, (err) => this.submissionReadyReject(err))
|
|
724
|
-
.catch((err) => this.submissionReadyReject(err)));
|
|
740
|
+
}, (err) => this.submissionReadyReject(err)).catch((err) => this.submissionReadyReject(err));
|
|
725
741
|
}
|
|
726
742
|
handleDraftError(errName, errDetails, restoreDraft) {
|
|
727
|
-
const errorMessage = _.trim(`${this.t(errName)} ${errDetails ||
|
|
743
|
+
const errorMessage = _.trim(`${this.t(errName)} ${errDetails || ''}`);
|
|
728
744
|
console.warn(errorMessage);
|
|
729
|
-
this.emit(restoreDraft ?
|
|
745
|
+
this.emit(restoreDraft ? 'restoreDraftError' : 'saveDraftError', errDetails || errorMessage);
|
|
730
746
|
}
|
|
747
|
+
/**
|
|
748
|
+
* Saves a submission draft.
|
|
749
|
+
*/
|
|
731
750
|
saveDraft() {
|
|
732
751
|
if (!this.draftEnabled) {
|
|
733
752
|
return;
|
|
734
753
|
}
|
|
735
754
|
if (!this.formio) {
|
|
736
|
-
this.handleDraftError(
|
|
755
|
+
this.handleDraftError('saveDraftInstanceError');
|
|
737
756
|
return;
|
|
738
757
|
}
|
|
739
758
|
if (!Formio.getUser()) {
|
|
740
|
-
this.handleDraftError(
|
|
759
|
+
this.handleDraftError('saveDraftAuthError');
|
|
741
760
|
return;
|
|
742
761
|
}
|
|
743
762
|
const draft = fastCloneDeep(this.submission);
|
|
744
|
-
draft.state =
|
|
745
|
-
if (!this.savingDraft) {
|
|
746
|
-
this.emit(
|
|
763
|
+
draft.state = 'draft';
|
|
764
|
+
if (!this.savingDraft && !this.submitting) {
|
|
765
|
+
this.emit('saveDraftBegin');
|
|
747
766
|
this.savingDraft = true;
|
|
748
|
-
this.formio
|
|
749
|
-
.saveSubmission(draft)
|
|
750
|
-
.then((sub) => {
|
|
767
|
+
this.formio.saveSubmission(draft).then((sub) => {
|
|
751
768
|
// Set id to submission to avoid creating new draft submission
|
|
752
769
|
this.submission._id = sub._id;
|
|
753
770
|
this.savingDraft = false;
|
|
754
|
-
this.emit(
|
|
771
|
+
this.emit('saveDraft', sub);
|
|
755
772
|
})
|
|
756
|
-
.catch(
|
|
773
|
+
.catch(err => {
|
|
757
774
|
this.savingDraft = false;
|
|
758
|
-
this.handleDraftError(
|
|
775
|
+
this.handleDraftError('saveDraftError', err);
|
|
759
776
|
});
|
|
760
777
|
}
|
|
761
778
|
}
|
|
762
779
|
/**
|
|
763
780
|
* Restores a draft submission based on the user who is authenticated.
|
|
764
|
-
*
|
|
781
|
+
*
|
|
782
|
+
* @param {userId} - The user id where we need to restore the draft from.
|
|
765
783
|
*/
|
|
766
784
|
restoreDraft(userId) {
|
|
767
785
|
const formio = this.formio || this.options.formio;
|
|
768
786
|
if (!formio) {
|
|
769
|
-
this.handleDraftError(
|
|
787
|
+
this.handleDraftError('restoreDraftInstanceError', null, true);
|
|
770
788
|
return;
|
|
771
789
|
}
|
|
772
790
|
this.savingDraft = true;
|
|
773
|
-
formio
|
|
774
|
-
.loadSubmissions({
|
|
791
|
+
formio.loadSubmissions({
|
|
775
792
|
params: {
|
|
776
|
-
state:
|
|
777
|
-
owner: userId
|
|
778
|
-
}
|
|
779
|
-
})
|
|
780
|
-
.then((submissions) => {
|
|
793
|
+
state: 'draft',
|
|
794
|
+
owner: userId
|
|
795
|
+
}
|
|
796
|
+
}).then(submissions => {
|
|
781
797
|
if (submissions.length > 0 && !this.options.skipDraftRestore) {
|
|
782
798
|
const draft = fastCloneDeep(submissions[0]);
|
|
783
799
|
return this.setSubmission(draft).then(() => {
|
|
784
800
|
this.draftEnabled = true;
|
|
785
801
|
this.savingDraft = false;
|
|
786
|
-
this.emit(
|
|
802
|
+
this.emit('restoreDraft', draft);
|
|
787
803
|
});
|
|
788
804
|
}
|
|
789
805
|
// Enable drafts so that we can keep track of changes.
|
|
790
806
|
this.draftEnabled = true;
|
|
791
807
|
this.savingDraft = false;
|
|
792
|
-
this.emit(
|
|
808
|
+
this.emit('restoreDraft', null);
|
|
793
809
|
})
|
|
794
|
-
.catch(
|
|
810
|
+
.catch(err => {
|
|
795
811
|
this.draftEnabled = true;
|
|
796
812
|
this.savingDraft = false;
|
|
797
|
-
this.handleDraftError(
|
|
813
|
+
this.handleDraftError('restoreDraftError', err, true);
|
|
798
814
|
});
|
|
799
815
|
}
|
|
800
816
|
get schema() {
|
|
801
|
-
const schema = fastCloneDeep(_.omit(this._form, [
|
|
817
|
+
const schema = fastCloneDeep(_.omit(this._form, ['components']));
|
|
802
818
|
schema.components = [];
|
|
803
819
|
this.eachComponent((component) => schema.components.push(component.schema));
|
|
804
820
|
return schema;
|
|
805
821
|
}
|
|
806
822
|
mergeData(_this, _that) {
|
|
807
823
|
_.mergeWith(_this, _that, (thisValue, thatValue) => {
|
|
808
|
-
if (Array.isArray(thisValue) &&
|
|
809
|
-
Array.isArray(thatValue) &&
|
|
810
|
-
thisValue.length !== thatValue.length) {
|
|
824
|
+
if (Array.isArray(thisValue) && Array.isArray(thatValue) && thisValue.length !== thatValue.length) {
|
|
811
825
|
return thatValue;
|
|
812
826
|
}
|
|
813
827
|
});
|
|
@@ -849,7 +863,6 @@ export default class Webform extends NestedDataComponent {
|
|
|
849
863
|
}
|
|
850
864
|
/**
|
|
851
865
|
* Build the form.
|
|
852
|
-
* @returns {Promise} - The promise that is triggered when the form is built.
|
|
853
866
|
*/
|
|
854
867
|
init() {
|
|
855
868
|
if (this.options.submission) {
|
|
@@ -871,31 +884,28 @@ export default class Webform extends NestedDataComponent {
|
|
|
871
884
|
else {
|
|
872
885
|
this.component = this.form;
|
|
873
886
|
}
|
|
874
|
-
this.component.type =
|
|
887
|
+
this.component.type = 'form';
|
|
875
888
|
this.component.input = false;
|
|
876
889
|
this.addComponents();
|
|
877
|
-
this.on(
|
|
878
|
-
this.submit(false, options).catch(
|
|
890
|
+
this.on('submitButton', options => {
|
|
891
|
+
this.submit(false, options).catch(e => {
|
|
879
892
|
options.instance.loading = false;
|
|
880
893
|
return e !== false && e !== undefined && console.log(e);
|
|
881
894
|
});
|
|
882
895
|
}, true);
|
|
883
|
-
this.on(
|
|
884
|
-
this.on(
|
|
885
|
-
this.on(
|
|
886
|
-
this.on(
|
|
887
|
-
this.on(
|
|
896
|
+
this.on('checkValidity', (data) => this.validate(data, { dirty: true, process: 'change' }), true);
|
|
897
|
+
this.on('requestUrl', (args) => (this.submitUrl(args.url, args.headers)), true);
|
|
898
|
+
this.on('resetForm', () => this.resetValue(), true);
|
|
899
|
+
this.on('deleteSubmission', () => this.deleteSubmission(), true);
|
|
900
|
+
this.on('refreshData', () => this.updateValue(), true);
|
|
888
901
|
this.executeFormController();
|
|
889
902
|
return this.formReady;
|
|
890
903
|
}
|
|
891
904
|
executeFormController() {
|
|
892
905
|
// If no controller value or
|
|
893
906
|
// hidden and set to clearOnHide (Don't calculate a value for a hidden field set to clear when hidden)
|
|
894
|
-
if (!this.form ||
|
|
895
|
-
!this.
|
|
896
|
-
((!this.visible || this.component.hidden) &&
|
|
897
|
-
this.component.clearOnHide &&
|
|
898
|
-
!this.rootPristine)) {
|
|
907
|
+
if (!this.form || !this.form.controller
|
|
908
|
+
|| ((!this.visible || this.component.hidden) && this.component.clearOnHide && !this.rootPristine)) {
|
|
899
909
|
return false;
|
|
900
910
|
}
|
|
901
911
|
this.formReady.then(() => {
|
|
@@ -905,23 +915,20 @@ export default class Webform extends NestedDataComponent {
|
|
|
905
915
|
});
|
|
906
916
|
});
|
|
907
917
|
}
|
|
908
|
-
/**
|
|
909
|
-
*
|
|
910
|
-
*/
|
|
911
918
|
teardown() {
|
|
912
|
-
this.emit(
|
|
919
|
+
this.emit('formDelete', this.id);
|
|
913
920
|
delete Formio.forms[this.id];
|
|
914
921
|
delete this.executeShortcuts;
|
|
915
922
|
delete this.triggerSaveDraft;
|
|
916
923
|
super.teardown();
|
|
917
924
|
}
|
|
918
925
|
destroy(all = false) {
|
|
919
|
-
this.off(
|
|
920
|
-
this.off(
|
|
921
|
-
this.off(
|
|
922
|
-
this.off(
|
|
923
|
-
this.off(
|
|
924
|
-
this.off(
|
|
926
|
+
this.off('submitButton');
|
|
927
|
+
this.off('checkValidity');
|
|
928
|
+
this.off('requestUrl');
|
|
929
|
+
this.off('resetForm');
|
|
930
|
+
this.off('deleteSubmission');
|
|
931
|
+
this.off('refreshData');
|
|
925
932
|
return super.destroy(all);
|
|
926
933
|
}
|
|
927
934
|
build(element) {
|
|
@@ -934,17 +941,17 @@ export default class Webform extends NestedDataComponent {
|
|
|
934
941
|
return this.ready;
|
|
935
942
|
}
|
|
936
943
|
getClassName() {
|
|
937
|
-
let classes =
|
|
944
|
+
let classes = 'formio-form';
|
|
938
945
|
if (this.options.readOnly) {
|
|
939
|
-
classes +=
|
|
946
|
+
classes += ' formio-read-only';
|
|
940
947
|
}
|
|
941
948
|
return classes;
|
|
942
949
|
}
|
|
943
950
|
render() {
|
|
944
|
-
return super.render(this.renderTemplate(
|
|
951
|
+
return super.render(this.renderTemplate('webform', {
|
|
945
952
|
classes: this.getClassName(),
|
|
946
953
|
children: this.renderComponents(),
|
|
947
|
-
}), this.builderMode ?
|
|
954
|
+
}), this.builderMode ? 'builder' : 'form', true);
|
|
948
955
|
}
|
|
949
956
|
redraw() {
|
|
950
957
|
// Don't bother if we have not built yet.
|
|
@@ -957,13 +964,13 @@ export default class Webform extends NestedDataComponent {
|
|
|
957
964
|
}
|
|
958
965
|
attach(element) {
|
|
959
966
|
this.setElement(element);
|
|
960
|
-
this.loadRefs(element, { webform:
|
|
967
|
+
this.loadRefs(element, { webform: 'single' });
|
|
961
968
|
const childPromise = this.attachComponents(this.refs.webform);
|
|
962
|
-
this.addEventListener(document,
|
|
969
|
+
this.addEventListener(document, 'keydown', this.executeShortcuts);
|
|
963
970
|
this.currentForm = this;
|
|
964
|
-
this.hook(
|
|
971
|
+
this.hook('attachWebform', element, this);
|
|
965
972
|
return childPromise.then(() => {
|
|
966
|
-
this.emit(
|
|
973
|
+
this.emit('render', this.element);
|
|
967
974
|
return this.setValue(this._submission, {
|
|
968
975
|
noUpdateEvent: true,
|
|
969
976
|
});
|
|
@@ -980,23 +987,24 @@ export default class Webform extends NestedDataComponent {
|
|
|
980
987
|
return result;
|
|
981
988
|
}
|
|
982
989
|
resetValue() {
|
|
983
|
-
_.each(this.getComponents(), (comp) => comp.resetValue());
|
|
990
|
+
_.each(this.getComponents(), (comp) => (comp.resetValue()));
|
|
984
991
|
this.setPristine(true);
|
|
985
992
|
this.onChange({ resetValue: true });
|
|
986
993
|
}
|
|
987
994
|
/**
|
|
988
995
|
* Sets a new alert to display in the error dialog of the form.
|
|
996
|
+
*
|
|
989
997
|
* @param {string} type - The type of alert to display. "danger", "success", "warning", etc.
|
|
990
998
|
* @param {string} message - The message to show in the alert.
|
|
991
|
-
* @param {
|
|
999
|
+
* @param {Object} options
|
|
992
1000
|
*/
|
|
993
1001
|
setAlert(type, message, options) {
|
|
994
1002
|
if (!type && this.submitted) {
|
|
995
1003
|
if (this.alert) {
|
|
996
1004
|
if (this.refs.errorRef && this.refs.errorRef.length) {
|
|
997
|
-
this.refs.errorRef.forEach(
|
|
998
|
-
this.removeEventListener(el,
|
|
999
|
-
this.removeEventListener(el,
|
|
1005
|
+
this.refs.errorRef.forEach(el => {
|
|
1006
|
+
this.removeEventListener(el, 'click');
|
|
1007
|
+
this.removeEventListener(el, 'keypress');
|
|
1000
1008
|
});
|
|
1001
1009
|
}
|
|
1002
1010
|
this.removeChild(this.alert);
|
|
@@ -1006,16 +1014,16 @@ export default class Webform extends NestedDataComponent {
|
|
|
1006
1014
|
}
|
|
1007
1015
|
if (this.options.noAlerts) {
|
|
1008
1016
|
if (!message) {
|
|
1009
|
-
this.emit(
|
|
1017
|
+
this.emit('error', false);
|
|
1010
1018
|
}
|
|
1011
1019
|
return;
|
|
1012
1020
|
}
|
|
1013
1021
|
if (this.alert) {
|
|
1014
1022
|
try {
|
|
1015
1023
|
if (this.refs.errorRef && this.refs.errorRef.length) {
|
|
1016
|
-
this.refs.errorRef.forEach(
|
|
1017
|
-
this.removeEventListener(el,
|
|
1018
|
-
this.removeEventListener(el,
|
|
1024
|
+
this.refs.errorRef.forEach(el => {
|
|
1025
|
+
this.removeEventListener(el, 'click');
|
|
1026
|
+
this.removeEventListener(el, 'keypress');
|
|
1019
1027
|
});
|
|
1020
1028
|
}
|
|
1021
1029
|
this.removeChild(this.alert);
|
|
@@ -1033,21 +1041,21 @@ export default class Webform extends NestedDataComponent {
|
|
|
1033
1041
|
const templateOptions = {
|
|
1034
1042
|
message: message instanceof HTMLElement ? message.outerHTML : message,
|
|
1035
1043
|
attrs: attrs,
|
|
1036
|
-
type
|
|
1044
|
+
type
|
|
1037
1045
|
};
|
|
1038
|
-
this.alert = convertStringToHTMLElement(this.renderTemplate(
|
|
1046
|
+
this.alert = convertStringToHTMLElement(this.renderTemplate('alert', templateOptions), `#${attrs.id}`);
|
|
1039
1047
|
}
|
|
1040
1048
|
if (!this.alert) {
|
|
1041
1049
|
return;
|
|
1042
1050
|
}
|
|
1043
|
-
this.loadRefs(this.alert, { errorRef:
|
|
1051
|
+
this.loadRefs(this.alert, { errorRef: 'multiple' });
|
|
1044
1052
|
if (this.refs.errorRef && this.refs.errorRef.length) {
|
|
1045
|
-
this.refs.errorRef.forEach(
|
|
1046
|
-
this.addEventListener(el,
|
|
1053
|
+
this.refs.errorRef.forEach(el => {
|
|
1054
|
+
this.addEventListener(el, 'click', (e) => {
|
|
1047
1055
|
const key = e.currentTarget.dataset.componentKey;
|
|
1048
1056
|
this.focusOnComponent(key);
|
|
1049
1057
|
});
|
|
1050
|
-
this.addEventListener(el,
|
|
1058
|
+
this.addEventListener(el, 'keydown', (e) => {
|
|
1051
1059
|
if (e.keyCode === 13) {
|
|
1052
1060
|
e.preventDefault();
|
|
1053
1061
|
const key = e.currentTarget.dataset.componentKey;
|
|
@@ -1060,7 +1068,9 @@ export default class Webform extends NestedDataComponent {
|
|
|
1060
1068
|
}
|
|
1061
1069
|
/**
|
|
1062
1070
|
* Focus on selected component.
|
|
1071
|
+
*
|
|
1063
1072
|
* @param {string} key - The key of selected component.
|
|
1073
|
+
* @returns {*}
|
|
1064
1074
|
*/
|
|
1065
1075
|
focusOnComponent(key) {
|
|
1066
1076
|
if (key) {
|
|
@@ -1072,16 +1082,11 @@ export default class Webform extends NestedDataComponent {
|
|
|
1072
1082
|
}
|
|
1073
1083
|
/**
|
|
1074
1084
|
* Show the errors of this form within the alert dialog.
|
|
1075
|
-
*
|
|
1085
|
+
*
|
|
1086
|
+
* @param {Object} error - An optional additional error to display along with the component errors.
|
|
1076
1087
|
* @returns {*}
|
|
1077
1088
|
*/
|
|
1078
1089
|
/* eslint-disable no-unused-vars */
|
|
1079
|
-
/**
|
|
1080
|
-
*
|
|
1081
|
-
* @param {Array} errors - An array of errors to display.
|
|
1082
|
-
* @param {boolean} triggerEvent - Whether or not to trigger the error event.
|
|
1083
|
-
* @returns {void|Array} - The errors that were set.
|
|
1084
|
-
*/
|
|
1085
1090
|
showErrors(errors, triggerEvent) {
|
|
1086
1091
|
this.loading = false;
|
|
1087
1092
|
if (!Array.isArray(errors)) {
|
|
@@ -1118,46 +1123,42 @@ export default class Webform extends NestedDataComponent {
|
|
|
1118
1123
|
});
|
|
1119
1124
|
const displayedErrors = [];
|
|
1120
1125
|
if (errors.length) {
|
|
1121
|
-
errors = _.uniqBy(errors,
|
|
1126
|
+
errors = _.uniqBy(errors, error => error.message);
|
|
1122
1127
|
const createListItem = (message, index) => {
|
|
1123
1128
|
const err = errors[index];
|
|
1124
1129
|
const messageFromIndex = !_.isUndefined(index) && errors && errors[index];
|
|
1125
|
-
const keyOrPath = messageFromIndex?.formattedKeyOrPath ||
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
(err.context?.component && err.context?.component.key) ||
|
|
1129
|
-
(err.component && err.component.key) ||
|
|
1130
|
-
(err.fromServer && err.path);
|
|
1131
|
-
const formattedKeyOrPath = keyOrPath ? getStringFromComponentPath(keyOrPath) : "";
|
|
1132
|
-
if (typeof err !== "string" && !err.formattedKeyOrPath) {
|
|
1130
|
+
const keyOrPath = (messageFromIndex?.formattedKeyOrPath || messageFromIndex?.path || messageFromIndex?.context?.path) || (err.context?.component && err.context?.component.key) || (err.component && err.component.key) || err.fromServer && err.path;
|
|
1131
|
+
const formattedKeyOrPath = keyOrPath ? getStringFromComponentPath(keyOrPath) : '';
|
|
1132
|
+
if (typeof err !== 'string' && !err.formattedKeyOrPath) {
|
|
1133
1133
|
err.formattedKeyOrPath = formattedKeyOrPath;
|
|
1134
1134
|
}
|
|
1135
1135
|
return {
|
|
1136
1136
|
message: unescapeHTML(message),
|
|
1137
|
-
keyOrPath: formattedKeyOrPath
|
|
1137
|
+
keyOrPath: formattedKeyOrPath
|
|
1138
1138
|
};
|
|
1139
1139
|
};
|
|
1140
1140
|
errors.forEach(({ message, context, fromServer, component }, index) => {
|
|
1141
1141
|
const text = !component?.label || context?.hasLabel || fromServer
|
|
1142
|
-
? this.t(
|
|
1143
|
-
: this.t(
|
|
1142
|
+
? this.t('alertMessage', { message: this.t(message) })
|
|
1143
|
+
: this.t('alertMessageWithLabel', {
|
|
1144
1144
|
label: this.t(component?.label),
|
|
1145
1145
|
message: this.t(message),
|
|
1146
1146
|
});
|
|
1147
1147
|
displayedErrors.push(createListItem(text, index));
|
|
1148
1148
|
});
|
|
1149
1149
|
}
|
|
1150
|
-
const errorsList = this.renderTemplate(
|
|
1151
|
-
this.root.setAlert(
|
|
1150
|
+
const errorsList = this.renderTemplate('errorsList', { errors: displayedErrors });
|
|
1151
|
+
this.root.setAlert('danger', errorsList);
|
|
1152
1152
|
if (triggerEvent) {
|
|
1153
|
-
this.emit(
|
|
1153
|
+
this.emit('error', errors);
|
|
1154
1154
|
}
|
|
1155
1155
|
return errors;
|
|
1156
1156
|
}
|
|
1157
1157
|
/* eslint-enable no-unused-vars */
|
|
1158
1158
|
/**
|
|
1159
1159
|
* Called when the submission has completed, or if the submission needs to be sent to an external library.
|
|
1160
|
-
*
|
|
1160
|
+
*
|
|
1161
|
+
* @param {Object} submission - The submission object.
|
|
1161
1162
|
* @param {boolean} saved - Whether or not this submission was saved to the server.
|
|
1162
1163
|
* @returns {object} - The submission object.
|
|
1163
1164
|
*/
|
|
@@ -1168,25 +1169,25 @@ export default class Webform extends NestedDataComponent {
|
|
|
1168
1169
|
// We want to return the submitted submission and setValue will mutate the submission so cloneDeep it here.
|
|
1169
1170
|
this.setValue(fastCloneDeep(submission), {
|
|
1170
1171
|
noValidate: true,
|
|
1171
|
-
noCheck: true
|
|
1172
|
+
noCheck: true
|
|
1172
1173
|
});
|
|
1173
|
-
this.setAlert(
|
|
1174
|
+
this.setAlert('success', `<p>${this.t('complete')}</p>`);
|
|
1174
1175
|
// Cancel triggered saveDraft to prevent overriding the submitted state
|
|
1175
1176
|
if (this.draftEnabled && this.triggerSaveDraft?.cancel) {
|
|
1176
1177
|
this.triggerSaveDraft.cancel();
|
|
1177
1178
|
}
|
|
1178
|
-
this.emit(
|
|
1179
|
+
this.emit('submit', submission, saved);
|
|
1179
1180
|
if (saved) {
|
|
1180
|
-
this.emit(
|
|
1181
|
+
this.emit('submitDone', submission);
|
|
1181
1182
|
}
|
|
1182
1183
|
return submission;
|
|
1183
1184
|
}
|
|
1184
1185
|
normalizeError(error) {
|
|
1185
1186
|
if (error) {
|
|
1186
|
-
if (typeof error ===
|
|
1187
|
+
if (typeof error === 'object' && 'details' in error) {
|
|
1187
1188
|
error = error.details;
|
|
1188
1189
|
}
|
|
1189
|
-
if (typeof error ===
|
|
1190
|
+
if (typeof error === 'string') {
|
|
1190
1191
|
error = { message: error };
|
|
1191
1192
|
}
|
|
1192
1193
|
}
|
|
@@ -1194,17 +1195,17 @@ export default class Webform extends NestedDataComponent {
|
|
|
1194
1195
|
}
|
|
1195
1196
|
/**
|
|
1196
1197
|
* Called when an error occurs during the submission.
|
|
1197
|
-
*
|
|
1198
|
-
* @
|
|
1198
|
+
*
|
|
1199
|
+
* @param {Object} error - The error that occured.
|
|
1199
1200
|
*/
|
|
1200
1201
|
onSubmissionError(error) {
|
|
1201
1202
|
error = this.normalizeError(error);
|
|
1202
1203
|
this.submitting = false;
|
|
1203
1204
|
this.setPristine(false);
|
|
1204
|
-
this.emit(
|
|
1205
|
+
this.emit('submitError', error || this.errors);
|
|
1205
1206
|
// Allow for silent cancellations (no error message, no submit button error state)
|
|
1206
1207
|
if (error && error.silent) {
|
|
1207
|
-
this.emit(
|
|
1208
|
+
this.emit('change', { isValid: true }, { silent: true });
|
|
1208
1209
|
return false;
|
|
1209
1210
|
}
|
|
1210
1211
|
const errors = this.showErrors(error, true);
|
|
@@ -1215,10 +1216,9 @@ export default class Webform extends NestedDataComponent {
|
|
|
1215
1216
|
}
|
|
1216
1217
|
/**
|
|
1217
1218
|
* Trigger the change event for this form.
|
|
1218
|
-
*
|
|
1219
|
-
* @param
|
|
1220
|
-
* @param
|
|
1221
|
-
* @param {any} changes - The changes that have occured in the form.
|
|
1219
|
+
*
|
|
1220
|
+
* @param changed
|
|
1221
|
+
* @param flags
|
|
1222
1222
|
*/
|
|
1223
1223
|
onChange(flags, changed, modified, changes) {
|
|
1224
1224
|
flags = flags || {};
|
|
@@ -1231,17 +1231,13 @@ export default class Webform extends NestedDataComponent {
|
|
|
1231
1231
|
this.pristine = false;
|
|
1232
1232
|
}
|
|
1233
1233
|
this.checkData(value.data, flags);
|
|
1234
|
-
const shouldValidate = !flags.noValidate ||
|
|
1235
|
-
|
|
1236
|
-
(flags.fromSubmission && this.rootPristine && this.pristine && flags.changed);
|
|
1237
|
-
const errors = shouldValidate
|
|
1238
|
-
? this.validate(value.data, { ...flags, process: "change" })
|
|
1239
|
-
: [];
|
|
1234
|
+
const shouldValidate = !flags.noValidate || flags.fromIFrame || (flags.fromSubmission && this.rootPristine && this.pristine && flags.changed);
|
|
1235
|
+
const errors = shouldValidate ? this.validate(value.data, { ...flags, process: 'change' }) : [];
|
|
1240
1236
|
value.isValid = errors.length === 0;
|
|
1241
1237
|
this.loading = false;
|
|
1242
1238
|
if (this.submitted) {
|
|
1243
1239
|
// show server errors while they are not cleaned/fixed
|
|
1244
|
-
const nonComponentServerErrors = _.filter(this.serverErrors || [],
|
|
1240
|
+
const nonComponentServerErrors = _.filter(this.serverErrors || [], err => !err.component && !err.path);
|
|
1245
1241
|
this.showErrors(nonComponentServerErrors.length ? nonComponentServerErrors : errors);
|
|
1246
1242
|
}
|
|
1247
1243
|
// See if we need to save the draft of the form.
|
|
@@ -1249,39 +1245,38 @@ export default class Webform extends NestedDataComponent {
|
|
|
1249
1245
|
this.triggerSaveDraft();
|
|
1250
1246
|
}
|
|
1251
1247
|
if (!flags || !flags.noEmit) {
|
|
1252
|
-
this.emit(
|
|
1248
|
+
this.emit('change', value, flags, modified);
|
|
1253
1249
|
isChangeEventEmitted = true;
|
|
1254
1250
|
}
|
|
1255
1251
|
// The form is initialized after the first change event occurs.
|
|
1256
1252
|
if (isChangeEventEmitted && !this.initialized) {
|
|
1257
|
-
this.emit(
|
|
1253
|
+
this.emit('initialized');
|
|
1258
1254
|
this.initialized = true;
|
|
1259
1255
|
}
|
|
1260
1256
|
}
|
|
1261
1257
|
/**
|
|
1262
1258
|
* Send a delete request to the server.
|
|
1263
|
-
* @returns {Promise} - The promise that is triggered when the delete is complete.
|
|
1264
1259
|
*/
|
|
1265
1260
|
deleteSubmission() {
|
|
1266
|
-
return this.formio.deleteSubmission()
|
|
1267
|
-
|
|
1261
|
+
return this.formio.deleteSubmission()
|
|
1262
|
+
.then(() => {
|
|
1263
|
+
this.emit('submissionDeleted', this.submission);
|
|
1268
1264
|
this.resetValue();
|
|
1269
1265
|
});
|
|
1270
1266
|
}
|
|
1271
1267
|
/**
|
|
1272
1268
|
* Cancels the submission.
|
|
1273
|
-
*
|
|
1269
|
+
*
|
|
1274
1270
|
* @alias reset
|
|
1275
|
-
* @returns {boolean} - TRUE means the submission was cancelled, FALSE otherwise.
|
|
1276
1271
|
*/
|
|
1277
1272
|
cancel(noconfirm) {
|
|
1278
|
-
const shouldReset = this.hook(
|
|
1279
|
-
if (shouldReset && (noconfirm || confirm(this.t(
|
|
1273
|
+
const shouldReset = this.hook('beforeCancel', true);
|
|
1274
|
+
if (shouldReset && (noconfirm || confirm(this.t('confirmCancel')))) {
|
|
1280
1275
|
this.resetValue();
|
|
1281
1276
|
return true;
|
|
1282
1277
|
}
|
|
1283
1278
|
else {
|
|
1284
|
-
this.emit(
|
|
1279
|
+
this.emit('cancelSubmit');
|
|
1285
1280
|
return false;
|
|
1286
1281
|
}
|
|
1287
1282
|
}
|
|
@@ -1289,14 +1284,14 @@ export default class Webform extends NestedDataComponent {
|
|
|
1289
1284
|
// Add in metadata about client submitting the form
|
|
1290
1285
|
submission.metadata = submission.metadata || {};
|
|
1291
1286
|
_.defaults(submission.metadata, {
|
|
1292
|
-
timezone: _.get(this,
|
|
1293
|
-
offset: parseInt(_.get(this,
|
|
1287
|
+
timezone: _.get(this, '_submission.metadata.timezone', currentTimezone()),
|
|
1288
|
+
offset: parseInt(_.get(this, '_submission.metadata.offset', moment().utcOffset()), 10),
|
|
1294
1289
|
origin: document.location.origin,
|
|
1295
1290
|
referrer: document.referrer,
|
|
1296
1291
|
browserName: navigator.appName,
|
|
1297
1292
|
userAgent: navigator.userAgent,
|
|
1298
1293
|
pathName: window.location.pathname,
|
|
1299
|
-
onLine: navigator.onLine
|
|
1294
|
+
onLine: navigator.onLine
|
|
1300
1295
|
});
|
|
1301
1296
|
}
|
|
1302
1297
|
submitForm(options = {}) {
|
|
@@ -1306,30 +1301,29 @@ export default class Webform extends NestedDataComponent {
|
|
|
1306
1301
|
if (this.options.readOnly) {
|
|
1307
1302
|
return resolve({
|
|
1308
1303
|
submission: this.submission,
|
|
1309
|
-
saved: false
|
|
1304
|
+
saved: false
|
|
1310
1305
|
});
|
|
1311
1306
|
}
|
|
1312
1307
|
const submission = fastCloneDeep(this.submission || {});
|
|
1313
1308
|
this.setMetadata(submission);
|
|
1314
|
-
submission.state = options.state || submission.state ||
|
|
1315
|
-
const isDraft = submission.state ===
|
|
1316
|
-
this.hook(
|
|
1309
|
+
submission.state = options.state || submission.state || 'submitted';
|
|
1310
|
+
const isDraft = (submission.state === 'draft');
|
|
1311
|
+
this.hook('beforeSubmit', { ...submission, component: options.component }, (err, data) => {
|
|
1317
1312
|
if (err) {
|
|
1318
1313
|
return reject(err);
|
|
1319
1314
|
}
|
|
1320
|
-
submission._vnote = data && data._vnote ? data._vnote :
|
|
1315
|
+
submission._vnote = data && data._vnote ? data._vnote : '';
|
|
1321
1316
|
try {
|
|
1322
1317
|
if (!isDraft && !options.noValidate) {
|
|
1323
1318
|
if (!submission.data) {
|
|
1324
|
-
return reject(
|
|
1319
|
+
return reject('Invalid Submission');
|
|
1325
1320
|
}
|
|
1326
1321
|
const errors = this.validate(submission.data, {
|
|
1327
1322
|
dirty: true,
|
|
1328
1323
|
silentCheck: false,
|
|
1329
|
-
process:
|
|
1324
|
+
process: 'submit'
|
|
1330
1325
|
});
|
|
1331
|
-
if (errors.length ||
|
|
1332
|
-
options.beforeSubmitResults?.some((result) => result.status === "rejected")) {
|
|
1326
|
+
if (errors.length || options.beforeSubmitResults?.some((result) => result.status === 'rejected')) {
|
|
1333
1327
|
return reject(errors);
|
|
1334
1328
|
}
|
|
1335
1329
|
}
|
|
@@ -1338,20 +1332,20 @@ export default class Webform extends NestedDataComponent {
|
|
|
1338
1332
|
console.error(err);
|
|
1339
1333
|
}
|
|
1340
1334
|
this.everyComponent((comp) => {
|
|
1341
|
-
if (submission._vnote && comp.type ===
|
|
1335
|
+
if (submission._vnote && comp.type === 'form' && comp.component.reference) {
|
|
1342
1336
|
_.get(submission.data, comp.path, {})._vnote = submission._vnote;
|
|
1343
1337
|
}
|
|
1344
1338
|
const { persistent } = comp.component;
|
|
1345
|
-
if (persistent ===
|
|
1339
|
+
if (persistent === 'client-only') {
|
|
1346
1340
|
_.unset(submission.data, comp.path);
|
|
1347
1341
|
}
|
|
1348
1342
|
});
|
|
1349
|
-
this.hook(
|
|
1343
|
+
this.hook('customValidation', { ...submission, component: options.component }, (err) => {
|
|
1350
1344
|
if (err) {
|
|
1351
1345
|
// If string is returned, cast to object.
|
|
1352
|
-
if (typeof err ===
|
|
1346
|
+
if (typeof err === 'string') {
|
|
1353
1347
|
err = {
|
|
1354
|
-
message: err
|
|
1348
|
+
message: err
|
|
1355
1349
|
};
|
|
1356
1350
|
}
|
|
1357
1351
|
// Ensure err is an array.
|
|
@@ -1361,10 +1355,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
1361
1355
|
this.loading = true;
|
|
1362
1356
|
// Use the form action to submit the form if available.
|
|
1363
1357
|
if (this._form && this._form.action) {
|
|
1364
|
-
const method = submission.data._id &&
|
|
1365
|
-
this._form.action.includes(submission.data._id)
|
|
1366
|
-
? "PUT"
|
|
1367
|
-
: "POST";
|
|
1358
|
+
const method = (submission.data._id && this._form.action.includes(submission.data._id)) ? 'PUT' : 'POST';
|
|
1368
1359
|
return Formio.makeStaticRequest(this._form.action, method, submission, this.formio ? this.formio.options : {})
|
|
1369
1360
|
.then((result) => resolve({
|
|
1370
1361
|
submission: result,
|
|
@@ -1383,9 +1374,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
1383
1374
|
});
|
|
1384
1375
|
}
|
|
1385
1376
|
// If this is an actionUrl, then make sure to save the action and not the submission.
|
|
1386
|
-
const submitMethod = submitFormio.actionUrl
|
|
1387
|
-
? "saveAction"
|
|
1388
|
-
: "saveSubmission";
|
|
1377
|
+
const submitMethod = submitFormio.actionUrl ? 'saveAction' : 'saveSubmission';
|
|
1389
1378
|
submitFormio[submitMethod](submission)
|
|
1390
1379
|
.then((result) => resolve({
|
|
1391
1380
|
submission: result,
|
|
@@ -1401,15 +1390,13 @@ export default class Webform extends NestedDataComponent {
|
|
|
1401
1390
|
}
|
|
1402
1391
|
setServerErrors(error) {
|
|
1403
1392
|
if (error.details) {
|
|
1404
|
-
this.serverErrors = error.details
|
|
1405
|
-
.filter((err) => (err.level ? err.level === "error" : err))
|
|
1406
|
-
.map((err) => {
|
|
1393
|
+
this.serverErrors = error.details.filter((err) => err.level ? err.level === 'error' : err).map((err) => {
|
|
1407
1394
|
err.fromServer = true;
|
|
1408
1395
|
return err;
|
|
1409
1396
|
});
|
|
1410
1397
|
}
|
|
1411
|
-
else if (typeof error ===
|
|
1412
|
-
this.serverErrors = [{ fromServer: true, level:
|
|
1398
|
+
else if (typeof error === 'string') {
|
|
1399
|
+
this.serverErrors = [{ fromServer: true, level: 'error', message: error }];
|
|
1413
1400
|
}
|
|
1414
1401
|
}
|
|
1415
1402
|
executeSubmit(options) {
|
|
@@ -1440,6 +1427,7 @@ export default class Webform extends NestedDataComponent {
|
|
|
1440
1427
|
}
|
|
1441
1428
|
/**
|
|
1442
1429
|
* Submits the form.
|
|
1430
|
+
*
|
|
1443
1431
|
* @example
|
|
1444
1432
|
* import Webform from '@formio/js/Webform';
|
|
1445
1433
|
* let form = new Webform(document.getElementById('formio'));
|
|
@@ -1452,11 +1440,12 @@ export default class Webform extends NestedDataComponent {
|
|
|
1452
1440
|
* form.submit().then((submission) => {
|
|
1453
1441
|
* console.log(submission);
|
|
1454
1442
|
* });
|
|
1443
|
+
*
|
|
1455
1444
|
* @param {boolean} before - If this submission occured from the before handlers.
|
|
1456
|
-
*
|
|
1445
|
+
*
|
|
1457
1446
|
* @returns {Promise} - A promise when the form is done submitting.
|
|
1458
1447
|
*/
|
|
1459
|
-
submit(before
|
|
1448
|
+
submit(before, options = {}) {
|
|
1460
1449
|
this.submissionInProcess = true;
|
|
1461
1450
|
if (!before) {
|
|
1462
1451
|
return this.beforeSubmit(options).then(() => this.executeSubmit(options));
|
|
@@ -1467,41 +1456,37 @@ export default class Webform extends NestedDataComponent {
|
|
|
1467
1456
|
}
|
|
1468
1457
|
submitUrl(URL, headers) {
|
|
1469
1458
|
if (!URL) {
|
|
1470
|
-
return console.warn(
|
|
1459
|
+
return console.warn('Missing URL argument');
|
|
1471
1460
|
}
|
|
1472
1461
|
const submission = this.submission || {};
|
|
1473
1462
|
const API_URL = URL;
|
|
1474
1463
|
const settings = {
|
|
1475
|
-
method:
|
|
1476
|
-
headers: {}
|
|
1464
|
+
method: 'POST',
|
|
1465
|
+
headers: {}
|
|
1477
1466
|
};
|
|
1478
1467
|
if (headers && headers.length > 0) {
|
|
1479
1468
|
headers.map((e) => {
|
|
1480
|
-
if (e.header !==
|
|
1469
|
+
if (e.header !== '' && e.value !== '') {
|
|
1481
1470
|
settings.headers[e.header] = this.interpolate(e.value, submission);
|
|
1482
1471
|
}
|
|
1483
1472
|
});
|
|
1484
1473
|
}
|
|
1485
1474
|
if (API_URL && settings) {
|
|
1486
|
-
Formio.makeStaticRequest(API_URL, settings.method, submission, {
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
this.
|
|
1492
|
-
})
|
|
1493
|
-
.catch((e) => {
|
|
1494
|
-
const message = `${e.statusText ? e.statusText : ""} ${e.status ? e.status : e}`;
|
|
1495
|
-
this.emit("error", message);
|
|
1475
|
+
Formio.makeStaticRequest(API_URL, settings.method, submission, { headers: settings.headers }).then(() => {
|
|
1476
|
+
this.emit('requestDone');
|
|
1477
|
+
this.setAlert('success', '<p> Success </p>');
|
|
1478
|
+
}).catch((e) => {
|
|
1479
|
+
const message = `${e.statusText ? e.statusText : ''} ${e.status ? e.status : e}`;
|
|
1480
|
+
this.emit('error', message);
|
|
1496
1481
|
console.error(message);
|
|
1497
|
-
this.setAlert(
|
|
1482
|
+
this.setAlert('danger', `<p> ${message} </p>`);
|
|
1498
1483
|
return Promise.reject(this.onSubmissionError(e));
|
|
1499
1484
|
});
|
|
1500
1485
|
}
|
|
1501
1486
|
else {
|
|
1502
|
-
this.emit(
|
|
1503
|
-
this.setAlert(
|
|
1504
|
-
return console.warn(
|
|
1487
|
+
this.emit('error', 'You should add a URL to this button.');
|
|
1488
|
+
this.setAlert('warning', 'You should add a URL to this button.');
|
|
1489
|
+
return console.warn('You should add a URL to this button.');
|
|
1505
1490
|
}
|
|
1506
1491
|
}
|
|
1507
1492
|
triggerRecaptcha() {
|
|
@@ -1509,16 +1494,16 @@ export default class Webform extends NestedDataComponent {
|
|
|
1509
1494
|
return;
|
|
1510
1495
|
}
|
|
1511
1496
|
const recaptchaComponent = searchComponents(this.components, {
|
|
1512
|
-
|
|
1513
|
-
|
|
1497
|
+
'component.type': 'recaptcha',
|
|
1498
|
+
'component.eventType': 'formLoad'
|
|
1514
1499
|
});
|
|
1515
1500
|
if (recaptchaComponent.length > 0) {
|
|
1516
|
-
recaptchaComponent[0].verify(`${this.form.name ? this.form.name :
|
|
1501
|
+
recaptchaComponent[0].verify(`${this.form.name ? this.form.name : 'form'}Load`);
|
|
1517
1502
|
}
|
|
1518
1503
|
}
|
|
1519
1504
|
set nosubmit(value) {
|
|
1520
1505
|
this._nosubmit = !!value;
|
|
1521
|
-
this.emit(
|
|
1506
|
+
this.emit('nosubmit', this._nosubmit);
|
|
1522
1507
|
}
|
|
1523
1508
|
get nosubmit() {
|
|
1524
1509
|
return this._nosubmit || false;
|