@defra/forms-engine-plugin 5.0.0-alpha.2 → 5.0.0-alpha.21
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/.public/javascripts/application.min.js +1 -1
- package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
- package/.public/javascripts/application.min.js.map +1 -1
- package/.public/javascripts/shared.min.js +1 -1
- package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
- package/.public/javascripts/shared.min.js.map +1 -1
- package/.public/stylesheets/application.min.css.map +1 -1
- package/.server/client/javascripts/file-upload.js +6 -3
- package/.server/client/javascripts/file-upload.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.d.ts +153 -5
- package/.server/client/javascripts/geospatial-map.js +157 -77
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/govuk.js +2 -1
- package/.server/client/javascripts/govuk.js.map +1 -1
- package/.server/client/javascripts/location-map.d.ts +44 -0
- package/.server/client/javascripts/location-map.js +54 -5
- package/.server/client/javascripts/location-map.js.map +1 -1
- package/.server/client/javascripts/map-constants.d.ts +3 -0
- package/.server/client/javascripts/map-constants.js +4 -0
- package/.server/client/javascripts/map-constants.js.map +1 -0
- package/.server/client/javascripts/map.d.ts +10 -0
- package/.server/client/javascripts/map.js +42 -0
- package/.server/client/javascripts/map.js.map +1 -1
- package/.server/client/javascripts/maps.d.ts +5 -0
- package/.server/client/javascripts/maps.js +6 -0
- package/.server/client/javascripts/maps.js.map +1 -0
- package/.server/client/javascripts/shared.d.ts +1 -4
- package/.server/client/javascripts/shared.js +1 -4
- package/.server/client/javascripts/shared.js.map +1 -1
- package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
- package/.server/client/javascripts/sssi-dataset.js +37 -39
- package/.server/client/javascripts/sssi-dataset.js.map +1 -1
- package/.server/client/stylesheets/maps.scss +4 -0
- package/.server/client/stylesheets/shared.scss +1 -5
- package/.server/server/constants.d.ts +2 -0
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -1
- package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
- package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +21 -0
- package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
- package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
- package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
- package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
- package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
- package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
- package/.server/server/plugins/engine/components/Details.d.ts +1 -0
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
- package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +21 -0
- package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
- package/.server/server/plugins/engine/components/FormComponent.js +5 -2
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
- package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/Html.d.ts +1 -0
- package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
- package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
- package/.server/server/plugins/engine/components/LatLongField.js +85 -48
- package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
- package/.server/server/plugins/engine/components/List.d.ts +1 -0
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js +25 -6
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
- package/.server/server/plugins/engine/components/Markdown.js +1 -1
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
- package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
- package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
- package/.server/server/plugins/engine/components/NumberField.js +16 -0
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
- package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
- package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
- package/.server/server/plugins/engine/components/PaymentField.js +17 -6
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
- package/.server/server/plugins/engine/components/YesNoField.js +17 -8
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.js +3 -3
- package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.js +56 -15
- package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
- package/.server/server/plugins/engine/components/helpers/index.js +13 -1
- package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
- package/.server/server/plugins/engine/components/types.d.ts +1 -0
- package/.server/server/plugins/engine/components/types.js.map +1 -1
- package/.server/server/plugins/engine/errors.d.ts +49 -0
- package/.server/server/plugins/engine/errors.js +75 -0
- package/.server/server/plugins/engine/errors.js.map +1 -0
- package/.server/server/plugins/engine/form-availability.d.ts +3 -2
- package/.server/server/plugins/engine/form-availability.js +3 -2
- package/.server/server/plugins/engine/form-availability.js.map +1 -1
- package/.server/server/plugins/engine/form-context.js +2 -2
- package/.server/server/plugins/engine/form-context.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +22 -2
- package/.server/server/plugins/engine/helpers.js +44 -5
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
- package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
- package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
- package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
- package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
- package/.server/server/plugins/engine/i18n/form.js +35 -0
- package/.server/server/plugins/engine/i18n/form.js.map +1 -0
- package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
- package/.server/server/plugins/engine/i18n/languages.js +19 -0
- package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
- package/.server/server/plugins/engine/i18n/translations/cy.json +192 -9
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +125 -7
- package/.server/server/plugins/engine/i18n/types.d.ts +3 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -1
- package/.server/server/plugins/engine/index.d.ts +4 -0
- package/.server/server/plugins/engine/index.js +4 -0
- package/.server/server/plugins/engine/index.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
- package/.server/server/plugins/engine/models/FormModel.js +35 -23
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
- package/.server/server/plugins/engine/models/types.d.ts +28 -1
- package/.server/server/plugins/engine/models/types.js.map +1 -1
- package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
- package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
- package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/types/enums.d.ts +3 -3
- package/.server/server/plugins/engine/types/enums.js +5 -4
- package/.server/server/plugins/engine/types/enums.js.map +1 -1
- package/.server/server/plugins/engine/types/schema.js +10 -3
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +18 -2
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/unavailable-response.js +5 -2
- package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
- package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
- package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
- package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/.server/server/plugins/engine/views/file-upload.html +1 -1
- package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
- package/.server/server/plugins/engine/views/unavailable.html +14 -11
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
- package/.server/server/plugins/payment/helper.d.ts +11 -1
- package/.server/server/plugins/payment/helper.js +18 -2
- package/.server/server/plugins/payment/helper.js.map +1 -1
- package/.server/server/plugins/payment/helper.test.js +2 -1
- package/.server/server/plugins/payment/helper.test.js.map +1 -1
- package/.server/server/plugins/payment/service.d.ts +2 -1
- package/.server/server/plugins/payment/service.js +5 -2
- package/.server/server/plugins/payment/service.js.map +1 -1
- package/.server/server/plugins/payment/service.test.js +7 -3
- package/.server/server/plugins/payment/service.test.js.map +1 -1
- package/.server/server/plugins/payment/types.d.ts +4 -0
- package/.server/server/plugins/payment/types.js +1 -0
- package/.server/server/plugins/payment/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
- package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
- package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
- package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
- package/.server/server/plugins/postcode-lookup/types.js +6 -1
- package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/.server/server/utils/type-utils.d.ts +1 -2
- package/.server/server/utils/type-utils.js +0 -3
- package/.server/server/utils/type-utils.js.map +1 -1
- package/.server/server/utils/utils.d.ts +6 -0
- package/.server/server/utils/utils.js +18 -1
- package/.server/server/utils/utils.js.map +1 -1
- package/.server/server/utils/utils.test.js +21 -1
- package/.server/server/utils/utils.test.js.map +1 -1
- package/package.json +20 -5
- package/src/client/javascripts/file-upload.js +11 -3
- package/src/client/javascripts/geospatial-map.js +176 -81
- package/src/client/javascripts/govuk.js +2 -0
- package/src/client/javascripts/location-map.js +60 -4
- package/src/client/javascripts/map-constants.js +3 -0
- package/src/client/javascripts/map.js +47 -0
- package/src/client/javascripts/maps.js +5 -0
- package/src/client/javascripts/shared.js +1 -4
- package/src/client/javascripts/sssi-dataset.js +39 -41
- package/src/client/stylesheets/maps.scss +4 -0
- package/src/client/stylesheets/shared.scss +1 -5
- package/src/server/constants.js +2 -0
- package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
- package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
- package/src/server/plugins/engine/components/CheckboxesField.ts +38 -5
- package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
- package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
- package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
- package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
- package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
- package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
- package/src/server/plugins/engine/components/FileUploadField.ts +44 -3
- package/src/server/plugins/engine/components/FormComponent.ts +6 -5
- package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
- package/src/server/plugins/engine/components/LatLongField.ts +128 -58
- package/src/server/plugins/engine/components/LocationFieldBase.ts +30 -7
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
- package/src/server/plugins/engine/components/Markdown.ts +2 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
- package/src/server/plugins/engine/components/NumberField.ts +21 -1
- package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
- package/src/server/plugins/engine/components/PaymentField.ts +15 -5
- package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
- package/src/server/plugins/engine/components/YesNoField.ts +17 -9
- package/src/server/plugins/engine/components/helpers/components.ts +3 -3
- package/src/server/plugins/engine/components/helpers/geospatial.ts +84 -21
- package/src/server/plugins/engine/components/helpers/index.ts +19 -0
- package/src/server/plugins/engine/components/types.ts +1 -0
- package/src/server/plugins/engine/errors.ts +78 -0
- package/src/server/plugins/engine/form-availability.ts +8 -2
- package/src/server/plugins/engine/form-context.ts +4 -2
- package/src/server/plugins/engine/helpers.ts +52 -5
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
- package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
- package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
- package/src/server/plugins/engine/i18n/form.ts +54 -0
- package/src/server/plugins/engine/i18n/languages.ts +19 -0
- package/src/server/plugins/engine/i18n/translations/cy.json +192 -9
- package/src/server/plugins/engine/i18n/translations/en-GB.json +125 -7
- package/src/server/plugins/engine/i18n/types.ts +3 -0
- package/src/server/plugins/engine/index.ts +7 -0
- package/src/server/plugins/engine/models/FormModel.ts +46 -23
- package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
- package/src/server/plugins/engine/models/types.ts +31 -0
- package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
- package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
- package/src/server/plugins/engine/types/enums.ts +4 -3
- package/src/server/plugins/engine/types/schema.ts +17 -4
- package/src/server/plugins/engine/types.ts +19 -1
- package/src/server/plugins/engine/unavailable-response.ts +6 -2
- package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
- package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
- package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
- package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/src/server/plugins/engine/views/file-upload.html +1 -1
- package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
- package/src/server/plugins/engine/views/unavailable.html +14 -11
- package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/src/server/plugins/nunjucks/filters/index.js +1 -0
- package/src/server/plugins/payment/helper.js +22 -2
- package/src/server/plugins/payment/service.js +6 -2
- package/src/server/plugins/payment/types.js +1 -0
- package/src/server/plugins/postcode-lookup/models/index.js +75 -43
- package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
- package/src/server/plugins/postcode-lookup/types.js +6 -1
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/src/server/utils/type-utils.ts +1 -11
- package/src/server/utils/utils.js +19 -1
|
@@ -14,7 +14,26 @@
|
|
|
14
14
|
"numberInteger": "{{#label}} must be a whole number",
|
|
15
15
|
"numberMin": "{{#label}} must be {{#limit}} or higher",
|
|
16
16
|
"numberMax": "{{#label}} must be {{#limit}} or lower",
|
|
17
|
-
"maxWords": "{{#label}} must be {{#limit}} words or fewer"
|
|
17
|
+
"maxWords": "{{#label}} must be {{#limit}} words or fewer",
|
|
18
|
+
"unicode": "{{#label}} includes invalid characters, for example, long dashes",
|
|
19
|
+
"arrayMin_one": "Select at least {{#limit}} option from the list",
|
|
20
|
+
"arrayMin_other": "Select at least {{#limit}} options from the list",
|
|
21
|
+
"arrayMax_one": "Only {{#limit}} option can be selected from the list",
|
|
22
|
+
"arrayMax_other": "Only {{#limit}} options can be selected from the list",
|
|
23
|
+
"arrayLength_one": "Select only {{#limit}} option from the list",
|
|
24
|
+
"arrayLength_other": "Select only {{#limit}} options from the list",
|
|
25
|
+
"featuresMin_one": "Define at least {{#limit}} feature",
|
|
26
|
+
"featuresMin_other": "Define at least {{#limit}} features",
|
|
27
|
+
"featuresMax_one": "Only {{#limit}} feature can be defined",
|
|
28
|
+
"featuresMax_other": "Only {{#limit}} features can be defined",
|
|
29
|
+
"featuresLength_one": "Define exactly {{#limit}} feature",
|
|
30
|
+
"featuresLength_other": "Define exactly {{#limit}} features",
|
|
31
|
+
"filesMin_one": "You must upload {{#limit}} file or more",
|
|
32
|
+
"filesMin_other": "You must upload {{#limit}} files or more",
|
|
33
|
+
"filesMax_one": "You can only upload {{#limit}} file or less",
|
|
34
|
+
"filesMax_other": "You can only upload {{#limit}} files or less",
|
|
35
|
+
"filesLength_one": "You must upload exactly {{#limit}} file",
|
|
36
|
+
"filesLength_other": "You must upload exactly {{#limit}} files"
|
|
18
37
|
},
|
|
19
38
|
|
|
20
39
|
"errors": {
|
|
@@ -29,7 +48,14 @@
|
|
|
29
48
|
"continue": "Continue",
|
|
30
49
|
"saveAndExit": "Save and exit",
|
|
31
50
|
"draft": "draft",
|
|
32
|
-
"live": "live"
|
|
51
|
+
"live": "live",
|
|
52
|
+
"or": "or",
|
|
53
|
+
"and": "and",
|
|
54
|
+
"england": "England",
|
|
55
|
+
"wales": "Wales",
|
|
56
|
+
"northern-ireland": "Northern Ireland",
|
|
57
|
+
"scotland": "Scotland",
|
|
58
|
+
"sendFeedback": "Send feedback"
|
|
33
59
|
},
|
|
34
60
|
|
|
35
61
|
"pages": {
|
|
@@ -60,6 +86,8 @@
|
|
|
60
86
|
"totalAmount": "Total amount",
|
|
61
87
|
"reference": "Reference",
|
|
62
88
|
"dateOfPayment": "Date of payment",
|
|
89
|
+
"fileUpload_one": "Uploaded [[count]] file",
|
|
90
|
+
"fileUpload_other": "Uploaded [[count]] files",
|
|
63
91
|
"submissionFailed": "There was a problem and your form was not submitted. Try submitting the form again",
|
|
64
92
|
"submissionFailedContactSuffix": " or you can [[contactUsLink]] and quote your reference number to arrange a refund",
|
|
65
93
|
"contactUsLinkText": "contact us (opens in new tab)",
|
|
@@ -89,7 +117,18 @@
|
|
|
89
117
|
|
|
90
118
|
"fileUpload": {
|
|
91
119
|
"upload": "Upload file",
|
|
92
|
-
"maxFilesReached": "You have reached the maximum number of files. Please remove a file to upload more."
|
|
120
|
+
"maxFilesReached": "You have reached the maximum number of files. Please remove a file to upload more.",
|
|
121
|
+
"remove": "Remove",
|
|
122
|
+
"removeFileTitle": "Are you sure you want to remove this file?",
|
|
123
|
+
"removeFileBody": "You cannot recover removed files.",
|
|
124
|
+
"removeFileButton": "Remove file",
|
|
125
|
+
"cancel": "Cancel",
|
|
126
|
+
"FILE_VIRUS": "The selected file contains a virus",
|
|
127
|
+
"FILE_EMPTY": "The selected file is empty",
|
|
128
|
+
"FILE_TOO_LARGE": "The selected file must be smaller than [[maxFileSizeFormatted]]",
|
|
129
|
+
"FILE_INVALID_TYPE": "The selected file must be a [[fileExtensions]]",
|
|
130
|
+
"FILE_UPLOAD_FAILED": "The selected file could not be uploaded - try again",
|
|
131
|
+
"FILE_ERROR_UNKNOWN": "Unknown error"
|
|
93
132
|
},
|
|
94
133
|
|
|
95
134
|
"exit": {
|
|
@@ -111,9 +150,20 @@
|
|
|
111
150
|
"body": "If you want to receive a test email, [[link]] you want form submissions to go to.",
|
|
112
151
|
"linkText": "enter the email address (opens in new tab)"
|
|
113
152
|
},
|
|
153
|
+
"bannerTitle": "Important",
|
|
114
154
|
"bannerForce": "This is a preview of a [[previewMode]] form. Do not enter personal information.",
|
|
115
155
|
"bannerText": "This is a preview of a [[previewMode]] form page you are editing.",
|
|
116
156
|
"previousPages": "It depends on answers from earlier pages in the form. In the live version, users will need to complete those questions first."
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
"formUnavailable": {
|
|
160
|
+
"title": "Sorry, this form is unavailable",
|
|
161
|
+
"subHeading": "'[[formTitle]]' is no longer available.",
|
|
162
|
+
"contactDetailsHeading": "Contact details for [[organisationName]]",
|
|
163
|
+
"telephone": "Telephone",
|
|
164
|
+
"callCharges": "Find out about call charges",
|
|
165
|
+
"email": "Email",
|
|
166
|
+
"onlineContactForm": "Online contact form"
|
|
117
167
|
}
|
|
118
168
|
},
|
|
119
169
|
|
|
@@ -199,7 +249,8 @@
|
|
|
199
249
|
"eastingDigits": "{{#label}} for [[fieldLabel]] must be between 1 and 6 digits",
|
|
200
250
|
"northingDigits": "{{#label}} for [[fieldLabel]] must be between 1 and 7 digits",
|
|
201
251
|
"eastingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]",
|
|
202
|
-
"northingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]"
|
|
252
|
+
"northingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]",
|
|
253
|
+
"wrongCountry": "Location must be within [[country]]"
|
|
203
254
|
},
|
|
204
255
|
|
|
205
256
|
"nationalGridField": {
|
|
@@ -215,7 +266,16 @@
|
|
|
215
266
|
},
|
|
216
267
|
|
|
217
268
|
"locationFieldBase": {
|
|
218
|
-
"howToFind": "How to find location details"
|
|
269
|
+
"howToFind": "How to find location details",
|
|
270
|
+
"map": {
|
|
271
|
+
"helpPanel": {
|
|
272
|
+
"label": "How to use this map",
|
|
273
|
+
"point1": "Search for a place or postcode",
|
|
274
|
+
"point2": "Use the + and - icons to zoom in and out",
|
|
275
|
+
"point3": "Use a mouse or keyboard to centre the point at the location",
|
|
276
|
+
"point4": "Click to add the location to the map"
|
|
277
|
+
}
|
|
278
|
+
}
|
|
219
279
|
},
|
|
220
280
|
|
|
221
281
|
"yesNoField": {
|
|
@@ -238,6 +298,47 @@
|
|
|
238
298
|
"geospatialField": {
|
|
239
299
|
"added_one": "Added [[count]] location",
|
|
240
300
|
"added_other": "Added [[count]] locations",
|
|
301
|
+
"map": {
|
|
302
|
+
"helpPanel": {
|
|
303
|
+
"label": "How to use this map",
|
|
304
|
+
"ledeIntro": "You can add",
|
|
305
|
+
"ledeOutro": "to the map.",
|
|
306
|
+
"lineText": "a line",
|
|
307
|
+
"shapeText": "a shape",
|
|
308
|
+
"lineOrShapeText": "a line or shape",
|
|
309
|
+
"typesPhrasePoint": "points",
|
|
310
|
+
"typesPhraseLine": "lines",
|
|
311
|
+
"typesPhraseShape": "shapes",
|
|
312
|
+
"typesPhraseOr": "or",
|
|
313
|
+
"point1": "Search for a county, place or postcode",
|
|
314
|
+
"point2": "Use the + and - icons to zoom in and out",
|
|
315
|
+
"point3": "Double‑click, or select 'Done', when you have finished drawing",
|
|
316
|
+
"point4": "Give the location a name"
|
|
317
|
+
},
|
|
318
|
+
"typeDescriptions": {
|
|
319
|
+
"point": "Point",
|
|
320
|
+
"line": "Line",
|
|
321
|
+
"polygon": "Shape"
|
|
322
|
+
},
|
|
323
|
+
"buttons": {
|
|
324
|
+
"point": "Add point",
|
|
325
|
+
"line": "Add line",
|
|
326
|
+
"polygon": "Add shape"
|
|
327
|
+
},
|
|
328
|
+
"itemLabel1": "Location",
|
|
329
|
+
"itemLabel2": "description",
|
|
330
|
+
"itemUpdateLink": "Update",
|
|
331
|
+
"itemDeleteLink": "Delete",
|
|
332
|
+
"itemFocusLink": "Show",
|
|
333
|
+
"itemVisuallyHidden": "location",
|
|
334
|
+
"details": {
|
|
335
|
+
"summary": "Coordinates",
|
|
336
|
+
"type": "Type",
|
|
337
|
+
"centroidGridReference": "Centre grid reference",
|
|
338
|
+
"firstPointGridReference": "First point grid reference",
|
|
339
|
+
"detailedCoordinates": "Detailed coordinates"
|
|
340
|
+
}
|
|
341
|
+
},
|
|
241
342
|
"validation": {
|
|
242
343
|
"descriptionRequired": "Enter description for location [[count]]",
|
|
243
344
|
"wrongCountry": "Location [[count]] must be within [[country]]"
|
|
@@ -245,7 +346,7 @@
|
|
|
245
346
|
},
|
|
246
347
|
|
|
247
348
|
"paymentField": {
|
|
248
|
-
"detailsRequired": "Payment
|
|
349
|
+
"detailsRequired": "Payment required",
|
|
249
350
|
"pendingTransaction": "You may see a pending transaction in your bank account but you will only be charged when you submit the form.",
|
|
250
351
|
"addPaymentDetails": "Add payment details",
|
|
251
352
|
"cannotTakePayment": "There is a problem and we cannot take a payment. Contact us (details in the footer of this form) or save your progress and return to the form later.",
|
|
@@ -261,11 +362,28 @@
|
|
|
261
362
|
},
|
|
262
363
|
|
|
263
364
|
"fileUploadField": {
|
|
365
|
+
"uploading": "Uploading…",
|
|
264
366
|
"uploaded": "Uploaded",
|
|
265
367
|
"uploadFailed": "There was a problem with your uploaded files. Re-upload them before submitting the form again.",
|
|
266
368
|
"uploadedFilesHeading": "Uploaded files",
|
|
267
369
|
"filesCount_one": "[[count]] file uploaded",
|
|
268
|
-
"filesCount_other": "[[count]] files uploaded"
|
|
370
|
+
"filesCount_other": "[[count]] files uploaded",
|
|
371
|
+
"chooseFile": "Choose file",
|
|
372
|
+
"dropFile": "or drop file",
|
|
373
|
+
"noFileChosen": "No file chosen"
|
|
374
|
+
},
|
|
375
|
+
|
|
376
|
+
"characterCount": {
|
|
377
|
+
"_comment": "Note the use of %{count} instead of [[count]]. This is because we are passing to the govuk template, not passing to Joi",
|
|
378
|
+
"underLimit": {
|
|
379
|
+
"one": "You have %{count} character remaining",
|
|
380
|
+
"other": "You have %{count} characters remaining"
|
|
381
|
+
},
|
|
382
|
+
"atLimit": "You have 0 characters remaining",
|
|
383
|
+
"overLimit": {
|
|
384
|
+
"one": "You have %{count} character too many",
|
|
385
|
+
"other": "You have %{count} characters too many"
|
|
386
|
+
}
|
|
269
387
|
}
|
|
270
388
|
}
|
|
271
389
|
}
|
|
@@ -22,6 +22,9 @@ export type FormDefinitionTranslations = Record<
|
|
|
22
22
|
hint: string
|
|
23
23
|
content: string
|
|
24
24
|
shortDescription: string
|
|
25
|
+
errorDescription: string
|
|
26
|
+
paymentDescription: string
|
|
27
|
+
instructionText: string
|
|
25
28
|
}>
|
|
26
29
|
>
|
|
27
30
|
sections: Record<string, Partial<Pick<Section, 'title'>>>
|
|
@@ -22,6 +22,13 @@ export {
|
|
|
22
22
|
resolveFormModel
|
|
23
23
|
} from './form-context.js'
|
|
24
24
|
export * from './form-availability.js'
|
|
25
|
+
export { getAvailableLanguages } from './i18n/languages.js'
|
|
26
|
+
export {
|
|
27
|
+
extractMetadataBaseTranslations,
|
|
28
|
+
loadFormTranslations
|
|
29
|
+
} from './i18n/createFormTranslator.js'
|
|
30
|
+
export { extractBaseTranslations } from './i18n/extractBaseTranslations.js'
|
|
31
|
+
export { applyUrlParam } from '../nunjucks/filters/applyUrlParam.js'
|
|
25
32
|
|
|
26
33
|
const globals = {
|
|
27
34
|
checkComponentTemplates,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ComponentType,
|
|
3
|
+
ConditionEvaluationOutcome,
|
|
3
4
|
ConditionsModel,
|
|
4
5
|
ControllerPath,
|
|
5
6
|
ControllerType,
|
|
@@ -8,6 +9,7 @@ import {
|
|
|
8
9
|
formDefinitionSchema,
|
|
9
10
|
formDefinitionV2Schema,
|
|
10
11
|
generateConditionAlias,
|
|
12
|
+
getErrorMessage,
|
|
11
13
|
hasComponents,
|
|
12
14
|
hasComponentsEvenIfNoNext,
|
|
13
15
|
hasRepeater,
|
|
@@ -31,6 +33,7 @@ import { type i18n } from 'i18next'
|
|
|
31
33
|
import joi from 'joi'
|
|
32
34
|
|
|
33
35
|
import { logger } from '../../../common/helpers/logging/logger.js'
|
|
36
|
+
import { EN_GB } from '../../../constants.js'
|
|
34
37
|
import { type ListFormComponent } from '../components/ListFormComponent.js'
|
|
35
38
|
import {} from '../components/YesNoField.js'
|
|
36
39
|
import {
|
|
@@ -38,6 +41,10 @@ import {
|
|
|
38
41
|
type Component
|
|
39
42
|
} from '../components/helpers/components.js'
|
|
40
43
|
import { todayAsDateOnly } from '../date-helper.js'
|
|
44
|
+
import {
|
|
45
|
+
ConditionBuildError,
|
|
46
|
+
SchemaValidationError
|
|
47
|
+
} from '../errors.js'
|
|
41
48
|
import {
|
|
42
49
|
findPage,
|
|
43
50
|
getError,
|
|
@@ -47,8 +54,12 @@ import { loadFormTranslations } from '../i18n/createFormTranslator.js'
|
|
|
47
54
|
import { createTranslator } from '../i18n/createTranslator.js'
|
|
48
55
|
import { extractBaseTranslations } from '../i18n/extractBaseTranslations.js'
|
|
49
56
|
import { createFormI18nInstance } from '../i18n/index.js'
|
|
57
|
+
import { getAvailableLanguages } from '../i18n/languages.js'
|
|
50
58
|
import { type Translator } from '../i18n/types.js'
|
|
51
|
-
import {
|
|
59
|
+
import {
|
|
60
|
+
type ConditionEvaluation,
|
|
61
|
+
type ExecutableCondition
|
|
62
|
+
} from './types.js'
|
|
52
63
|
import { type PageController } from '../pageControllers/PageController.js'
|
|
53
64
|
import {
|
|
54
65
|
createPage,
|
|
@@ -122,7 +133,7 @@ export class FormModel {
|
|
|
122
133
|
const result = schema.validate(def, { abortEarly: false })
|
|
123
134
|
|
|
124
135
|
if (result.error) {
|
|
125
|
-
throw result.error
|
|
136
|
+
throw new SchemaValidationError(result.error)
|
|
126
137
|
}
|
|
127
138
|
|
|
128
139
|
// Make a clone of the shallow copy returned
|
|
@@ -240,7 +251,12 @@ export class FormModel {
|
|
|
240
251
|
}
|
|
241
252
|
|
|
242
253
|
/** Returns a scoped translator pair for the given language. */
|
|
243
|
-
createTranslator(language =
|
|
254
|
+
createTranslator(language = EN_GB): Translator {
|
|
255
|
+
// @ts-expect-error - dynamic language lookup
|
|
256
|
+
if (!this.def.metadata?.translations?.[language]) {
|
|
257
|
+
// If not translations defined in the FormDefinition, always default to English
|
|
258
|
+
language = EN_GB
|
|
259
|
+
}
|
|
244
260
|
return createTranslator(this.i18nInstance, language)
|
|
245
261
|
}
|
|
246
262
|
|
|
@@ -285,23 +301,43 @@ export class FormModel {
|
|
|
285
301
|
})
|
|
286
302
|
|
|
287
303
|
const { name, displayName, value } = condition
|
|
288
|
-
const expr = this.toConditionExpression(value, parser)
|
|
289
304
|
|
|
290
|
-
|
|
305
|
+
let expr
|
|
306
|
+
try {
|
|
307
|
+
expr = this.toConditionExpression(value, parser)
|
|
308
|
+
} catch (cause) {
|
|
309
|
+
throw new ConditionBuildError(displayName, { cause })
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const evaluate = (evaluationState: FormState): ConditionEvaluation => {
|
|
291
313
|
const ctx = this.toConditionContext(evaluationState, this.conditions)
|
|
314
|
+
|
|
292
315
|
try {
|
|
293
|
-
return
|
|
294
|
-
|
|
295
|
-
|
|
316
|
+
return {
|
|
317
|
+
outcome: (expr.evaluate(ctx) as boolean)
|
|
318
|
+
? ConditionEvaluationOutcome.True
|
|
319
|
+
: ConditionEvaluationOutcome.False
|
|
320
|
+
}
|
|
321
|
+
} catch (err) {
|
|
322
|
+
return {
|
|
323
|
+
outcome: ConditionEvaluationOutcome.Error,
|
|
324
|
+
error: getErrorMessage(err)
|
|
325
|
+
}
|
|
296
326
|
}
|
|
297
327
|
}
|
|
298
328
|
|
|
329
|
+
// A failed evaluation continues to route as `false`. `evaluate` exists so
|
|
330
|
+
// that the two can be told apart when recording outcomes for submission.
|
|
331
|
+
const fn = (evaluationState: FormState) =>
|
|
332
|
+
evaluate(evaluationState).outcome === ConditionEvaluationOutcome.True
|
|
333
|
+
|
|
299
334
|
return {
|
|
300
335
|
name,
|
|
301
336
|
displayName,
|
|
302
337
|
value,
|
|
303
338
|
expr,
|
|
304
|
-
fn
|
|
339
|
+
fn,
|
|
340
|
+
evaluate
|
|
305
341
|
}
|
|
306
342
|
}
|
|
307
343
|
|
|
@@ -662,7 +698,7 @@ function validateFormState(
|
|
|
662
698
|
|
|
663
699
|
// Add relevant state errors
|
|
664
700
|
if (error) {
|
|
665
|
-
const errorsState = error.details.map(getError)
|
|
701
|
+
const errorsState = error.details.map((item) => getError(EN_GB, item))
|
|
666
702
|
return { ...context, errors: errors.concat(errorsState) }
|
|
667
703
|
}
|
|
668
704
|
|
|
@@ -679,16 +715,3 @@ function getReferenceNumber(state: FormSubmissionState): string {
|
|
|
679
715
|
|
|
680
716
|
return state.$$__referenceNumber
|
|
681
717
|
}
|
|
682
|
-
|
|
683
|
-
export function getAvailableLanguages(
|
|
684
|
-
def: FormDefinition
|
|
685
|
-
): { name: string; code: string }[] {
|
|
686
|
-
// @ts-expect-error - dynamic property
|
|
687
|
-
if (def.metadata?.translations?.cy) {
|
|
688
|
-
return [
|
|
689
|
-
{ name: 'English', code: 'en-GB' },
|
|
690
|
-
{ name: 'Cymraeg', code: 'cy' }
|
|
691
|
-
]
|
|
692
|
-
}
|
|
693
|
-
return []
|
|
694
|
-
}
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type Section
|
|
5
5
|
} from '@defra/forms-model'
|
|
6
6
|
|
|
7
|
+
import { EN_GB } from '../../../constants.js'
|
|
7
8
|
import { PaymentField } from '../components/PaymentField.js'
|
|
8
9
|
import { type PaymentState } from '../components/PaymentField.types.js'
|
|
9
10
|
import {
|
|
@@ -96,7 +97,7 @@ export class SummaryViewModel {
|
|
|
96
97
|
.validate(this.context.relevantState, { ...opts, stripUnknown: true })
|
|
97
98
|
|
|
98
99
|
// Format errors
|
|
99
|
-
this.errors = result.error?.details.map(getError)
|
|
100
|
+
this.errors = result.error?.details.map((item) => getError(EN_GB, item))
|
|
100
101
|
this.details = this.summaryDetails(request, sections, translator)
|
|
101
102
|
|
|
102
103
|
// Format check answers
|
|
@@ -212,12 +213,12 @@ function ItemRepeat(
|
|
|
212
213
|
translator: Translator
|
|
213
214
|
): DetailItemRepeat {
|
|
214
215
|
const { collection, repeat } = page
|
|
215
|
-
const { name
|
|
216
|
-
|
|
216
|
+
const { name } = repeat.options
|
|
217
|
+
const { t, tPage } = translator
|
|
218
|
+
const title = tPage(page.pageDef, 'repeatTitle') || repeat.options.title
|
|
217
219
|
const values = page.getListFromState(state)
|
|
218
220
|
const count = values.length
|
|
219
|
-
const value =
|
|
220
|
-
count === 0 ? '' : translator.t('pages.repeater.pageTitle', { count })
|
|
221
|
+
const value = count === 0 ? '' : t('pages.repeater.pageTitle', { count })
|
|
221
222
|
|
|
222
223
|
return {
|
|
223
224
|
name,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
type ConditionEvaluationOutcome,
|
|
2
3
|
type ConditionWrapper,
|
|
3
4
|
type FormComponentsDef,
|
|
4
5
|
type Section
|
|
@@ -16,9 +17,39 @@ import {
|
|
|
16
17
|
type FormSubmissionError
|
|
17
18
|
} from '../types.js'
|
|
18
19
|
|
|
20
|
+
/**
|
|
21
|
+
* The result of evaluating a condition, keeping a failed evaluation distinct
|
|
22
|
+
* from one that legitimately returned `false`.
|
|
23
|
+
* @see {@link ExecutableCondition.evaluate}
|
|
24
|
+
*/
|
|
25
|
+
export interface ConditionEvaluation {
|
|
26
|
+
outcome: ConditionEvaluationOutcome
|
|
27
|
+
error?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A form condition paired with the parsed expression and callbacks needed to
|
|
32
|
+
* run it against a form submission state
|
|
33
|
+
* Created by `FormModel.makeCondition`
|
|
34
|
+
*/
|
|
19
35
|
export type ExecutableCondition = ConditionWrapper & {
|
|
36
|
+
/**
|
|
37
|
+
* Parsed expression for the condition's {@link ConditionWrapper.value},
|
|
38
|
+
* evaluated against a context built from the submission state
|
|
39
|
+
*/
|
|
20
40
|
expr: Expression
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Evaluates the condition, used for page routing and component visibility
|
|
44
|
+
* A failed evaluation is reported as `false`
|
|
45
|
+
*/
|
|
21
46
|
fn: (evaluationState: FormState) => boolean
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* As `fn`, but reports whether evaluation failed rather than defaulting a
|
|
50
|
+
* failure to `false`. Used to record condition outcomes on submission.
|
|
51
|
+
*/
|
|
52
|
+
evaluate: (evaluationState: FormState) => ConditionEvaluation
|
|
22
53
|
}
|
|
23
54
|
|
|
24
55
|
/**
|
|
@@ -1,19 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
type FormDefinition,
|
|
3
|
+
type FormMetadata,
|
|
4
|
+
type FormMetadataContact
|
|
5
|
+
} from '@defra/forms-model'
|
|
6
|
+
|
|
7
|
+
import { createFormTranslator } from '../i18n/createFormTranslator.js'
|
|
8
|
+
import { getAvailableLanguages } from '../i18n/languages.js'
|
|
9
|
+
import { type Translator } from '../types/index.js'
|
|
2
10
|
|
|
3
11
|
export interface UnavailableViewModel {
|
|
4
12
|
pageTitle: string
|
|
5
13
|
formTitle: string
|
|
6
14
|
organisationName: string
|
|
7
15
|
contact?: FormMetadataContact
|
|
16
|
+
context: { translator: Translator }
|
|
17
|
+
language: string
|
|
18
|
+
languages: { code: string; name: string }[]
|
|
8
19
|
}
|
|
9
20
|
|
|
10
21
|
export function unavailableViewModel(
|
|
11
|
-
metadata: FormMetadata
|
|
22
|
+
metadata: FormMetadata,
|
|
23
|
+
definition: FormDefinition | undefined,
|
|
24
|
+
language: string
|
|
12
25
|
): UnavailableViewModel {
|
|
26
|
+
const translator = createFormTranslator(metadata, definition, language)
|
|
27
|
+
const { t, tForm } = translator
|
|
13
28
|
return {
|
|
14
|
-
pageTitle: '
|
|
15
|
-
formTitle: metadata.title,
|
|
29
|
+
pageTitle: t('pages.formUnavailable.title'),
|
|
30
|
+
formTitle: tForm('title') || metadata.title,
|
|
16
31
|
organisationName: metadata.organisation,
|
|
17
|
-
contact: metadata.contact
|
|
32
|
+
contact: metadata.contact,
|
|
33
|
+
context: { translator },
|
|
34
|
+
language,
|
|
35
|
+
// Always get Welsh and English
|
|
36
|
+
languages: getAvailableLanguages({
|
|
37
|
+
metadata: { translations: { cy: {} } }
|
|
38
|
+
} as unknown as FormDefinition)
|
|
18
39
|
}
|
|
19
40
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
+
Engine,
|
|
2
3
|
type FormMetadata,
|
|
3
4
|
type SubmitResponsePayload
|
|
4
5
|
} from '@defra/forms-model'
|
|
5
6
|
|
|
7
|
+
import { EN_GB } from '../../../../constants.js'
|
|
6
8
|
import {
|
|
7
9
|
getFormVersion,
|
|
8
10
|
type checkFormStatus
|
|
@@ -10,6 +12,7 @@ import {
|
|
|
10
12
|
import { type FormModel } from '../../models/FormModel.js'
|
|
11
13
|
import { type DetailItem } from '../../models/types.js'
|
|
12
14
|
import { categoriseData } from '../machine/v2.js'
|
|
15
|
+
import { buildConditionEvaluations } from '../../pageControllers/helpers/submission.js'
|
|
13
16
|
import { FormAdapterSubmissionSchemaVersion } from '../../types/enums.js'
|
|
14
17
|
import {
|
|
15
18
|
type FormAdapterSubmissionMessageData,
|
|
@@ -42,18 +45,14 @@ export function format(
|
|
|
42
45
|
formSlug: formMetadata?.slug ?? '',
|
|
43
46
|
status: formStatus.state,
|
|
44
47
|
isPreview: formStatus.isPreview,
|
|
45
|
-
notificationEmail: formMetadata?.notificationEmail ?? ''
|
|
48
|
+
notificationEmail: formMetadata?.notificationEmail ?? '',
|
|
49
|
+
language: context.translator?.language ?? EN_GB
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
if (versionMetadata) {
|
|
49
53
|
meta.versionMetadata = versionMetadata
|
|
50
54
|
}
|
|
51
55
|
|
|
52
|
-
const definitionLanguage = model.def.metadata?.language
|
|
53
|
-
if (typeof definitionLanguage === 'string') {
|
|
54
|
-
meta.language = definitionLanguage
|
|
55
|
-
}
|
|
56
|
-
|
|
57
56
|
const main = Object.fromEntries(
|
|
58
57
|
Object.entries(v2Main).map(([key, value]) => {
|
|
59
58
|
if (value === undefined) {
|
|
@@ -76,7 +75,19 @@ export function format(
|
|
|
76
75
|
const payload: FormAdapterSubmissionMessagePayload = {
|
|
77
76
|
meta,
|
|
78
77
|
data,
|
|
79
|
-
result
|
|
78
|
+
result,
|
|
79
|
+
|
|
80
|
+
// Recorded here because only the engine holds the walked evaluation state
|
|
81
|
+
// the conditions were judged against; forms-notify-listener receives the
|
|
82
|
+
// flat submitted answers and resolves the outputs that qualify from these
|
|
83
|
+
// outcomes alone. Condition ids are only stable in V2, so a V1 definition
|
|
84
|
+
// has nothing to report - the property is still emitted, because its
|
|
85
|
+
// absence is what marks a message as predating this and sends the listener
|
|
86
|
+
// down its legacy path.
|
|
87
|
+
conditionEvaluations:
|
|
88
|
+
model.engine === Engine.V2
|
|
89
|
+
? buildConditionEvaluations(model, context)
|
|
90
|
+
: []
|
|
80
91
|
}
|
|
81
92
|
|
|
82
93
|
return JSON.stringify(payload)
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
import { addDays, format as dateFormat } from 'date-fns'
|
|
6
6
|
|
|
7
7
|
import { config } from '../../../../../config/index.js'
|
|
8
|
+
import { EN_GB } from '../../../../constants.js'
|
|
8
9
|
import { getAnswer } from '../../components/helpers/components.js'
|
|
9
10
|
import { escapeMarkdown } from '../../components/helpers/index.js'
|
|
10
11
|
import { PaymentField } from '../../components/index.js'
|
|
@@ -116,7 +117,7 @@ function appendPaymentSection(paymentItems: DetailItem[], lines: string[]) {
|
|
|
116
117
|
|
|
117
118
|
const formattedAmount = formatCurrency(paymentState.amount)
|
|
118
119
|
const dateOfPayment = paymentState.preAuth?.createdAt
|
|
119
|
-
? formatPaymentDate(paymentState.preAuth.createdAt)
|
|
120
|
+
? formatPaymentDate(paymentState.preAuth.createdAt, EN_GB)
|
|
120
121
|
: ''
|
|
121
122
|
|
|
122
123
|
lines.push(
|
|
@@ -28,6 +28,7 @@ interface PaymentOutput {
|
|
|
28
28
|
reference: string
|
|
29
29
|
amount: number
|
|
30
30
|
description: string
|
|
31
|
+
descriptionInEng?: string
|
|
31
32
|
createdAt: string
|
|
32
33
|
}
|
|
33
34
|
|
|
@@ -93,6 +94,7 @@ export function format(
|
|
|
93
94
|
* reference: 'REF-123',
|
|
94
95
|
* amount: 10.00,
|
|
95
96
|
* description: 'Application fee',
|
|
97
|
+
* descriptionInEng: 'Applicaiton fee',
|
|
96
98
|
* createdAt: '2025-01-23T10:30:00.000Z'
|
|
97
99
|
* }
|
|
98
100
|
* }
|
|
@@ -204,6 +206,7 @@ function extractPayment(
|
|
|
204
206
|
reference: paymentState.reference,
|
|
205
207
|
amount: paymentState.amount,
|
|
206
208
|
description: paymentState.description,
|
|
209
|
+
descriptionInEng: item.field.def.options.description,
|
|
207
210
|
createdAt: paymentState.preAuth?.createdAt ?? ''
|
|
208
211
|
}
|
|
209
212
|
}
|