@defra/forms-engine-plugin 5.0.0-alpha.3 → 5.0.0-alpha.30
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/37c964ca545c240f010a.mjs +2 -0
- package/.public/37c964ca545c240f010a.mjs.LICENSE.txt +4 -0
- package/.public/assets-manifest.json +3 -0
- 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 +9 -0
- package/.public/javascripts/shared.min.js.map +1 -1
- package/.public/javascripts/vendor/@defra.min.js +1 -1
- package/.public/javascripts/vendor/@defra.min.js.map +1 -1
- package/.public/javascripts/vendor/maplibre-gl.min.js +1 -1
- package/.public/javascripts/vendor/maplibre-gl.min.js.LICENSE.txt +3 -3
- package/.public/javascripts/vendor/maplibre-gl.min.js.map +1 -1
- package/.public/stylesheets/application.min.css +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 +159 -5
- package/.server/client/javascripts/geospatial-map.js +161 -81
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.test.js +152 -0
- package/.server/client/javascripts/geospatial-map.test.js.map +1 -0
- 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 +55 -6
- 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 +17 -4
- package/.server/client/javascripts/map.js +59 -6
- 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/forms/components.json +8 -0
- package/.server/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
- 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 +8 -3
- package/.server/server/plugins/engine/components/AutocompleteField.js +17 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +23 -2
- 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 +2 -1
- 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 +12 -7
- 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 +6 -3
- 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 +23 -2
- 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 +3 -2
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js +31 -7
- 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 +22 -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 +2 -0
- package/.server/server/plugins/engine/components/PaymentField.js +9 -5
- 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/TrackingField.d.ts +21 -0
- package/.server/server/plugins/engine/components/TrackingField.js +46 -0
- package/.server/server/plugins/engine/components/TrackingField.js.map +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 +3 -2
- package/.server/server/plugins/engine/components/YesNoField.js +22 -8
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.d.ts +1 -1
- package/.server/server/plugins/engine/components/helpers/components.js +6 -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 +58 -17
- package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/index.d.ts +21 -1
- package/.server/server/plugins/engine/components/helpers/index.js +45 -1
- package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
- package/.server/server/plugins/engine/components/index.d.ts +1 -0
- package/.server/server/plugins/engine/components/index.js +1 -0
- package/.server/server/plugins/engine/components/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 +23 -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 +27 -5
- 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 +176 -7
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +110 -6
- package/.server/server/plugins/engine/i18n/types.d.ts +2 -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/options.js +2 -1
- package/.server/server/plugins/engine/options.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 +2 -2
- 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/plugin.js +3 -0
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/referenceNumbers.d.ts +1 -0
- package/.server/server/plugins/engine/referenceNumbers.js +1 -0
- package/.server/server/plugins/engine/referenceNumbers.js.map +1 -1
- package/.server/server/plugins/engine/routes/index.js +9 -4
- package/.server/server/plugins/engine/routes/index.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 +15 -4
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +24 -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/osgridreffield.html +4 -1
- package/.server/server/plugins/engine/views/components/trackingfield.html +3 -0
- 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/summary.html +1 -0
- package/.server/server/plugins/engine/views/unavailable.html +14 -11
- package/.server/server/plugins/map/routes/index.d.ts +4 -0
- package/.server/server/plugins/map/routes/index.js +12 -4
- package/.server/server/plugins/map/routes/index.js.map +1 -1
- package/.server/server/plugins/map/routes/index.test.js +7 -0
- package/.server/server/plugins/map/routes/index.test.js.map +1 -0
- package/.server/server/plugins/map/routes/vts/README.md +38 -0
- package/.server/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
- package/.server/server/plugins/map/routes/vts/countries.geojson +10 -39283
- package/.server/server/plugins/map/types.d.ts +24 -2
- package/.server/server/plugins/map/types.js +9 -2
- package/.server/server/plugins/map/types.js.map +1 -1
- package/.server/server/plugins/nunjucks/enviroment.test.js +11 -4
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
- 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 +103 -36
- 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 +64 -18
- 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/.server/typings/geodesy/index.d.js +2 -0
- package/.server/typings/geodesy/index.d.js.map +1 -0
- package/.server/typings/hapi/index.d.js.map +1 -1
- package/package.json +24 -9
- package/src/client/javascripts/file-upload.js +11 -3
- package/src/client/javascripts/geospatial-map.js +181 -86
- package/src/client/javascripts/govuk.js +2 -0
- package/src/client/javascripts/location-map.js +62 -6
- package/src/client/javascripts/map-constants.js +3 -0
- package/src/client/javascripts/map.js +66 -9
- 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/forms/components.json +8 -0
- package/src/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
- package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
- package/src/server/plugins/engine/components/AutocompleteField.ts +20 -0
- package/src/server/plugins/engine/components/CheckboxesField.ts +41 -8
- package/src/server/plugins/engine/components/ComponentBase.ts +6 -4
- package/src/server/plugins/engine/components/ComponentCollection.ts +17 -15
- package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
- package/src/server/plugins/engine/components/DeclarationField.ts +10 -10
- 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 +46 -5
- 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/ListFormComponent.ts +4 -4
- package/src/server/plugins/engine/components/LocationFieldBase.ts +41 -8
- 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 +24 -0
- package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
- package/src/server/plugins/engine/components/PaymentField.ts +9 -4
- package/src/server/plugins/engine/components/TrackingField.ts +64 -0
- package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
- package/src/server/plugins/engine/components/YesNoField.ts +27 -9
- package/src/server/plugins/engine/components/helpers/components.ts +8 -3
- package/src/server/plugins/engine/components/helpers/geospatial.ts +87 -24
- package/src/server/plugins/engine/components/helpers/index.ts +64 -1
- package/src/server/plugins/engine/components/index.ts +1 -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 +43 -12
- 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 +176 -7
- package/src/server/plugins/engine/i18n/translations/en-GB.json +110 -6
- package/src/server/plugins/engine/i18n/types.ts +2 -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/options.js +2 -1
- 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 +2 -2
- 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/plugin.ts +6 -0
- package/src/server/plugins/engine/referenceNumbers.ts +2 -0
- package/src/server/plugins/engine/routes/index.ts +9 -3
- package/src/server/plugins/engine/types/enums.ts +4 -3
- package/src/server/plugins/engine/types/schema.ts +22 -5
- package/src/server/plugins/engine/types.ts +28 -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/osgridreffield.html +4 -1
- package/src/server/plugins/engine/views/components/trackingfield.html +3 -0
- 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/summary.html +1 -0
- package/src/server/plugins/engine/views/unavailable.html +14 -11
- package/src/server/plugins/map/routes/index.js +29 -4
- package/src/server/plugins/map/routes/vts/README.md +38 -0
- package/src/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
- package/src/server/plugins/map/routes/vts/countries.geojson +10 -39283
- package/src/server/plugins/map/types.js +9 -2
- 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 +91 -46
- package/src/server/plugins/postcode-lookup/routes/index.js +96 -24
- 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
- package/src/typings/geodesy/index.d.ts +18 -0
- package/src/typings/hapi/index.d.ts +2 -0
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
type FormStateValue,
|
|
31
31
|
type FormSubmissionState
|
|
32
32
|
} from '../types.js'
|
|
33
|
-
import {
|
|
33
|
+
import { formatDateForLanguage } from '../../payment/helper.js'
|
|
34
34
|
|
|
35
35
|
export class MonthYearField extends FormComponent {
|
|
36
36
|
declare options: MonthYearFieldComponent['options']
|
|
@@ -48,16 +48,15 @@ export class MonthYearField extends FormComponent {
|
|
|
48
48
|
|
|
49
49
|
const isRequired = options.required !== false
|
|
50
50
|
|
|
51
|
-
const customValidationMessages
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
})
|
|
51
|
+
const customValidationMessages = {
|
|
52
|
+
'any.required': messageTemplate.objectMissing,
|
|
53
|
+
'number.base': messageTemplate.objectMissing,
|
|
54
|
+
'number.precision': messageTemplate.dateFormat,
|
|
55
|
+
'number.integer': messageTemplate.dateFormat,
|
|
56
|
+
'number.unsafe': messageTemplate.dateFormat,
|
|
57
|
+
'number.min': messageTemplate.dateFormat,
|
|
58
|
+
'number.max': messageTemplate.dateFormat
|
|
59
|
+
} as LanguageMessages
|
|
61
60
|
|
|
62
61
|
this.collection = new ComponentCollection(
|
|
63
62
|
[
|
|
@@ -105,16 +104,18 @@ export class MonthYearField extends FormComponent {
|
|
|
105
104
|
|
|
106
105
|
getDisplayStringFromFormValue(
|
|
107
106
|
value: MonthYearState | undefined,
|
|
108
|
-
|
|
107
|
+
translator: Translator
|
|
109
108
|
): string {
|
|
110
109
|
if (!value) {
|
|
111
110
|
return ''
|
|
112
111
|
}
|
|
113
112
|
|
|
114
113
|
const date = new Date()
|
|
114
|
+
// Force to first day of month in case current date was say 31st and specified month has fewer than 31 days
|
|
115
|
+
date.setDate(1)
|
|
115
116
|
date.setMonth(value.month - 1)
|
|
116
117
|
|
|
117
|
-
const monthString = date
|
|
118
|
+
const monthString = formatDateForLanguage(date, 'LLLL', translator.language)
|
|
118
119
|
return `${monthString} ${value.year}`
|
|
119
120
|
}
|
|
120
121
|
|
|
@@ -155,7 +156,7 @@ export class MonthYearField extends FormComponent {
|
|
|
155
156
|
|
|
156
157
|
getValidationMessagesOverride(translator: Translator) {
|
|
157
158
|
const { t } = translator
|
|
158
|
-
|
|
159
|
+
const messages = {
|
|
159
160
|
'any.required': buildValidationMessages(t).objectMissing,
|
|
160
161
|
'number.base': buildValidationMessages(t).objectMissing,
|
|
161
162
|
'number.precision': buildValidationMessages(t).dateFormat,
|
|
@@ -163,7 +164,11 @@ export class MonthYearField extends FormComponent {
|
|
|
163
164
|
'number.unsafe': buildValidationMessages(t).dateFormat,
|
|
164
165
|
'number.min': buildValidationMessages(t).dateFormat,
|
|
165
166
|
'number.max': buildValidationMessages(t).dateFormat
|
|
166
|
-
}
|
|
167
|
+
} as LanguageMessages
|
|
168
|
+
return {
|
|
169
|
+
[`${this.name}__month`]: messages,
|
|
170
|
+
[`${this.name}__year`]: messages
|
|
171
|
+
}
|
|
167
172
|
}
|
|
168
173
|
|
|
169
174
|
getViewModel(context: RenderContext) {
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'
|
|
2
2
|
|
|
3
|
+
import { EN_GB } from '../../../constants.js'
|
|
3
4
|
import { LocationFieldBase } from './LocationFieldBase.js'
|
|
4
5
|
import { createLowerFirstExpression } from './helpers/index.js'
|
|
5
6
|
import { t } from '../i18n/index.js'
|
|
7
|
+
import { type Translator } from '../i18n/types.js'
|
|
6
8
|
import { type ErrorMessageTemplateList } from '../types.js'
|
|
7
9
|
|
|
8
10
|
export class NationalGridFieldNumberField extends LocationFieldBase {
|
|
9
11
|
declare options: NationalGridFieldNumberFieldComponent['options']
|
|
10
12
|
|
|
11
|
-
protected getValidationConfig() {
|
|
13
|
+
protected getValidationConfig(translator: Translator | undefined) {
|
|
12
14
|
// Regex for OS national grid field references (NGFR)
|
|
13
15
|
// Validates specific valid OS grid letter combinations with:
|
|
14
16
|
// - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789
|
|
@@ -18,10 +20,14 @@ export class NationalGridFieldNumberField extends LocationFieldBase {
|
|
|
18
20
|
return {
|
|
19
21
|
pattern,
|
|
20
22
|
patternErrorMessage: createLowerFirstExpression(
|
|
21
|
-
|
|
23
|
+
translator
|
|
24
|
+
? translator.t('components.nationalGridField.pattern')
|
|
25
|
+
: t('components.nationalGridField.pattern', EN_GB)
|
|
22
26
|
),
|
|
23
27
|
requiredMessage: createLowerFirstExpression(
|
|
24
|
-
|
|
28
|
+
translator
|
|
29
|
+
? translator.t('components.nationalGridField.required')
|
|
30
|
+
: t('components.nationalGridField.required', EN_GB)
|
|
25
31
|
)
|
|
26
32
|
}
|
|
27
33
|
}
|
|
@@ -5,8 +5,11 @@ import {
|
|
|
5
5
|
FormComponent,
|
|
6
6
|
isFormValue
|
|
7
7
|
} from './FormComponent.js'
|
|
8
|
+
import { withCustomValidationOverrides } from './helpers/index.js'
|
|
8
9
|
import { type RenderContext } from './types.js'
|
|
10
|
+
import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
|
|
9
11
|
import { messageTemplate } from '../pageControllers/validationOptions.js'
|
|
12
|
+
import { type Translator } from '../types/index.js'
|
|
10
13
|
import {
|
|
11
14
|
type ErrorMessageTemplateList,
|
|
12
15
|
type FormState,
|
|
@@ -130,6 +133,27 @@ export class NumberField extends FormComponent {
|
|
|
130
133
|
return NumberField.isNumber(value)
|
|
131
134
|
}
|
|
132
135
|
|
|
136
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
137
|
+
const { customValidationMessage, customValidationMessages } = this.options
|
|
138
|
+
const { t } = translator
|
|
139
|
+
const defaults = {
|
|
140
|
+
'any.required': buildValidationMessages(t).objectRequired,
|
|
141
|
+
'number.base': buildValidationMessages(t).objectMissing,
|
|
142
|
+
'number.precision': buildValidationMessages(t).numberPrecision,
|
|
143
|
+
'number.integer': buildValidationMessages(t).numberInteger,
|
|
144
|
+
'number.min': buildValidationMessages(t).numberMin,
|
|
145
|
+
'number.max': buildValidationMessages(t).numberMax
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
[this.name]: withCustomValidationOverrides(
|
|
150
|
+
defaults,
|
|
151
|
+
customValidationMessage,
|
|
152
|
+
customValidationMessages
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
133
157
|
/**
|
|
134
158
|
* For error preview page that shows all possible errors on a component
|
|
135
159
|
*/
|
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
import { type OsGridRefFieldComponent } from '@defra/forms-model'
|
|
2
2
|
|
|
3
|
+
import { EN_GB } from '../../../constants.js'
|
|
3
4
|
import { LocationFieldBase } from './LocationFieldBase.js'
|
|
5
|
+
import { getMapLayers } from './LocationFieldHelpers.js'
|
|
4
6
|
import { createLowerFirstExpression } from './helpers/index.js'
|
|
7
|
+
import { type RenderContext } from './types.js'
|
|
5
8
|
import { t } from '../i18n/index.js'
|
|
9
|
+
import { type Translator } from '../types/index.js'
|
|
6
10
|
import { type ErrorMessageTemplateList } from '../types.js'
|
|
7
11
|
|
|
8
12
|
export class OsGridRefField extends LocationFieldBase {
|
|
9
13
|
declare options: OsGridRefFieldComponent['options']
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
getViewModel(context: RenderContext) {
|
|
16
|
+
const viewModel = super.getViewModel(context)
|
|
17
|
+
|
|
18
|
+
Object.assign(viewModel, {
|
|
19
|
+
lang: context.translator.language,
|
|
20
|
+
mapLayers: getMapLayers(this)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
return viewModel
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
protected getValidationConfig(translator: Translator | undefined) {
|
|
12
27
|
// Regex for OS national grid references (NGR)
|
|
13
28
|
// Validates specific valid OS grid letter combinations with:
|
|
14
29
|
// - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678
|
|
@@ -21,10 +36,14 @@ export class OsGridRefField extends LocationFieldBase {
|
|
|
21
36
|
return {
|
|
22
37
|
pattern,
|
|
23
38
|
patternErrorMessage: createLowerFirstExpression(
|
|
24
|
-
|
|
39
|
+
translator
|
|
40
|
+
? translator.t('components.osGridRefField.pattern')
|
|
41
|
+
: t('components.osGridRefField.pattern', EN_GB)
|
|
25
42
|
),
|
|
26
43
|
requiredMessage: createLowerFirstExpression(
|
|
27
|
-
|
|
44
|
+
translator
|
|
45
|
+
? translator.t('components.osGridRefField.required')
|
|
46
|
+
: t('components.osGridRefField.required', EN_GB)
|
|
28
47
|
)
|
|
29
48
|
}
|
|
30
49
|
}
|
|
@@ -63,6 +63,7 @@ export class PaymentField extends FormComponent {
|
|
|
63
63
|
reference: joi.string().required(),
|
|
64
64
|
amount: joi.number().required(),
|
|
65
65
|
description: joi.string().required(),
|
|
66
|
+
descriptionInEng: joi.string().optional(),
|
|
66
67
|
uuid: joi.string().uuid().required(),
|
|
67
68
|
formId: joi.string().required(),
|
|
68
69
|
isLivePayment: joi.boolean().required(),
|
|
@@ -239,8 +240,9 @@ export class PaymentField extends FormComponent {
|
|
|
239
240
|
): Promise<unknown> {
|
|
240
241
|
const { options, name: componentName } = args.component
|
|
241
242
|
const { model } = args.controller
|
|
242
|
-
const language =
|
|
243
|
-
|
|
243
|
+
const { language, t, tComponent } = model.createTranslator(
|
|
244
|
+
resolveLanguage(request)
|
|
245
|
+
)
|
|
244
246
|
const state = await args.controller.getState(request)
|
|
245
247
|
const { baseUrl } = getPluginOptions(request.server)
|
|
246
248
|
const summaryUrl = `${baseUrl}/${model.basePath}/summary`
|
|
@@ -272,7 +274,8 @@ export class PaymentField extends FormComponent {
|
|
|
272
274
|
return h.redirect(summaryUrl).code(StatusCodes.SEE_OTHER)
|
|
273
275
|
}
|
|
274
276
|
|
|
275
|
-
const description =
|
|
277
|
+
const description =
|
|
278
|
+
tComponent(args.component, 'paymentDescription') || options.description
|
|
276
279
|
|
|
277
280
|
const slug = `/${model.basePath}`
|
|
278
281
|
|
|
@@ -292,7 +295,7 @@ export class PaymentField extends FormComponent {
|
|
|
292
295
|
payCallbackUrl,
|
|
293
296
|
reference,
|
|
294
297
|
isLivePayment,
|
|
295
|
-
{ formId, slug },
|
|
298
|
+
{ formId, slug, language },
|
|
296
299
|
prefilledEmail
|
|
297
300
|
)
|
|
298
301
|
|
|
@@ -313,6 +316,7 @@ export class PaymentField extends FormComponent {
|
|
|
313
316
|
reference,
|
|
314
317
|
amount: resolvedAmount,
|
|
315
318
|
description,
|
|
319
|
+
descriptionInEng: options.description,
|
|
316
320
|
paymentId: payment.paymentId,
|
|
317
321
|
componentName,
|
|
318
322
|
returnUrl: summaryUrl,
|
|
@@ -449,6 +453,7 @@ export interface PaymentSessionData {
|
|
|
449
453
|
reference: string
|
|
450
454
|
amount: number
|
|
451
455
|
description: string
|
|
456
|
+
descriptionInEng?: string
|
|
452
457
|
paymentId: string
|
|
453
458
|
componentName: string
|
|
454
459
|
returnUrl: string
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type TrackingFieldComponent } from '@defra/forms-model'
|
|
2
|
+
import joi, { type BooleanSchema } from 'joi'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
FormComponent,
|
|
6
|
+
isFormValue
|
|
7
|
+
} from './FormComponent.js'
|
|
8
|
+
import { messageTemplate } from '../pageControllers/validationOptions.js'
|
|
9
|
+
import {
|
|
10
|
+
type ErrorMessageTemplateList,
|
|
11
|
+
type FormState,
|
|
12
|
+
type FormStateValue,
|
|
13
|
+
type FormSubmissionState
|
|
14
|
+
} from '../types.js'
|
|
15
|
+
|
|
16
|
+
export class TrackingField extends FormComponent {
|
|
17
|
+
declare formSchema: BooleanSchema
|
|
18
|
+
declare stateSchema: BooleanSchema
|
|
19
|
+
declare options: TrackingFieldComponent['options']
|
|
20
|
+
|
|
21
|
+
constructor(
|
|
22
|
+
def: TrackingFieldComponent,
|
|
23
|
+
props: ConstructorParameters<typeof FormComponent>[1]
|
|
24
|
+
) {
|
|
25
|
+
super(def, props)
|
|
26
|
+
|
|
27
|
+
const formSchema = joi.boolean().valid(true).label(this.label).required()
|
|
28
|
+
|
|
29
|
+
this.formSchema = formSchema.default(false)
|
|
30
|
+
this.stateSchema = formSchema.default(null).allow(null)
|
|
31
|
+
this.schema = {}
|
|
32
|
+
this.options = {}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
getFormValueFromState(state: FormSubmissionState) {
|
|
36
|
+
const { name } = this
|
|
37
|
+
return this.getFormValue(state[name])
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
isValue(value?: FormStateValue | FormState): value is true {
|
|
41
|
+
return TrackingField.isTracking(value)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* For error preview page that shows all possible errors on a component
|
|
46
|
+
*/
|
|
47
|
+
getAllPossibleErrors(): ErrorMessageTemplateList {
|
|
48
|
+
return TrackingField.getAllPossibleErrors()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static isTracking(value?: FormStateValue | FormState): value is true {
|
|
52
|
+
return isFormValue(value) && typeof value === 'boolean'
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Static version of getAllPossibleErrors that doesn't require a component instance.
|
|
57
|
+
*/
|
|
58
|
+
static getAllPossibleErrors(): ErrorMessageTemplateList {
|
|
59
|
+
return {
|
|
60
|
+
baseErrors: [{ type: 'required', template: messageTemplate.required }],
|
|
61
|
+
advancedSettingsErrors: []
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ComponentType,
|
|
3
|
+
FormStatus,
|
|
4
|
+
type FormMetadata,
|
|
5
|
+
type UkAddressFieldComponent
|
|
6
|
+
} from '@defra/forms-model'
|
|
2
7
|
import { type ObjectSchema } from 'joi'
|
|
3
8
|
import lowerFirst from 'lodash/lowerFirst.js'
|
|
4
9
|
|
|
@@ -9,6 +14,8 @@ import {
|
|
|
9
14
|
} from './FormComponent.js'
|
|
10
15
|
import { TextField } from './TextField.js'
|
|
11
16
|
import { type RenderContext } from './types.js'
|
|
17
|
+
import { getCachedPluginTranslator } from '../i18n/form.js'
|
|
18
|
+
import { getAvailableLanguages } from '../i18n/languages.js'
|
|
12
19
|
import { type Translator } from '../i18n/types.js'
|
|
13
20
|
import {
|
|
14
21
|
type FormRequestPayload,
|
|
@@ -207,7 +214,7 @@ export class UkAddressField extends FormComponent {
|
|
|
207
214
|
|
|
208
215
|
/**
|
|
209
216
|
* For screen readers, only hide legend visually. This can be overridden
|
|
210
|
-
* by single component
|
|
217
|
+
* by single component (see QuestionPageController and showTitle handling)
|
|
211
218
|
*/
|
|
212
219
|
classes: options.hideTitle
|
|
213
220
|
? 'govuk-visually-hidden'
|
|
@@ -290,7 +297,6 @@ export class UkAddressField extends FormComponent {
|
|
|
290
297
|
)
|
|
291
298
|
}
|
|
292
299
|
|
|
293
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
294
300
|
static async dispatcher(
|
|
295
301
|
request: FormRequestPayload,
|
|
296
302
|
h: FormResponseToolkit,
|
|
@@ -299,14 +305,31 @@ export class UkAddressField extends FormComponent {
|
|
|
299
305
|
const { controller, component } = args
|
|
300
306
|
const language = resolveLanguage(request)
|
|
301
307
|
|
|
308
|
+
const availableLanguages = getAvailableLanguages(controller.model.def)
|
|
309
|
+
const languages = availableLanguages.length
|
|
310
|
+
? { languages: availableLanguages }
|
|
311
|
+
: {}
|
|
312
|
+
|
|
313
|
+
const translator = await getCachedPluginTranslator(
|
|
314
|
+
request,
|
|
315
|
+
{ id: controller.model.formId } as unknown as FormMetadata,
|
|
316
|
+
args.isLive ? FormStatus.Live : FormStatus.Draft,
|
|
317
|
+
language
|
|
318
|
+
)
|
|
319
|
+
const { tComponent, tForm } = translator
|
|
320
|
+
|
|
302
321
|
return dispatch(request, h, {
|
|
303
|
-
formName:
|
|
322
|
+
formName: tForm('title'),
|
|
323
|
+
formId: controller.model.formId,
|
|
324
|
+
formStatus: args.isLive ? FormStatus.Live : FormStatus.Draft,
|
|
325
|
+
componentId: component.id ?? 'unknown',
|
|
304
326
|
componentName: component.name,
|
|
305
|
-
componentHint: component
|
|
306
|
-
componentTitle: component
|
|
327
|
+
componentHint: tComponent(component, 'hint'),
|
|
328
|
+
componentTitle: tComponent(component, 'title') || controller.title,
|
|
307
329
|
step: args.actionArgs.step,
|
|
308
330
|
sourceUrl: args.sourceUrl,
|
|
309
|
-
language
|
|
331
|
+
language,
|
|
332
|
+
...languages
|
|
310
333
|
})
|
|
311
334
|
}
|
|
312
335
|
}
|
|
@@ -4,15 +4,16 @@ import {
|
|
|
4
4
|
yesNoListName,
|
|
5
5
|
type YesNoFieldComponent
|
|
6
6
|
} from '@defra/forms-model'
|
|
7
|
-
import { type LanguageMessages } from 'joi'
|
|
8
7
|
|
|
9
8
|
import { SelectionControlField } from './SelectionControlField.js'
|
|
10
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
addClassOptionIfNone,
|
|
11
|
+
withCustomValidationOverrides
|
|
12
|
+
} from './helpers/index.js'
|
|
11
13
|
import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
|
|
12
14
|
import { type Translator } from '../i18n/types.js'
|
|
13
15
|
import { messageTemplate } from '../pageControllers/validationOptions.js'
|
|
14
16
|
import { type ErrorMessageTemplateList } from '../types.js'
|
|
15
|
-
import { convertToLanguageMessages } from '../../../utils/type-utils.js'
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* @description
|
|
@@ -45,21 +46,38 @@ export class YesNoField extends SelectionControlField {
|
|
|
45
46
|
formSchema = formSchema.optional()
|
|
46
47
|
}
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
if (options.customValidationMessage) {
|
|
50
|
+
const message = options.customValidationMessage
|
|
51
|
+
|
|
52
|
+
formSchema = formSchema.messages({
|
|
53
|
+
'any.required': message
|
|
54
|
+
})
|
|
55
|
+
} else if (options.customValidationMessages) {
|
|
56
|
+
formSchema = formSchema.messages(options.customValidationMessages)
|
|
57
|
+
} else {
|
|
58
|
+
formSchema = formSchema.messages({
|
|
50
59
|
'any.required': messageTemplate.selectYesNoRequired
|
|
51
60
|
})
|
|
52
|
-
|
|
61
|
+
}
|
|
53
62
|
|
|
54
63
|
this.formSchema = formSchema
|
|
55
64
|
this.options = options
|
|
56
65
|
}
|
|
57
66
|
|
|
58
|
-
getValidationMessagesOverride(translator: Translator)
|
|
67
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
68
|
+
const { customValidationMessage, customValidationMessages } = this.options
|
|
59
69
|
const { selectYesNoRequired } = buildValidationMessages(translator.t)
|
|
60
|
-
|
|
70
|
+
const defaults = {
|
|
61
71
|
'any.required': selectYesNoRequired
|
|
62
|
-
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
[this.name]: withCustomValidationOverrides(
|
|
76
|
+
defaults,
|
|
77
|
+
customValidationMessage,
|
|
78
|
+
customValidationMessages
|
|
79
|
+
)
|
|
80
|
+
}
|
|
63
81
|
}
|
|
64
82
|
|
|
65
83
|
/**
|
|
@@ -6,6 +6,7 @@ import { ListFormComponent } from '../ListFormComponent.js'
|
|
|
6
6
|
import { escapeMarkdown } from './index.js'
|
|
7
7
|
import * as Components from '../index.js'
|
|
8
8
|
import { markdown } from '../markdownParser.js'
|
|
9
|
+
import { UnknownComponentTypeError } from '../../errors.js'
|
|
9
10
|
import { type Translator } from '../../i18n/types.js'
|
|
10
11
|
import { type FormState } from '../../types.js'
|
|
11
12
|
|
|
@@ -36,6 +37,7 @@ export type Field = InstanceType<
|
|
|
36
37
|
| typeof Components.UkAddressField
|
|
37
38
|
| typeof Components.FileUploadField
|
|
38
39
|
| typeof Components.HiddenField
|
|
40
|
+
| typeof Components.TrackingField
|
|
39
41
|
| typeof Components.PaymentField
|
|
40
42
|
| typeof Components.GeospatialField
|
|
41
43
|
>
|
|
@@ -200,6 +202,10 @@ export function createComponent(
|
|
|
200
202
|
component = new Components.HiddenField(def, options)
|
|
201
203
|
break
|
|
202
204
|
|
|
205
|
+
case ComponentType.TrackingField:
|
|
206
|
+
component = new Components.TrackingField(def, options)
|
|
207
|
+
break
|
|
208
|
+
|
|
203
209
|
case ComponentType.PaymentField:
|
|
204
210
|
component = new Components.PaymentField(def, options)
|
|
205
211
|
break
|
|
@@ -210,7 +216,7 @@ export function createComponent(
|
|
|
210
216
|
}
|
|
211
217
|
|
|
212
218
|
if (typeof component === 'undefined') {
|
|
213
|
-
throw new
|
|
219
|
+
throw new UnknownComponentTypeError(def.type)
|
|
214
220
|
}
|
|
215
221
|
|
|
216
222
|
return component
|
|
@@ -347,8 +353,7 @@ export function getAnswerMarkdown(
|
|
|
347
353
|
field instanceof Components.EastingNorthingField ||
|
|
348
354
|
field instanceof Components.LatLongField
|
|
349
355
|
) {
|
|
350
|
-
|
|
351
|
-
answerEscaped = contextValue ? `${contextValue}\n` : ''
|
|
356
|
+
answerEscaped = answer ? `${answer}\n` : ''
|
|
352
357
|
} else if (field instanceof Components.GeospatialField) {
|
|
353
358
|
const features = field.getFormValueFromState(state)
|
|
354
359
|
const value = field.getDisplayStringFromFormValue(features, translator)
|
|
@@ -1,26 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
|
-
GeospatialFieldOptionsCountryEnum,
|
|
3
2
|
type GeospatialFieldComponent,
|
|
4
3
|
type GeospatialFieldOptionsCountry
|
|
5
4
|
} from '@defra/forms-model'
|
|
6
5
|
import Bourne from '@hapi/bourne'
|
|
7
6
|
import { booleanWithin } from '@turf/boolean-within'
|
|
7
|
+
import { point } from '@turf/helpers'
|
|
8
|
+
import OsGridRef from 'geodesy/osgridref.js'
|
|
8
9
|
import JoiBase, { type CustomValidator } from 'joi'
|
|
9
10
|
|
|
11
|
+
import { type EastingNorthingField } from '../EastingNorthingField.js'
|
|
12
|
+
import { type EastingNorthingState } from '../types.js'
|
|
10
13
|
import {
|
|
11
14
|
type Coordinates,
|
|
12
15
|
type Feature,
|
|
13
16
|
type FeatureProperties,
|
|
14
17
|
type Geometry
|
|
15
18
|
} from '../../types.js'
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
const countriesDesc: Record<GeospatialFieldOptionsCountryEnum, string> = {
|
|
19
|
-
[GeospatialFieldOptionsCountryEnum.England]: 'England',
|
|
20
|
-
[GeospatialFieldOptionsCountryEnum.NorthernIreland]: 'Northern Ireland',
|
|
21
|
-
[GeospatialFieldOptionsCountryEnum.Scotland]: 'Scotland',
|
|
22
|
-
[GeospatialFieldOptionsCountryEnum.Wales]: 'Wales'
|
|
23
|
-
}
|
|
19
|
+
import { countriesValidate } from '../../../map/routes/index.js'
|
|
20
|
+
import { CountryMap } from '../../../map/types.js'
|
|
24
21
|
|
|
25
22
|
const Joi = JoiBase.extend({
|
|
26
23
|
type: 'array',
|
|
@@ -98,25 +95,43 @@ const featureSchema = Joi.object<Feature>().keys({
|
|
|
98
95
|
geometry: featureGeometrySchema
|
|
99
96
|
})
|
|
100
97
|
|
|
101
|
-
function
|
|
102
|
-
|
|
103
|
-
|
|
98
|
+
export function determineLimits(
|
|
99
|
+
def: GeospatialFieldComponent,
|
|
100
|
+
isOptional: boolean
|
|
104
101
|
) {
|
|
105
|
-
const {
|
|
106
|
-
const
|
|
107
|
-
|
|
102
|
+
const { schema: constraints } = def
|
|
103
|
+
const limits: { min?: number; max?: number; length?: number } = {}
|
|
108
104
|
if (typeof constraints?.length === 'number') {
|
|
109
|
-
|
|
105
|
+
limits.length = constraints.length
|
|
110
106
|
} else {
|
|
111
107
|
if (typeof constraints?.min === 'number') {
|
|
112
|
-
|
|
108
|
+
limits.min = constraints.min
|
|
113
109
|
} else if (!isOptional) {
|
|
114
|
-
|
|
110
|
+
limits.min = 1
|
|
115
111
|
}
|
|
116
112
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
113
|
+
limits.max = typeof constraints?.max === 'number' ? constraints.max : 50
|
|
114
|
+
}
|
|
115
|
+
return limits
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function applySchemaConstraints(
|
|
119
|
+
schema: JoiBase.ArraySchema<Feature[]>,
|
|
120
|
+
def: GeospatialFieldComponent
|
|
121
|
+
) {
|
|
122
|
+
const { options } = def
|
|
123
|
+
const isOptional = options.required === false
|
|
124
|
+
|
|
125
|
+
const limits = determineLimits(def, isOptional)
|
|
126
|
+
|
|
127
|
+
if (limits.length !== undefined) {
|
|
128
|
+
schema = schema.length(limits.length)
|
|
129
|
+
}
|
|
130
|
+
if (limits.min !== undefined) {
|
|
131
|
+
schema = schema.min(limits.min)
|
|
132
|
+
}
|
|
133
|
+
if (limits.max !== undefined) {
|
|
134
|
+
schema = schema.max(limits.max)
|
|
120
135
|
}
|
|
121
136
|
|
|
122
137
|
if (isOptional) {
|
|
@@ -143,8 +158,8 @@ export function getGeospatialSchema(
|
|
|
143
158
|
}
|
|
144
159
|
|
|
145
160
|
const validateCountryBounds: CustomValidator = (value, helpers) => {
|
|
146
|
-
const countryFeature =
|
|
147
|
-
(feature) => feature.id === country
|
|
161
|
+
const countryFeature = countriesValidate.features.find(
|
|
162
|
+
(feature) => feature.id === CountryMap[country]
|
|
148
163
|
)
|
|
149
164
|
|
|
150
165
|
if (!countryFeature) {
|
|
@@ -156,7 +171,7 @@ export function getGeospatialSchema(
|
|
|
156
171
|
|
|
157
172
|
if (!result) {
|
|
158
173
|
return helpers.error('any.custom', {
|
|
159
|
-
country
|
|
174
|
+
country
|
|
160
175
|
})
|
|
161
176
|
}
|
|
162
177
|
|
|
@@ -171,3 +186,51 @@ export function getGeospatialSchema(
|
|
|
171
186
|
def
|
|
172
187
|
)
|
|
173
188
|
}
|
|
189
|
+
|
|
190
|
+
export function getEastingNorthingCountryValidator(
|
|
191
|
+
field: EastingNorthingField,
|
|
192
|
+
country: GeospatialFieldOptionsCountry
|
|
193
|
+
) {
|
|
194
|
+
const validateCountryBounds: CustomValidator = (value, helpers) => {
|
|
195
|
+
const countryFeature = countriesValidate.features.find(
|
|
196
|
+
(feature) => feature.id === CountryMap[country]
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
if (!countryFeature) {
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
201
|
+
return value
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const eastingNorthing = field.getFormValueFromState(
|
|
205
|
+
value as EastingNorthingState
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
if (!eastingNorthing) {
|
|
209
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
210
|
+
return value
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const gridRef = new OsGridRef(
|
|
214
|
+
eastingNorthing.easting,
|
|
215
|
+
eastingNorthing.northing
|
|
216
|
+
)
|
|
217
|
+
const latLong = gridRef.toLatLon()
|
|
218
|
+
const coord = point([latLong.longitude, latLong.latitude])
|
|
219
|
+
const within = booleanWithin(coord, countryFeature)
|
|
220
|
+
|
|
221
|
+
if (!within) {
|
|
222
|
+
return helpers.error(
|
|
223
|
+
'any.custom',
|
|
224
|
+
{
|
|
225
|
+
country
|
|
226
|
+
},
|
|
227
|
+
{ path: [field.name] }
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
232
|
+
return value
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return validateCountryBounds
|
|
236
|
+
}
|