@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
|
@@ -11,7 +11,6 @@ import createSearchPlugin from '@defra/interactive-map/plugins/search'
|
|
|
11
11
|
// @ts-expect-error - no types
|
|
12
12
|
import maplibreProvider from '@defra/interactive-map/providers/maplibre'
|
|
13
13
|
import { centroid } from '@turf/centroid'
|
|
14
|
-
// @ts-expect-error - no types
|
|
15
14
|
import OsGridRef, { LatLon } from 'geodesy/osgridref.js'
|
|
16
15
|
|
|
17
16
|
import { processGeospatial } from './geospatial-map.js'
|
|
@@ -123,10 +122,15 @@ export function getCentroidGridRef(feature) {
|
|
|
123
122
|
}
|
|
124
123
|
}
|
|
125
124
|
|
|
126
|
-
/**
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Get the default config for a map
|
|
127
|
+
* @returns {InteractiveMapInitConfig}
|
|
128
|
+
*/
|
|
129
|
+
export const getDefaultConfig = () => {
|
|
130
|
+
return {
|
|
131
|
+
zoom: '6',
|
|
132
|
+
center: [DEFAULT_LONG, DEFAULT_LAT]
|
|
133
|
+
}
|
|
130
134
|
}
|
|
131
135
|
|
|
132
136
|
export const EVENTS = {
|
|
@@ -167,6 +171,7 @@ export function initMaps(config = {}) {
|
|
|
167
171
|
const {
|
|
168
172
|
assetPath = '/assets',
|
|
169
173
|
apiPath = '/form/api',
|
|
174
|
+
workerPath = '/assets/interactive-map/maplibre-gl-worker.mjs',
|
|
170
175
|
data = defaultData
|
|
171
176
|
} = config
|
|
172
177
|
const locations = document.querySelectorAll('.app-location-field')
|
|
@@ -198,11 +203,15 @@ export function initMaps(config = {}) {
|
|
|
198
203
|
}
|
|
199
204
|
|
|
200
205
|
locations.forEach((location, index) => {
|
|
201
|
-
processLocation({ assetPath, apiPath, data }, location, index)
|
|
206
|
+
processLocation({ assetPath, apiPath, workerPath, data }, location, index)
|
|
202
207
|
})
|
|
203
208
|
|
|
204
209
|
geospatials.forEach((geospatial, index) => {
|
|
205
|
-
processGeospatial(
|
|
210
|
+
processGeospatial(
|
|
211
|
+
{ assetPath, apiPath, workerPath, data },
|
|
212
|
+
geospatial,
|
|
213
|
+
index
|
|
214
|
+
)
|
|
206
215
|
})
|
|
207
216
|
}
|
|
208
217
|
|
|
@@ -259,7 +268,7 @@ export function makeTileRequestTransformer(apiPath) {
|
|
|
259
268
|
* @param {MapsEnvironmentConfig} mapsConfig - the map environment params
|
|
260
269
|
*/
|
|
261
270
|
export function createMap(mapId, initConfig, mapsConfig) {
|
|
262
|
-
const { assetPath, apiPath, data = defaultData } = mapsConfig
|
|
271
|
+
const { assetPath, apiPath, workerPath, data = defaultData } = mapsConfig
|
|
263
272
|
const logoAltText = 'Ordnance survey logo'
|
|
264
273
|
const interactPlugin = createInteractPlugin({
|
|
265
274
|
markerColor: { outdoor: '#ff0000', dark: '#00ff00' },
|
|
@@ -271,7 +280,7 @@ export function createMap(mapId, initConfig, mapsConfig) {
|
|
|
271
280
|
const map = new InteractiveMap(mapId, {
|
|
272
281
|
enableFullscreen: true,
|
|
273
282
|
autoColorScheme: false,
|
|
274
|
-
mapProvider: maplibreProvider(),
|
|
283
|
+
mapProvider: maplibreProvider({ workerUrl: workerPath }),
|
|
275
284
|
behaviour: 'inline',
|
|
276
285
|
minZoom: 6,
|
|
277
286
|
maxZoom: 18,
|
|
@@ -367,6 +376,48 @@ export function getMapLayers(layers) {
|
|
|
367
376
|
return trimmed ? trimmed.split(',') : []
|
|
368
377
|
}
|
|
369
378
|
|
|
379
|
+
/**
|
|
380
|
+
* Adds the country layers to a datasets array
|
|
381
|
+
* @param {string} apiPath
|
|
382
|
+
* @param {string} [country]
|
|
383
|
+
*/
|
|
384
|
+
export function getMapCountryLayers(apiPath, country) {
|
|
385
|
+
/** @type {any[]} */
|
|
386
|
+
const datasets = []
|
|
387
|
+
|
|
388
|
+
if (country) {
|
|
389
|
+
// Add the country bounds to the datasets array to show the valid area on the map
|
|
390
|
+
// and provide feedback to the user when they add features outside of the bounds.
|
|
391
|
+
datasets.push(
|
|
392
|
+
{
|
|
393
|
+
id: 'invalid-area',
|
|
394
|
+
label: 'Invalid areas',
|
|
395
|
+
geojson: `${apiPath}/maps/countries.geojson?omit=${country}`,
|
|
396
|
+
showInKey: false,
|
|
397
|
+
showInMenu: false,
|
|
398
|
+
style: {
|
|
399
|
+
stroke: 'gray',
|
|
400
|
+
strokeWidth: 1,
|
|
401
|
+
fill: 'rgba(211,211,211,0.8)'
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
id: 'valid-area',
|
|
406
|
+
label: 'Valid areas',
|
|
407
|
+
geojson: `${apiPath}/maps/countries.geojson?only=${country}`,
|
|
408
|
+
showInKey: false,
|
|
409
|
+
showInMenu: false,
|
|
410
|
+
style: {
|
|
411
|
+
stroke: 'rgba(0,112,60,1)',
|
|
412
|
+
strokeWidth: 1
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
)
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return datasets
|
|
419
|
+
}
|
|
420
|
+
|
|
370
421
|
/**
|
|
371
422
|
* @typedef {object} InteractiveMap - an instance of a InteractiveMap
|
|
372
423
|
* @property {Function} on - register callback listeners to map events
|
|
@@ -407,6 +458,7 @@ export function getMapLayers(layers) {
|
|
|
407
458
|
* @typedef {object} MapsEnvironmentConfig
|
|
408
459
|
* @property {string} assetPath - the root asset path
|
|
409
460
|
* @property {string} apiPath - the root API path
|
|
461
|
+
* @property {string} workerPath - the maplibre worker path
|
|
410
462
|
* @property {TileData} data - the tile data config
|
|
411
463
|
*/
|
|
412
464
|
|
|
@@ -418,3 +470,8 @@ export function getMapLayers(layers) {
|
|
|
418
470
|
/**
|
|
419
471
|
* @import { Feature } from '../../server/plugins/engine/types.js'
|
|
420
472
|
*/
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* Supported language codes
|
|
476
|
+
* @typedef {('en-GB'|'cy')} LanguageCode
|
|
477
|
+
*/
|
|
@@ -3,10 +3,7 @@ import { initDebounceClick as initDebounceClickImp } from './debounce-click.js'
|
|
|
3
3
|
import { initFileUpload as initFileUploadImp } from './file-upload.js'
|
|
4
4
|
import { initAllGovuk as initAllGovukImp } from './govuk.js'
|
|
5
5
|
import { initPreviewCloseLink as initPreviewCloseLinkImp } from './preview-close-link.js'
|
|
6
|
-
export
|
|
7
|
-
export * as map from './map.js'
|
|
8
|
-
export * as geospatialMap from './geospatial-map.js'
|
|
9
|
-
export * as sssiDataset from './sssi-dataset.js'
|
|
6
|
+
export * from './maps.js'
|
|
10
7
|
|
|
11
8
|
export const initAllGovuk = initAllGovukImp
|
|
12
9
|
export const initAllAutocomplete = initAllAutocompleteImp
|
|
@@ -49,49 +49,47 @@ export function sssiScotlandRequestTransformer(url, { bbox }) {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
export default
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
transformRequest: sssiEnglandRequestTransformer
|
|
61
|
-
},
|
|
62
|
-
minZoom,
|
|
63
|
-
style,
|
|
64
|
-
showInKey: true,
|
|
65
|
-
showInMenu: false
|
|
52
|
+
export default [
|
|
53
|
+
{
|
|
54
|
+
id: 'sssi-england',
|
|
55
|
+
label: 'Sites of Special Scientific Interest',
|
|
56
|
+
dynamicGeoJSON: {
|
|
57
|
+
url: englandWFS,
|
|
58
|
+
idProperty: 'ref_code',
|
|
59
|
+
transformRequest: sssiEnglandRequestTransformer
|
|
66
60
|
},
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
61
|
+
minZoom,
|
|
62
|
+
style,
|
|
63
|
+
showInKey: true,
|
|
64
|
+
showInMenu: false
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'sssi-wales',
|
|
68
|
+
label: 'SSSI Wales',
|
|
69
|
+
dynamicGeoJSON: {
|
|
70
|
+
url: walesWFS,
|
|
71
|
+
idProperty: 'id',
|
|
72
|
+
transformRequest: sssiWalesRequestTransformer
|
|
79
73
|
},
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
74
|
+
minZoom,
|
|
75
|
+
style,
|
|
76
|
+
showInKey: false,
|
|
77
|
+
showInMenu: false
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: 'sssi-scotland',
|
|
81
|
+
label: 'SSSI Scotland',
|
|
82
|
+
dynamicGeoJSON: {
|
|
83
|
+
url: scotlandWFS,
|
|
84
|
+
idProperty: 'OBJECTID',
|
|
85
|
+
transformRequest: sssiScotlandRequestTransformer
|
|
86
|
+
},
|
|
87
|
+
minZoom,
|
|
88
|
+
style,
|
|
89
|
+
showInKey: false,
|
|
90
|
+
showInMenu: false
|
|
91
|
+
}
|
|
92
|
+
]
|
|
95
93
|
|
|
96
94
|
/**
|
|
97
95
|
* @typedef {object} TransformRequestOptions
|
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
@use "prose";
|
|
4
4
|
@use "summary-list";
|
|
5
5
|
@use "location-fields";
|
|
6
|
-
|
|
7
|
-
@use "@defra/interactive-map/css" as core;
|
|
8
|
-
@use "@defra/interactive-map/plugins/map-styles/css" as mapStyles;
|
|
9
|
-
@use "@defra/interactive-map/plugins/search/css" as search;
|
|
10
|
-
@use "@defra/interactive-map/plugins/scale-bar/css" as scaleBar;
|
|
6
|
+
@use "maps";
|
|
11
7
|
|
|
12
8
|
// Use default GDS Transport font for autocomplete
|
|
13
9
|
.autocomplete__hint,
|
package/src/server/constants.js
CHANGED
|
@@ -5,3 +5,5 @@ export const EXTERNAL_STATE_PAYLOAD = 'EXTERNAL_STATE_PAYLOAD'
|
|
|
5
5
|
export const EXTERNAL_STATE_APPENDAGE = 'EXTERNAL_STATE_APPENDAGE'
|
|
6
6
|
export const COMPONENT_STATE_ERROR = 'COMPONENT_STATE_ERROR'
|
|
7
7
|
export const PAYMENT_EXPIRED_NOTIFICATION = 'PAYMENT_EXPIRED_NOTIFICATION'
|
|
8
|
+
export const EN_GB = 'en-GB' // English language
|
|
9
|
+
export const CY = 'cy' // Welsh language
|
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
"path": "/all-components",
|
|
7
7
|
"title": "All Components",
|
|
8
8
|
"components": [
|
|
9
|
+
{
|
|
10
|
+
"type": "TrackingField",
|
|
11
|
+
"name": "trackingField",
|
|
12
|
+
"title": "Tracking field",
|
|
13
|
+
"hint": "Help text",
|
|
14
|
+
"options": {},
|
|
15
|
+
"schema": {}
|
|
16
|
+
},
|
|
9
17
|
{
|
|
10
18
|
"type": "TextField",
|
|
11
19
|
"name": "textField",
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ComponentType,
|
|
3
|
+
ConditionType,
|
|
4
|
+
ControllerType,
|
|
5
|
+
Engine,
|
|
6
|
+
OperatorName,
|
|
7
|
+
SchemaVersion,
|
|
8
|
+
type FormDefinition,
|
|
9
|
+
type PageQuestion
|
|
10
|
+
} from '@defra/forms-model'
|
|
11
|
+
|
|
12
|
+
const YES_NO_COMPONENT_ID = 'a7c0242f-2a31-45b2-8c71-ff2ac7f53288'
|
|
13
|
+
const USER_TYPE_LIST_ID = '4fa26e9c-07cf-47cd-a9dd-5cec0dd3f544'
|
|
14
|
+
const EXISTING_USER_ITEM_ID = '55fe0067-d011-4d33-886c-e1aa266637c3'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A minimal, schema-valid V2 definition: one YesNo question page and a
|
|
18
|
+
* summary page. Each call returns a fresh object, so tests can mutate their
|
|
19
|
+
* copy freely without affecting each other.
|
|
20
|
+
*/
|
|
21
|
+
export function buildDefinition(): FormDefinition {
|
|
22
|
+
return {
|
|
23
|
+
name: 'Stub definition',
|
|
24
|
+
engine: Engine.V2,
|
|
25
|
+
schema: SchemaVersion.V2,
|
|
26
|
+
startPage: '/summary',
|
|
27
|
+
pages: [
|
|
28
|
+
{
|
|
29
|
+
id: '449c053b-9201-4312-9a75-187afc6ba48b',
|
|
30
|
+
path: '/licence',
|
|
31
|
+
title: 'Licence',
|
|
32
|
+
components: [
|
|
33
|
+
{
|
|
34
|
+
id: YES_NO_COMPONENT_ID,
|
|
35
|
+
name: 'xVrYaJ',
|
|
36
|
+
type: ComponentType.YesNoField,
|
|
37
|
+
title: 'Do you have a licence?',
|
|
38
|
+
shortDescription: 'Licence',
|
|
39
|
+
options: { required: true }
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
next: []
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: '449c053b-9201-4312-9a75-187afc6ba48c',
|
|
46
|
+
path: '/summary',
|
|
47
|
+
title: 'Summary',
|
|
48
|
+
controller: ControllerType.Summary,
|
|
49
|
+
components: []
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
lists: [],
|
|
53
|
+
sections: [],
|
|
54
|
+
conditions: []
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* A definition that passes schema validation but cannot be used by the
|
|
60
|
+
* engine: a ListItemRef condition points at the YesNoField (boolean), so the
|
|
61
|
+
* condition expression builder produces an unparseable expression. Distilled
|
|
62
|
+
* from a real production incident.
|
|
63
|
+
*/
|
|
64
|
+
export function buildBrokenConditionDefinition(): FormDefinition {
|
|
65
|
+
const definition = buildDefinition()
|
|
66
|
+
|
|
67
|
+
definition.name = 'Broken condition fixture'
|
|
68
|
+
|
|
69
|
+
const questionPage = definition.pages[0] as PageQuestion
|
|
70
|
+
// A YesNoField cannot legitimately carry a custom list — that is the
|
|
71
|
+
// corruption this fixture models — so the TS component types (rightly)
|
|
72
|
+
// have no `list` property here and a cast is required.
|
|
73
|
+
;(questionPage.components[0] as { list?: string }).list = USER_TYPE_LIST_ID
|
|
74
|
+
definition.lists = [
|
|
75
|
+
{
|
|
76
|
+
id: USER_TYPE_LIST_ID,
|
|
77
|
+
name: 'XtfRYR',
|
|
78
|
+
title: 'User type list',
|
|
79
|
+
type: 'string',
|
|
80
|
+
items: [
|
|
81
|
+
{
|
|
82
|
+
id: EXISTING_USER_ITEM_ID,
|
|
83
|
+
text: 'existing user',
|
|
84
|
+
value: 'existing user'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: '2277c7e5-7fef-46c6-993b-d294116d6d6b',
|
|
88
|
+
text: 'new user',
|
|
89
|
+
value: 'new user'
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
definition.conditions = [
|
|
95
|
+
{
|
|
96
|
+
id: '3f9d3a35-6dee-4706-806c-3f776129f631',
|
|
97
|
+
displayName: 'Existing user',
|
|
98
|
+
items: [
|
|
99
|
+
{
|
|
100
|
+
id: '7d7f58ee-c860-4d24-8a13-de5cb9af53d8',
|
|
101
|
+
componentId: YES_NO_COMPONENT_ID,
|
|
102
|
+
operator: OperatorName.Is,
|
|
103
|
+
type: ConditionType.ListItemRef,
|
|
104
|
+
value: {
|
|
105
|
+
listId: USER_TYPE_LIST_ID,
|
|
106
|
+
itemId: [EXISTING_USER_ITEM_ID]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
return definition
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* A schema-valid definition whose first page names a controller that is
|
|
118
|
+
* neither built in nor registered by the host application.
|
|
119
|
+
*/
|
|
120
|
+
export function buildUnknownControllerDefinition(): FormDefinition {
|
|
121
|
+
const definition = buildDefinition()
|
|
122
|
+
|
|
123
|
+
definition.name = 'Unknown controller fixture'
|
|
124
|
+
definition.pages[0].controller =
|
|
125
|
+
'NoSuchPageController' as unknown as ControllerType
|
|
126
|
+
|
|
127
|
+
return definition
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Schema-valid (component types are free strings in the schema), but the
|
|
132
|
+
* question uses a type the engine has no component class for.
|
|
133
|
+
*/
|
|
134
|
+
export function buildUnknownComponentDefinition(): FormDefinition {
|
|
135
|
+
const definition = buildDefinition()
|
|
136
|
+
|
|
137
|
+
definition.name = 'Unknown component fixture'
|
|
138
|
+
const questionPage = definition.pages[0] as PageQuestion
|
|
139
|
+
questionPage.components[0].type = 'MyUnknownField' as unknown as ComponentType
|
|
140
|
+
|
|
141
|
+
return definition
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* A definition that fails schema validation: the question page appears
|
|
146
|
+
* twice, violating the pages uniqueness rule.
|
|
147
|
+
*/
|
|
148
|
+
export function buildSchemaInvalidDefinition(): FormDefinition {
|
|
149
|
+
const definition = buildDefinition()
|
|
150
|
+
|
|
151
|
+
definition.name = 'Schema invalid fixture'
|
|
152
|
+
definition.pages.push(buildDefinition().pages[0])
|
|
153
|
+
|
|
154
|
+
return definition
|
|
155
|
+
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { type AutocompleteFieldComponent } from '@defra/forms-model'
|
|
2
2
|
|
|
3
3
|
import { SelectField } from './SelectField.js'
|
|
4
|
+
import { withCustomValidationOverrides } from './helpers/index.js'
|
|
4
5
|
import { type RenderContext } from './types.js'
|
|
6
|
+
import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
|
|
5
7
|
import { messageTemplate } from '../pageControllers/validationOptions.js'
|
|
8
|
+
import { type Translator } from '../types/index.js'
|
|
6
9
|
|
|
7
10
|
export class AutocompleteField extends SelectField {
|
|
8
11
|
declare options: AutocompleteFieldComponent['options']
|
|
@@ -45,4 +48,21 @@ export class AutocompleteField extends SelectField {
|
|
|
45
48
|
formGroup
|
|
46
49
|
}
|
|
47
50
|
}
|
|
51
|
+
|
|
52
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
53
|
+
const { customValidationMessages } = this.options
|
|
54
|
+
const { t } = translator
|
|
55
|
+
const defaults = {
|
|
56
|
+
'any.required': buildValidationMessages(t).objectRequired,
|
|
57
|
+
'any.only': buildValidationMessages(t).objectRequired
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
[this.name]: withCustomValidationOverrides(
|
|
62
|
+
defaults,
|
|
63
|
+
undefined,
|
|
64
|
+
customValidationMessages
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
48
68
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'
|
|
2
2
|
import joi, { type ArraySchema } from 'joi'
|
|
3
3
|
|
|
4
|
+
import { EN_GB } from '../../../constants.js'
|
|
4
5
|
import { isFormValue } from './FormComponent.js'
|
|
5
6
|
import { SelectionControlField } from './SelectionControlField.js'
|
|
7
|
+
import { t as tPlugin } from '../i18n/index.js'
|
|
6
8
|
import { type Translator } from '../i18n/types.js'
|
|
7
9
|
import { type FormModel } from '../models/FormModel.js'
|
|
8
10
|
import { type QuestionPageController } from '../pageControllers/QuestionPageController.js'
|
|
@@ -17,8 +19,9 @@ import {
|
|
|
17
19
|
export class CheckboxesField extends SelectionControlField {
|
|
18
20
|
declare options: CheckboxesFieldComponent['options']
|
|
19
21
|
declare schema: CheckboxesFieldComponent['schema']
|
|
20
|
-
declare formSchema: ArraySchema<string> | ArraySchema<number>
|
|
21
|
-
declare stateSchema: ArraySchema<string> | ArraySchema<number>
|
|
22
|
+
declare formSchema: ArraySchema<string[]> | ArraySchema<number[]>
|
|
23
|
+
declare stateSchema: ArraySchema<string[]> | ArraySchema<number[]>
|
|
24
|
+
declare limits: { min?: number; max?: number; length?: number }
|
|
22
25
|
|
|
23
26
|
constructor(
|
|
24
27
|
def: CheckboxesFieldComponent,
|
|
@@ -30,7 +33,7 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
30
33
|
const { options, schema } = def
|
|
31
34
|
|
|
32
35
|
let formSchema =
|
|
33
|
-
type === 'string' ? joi.array<string>() : joi.array<number>()
|
|
36
|
+
type === 'string' ? joi.array<string[]>() : joi.array<number[]>()
|
|
34
37
|
|
|
35
38
|
const itemsSchema = joi[type]()
|
|
36
39
|
.valid(...this.values)
|
|
@@ -41,11 +44,8 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
41
44
|
.single()
|
|
42
45
|
.label(this.label)
|
|
43
46
|
.required()
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
'array.max': messageTemplate.arrayMax,
|
|
47
|
-
'array.length': messageTemplate.arrayLength
|
|
48
|
-
})
|
|
47
|
+
|
|
48
|
+
const limits: { min?: number; max?: number; length?: number } = {}
|
|
49
49
|
|
|
50
50
|
if (options.required === false) {
|
|
51
51
|
formSchema = formSchema.optional()
|
|
@@ -53,16 +53,25 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
53
53
|
|
|
54
54
|
if (typeof schema?.length === 'number') {
|
|
55
55
|
formSchema = formSchema.length(schema.length)
|
|
56
|
+
limits.length = schema.length
|
|
56
57
|
} else {
|
|
57
58
|
if (typeof schema?.min === 'number') {
|
|
58
59
|
formSchema = formSchema.min(schema.min)
|
|
60
|
+
limits.min = schema.min
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
if (typeof schema?.max === 'number') {
|
|
62
64
|
formSchema = formSchema.max(schema.max)
|
|
65
|
+
limits.max = schema.max
|
|
63
66
|
}
|
|
64
67
|
}
|
|
65
68
|
|
|
69
|
+
this.limits = limits
|
|
70
|
+
|
|
71
|
+
formSchema = formSchema.messages(
|
|
72
|
+
CheckboxesField.buildErrorMessages(EN_GB, limits)
|
|
73
|
+
)
|
|
74
|
+
|
|
66
75
|
this.formSchema = formSchema.default([])
|
|
67
76
|
this.stateSchema = formSchema.default(null).allow(null)
|
|
68
77
|
this.options = options
|
|
@@ -133,6 +142,13 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
133
142
|
return this.getContextValueFromFormValue(values)
|
|
134
143
|
}
|
|
135
144
|
|
|
145
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
146
|
+
const { language } = translator
|
|
147
|
+
return {
|
|
148
|
+
[this.name]: CheckboxesField.buildErrorMessages(language, this.limits)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
136
152
|
/**
|
|
137
153
|
* For error preview page that shows all possible errors on a component
|
|
138
154
|
*/
|
|
@@ -169,4 +185,21 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
169
185
|
|
|
170
186
|
return value.every(isFormValue)
|
|
171
187
|
}
|
|
188
|
+
|
|
189
|
+
static buildErrorMessages(
|
|
190
|
+
language: string,
|
|
191
|
+
limits: { min?: number; max?: number; length?: number } = {}
|
|
192
|
+
) {
|
|
193
|
+
return {
|
|
194
|
+
'array.min': tPlugin('validation.arrayMin', language, {
|
|
195
|
+
count: limits.min ?? 1
|
|
196
|
+
}),
|
|
197
|
+
'array.max': tPlugin('validation.arrayMax', language, {
|
|
198
|
+
count: limits.max ?? 1
|
|
199
|
+
}),
|
|
200
|
+
'array.length': tPlugin('validation.arrayLength', language, {
|
|
201
|
+
count: limits.length ?? 1
|
|
202
|
+
})
|
|
203
|
+
}
|
|
204
|
+
}
|
|
172
205
|
}
|
|
@@ -28,6 +28,7 @@ export class ComponentBase {
|
|
|
28
28
|
|
|
29
29
|
isFormComponent = false
|
|
30
30
|
model: FormModel
|
|
31
|
+
def: ComponentDef
|
|
31
32
|
|
|
32
33
|
/** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
|
|
33
34
|
formSchema: ComponentSchema = joi.string()
|
|
@@ -45,6 +46,7 @@ export class ComponentBase {
|
|
|
45
46
|
this.type = def.type
|
|
46
47
|
this.name = def.name
|
|
47
48
|
this.title = def.title
|
|
49
|
+
this.def = def
|
|
48
50
|
|
|
49
51
|
if ('schema' in def) {
|
|
50
52
|
this.schema = def.schema
|
|
@@ -87,10 +89,10 @@ export class ComponentBase {
|
|
|
87
89
|
}
|
|
88
90
|
|
|
89
91
|
export type ComponentSchema =
|
|
90
|
-
| ArraySchema<string>
|
|
91
|
-
| ArraySchema<number>
|
|
92
|
-
| ArraySchema<boolean>
|
|
93
|
-
| ArraySchema<object>
|
|
92
|
+
| ArraySchema<string[]>
|
|
93
|
+
| ArraySchema<number[]>
|
|
94
|
+
| ArraySchema<boolean[]>
|
|
95
|
+
| ArraySchema<object[]>
|
|
94
96
|
| BooleanSchema<string>
|
|
95
97
|
| BooleanSchema
|
|
96
98
|
| DateSchema
|