@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
|
@@ -13,6 +13,7 @@ const townFieldName = 'town';
|
|
|
13
13
|
const countyFieldName = 'county';
|
|
14
14
|
const postcodeFieldName = 'postcode';
|
|
15
15
|
const GOVUK_MARGIN_RIGHT_1 = 'govuk-!-margin-right-1';
|
|
16
|
+
const COMMON_BACK = 'common.back';
|
|
16
17
|
export const steps = {
|
|
17
18
|
// Step 1: Postcode/building name input
|
|
18
19
|
details: 'details',
|
|
@@ -338,56 +339,77 @@ function getHref(step) {
|
|
|
338
339
|
/**
|
|
339
340
|
* The postcode lookup details form view model
|
|
340
341
|
* @param {PostcodeLookupSessionData} data
|
|
342
|
+
* @param {Translator} translator
|
|
341
343
|
* @param {PostcodeLookupDetailsData} [payload]
|
|
342
344
|
* @param {Error} [err]
|
|
343
345
|
*/
|
|
344
|
-
export function detailsViewModel(data, payload, err) {
|
|
346
|
+
export function detailsViewModel(data, translator, payload, err) {
|
|
345
347
|
const {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
+
componentId,
|
|
349
|
+
componentHint,
|
|
348
350
|
sourceUrl,
|
|
349
|
-
|
|
351
|
+
languages
|
|
350
352
|
} = data.initial;
|
|
353
|
+
const {
|
|
354
|
+
t,
|
|
355
|
+
tComponent,
|
|
356
|
+
tForm
|
|
357
|
+
} = translator;
|
|
358
|
+
const component = /** @type {ComponentDef} */{
|
|
359
|
+
id: componentId
|
|
360
|
+
};
|
|
351
361
|
const backLink = {
|
|
352
|
-
href: sourceUrl
|
|
362
|
+
href: sourceUrl,
|
|
363
|
+
text: t(COMMON_BACK)
|
|
353
364
|
};
|
|
354
365
|
const {
|
|
355
366
|
errors,
|
|
356
367
|
postcodeQueryError,
|
|
357
368
|
buildingNameQueryError
|
|
358
369
|
} = buildErrors(err);
|
|
359
|
-
const fields = getDetailsFields(payload ?? data.details, postcodeQueryError, buildingNameQueryError, language);
|
|
370
|
+
const fields = getDetailsFields(payload ?? data.details, postcodeQueryError, buildingNameQueryError, translator.language);
|
|
371
|
+
const hint = componentHint && {
|
|
372
|
+
text: tComponent(component, 'hint')
|
|
373
|
+
};
|
|
360
374
|
const continueButton = {
|
|
361
|
-
text:
|
|
375
|
+
text: t('postcodeLookup.findAddress'),
|
|
362
376
|
classes: GOVUK_MARGIN_RIGHT_1
|
|
363
377
|
};
|
|
364
378
|
const manualLink = {
|
|
365
|
-
text:
|
|
379
|
+
text: t('postcodeLookup.enterManually'),
|
|
366
380
|
href: getHref(steps.manual)
|
|
367
381
|
};
|
|
382
|
+
const selector = languages?.length ? {
|
|
383
|
+
languages
|
|
384
|
+
} : {};
|
|
368
385
|
return {
|
|
369
386
|
step: steps.details,
|
|
370
387
|
showTitle: true,
|
|
371
|
-
name:
|
|
388
|
+
name: tForm('title'),
|
|
372
389
|
serviceUrl: sourceUrl,
|
|
373
|
-
pageTitle,
|
|
390
|
+
pageTitle: tComponent(component, 'title'),
|
|
391
|
+
hint,
|
|
374
392
|
backLink,
|
|
375
393
|
errors,
|
|
376
394
|
fields,
|
|
377
395
|
buttons: {
|
|
378
396
|
continueButton,
|
|
379
397
|
manualLink
|
|
380
|
-
}
|
|
398
|
+
},
|
|
399
|
+
t,
|
|
400
|
+
language: translator.language,
|
|
401
|
+
...selector
|
|
381
402
|
};
|
|
382
403
|
}
|
|
383
404
|
|
|
384
405
|
/**
|
|
385
406
|
* The postcode lookup select form view model
|
|
386
407
|
* @param {{ session: PostcodeLookupSessionData, apiKey: string }} data
|
|
408
|
+
* @param {Translator} translator
|
|
387
409
|
* @param {PostcodeLookupSelectPayload} [payload]
|
|
388
410
|
* @param {Error} [err]
|
|
389
411
|
*/
|
|
390
|
-
export async function selectViewModel(data, payload, err) {
|
|
412
|
+
export async function selectViewModel(data, translator, payload, err) {
|
|
391
413
|
const {
|
|
392
414
|
session,
|
|
393
415
|
apiKey
|
|
@@ -400,7 +422,12 @@ export async function selectViewModel(data, payload, err) {
|
|
|
400
422
|
postcodeQuery,
|
|
401
423
|
buildingNameQuery
|
|
402
424
|
} = details;
|
|
403
|
-
const
|
|
425
|
+
const {
|
|
426
|
+
language,
|
|
427
|
+
t,
|
|
428
|
+
tComponent,
|
|
429
|
+
tForm
|
|
430
|
+
} = translator;
|
|
404
431
|
const {
|
|
405
432
|
hasAddresses,
|
|
406
433
|
hasMultipleAddresses,
|
|
@@ -408,39 +435,45 @@ export async function selectViewModel(data, payload, err) {
|
|
|
408
435
|
addresses,
|
|
409
436
|
addressCount
|
|
410
437
|
} = await getAddresses(postcodeQuery, buildingNameQuery, apiKey);
|
|
411
|
-
const title = hasAddresses ?
|
|
438
|
+
const title = hasAddresses ? tComponent(/** @type {ComponentDef} */{
|
|
439
|
+
id: initial.componentId
|
|
440
|
+
}, 'title') : t('postcodeLookup.noAddressFoundTitle');
|
|
412
441
|
const formPath = initial.sourceUrl;
|
|
413
442
|
const href = getHref();
|
|
414
443
|
const backLink = {
|
|
415
|
-
href
|
|
444
|
+
href,
|
|
445
|
+
text: t(COMMON_BACK)
|
|
416
446
|
};
|
|
417
447
|
const {
|
|
418
448
|
errors,
|
|
419
449
|
uprnError
|
|
420
450
|
} = buildErrors(err);
|
|
421
451
|
const fields = getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses, language);
|
|
422
|
-
const searchAgainText =
|
|
452
|
+
const searchAgainText = t('postcodeLookup.searchAgain');
|
|
423
453
|
const searchAgainLink = {
|
|
424
454
|
text: searchAgainText,
|
|
425
455
|
href
|
|
426
456
|
};
|
|
427
457
|
const continueButton = {
|
|
428
458
|
href: hasAddresses ? undefined : href,
|
|
429
|
-
text: hasAddresses ?
|
|
459
|
+
text: hasAddresses ? t('postcodeLookup.useThisAddress') : searchAgainText,
|
|
430
460
|
classes: GOVUK_MARGIN_RIGHT_1
|
|
431
461
|
};
|
|
432
462
|
const manualLink = {
|
|
433
|
-
text:
|
|
463
|
+
text: t('postcodeLookup.enterManually'),
|
|
434
464
|
href: `${href}?step=${steps.manual}`
|
|
435
465
|
};
|
|
436
|
-
const addressesFoundText = hasAddresses ?
|
|
466
|
+
const addressesFoundText = hasAddresses ? t('postcodeLookup.addressFound', {
|
|
437
467
|
count: addressCount
|
|
438
468
|
}) : undefined;
|
|
439
|
-
const noAddressFoundText = !hasAddresses ?
|
|
469
|
+
const noAddressFoundText = !hasAddresses ? t('postcodeLookup.noAddressFoundBody') : undefined;
|
|
470
|
+
const selector = initial.languages?.length ? {
|
|
471
|
+
languages: initial.languages
|
|
472
|
+
} : {};
|
|
440
473
|
return {
|
|
441
474
|
step: steps.select,
|
|
442
475
|
showTitle: true,
|
|
443
|
-
name: title,
|
|
476
|
+
name: tForm('title'),
|
|
444
477
|
serviceUrl: formPath,
|
|
445
478
|
pageTitle: title,
|
|
446
479
|
backLink,
|
|
@@ -457,27 +490,40 @@ export async function selectViewModel(data, payload, err) {
|
|
|
457
490
|
buttons: {
|
|
458
491
|
continueButton,
|
|
459
492
|
manualLink
|
|
460
|
-
}
|
|
493
|
+
},
|
|
494
|
+
t,
|
|
495
|
+
language,
|
|
496
|
+
...selector
|
|
461
497
|
};
|
|
462
498
|
}
|
|
463
499
|
|
|
464
500
|
/**
|
|
465
501
|
* The postcode lookup manual form view model
|
|
466
502
|
* @param {PostcodeLookupSessionData} data
|
|
503
|
+
* @param {Translator} translator
|
|
467
504
|
* @param {PostcodeLookupManualPayload} [payload]
|
|
468
505
|
* @param {Error} [err]
|
|
469
506
|
*/
|
|
470
|
-
export function manualViewModel(data, payload, err) {
|
|
507
|
+
export function manualViewModel(data, translator, payload, err) {
|
|
471
508
|
const {
|
|
472
|
-
|
|
509
|
+
componentId,
|
|
473
510
|
sourceUrl,
|
|
474
511
|
componentHint,
|
|
475
|
-
|
|
512
|
+
languages
|
|
476
513
|
} = data.initial;
|
|
477
514
|
const formPath = sourceUrl;
|
|
478
515
|
const href = getHref();
|
|
516
|
+
const {
|
|
517
|
+
t,
|
|
518
|
+
tComponent,
|
|
519
|
+
tForm
|
|
520
|
+
} = translator;
|
|
521
|
+
const component = /** @type {ComponentDef} */{
|
|
522
|
+
id: componentId
|
|
523
|
+
};
|
|
479
524
|
const backLink = {
|
|
480
|
-
href
|
|
525
|
+
href,
|
|
526
|
+
text: t(COMMON_BACK)
|
|
481
527
|
};
|
|
482
528
|
const {
|
|
483
529
|
errors,
|
|
@@ -488,23 +534,26 @@ export function manualViewModel(data, payload, err) {
|
|
|
488
534
|
postcodeError
|
|
489
535
|
} = buildErrors(err);
|
|
490
536
|
const hint = componentHint && {
|
|
491
|
-
text:
|
|
537
|
+
text: tComponent(component, 'hint')
|
|
492
538
|
};
|
|
493
|
-
const fields = getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError, language);
|
|
539
|
+
const fields = getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError, translator.language);
|
|
494
540
|
const continueButton = {
|
|
495
|
-
text:
|
|
541
|
+
text: t('postcodeLookup.useThisAddress'),
|
|
496
542
|
classes: GOVUK_MARGIN_RIGHT_1
|
|
497
543
|
};
|
|
498
544
|
const detailsLink = {
|
|
499
|
-
text:
|
|
545
|
+
text: t('postcodeLookup.findAnAddressInstead'),
|
|
500
546
|
href
|
|
501
547
|
};
|
|
548
|
+
const selector = languages?.length ? {
|
|
549
|
+
languages
|
|
550
|
+
} : {};
|
|
502
551
|
return {
|
|
503
552
|
step: steps.manual,
|
|
504
553
|
showTitle: true,
|
|
505
|
-
name:
|
|
554
|
+
name: tForm('title'),
|
|
506
555
|
serviceUrl: formPath,
|
|
507
|
-
pageTitle:
|
|
556
|
+
pageTitle: tComponent(component, 'title'),
|
|
508
557
|
backLink,
|
|
509
558
|
errors,
|
|
510
559
|
hint,
|
|
@@ -512,7 +561,10 @@ export function manualViewModel(data, payload, err) {
|
|
|
512
561
|
buttons: {
|
|
513
562
|
continueButton,
|
|
514
563
|
detailsLink
|
|
515
|
-
}
|
|
564
|
+
},
|
|
565
|
+
t,
|
|
566
|
+
language: translator.language,
|
|
567
|
+
...selector
|
|
516
568
|
};
|
|
517
569
|
}
|
|
518
570
|
|
|
@@ -520,6 +572,8 @@ export function manualViewModel(data, payload, err) {
|
|
|
520
572
|
|
|
521
573
|
/**
|
|
522
574
|
* @import { ObjectSchema, ValidationErrorItem } from 'joi'
|
|
575
|
+
* @import { ComponentDef } from '@defra/forms-model'
|
|
523
576
|
* @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js'
|
|
577
|
+
* @import { Translator } from '../../../../server/plugins/engine/i18n/types.js'
|
|
524
578
|
*/
|
|
525
579
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Joi","t","i18nT","service","crumbSchema","postcodeQueryFieldName","buildingNameQueryFieldName","uprnFieldName","line1FieldName","line2FieldName","townFieldName","countyFieldName","postcodeFieldName","GOVUK_MARGIN_RIGHT_1","steps","details","select","manual","JOURNEY_BASE_URL","buildErrors","err","hasErrors","isError","length","getError","fieldName","find","item","path","postcodeQueryError","buildingNameQueryError","uprnError","line1Error","line2Error","townError","countyError","postcodeError","errors","pushError","push","text","message","href","getAddresses","postcodeQuery","buildingNameQuery","apiKey","addresses","search","addressCount","singleAddress","at","undefined","hasAddresses","hasMultipleAddresses","getDetailsFields","language","id","name","label","hint","value","errorMessage","getSelectFields","payload","selectAddressText","type","uprn","items","concat","map","formatted","getManualFields","addressLine1","addressLine2","classes","town","county","postcode","stepSchema","string","valid","Object","keys","required","sharedPayloadSchemaKeys","crumb","step","createDetailsPayloadSchema","object","pattern","trim","messages","allow","createSelectPayloadSchema","createManualPayloadSchema","getHref","query","detailsViewModel","data","componentTitle","pageTitle","formName","sourceUrl","initial","backLink","fields","continueButton","manualLink","showTitle","serviceUrl","buttons","selectViewModel","session","title","formPath","searchAgainText","searchAgainLink","addressesFoundText","count","noAddressFoundText","manualViewModel","componentHint","detailsLink"],"sources":["../../../../../src/server/plugins/postcode-lookup/models/index.js"],"sourcesContent":["import Joi from 'joi'\n\nimport { t as i18nT } from '~/src/server/plugins/engine/i18n/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\nimport { crumbSchema } from '~/src/server/schemas/index.js'\n\n// Field names/ids\nconst postcodeQueryFieldName = 'postcodeQuery'\nconst buildingNameQueryFieldName = 'buildingNameQuery'\nconst uprnFieldName = 'uprn'\n\nconst line1FieldName = 'addressLine1'\nconst line2FieldName = 'addressLine2'\nconst townFieldName = 'town'\nconst countyFieldName = 'county'\nconst postcodeFieldName = 'postcode'\n\nconst GOVUK_MARGIN_RIGHT_1 = 'govuk-!-margin-right-1'\n\nexport const steps = {\n // Step 1: Postcode/building name input\n details: 'details',\n // Step 2: Select address\n select: 'select',\n // Step 3: Manual address\n manual: 'manual'\n}\n\nexport const JOURNEY_BASE_URL = '/postcode-lookup'\n\n/**\n * Build form errors\n * @param {Error} [err]\n */\nfunction buildErrors(err) {\n const hasErrors = Joi.isError(err) && err.details.length > 0\n\n if (!hasErrors) {\n return {}\n }\n\n /**\n * Get error by path\n * @param {string} fieldName\n */\n const getError = (fieldName) => {\n return err.details.find((item) => item.path[0] === fieldName)\n }\n\n const postcodeQueryError = getError(postcodeQueryFieldName)\n const buildingNameQueryError = getError(buildingNameQueryFieldName)\n const uprnError = getError(uprnFieldName)\n const line1Error = getError(line1FieldName)\n const line2Error = getError(line2FieldName)\n const townError = getError(townFieldName)\n const countyError = getError(countyFieldName)\n const postcodeError = getError(postcodeFieldName)\n\n /**\n * @type {{ text: string, href: string }[]}\n */\n const errors = []\n\n /**\n * Push error\n * @param {string} fieldName - the field name\n * @param {ValidationErrorItem} [item] - the joi validation error\n */\n const pushError = (fieldName, item) => {\n if (item) {\n errors.push({\n text: item.message,\n href: `#${fieldName}`\n })\n }\n }\n\n pushError(postcodeQueryFieldName, postcodeQueryError)\n pushError(buildingNameQueryFieldName, buildingNameQueryError)\n pushError(uprnFieldName, uprnError)\n pushError(line1FieldName, line1Error)\n pushError(line2FieldName, line2Error)\n pushError(townFieldName, townError)\n pushError(countyFieldName, countyError)\n pushError(postcodeFieldName, postcodeError)\n\n return {\n errors,\n postcodeQueryError,\n buildingNameQueryError,\n uprnError,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n }\n}\n\n/**\n * Search ordnance survey for addresses\n * @param {string} postcodeQuery\n * @param {string} buildingNameQuery\n * @param {string} apiKey\n */\nasync function getAddresses(postcodeQuery, buildingNameQuery, apiKey) {\n const addresses = await service.search(\n postcodeQuery,\n buildingNameQuery,\n apiKey\n )\n const addressCount = addresses.length\n const singleAddress = addressCount === 1 ? addresses.at(0) : undefined\n const hasAddresses = addressCount > 0\n const hasMultipleAddresses = addressCount > 1\n\n return {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n }\n}\n\n/**\n * Get the details view fields\n * @param {PostcodeLookupDetailsData | undefined} details\n * @param {OptionalValidationErrorItem} postcodeQueryError\n * @param {OptionalValidationErrorItem} buildingNameQueryError\n * @param {string} language\n */\nfunction getDetailsFields(\n details,\n postcodeQueryError,\n buildingNameQueryError,\n language\n) {\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n label: {\n text: i18nT('postcodeLookup.postcodeLabel', language)\n },\n hint: {\n text: i18nT('postcodeLookup.postcodeHint', language)\n },\n value: details?.postcodeQuery,\n errorMessage: postcodeQueryError && { text: postcodeQueryError.message }\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n label: {\n text: i18nT('postcodeLookup.buildingNameLabel', language)\n },\n hint: {\n text: i18nT('postcodeLookup.buildingNameHint', language)\n },\n value: details?.buildingNameQuery,\n errorMessage: buildingNameQueryError && {\n text: buildingNameQueryError.message\n }\n }\n }\n}\n\n/**\n * Get the select view fields\n * @param {PostcodeLookupDetailsData} details\n * @param {boolean} hasMultipleAddresses\n * @param {Address | undefined} singleAddress\n * @param {PostcodeLookupSelectPayload | undefined} payload\n * @param {OptionalValidationErrorItem} uprnError\n * @param {Address[]} addresses\n * @param {string} language\n */\nfunction getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses,\n language\n) {\n const selectAddressText = i18nT('postcodeLookup.selectAddress', language)\n\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n type: 'hidden',\n value: details.postcodeQuery\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n type: 'hidden',\n value: details.buildingNameQuery\n },\n [uprnFieldName]: {\n id: uprnFieldName,\n name: uprnFieldName,\n label: hasMultipleAddresses\n ? {\n text: selectAddressText\n }\n : undefined,\n value: singleAddress ? singleAddress.uprn : payload?.uprn,\n errorMessage: uprnError && { text: uprnError.message },\n items: hasMultipleAddresses\n ? [{ text: selectAddressText, value: '' }].concat(\n addresses.map((item) => ({\n text: item.formatted,\n value: item.uprn\n }))\n )\n : undefined,\n type: singleAddress ? 'hidden' : undefined\n }\n }\n}\n\n/**\n * Get the manual view fields\n * @param {PostcodeLookupManualPayload | undefined} payload\n * @param {OptionalValidationErrorItem} line1Error\n * @param {OptionalValidationErrorItem} line2Error\n * @param {OptionalValidationErrorItem} townError\n * @param {OptionalValidationErrorItem} countyError\n * @param {OptionalValidationErrorItem} postcodeError\n * @param {string} language\n */\nfunction getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError,\n language\n) {\n return {\n [line1FieldName]: {\n id: line1FieldName,\n name: line1FieldName,\n label: {\n text: i18nT('postcodeLookup.addressLine1Label', language)\n },\n value: payload?.addressLine1,\n errorMessage: line1Error && { text: line1Error.message }\n },\n [line2FieldName]: {\n id: line2FieldName,\n name: line2FieldName,\n label: {\n text: i18nT('postcodeLookup.addressLine2Label', language)\n },\n value: payload?.addressLine2,\n errorMessage: line2Error && { text: line2Error.message }\n },\n [townFieldName]: {\n id: townFieldName,\n name: townFieldName,\n label: {\n text: i18nT('postcodeLookup.townLabel', language)\n },\n classes: 'govuk-!-width-two-thirds',\n value: payload?.town,\n errorMessage: townError && { text: townError.message }\n },\n [countyFieldName]: {\n id: countyFieldName,\n name: countyFieldName,\n label: {\n text: i18nT('postcodeLookup.countyLabel', language)\n },\n value: payload?.county,\n errorMessage: countyError && { text: countyError.message }\n },\n [postcodeFieldName]: {\n id: postcodeFieldName,\n name: postcodeFieldName,\n label: {\n text: i18nT('postcodeLookup.postcodeLabel', language)\n },\n classes: 'govuk-input--width-10',\n value: payload?.postcode,\n errorMessage: postcodeError && { text: postcodeError.message }\n }\n }\n}\n\nexport const stepSchema = Joi.string()\n .valid(...Object.keys(steps))\n .required()\n\nconst sharedPayloadSchemaKeys = {\n crumb: crumbSchema,\n step: stepSchema\n}\n\n/**\n * Postcode lookup details form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupDetailsPayload>}\n */\nexport function createDetailsPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [postcodeQueryFieldName]: Joi.string()\n .pattern(/^[a-zA-Z]{1,2}\\d[a-zA-Z\\d]?\\s?\\d[a-zA-Z]{2}$/)\n .trim()\n .required()\n .messages({\n 'string.pattern.base': i18nT(\n 'postcodeLookup.validation.invalidPostcode',\n language\n ),\n '*': i18nT('postcodeLookup.validation.requiredPostcode', language)\n }),\n [buildingNameQueryFieldName]: Joi.string()\n .trim()\n .required()\n .allow('')\n .trim()\n })\n .required()\n}\n\n/**\n * Postcode lookup select form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupSelectPayload>}\n */\nexport function createSelectPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [uprnFieldName]: Joi.string()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.selectAddress', language)\n })\n })\n .required()\n}\n\n/**\n * Postcode lookup manual form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupManualPayload>}\n */\nexport function createManualPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [line1FieldName]: Joi.string()\n .trim()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.requiredAddressLine1', language)\n }),\n [line2FieldName]: Joi.string().trim().allow('').required(),\n [townFieldName]: Joi.string()\n .trim()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.requiredTown', language)\n }),\n [countyFieldName]: Joi.string().trim().allow('').required(),\n [postcodeFieldName]: Joi.string()\n .pattern(/^[a-zA-Z]{1,2}\\d[a-zA-Z\\d]?\\s?\\d[a-zA-Z]{2}$/)\n .trim()\n .required()\n .messages({\n 'string.pattern.base': i18nT(\n 'postcodeLookup.validation.invalidManualPostcode',\n language\n ),\n '*': i18nT(\n 'postcodeLookup.validation.requiredManualPostcode',\n language\n )\n })\n })\n .required()\n}\n\n/**\n * Get the postcode lookup href\n * @param {string} [step] - the postcode lookup step\n */\nfunction getHref(step) {\n const query = step ? `?step=${step}` : ''\n\n return `${JOURNEY_BASE_URL}${query}`\n}\n\n/**\n * The postcode lookup details form view model\n * @param {PostcodeLookupSessionData} data\n * @param {PostcodeLookupDetailsData} [payload]\n * @param {Error} [err]\n */\nexport function detailsViewModel(data, payload, err) {\n const {\n componentTitle: pageTitle,\n formName,\n sourceUrl,\n language = 'en-GB'\n } = data.initial\n\n const backLink = {\n href: sourceUrl\n }\n\n const { errors, postcodeQueryError, buildingNameQueryError } =\n buildErrors(err)\n\n const fields = getDetailsFields(\n payload ?? data.details,\n postcodeQueryError,\n buildingNameQueryError,\n language\n )\n\n const continueButton = {\n text: i18nT('postcodeLookup.findAddress', language),\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: i18nT('postcodeLookup.enterManually', language),\n href: getHref(steps.manual)\n }\n\n return {\n step: steps.details,\n showTitle: true,\n name: formName,\n serviceUrl: sourceUrl,\n pageTitle,\n backLink,\n errors,\n fields,\n buttons: { continueButton, manualLink }\n }\n}\n\n/**\n * The postcode lookup select form view model\n * @param {{ session: PostcodeLookupSessionData, apiKey: string }} data\n * @param {PostcodeLookupSelectPayload} [payload]\n * @param {Error} [err]\n */\nexport async function selectViewModel(data, payload, err) {\n const { session, apiKey } = data\n const { details, initial } = session\n const { postcodeQuery, buildingNameQuery } = details\n const language = initial.language ?? 'en-GB'\n\n const {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n } = await getAddresses(postcodeQuery, buildingNameQuery, apiKey)\n\n const title = hasAddresses\n ? initial.componentTitle\n : i18nT('postcodeLookup.noAddressFoundTitle', language)\n const formPath = initial.sourceUrl\n const href = getHref()\n\n const backLink = { href }\n\n const { errors, uprnError } = buildErrors(err)\n\n const fields = getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses,\n language\n )\n\n const searchAgainText = i18nT('postcodeLookup.searchAgain', language)\n\n const searchAgainLink = {\n text: searchAgainText,\n href\n }\n\n const continueButton = {\n href: hasAddresses ? undefined : href,\n text: hasAddresses\n ? i18nT('postcodeLookup.useThisAddress', language)\n : searchAgainText,\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: i18nT('postcodeLookup.enterManually', language),\n href: `${href}?step=${steps.manual}`\n }\n\n const addressesFoundText = hasAddresses\n ? i18nT('postcodeLookup.addressFound', language, { count: addressCount })\n : undefined\n const noAddressFoundText = !hasAddresses\n ? i18nT('postcodeLookup.noAddressFoundBody', language)\n : undefined\n\n return {\n step: steps.select,\n showTitle: true,\n name: title,\n serviceUrl: formPath,\n pageTitle: title,\n backLink,\n errors,\n searchAgainLink,\n fields,\n details,\n addressCount,\n singleAddress,\n hasAddresses,\n hasMultipleAddresses,\n addressesFoundText,\n noAddressFoundText,\n buttons: { continueButton, manualLink }\n }\n}\n\n/**\n * The postcode lookup manual form view model\n * @param {PostcodeLookupSessionData} data\n * @param {PostcodeLookupManualPayload} [payload]\n * @param {Error} [err]\n */\nexport function manualViewModel(data, payload, err) {\n const {\n componentTitle,\n sourceUrl,\n componentHint,\n language = 'en-GB'\n } = data.initial\n const formPath = sourceUrl\n const href = getHref()\n\n const backLink = {\n href\n }\n\n const {\n errors,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n } = buildErrors(err)\n\n const hint = componentHint && {\n text: componentHint\n }\n\n const fields = getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError,\n language\n )\n\n const continueButton = {\n text: i18nT('postcodeLookup.useThisAddress', language),\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const detailsLink = {\n text: i18nT('postcodeLookup.findAnAddressInstead', language),\n href\n }\n\n return {\n step: steps.manual,\n showTitle: true,\n name: componentTitle,\n serviceUrl: formPath,\n pageTitle: componentTitle,\n backLink,\n errors,\n hint,\n fields,\n buttons: { continueButton, detailsLink }\n }\n}\n\n/** @typedef { ValidationErrorItem | undefined } OptionalValidationErrorItem */\n\n/**\n * @import { ObjectSchema, ValidationErrorItem } from 'joi'\n * @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Joi","t","i18nT","service","crumbSchema","postcodeQueryFieldName","buildingNameQueryFieldName","uprnFieldName","line1FieldName","line2FieldName","townFieldName","countyFieldName","postcodeFieldName","GOVUK_MARGIN_RIGHT_1","COMMON_BACK","steps","details","select","manual","JOURNEY_BASE_URL","buildErrors","err","hasErrors","isError","length","getError","fieldName","find","item","path","postcodeQueryError","buildingNameQueryError","uprnError","line1Error","line2Error","townError","countyError","postcodeError","errors","pushError","push","text","message","href","getAddresses","postcodeQuery","buildingNameQuery","apiKey","addresses","search","addressCount","singleAddress","at","undefined","hasAddresses","hasMultipleAddresses","getDetailsFields","language","id","name","label","hint","value","errorMessage","getSelectFields","payload","selectAddressText","type","uprn","items","concat","map","formatted","getManualFields","addressLine1","addressLine2","classes","town","county","postcode","stepSchema","string","valid","Object","keys","required","sharedPayloadSchemaKeys","crumb","step","createDetailsPayloadSchema","object","pattern","trim","messages","allow","createSelectPayloadSchema","createManualPayloadSchema","getHref","query","detailsViewModel","data","translator","componentId","componentHint","sourceUrl","languages","initial","tComponent","tForm","component","backLink","fields","continueButton","manualLink","selector","showTitle","serviceUrl","pageTitle","buttons","selectViewModel","session","title","formPath","searchAgainText","searchAgainLink","addressesFoundText","count","noAddressFoundText","manualViewModel","detailsLink"],"sources":["../../../../../src/server/plugins/postcode-lookup/models/index.js"],"sourcesContent":["import Joi from 'joi'\n\nimport { t as i18nT } from '~/src/server/plugins/engine/i18n/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\nimport { crumbSchema } from '~/src/server/schemas/index.js'\n\n// Field names/ids\nconst postcodeQueryFieldName = 'postcodeQuery'\nconst buildingNameQueryFieldName = 'buildingNameQuery'\nconst uprnFieldName = 'uprn'\n\nconst line1FieldName = 'addressLine1'\nconst line2FieldName = 'addressLine2'\nconst townFieldName = 'town'\nconst countyFieldName = 'county'\nconst postcodeFieldName = 'postcode'\n\nconst GOVUK_MARGIN_RIGHT_1 = 'govuk-!-margin-right-1'\nconst COMMON_BACK = 'common.back'\n\nexport const steps = {\n // Step 1: Postcode/building name input\n details: 'details',\n // Step 2: Select address\n select: 'select',\n // Step 3: Manual address\n manual: 'manual'\n}\n\nexport const JOURNEY_BASE_URL = '/postcode-lookup'\n\n/**\n * Build form errors\n * @param {Error} [err]\n */\nfunction buildErrors(err) {\n const hasErrors = Joi.isError(err) && err.details.length > 0\n\n if (!hasErrors) {\n return {}\n }\n\n /**\n * Get error by path\n * @param {string} fieldName\n */\n const getError = (fieldName) => {\n return err.details.find((item) => item.path[0] === fieldName)\n }\n\n const postcodeQueryError = getError(postcodeQueryFieldName)\n const buildingNameQueryError = getError(buildingNameQueryFieldName)\n const uprnError = getError(uprnFieldName)\n const line1Error = getError(line1FieldName)\n const line2Error = getError(line2FieldName)\n const townError = getError(townFieldName)\n const countyError = getError(countyFieldName)\n const postcodeError = getError(postcodeFieldName)\n\n /**\n * @type {{ text: string, href: string }[]}\n */\n const errors = []\n\n /**\n * Push error\n * @param {string} fieldName - the field name\n * @param {ValidationErrorItem} [item] - the joi validation error\n */\n const pushError = (fieldName, item) => {\n if (item) {\n errors.push({\n text: item.message,\n href: `#${fieldName}`\n })\n }\n }\n\n pushError(postcodeQueryFieldName, postcodeQueryError)\n pushError(buildingNameQueryFieldName, buildingNameQueryError)\n pushError(uprnFieldName, uprnError)\n pushError(line1FieldName, line1Error)\n pushError(line2FieldName, line2Error)\n pushError(townFieldName, townError)\n pushError(countyFieldName, countyError)\n pushError(postcodeFieldName, postcodeError)\n\n return {\n errors,\n postcodeQueryError,\n buildingNameQueryError,\n uprnError,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n }\n}\n\n/**\n * Search ordnance survey for addresses\n * @param {string} postcodeQuery\n * @param {string} buildingNameQuery\n * @param {string} apiKey\n */\nasync function getAddresses(postcodeQuery, buildingNameQuery, apiKey) {\n const addresses = await service.search(\n postcodeQuery,\n buildingNameQuery,\n apiKey\n )\n const addressCount = addresses.length\n const singleAddress = addressCount === 1 ? addresses.at(0) : undefined\n const hasAddresses = addressCount > 0\n const hasMultipleAddresses = addressCount > 1\n\n return {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n }\n}\n\n/**\n * Get the details view fields\n * @param {PostcodeLookupDetailsData | undefined} details\n * @param {OptionalValidationErrorItem} postcodeQueryError\n * @param {OptionalValidationErrorItem} buildingNameQueryError\n * @param {string} language\n */\nfunction getDetailsFields(\n details,\n postcodeQueryError,\n buildingNameQueryError,\n language\n) {\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n label: {\n text: i18nT('postcodeLookup.postcodeLabel', language)\n },\n hint: {\n text: i18nT('postcodeLookup.postcodeHint', language)\n },\n value: details?.postcodeQuery,\n errorMessage: postcodeQueryError && { text: postcodeQueryError.message }\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n label: {\n text: i18nT('postcodeLookup.buildingNameLabel', language)\n },\n hint: {\n text: i18nT('postcodeLookup.buildingNameHint', language)\n },\n value: details?.buildingNameQuery,\n errorMessage: buildingNameQueryError && {\n text: buildingNameQueryError.message\n }\n }\n }\n}\n\n/**\n * Get the select view fields\n * @param {PostcodeLookupDetailsData} details\n * @param {boolean} hasMultipleAddresses\n * @param {Address | undefined} singleAddress\n * @param {PostcodeLookupSelectPayload | undefined} payload\n * @param {OptionalValidationErrorItem} uprnError\n * @param {Address[]} addresses\n * @param {string} language\n */\nfunction getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses,\n language\n) {\n const selectAddressText = i18nT('postcodeLookup.selectAddress', language)\n\n return {\n [postcodeQueryFieldName]: {\n id: postcodeQueryFieldName,\n name: postcodeQueryFieldName,\n type: 'hidden',\n value: details.postcodeQuery\n },\n [buildingNameQueryFieldName]: {\n id: buildingNameQueryFieldName,\n name: buildingNameQueryFieldName,\n type: 'hidden',\n value: details.buildingNameQuery\n },\n [uprnFieldName]: {\n id: uprnFieldName,\n name: uprnFieldName,\n label: hasMultipleAddresses\n ? {\n text: selectAddressText\n }\n : undefined,\n value: singleAddress ? singleAddress.uprn : payload?.uprn,\n errorMessage: uprnError && { text: uprnError.message },\n items: hasMultipleAddresses\n ? [{ text: selectAddressText, value: '' }].concat(\n addresses.map((item) => ({\n text: item.formatted,\n value: item.uprn\n }))\n )\n : undefined,\n type: singleAddress ? 'hidden' : undefined\n }\n }\n}\n\n/**\n * Get the manual view fields\n * @param {PostcodeLookupManualPayload | undefined} payload\n * @param {OptionalValidationErrorItem} line1Error\n * @param {OptionalValidationErrorItem} line2Error\n * @param {OptionalValidationErrorItem} townError\n * @param {OptionalValidationErrorItem} countyError\n * @param {OptionalValidationErrorItem} postcodeError\n * @param {string} language\n */\nfunction getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError,\n language\n) {\n return {\n [line1FieldName]: {\n id: line1FieldName,\n name: line1FieldName,\n label: {\n text: i18nT('postcodeLookup.addressLine1Label', language)\n },\n value: payload?.addressLine1,\n errorMessage: line1Error && { text: line1Error.message }\n },\n [line2FieldName]: {\n id: line2FieldName,\n name: line2FieldName,\n label: {\n text: i18nT('postcodeLookup.addressLine2Label', language)\n },\n value: payload?.addressLine2,\n errorMessage: line2Error && { text: line2Error.message }\n },\n [townFieldName]: {\n id: townFieldName,\n name: townFieldName,\n label: {\n text: i18nT('postcodeLookup.townLabel', language)\n },\n classes: 'govuk-!-width-two-thirds',\n value: payload?.town,\n errorMessage: townError && { text: townError.message }\n },\n [countyFieldName]: {\n id: countyFieldName,\n name: countyFieldName,\n label: {\n text: i18nT('postcodeLookup.countyLabel', language)\n },\n value: payload?.county,\n errorMessage: countyError && { text: countyError.message }\n },\n [postcodeFieldName]: {\n id: postcodeFieldName,\n name: postcodeFieldName,\n label: {\n text: i18nT('postcodeLookup.postcodeLabel', language)\n },\n classes: 'govuk-input--width-10',\n value: payload?.postcode,\n errorMessage: postcodeError && { text: postcodeError.message }\n }\n }\n}\n\nexport const stepSchema = Joi.string()\n .valid(...Object.keys(steps))\n .required()\n\nconst sharedPayloadSchemaKeys = {\n crumb: crumbSchema,\n step: stepSchema\n}\n\n/**\n * Postcode lookup details form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupDetailsPayload>}\n */\nexport function createDetailsPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [postcodeQueryFieldName]: Joi.string()\n .pattern(/^[a-zA-Z]{1,2}\\d[a-zA-Z\\d]?\\s?\\d[a-zA-Z]{2}$/)\n .trim()\n .required()\n .messages({\n 'string.pattern.base': i18nT(\n 'postcodeLookup.validation.invalidPostcode',\n language\n ),\n '*': i18nT('postcodeLookup.validation.requiredPostcode', language)\n }),\n [buildingNameQueryFieldName]: Joi.string()\n .trim()\n .required()\n .allow('')\n .trim()\n })\n .required()\n}\n\n/**\n * Postcode lookup select form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupSelectPayload>}\n */\nexport function createSelectPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [uprnFieldName]: Joi.string()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.selectAddress', language)\n })\n })\n .required()\n}\n\n/**\n * Postcode lookup manual form payload schema\n * @param {string} [language]\n * @returns {ObjectSchema<PostcodeLookupManualPayload>}\n */\nexport function createManualPayloadSchema(language = 'en-GB') {\n return Joi.object()\n .keys({\n ...sharedPayloadSchemaKeys,\n [line1FieldName]: Joi.string()\n .trim()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.requiredAddressLine1', language)\n }),\n [line2FieldName]: Joi.string().trim().allow('').required(),\n [townFieldName]: Joi.string()\n .trim()\n .required()\n .messages({\n '*': i18nT('postcodeLookup.validation.requiredTown', language)\n }),\n [countyFieldName]: Joi.string().trim().allow('').required(),\n [postcodeFieldName]: Joi.string()\n .pattern(/^[a-zA-Z]{1,2}\\d[a-zA-Z\\d]?\\s?\\d[a-zA-Z]{2}$/)\n .trim()\n .required()\n .messages({\n 'string.pattern.base': i18nT(\n 'postcodeLookup.validation.invalidManualPostcode',\n language\n ),\n '*': i18nT(\n 'postcodeLookup.validation.requiredManualPostcode',\n language\n )\n })\n })\n .required()\n}\n\n/**\n * Get the postcode lookup href\n * @param {string} [step] - the postcode lookup step\n */\nfunction getHref(step) {\n const query = step ? `?step=${step}` : ''\n\n return `${JOURNEY_BASE_URL}${query}`\n}\n\n/**\n * The postcode lookup details form view model\n * @param {PostcodeLookupSessionData} data\n * @param {Translator} translator\n * @param {PostcodeLookupDetailsData} [payload]\n * @param {Error} [err]\n */\nexport function detailsViewModel(data, translator, payload, err) {\n const { componentId, componentHint, sourceUrl, languages } = data.initial\n\n const { t, tComponent, tForm } = translator\n\n const component = /** @type {ComponentDef} */ ({ id: componentId })\n\n const backLink = {\n href: sourceUrl,\n text: t(COMMON_BACK)\n }\n\n const { errors, postcodeQueryError, buildingNameQueryError } =\n buildErrors(err)\n\n const fields = getDetailsFields(\n payload ?? data.details,\n postcodeQueryError,\n buildingNameQueryError,\n translator.language\n )\n\n const hint = componentHint && {\n text: tComponent(component, 'hint')\n }\n\n const continueButton = {\n text: t('postcodeLookup.findAddress'),\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: t('postcodeLookup.enterManually'),\n href: getHref(steps.manual)\n }\n\n const selector = languages?.length ? { languages } : {}\n\n return {\n step: steps.details,\n showTitle: true,\n name: tForm('title'),\n serviceUrl: sourceUrl,\n pageTitle: tComponent(component, 'title'),\n hint,\n backLink,\n errors,\n fields,\n buttons: { continueButton, manualLink },\n t,\n language: translator.language,\n ...selector\n }\n}\n\n/**\n * The postcode lookup select form view model\n * @param {{ session: PostcodeLookupSessionData, apiKey: string }} data\n * @param {Translator} translator\n * @param {PostcodeLookupSelectPayload} [payload]\n * @param {Error} [err]\n */\nexport async function selectViewModel(data, translator, payload, err) {\n const { session, apiKey } = data\n const { details, initial } = session\n const { postcodeQuery, buildingNameQuery } = details\n const { language, t, tComponent, tForm } = translator\n\n const {\n hasAddresses,\n hasMultipleAddresses,\n singleAddress,\n addresses,\n addressCount\n } = await getAddresses(postcodeQuery, buildingNameQuery, apiKey)\n\n const title = hasAddresses\n ? tComponent(\n /** @type {ComponentDef} */ ({ id: initial.componentId }),\n 'title'\n )\n : t('postcodeLookup.noAddressFoundTitle')\n const formPath = initial.sourceUrl\n const href = getHref()\n\n const backLink = {\n href,\n text: t(COMMON_BACK)\n }\n\n const { errors, uprnError } = buildErrors(err)\n\n const fields = getSelectFields(\n details,\n hasMultipleAddresses,\n singleAddress,\n payload,\n uprnError,\n addresses,\n language\n )\n\n const searchAgainText = t('postcodeLookup.searchAgain')\n\n const searchAgainLink = {\n text: searchAgainText,\n href\n }\n\n const continueButton = {\n href: hasAddresses ? undefined : href,\n text: hasAddresses ? t('postcodeLookup.useThisAddress') : searchAgainText,\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const manualLink = {\n text: t('postcodeLookup.enterManually'),\n href: `${href}?step=${steps.manual}`\n }\n\n const addressesFoundText = hasAddresses\n ? t('postcodeLookup.addressFound', { count: addressCount })\n : undefined\n const noAddressFoundText = !hasAddresses\n ? t('postcodeLookup.noAddressFoundBody')\n : undefined\n\n const selector = initial.languages?.length\n ? { languages: initial.languages }\n : {}\n\n return {\n step: steps.select,\n showTitle: true,\n name: tForm('title'),\n serviceUrl: formPath,\n pageTitle: title,\n backLink,\n errors,\n searchAgainLink,\n fields,\n details,\n addressCount,\n singleAddress,\n hasAddresses,\n hasMultipleAddresses,\n addressesFoundText,\n noAddressFoundText,\n buttons: { continueButton, manualLink },\n t,\n language,\n ...selector\n }\n}\n\n/**\n * The postcode lookup manual form view model\n * @param {PostcodeLookupSessionData} data\n * @param {Translator} translator\n * @param {PostcodeLookupManualPayload} [payload]\n * @param {Error} [err]\n */\nexport function manualViewModel(data, translator, payload, err) {\n const { componentId, sourceUrl, componentHint, languages } = data.initial\n const formPath = sourceUrl\n const href = getHref()\n\n const { t, tComponent, tForm } = translator\n\n const component = /** @type {ComponentDef} */ ({ id: componentId })\n\n const backLink = {\n href,\n text: t(COMMON_BACK)\n }\n\n const {\n errors,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError\n } = buildErrors(err)\n\n const hint = componentHint && {\n text: tComponent(component, 'hint')\n }\n\n const fields = getManualFields(\n payload,\n line1Error,\n line2Error,\n townError,\n countyError,\n postcodeError,\n translator.language\n )\n\n const continueButton = {\n text: t('postcodeLookup.useThisAddress'),\n classes: GOVUK_MARGIN_RIGHT_1\n }\n const detailsLink = {\n text: t('postcodeLookup.findAnAddressInstead'),\n href\n }\n\n const selector = languages?.length ? { languages } : {}\n\n return {\n step: steps.manual,\n showTitle: true,\n name: tForm('title'),\n serviceUrl: formPath,\n pageTitle: tComponent(component, 'title'),\n backLink,\n errors,\n hint,\n fields,\n buttons: { continueButton, detailsLink },\n t,\n language: translator.language,\n ...selector\n }\n}\n\n/** @typedef { ValidationErrorItem | undefined } OptionalValidationErrorItem */\n\n/**\n * @import { ObjectSchema, ValidationErrorItem } from 'joi'\n * @import { ComponentDef } from '@defra/forms-model'\n * @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { Translator } from '~/src/server/plugins/engine/i18n/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the session state associated with this journey
|
|
3
|
+
* @param {PostcodeLookupRequest} request
|
|
4
|
+
*/
|
|
5
|
+
export function getSessionState(request: PostcodeLookupRequest): PostcodeLookupSessionData;
|
|
6
|
+
/**
|
|
7
|
+
* Get a cached translator, or create a new one if not in the cache
|
|
8
|
+
* @param {PostcodeLookupRequest} request
|
|
9
|
+
* @param {PostcodeLookupDispatchData} initial
|
|
10
|
+
* @param { string | string[] | undefined } language
|
|
11
|
+
*/
|
|
12
|
+
export function getDispatchTranslator(request: PostcodeLookupRequest, initial: PostcodeLookupDispatchData, language: string | string[] | undefined): Promise<import("../../engine/i18n/types.js").Translator>;
|
|
1
13
|
/**
|
|
2
14
|
* Initialises and dispatches the request to the postcode lookup journey
|
|
3
15
|
* @param {FormRequestPayload} request - the source page
|
|
@@ -10,9 +22,11 @@ export function dispatch(request: FormRequestPayload, h: FormResponseToolkit, in
|
|
|
10
22
|
* @param {PostcodeLookupConfiguration} options - ordnance survey api key
|
|
11
23
|
*/
|
|
12
24
|
export function getRoutes(options: PostcodeLookupConfiguration): (ServerRoute<PostcodeLookupGetRequestRefs> | ServerRoute<PostcodeLookupPostRequestRefs>)[];
|
|
25
|
+
import type { PostcodeLookupRequest } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
26
|
+
import type { PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
27
|
+
import type { PostcodeLookupDispatchData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
13
28
|
import type { FormRequestPayload } from '../../../../server/routes/types.js';
|
|
14
29
|
import type { FormResponseToolkit } from '../../../../server/routes/types.js';
|
|
15
|
-
import type { PostcodeLookupDispatchData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
16
30
|
import type { PostcodeLookupConfiguration } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
17
31
|
import type { PostcodeLookupGetRequestRefs } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
18
32
|
import type { ServerRoute } from '@hapi/hapi';
|
|
@@ -2,15 +2,17 @@ import Boom from '@hapi/boom';
|
|
|
2
2
|
import { StatusCodes } from 'http-status-codes';
|
|
3
3
|
import Joi from 'joi';
|
|
4
4
|
import { EXTERNAL_STATE_APPENDAGE } from "../../../constants.js";
|
|
5
|
+
import { getCachedPluginTranslator } from "../../engine/i18n/form.js";
|
|
5
6
|
import { JOURNEY_BASE_URL, createDetailsPayloadSchema, createManualPayloadSchema, createSelectPayloadSchema, detailsViewModel, manualViewModel, selectViewModel, stepSchema, steps } from "../models/index.js";
|
|
6
7
|
import * as service from "../service.js";
|
|
8
|
+
import { resolveLanguage } from "../../../utils/utils.js";
|
|
7
9
|
const viewName = 'postcode-lookup-details';
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Get the session state associated with this journey
|
|
11
13
|
* @param {PostcodeLookupRequest} request
|
|
12
14
|
*/
|
|
13
|
-
function getSessionState(request) {
|
|
15
|
+
export function getSessionState(request) {
|
|
14
16
|
/**
|
|
15
17
|
* @type {PostcodeLookupSessionData | null | undefined}
|
|
16
18
|
*/
|
|
@@ -46,6 +48,29 @@ function flashComponentState(request, componentName, address) {
|
|
|
46
48
|
};
|
|
47
49
|
request.yar.flash(EXTERNAL_STATE_APPENDAGE, appendage, true);
|
|
48
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Get a cached translator, or create a new one if not in the cache
|
|
53
|
+
* @param {PostcodeLookupRequest} request
|
|
54
|
+
* @param {PostcodeLookupDispatchData} initial
|
|
55
|
+
* @param { string | string[] | undefined } language
|
|
56
|
+
*/
|
|
57
|
+
export async function getDispatchTranslator(request, initial, language) {
|
|
58
|
+
const {
|
|
59
|
+
formId,
|
|
60
|
+
formStatus
|
|
61
|
+
} = initial;
|
|
62
|
+
|
|
63
|
+
// Override language if passed as a query param
|
|
64
|
+
if (language) {
|
|
65
|
+
request.yar.set('language', language);
|
|
66
|
+
}
|
|
67
|
+
const typedReq = /** @type {AnyFormRequest} */ /** @type {any} */request;
|
|
68
|
+
const lang = resolveLanguage(typedReq);
|
|
69
|
+
const translator = await getCachedPluginTranslator(typedReq, /** @type {FormMetadata} */{
|
|
70
|
+
id: formId
|
|
71
|
+
}, formStatus, lang);
|
|
72
|
+
return translator;
|
|
73
|
+
}
|
|
49
74
|
|
|
50
75
|
/**
|
|
51
76
|
* Initialises and dispatches the request to the postcode lookup journey
|
|
@@ -84,21 +109,24 @@ function getRoute() {
|
|
|
84
109
|
return {
|
|
85
110
|
method: 'GET',
|
|
86
111
|
path: JOURNEY_BASE_URL,
|
|
87
|
-
handler(request, h) {
|
|
112
|
+
async handler(request, h) {
|
|
88
113
|
const {
|
|
89
114
|
query
|
|
90
115
|
} = request;
|
|
91
116
|
const {
|
|
92
|
-
step
|
|
117
|
+
step,
|
|
118
|
+
language
|
|
93
119
|
} = query;
|
|
94
120
|
const session = getSessionState(request);
|
|
95
|
-
const
|
|
121
|
+
const translator = await getDispatchTranslator(request, session.initial, language);
|
|
122
|
+
const model = step === steps.manual ? manualViewModel(session, translator) : detailsViewModel(session, translator);
|
|
96
123
|
return h.view(viewName, model);
|
|
97
124
|
},
|
|
98
125
|
options: {
|
|
99
126
|
validate: {
|
|
100
127
|
query: Joi.object().keys({
|
|
101
|
-
step: Joi.string().allow(steps.details, steps.manual).optional()
|
|
128
|
+
step: Joi.string().allow(steps.details, steps.manual).optional(),
|
|
129
|
+
language: Joi.string().allow('en-GB', 'cy').optional()
|
|
102
130
|
}).optional()
|
|
103
131
|
}
|
|
104
132
|
}
|
|
@@ -158,14 +186,15 @@ async function detailsPostHandler(request, h, options) {
|
|
|
158
186
|
const {
|
|
159
187
|
ordnanceSurveyApiKey: apiKey
|
|
160
188
|
} = options;
|
|
161
|
-
const
|
|
189
|
+
const translator = await getDispatchTranslator(request, session.initial, request.query.language);
|
|
190
|
+
const language = translator.language;
|
|
162
191
|
const {
|
|
163
192
|
value: details,
|
|
164
193
|
error
|
|
165
194
|
} = createDetailsPayloadSchema(language).validate(request.payload);
|
|
166
195
|
let model;
|
|
167
196
|
if (error) {
|
|
168
|
-
model = detailsViewModel(session, details, error);
|
|
197
|
+
model = detailsViewModel(session, translator, details, error);
|
|
169
198
|
return h.view(viewName, model);
|
|
170
199
|
}
|
|
171
200
|
const {
|
|
@@ -182,7 +211,7 @@ async function detailsPostHandler(request, h, options) {
|
|
|
182
211
|
model = await selectViewModel({
|
|
183
212
|
session,
|
|
184
213
|
apiKey
|
|
185
|
-
});
|
|
214
|
+
}, translator);
|
|
186
215
|
return h.view(viewName, model);
|
|
187
216
|
}
|
|
188
217
|
|
|
@@ -197,7 +226,8 @@ async function selectPostHandler(request, h, options) {
|
|
|
197
226
|
const {
|
|
198
227
|
ordnanceSurveyApiKey: apiKey
|
|
199
228
|
} = options;
|
|
200
|
-
const
|
|
229
|
+
const translator = await getDispatchTranslator(request, session.initial, request.query.language);
|
|
230
|
+
const language = translator.language;
|
|
201
231
|
const {
|
|
202
232
|
value: select,
|
|
203
233
|
error
|
|
@@ -206,7 +236,7 @@ async function selectPostHandler(request, h, options) {
|
|
|
206
236
|
const model = await selectViewModel({
|
|
207
237
|
session,
|
|
208
238
|
apiKey
|
|
209
|
-
}, select, error);
|
|
239
|
+
}, translator, select, error);
|
|
210
240
|
return h.view(viewName, model);
|
|
211
241
|
}
|
|
212
242
|
const addresses = await service.searchByUPRN(select.uprn, apiKey);
|
|
@@ -229,9 +259,10 @@ async function selectPostHandler(request, h, options) {
|
|
|
229
259
|
* @param {PostcodeLookupPostRequest} request
|
|
230
260
|
* @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h
|
|
231
261
|
*/
|
|
232
|
-
function manualPostHandler(request, h) {
|
|
262
|
+
async function manualPostHandler(request, h) {
|
|
233
263
|
const session = getSessionState(request);
|
|
234
|
-
const
|
|
264
|
+
const translator = await getDispatchTranslator(request, session.initial, request.query.language);
|
|
265
|
+
const language = translator.language;
|
|
235
266
|
const {
|
|
236
267
|
value: manual,
|
|
237
268
|
error
|
|
@@ -239,7 +270,7 @@ function manualPostHandler(request, h) {
|
|
|
239
270
|
abortEarly: false
|
|
240
271
|
});
|
|
241
272
|
if (error) {
|
|
242
|
-
const model = manualViewModel(session, manual, error);
|
|
273
|
+
const model = manualViewModel(session, translator, manual, error);
|
|
243
274
|
return h.view(viewName, model);
|
|
244
275
|
}
|
|
245
276
|
const {
|
|
@@ -254,8 +285,9 @@ function manualPostHandler(request, h) {
|
|
|
254
285
|
|
|
255
286
|
/**
|
|
256
287
|
* @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'
|
|
257
|
-
* @import {
|
|
288
|
+
* @import { FormMetadata } from '@defra/forms-model'
|
|
289
|
+
* @import { PostcodeLookupManualPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js'
|
|
258
290
|
* @import { FormRequestPayload, FormResponseToolkit } from '../../../../server/routes/types.js'
|
|
259
|
-
* @import { ExternalStateAppendage } from '../../../../server/plugins/engine/types.js'
|
|
291
|
+
* @import { AnyFormRequest, ExternalStateAppendage } from '../../../../server/plugins/engine/types.js'
|
|
260
292
|
*/
|
|
261
293
|
//# sourceMappingURL=index.js.map
|