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