@defra/forms-engine-plugin 5.0.0-alpha.3 → 5.0.0-alpha.31
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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocationFieldHelpers.js","names":["isFormValue","lowercaseMessageStart","message","startsWith","slice","charAt","toLowerCase","joinWithAnd","items","length","leading","join","last","formatErrorList","messages","formattedMessages","map","msg","index","mergeCssClasses","classNames","tokens","flatMap","name","split","token","trim","filter","Boolean","undefined","Array","from","Set","deduplicateErrorsByHref","errors","error","self","findIndex","err","href","getMapLayers","component","mapLayers","options","layers","sssi","push","getLocationFieldViewModel","viewModel","context","collection","fieldset","existingFieldset","label","subViewModels","getViewModel","fieldErrors","forEach","model","errorMessage","text","hasFieldErrors","type","value","classes","prefix","suffix","toString","baseItem","id","showFieldsetError","legend","result","instructionText","createLocationFieldValidator","payload","helpers","values","getFormValueFromState","getStateFromValidForm","missing","keys","key","isState","required"],"sources":["../../../../../src/server/plugins/engine/components/LocationFieldHelpers.ts"],"sourcesContent":["import { type Context, type CustomValidator } from 'joi'\n\nimport { type EastingNorthingField } from '~/src/server/plugins/engine/components/EastingNorthingField.js'\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type GeospatialField } from '~/src/server/plugins/engine/components/GeospatialField.js'\nimport { type LatLongField } from '~/src/server/plugins/engine/components/LatLongField.js'\nimport { type OsGridRefField } from '~/src/server/plugins/engine/components/OsGridRefField.js'\nimport {\n type DateInputItem,\n type Label,\n type RenderContext,\n type ViewModel\n} from '~/src/server/plugins/engine/components/types.js'\nimport {\n type FormPayload,\n type FormSubmissionError,\n type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport type LocationField =\n | InstanceType<typeof EastingNorthingField>\n | InstanceType<typeof LatLongField>\n\n/**\n * Lowercases the start of a message for concatenation.\n * Handles patterns like:\n * - \"Enter latitude\" -> \"enter latitude\"\n * - \"Enter a valid latitude...\" -> \"enter a valid latitude...\"\n * - \"latitude must be...\" -> \"latitude must be...\"\n */\nfunction lowercaseMessageStart(message: string): string {\n if (message.startsWith('Enter ')) {\n return 'enter' + message.slice(5)\n }\n\n // Lowercase first character for any other message\n return message.charAt(0).toLowerCase() + message.slice(1)\n}\n\nexport function joinWithAnd(items: string[]): string {\n if (items.length === 2) {\n return `${items[0]} and ${items[1]}`\n }\n\n const leading = items.slice(0, -1).join(', ')\n const last = items[items.length - 1]\n return `${leading} and ${last}`\n}\n\nexport function formatErrorList(messages: string[]): string {\n if (!messages.length) {\n return ''\n }\n\n if (messages.length === 1) {\n return messages[0]\n }\n\n const formattedMessages = messages.map((msg, index) =>\n index === 0 ? msg : lowercaseMessageStart(msg)\n )\n\n return joinWithAnd(formattedMessages)\n}\n\nexport function mergeCssClasses(...classNames: (string | undefined)[]) {\n const tokens = classNames\n .flatMap((name) => name?.split(/\\s+/) ?? [])\n .map((token) => token.trim())\n .filter(Boolean)\n\n if (!tokens.length) {\n return undefined\n }\n\n return Array.from(new Set(tokens)).join(' ')\n}\n\nexport function deduplicateErrorsByHref(\n errors?: FormSubmissionError[]\n): FormSubmissionError[] | undefined {\n if (!errors?.length) {\n return undefined\n }\n\n return errors.filter(\n (error, index, self) =>\n index === self.findIndex((err) => err.href === error.href)\n )\n}\n\nexport function getMapLayers(\n component:\n | GeospatialField\n | OsGridRefField\n | LatLongField\n | EastingNorthingField\n) {\n const { mapLayers } = component.options\n const layers = []\n\n if (mapLayers?.sssi) {\n layers.push('sssi')\n }\n\n return layers.join(',')\n}\n\nexport function getLocationFieldViewModel(\n component: LocationField,\n viewModel: ViewModel & {\n label: Label\n id: string\n name: string\n value: FormValue\n },\n context: RenderContext\n) {\n const { collection } = component\n const { fieldset: existingFieldset, label } = viewModel\n\n const subViewModels = collection.getViewModel(context)\n\n const fieldErrors: string[] = []\n subViewModels.forEach(({ model }) => {\n if (model.errorMessage?.text) {\n fieldErrors.push(model.errorMessage.text)\n }\n })\n\n const hasFieldErrors = fieldErrors.length > 0\n\n const items: DateInputItem[] = subViewModels.map(\n ({ model }): DateInputItem => {\n let { label, type, value, classes, prefix, suffix, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text\n }\n\n if (!isFormValue(value)) {\n value = undefined\n }\n\n const baseItem: DateInputItem = {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes: mergeCssClasses(\n classes,\n hasFieldErrors ? 'govuk-input--error' : undefined\n ),\n prefix,\n suffix\n }\n\n if (!hasFieldErrors && errorMessage) {\n baseItem.errorMessage = errorMessage\n }\n\n return baseItem\n }\n )\n\n const showFieldsetError =\n hasFieldErrors || Boolean(viewModel.errorMessage?.text)\n\n viewModel.showFieldsetError = showFieldsetError\n\n if (hasFieldErrors) {\n viewModel.errorMessage = {\n text:\n fieldErrors.length === 1 ? fieldErrors[0] : formatErrorList(fieldErrors)\n }\n }\n\n const fieldset = existingFieldset ?? {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const result = {\n ...viewModel,\n fieldset,\n items,\n mapLayers: getMapLayers(component)\n }\n\n if (component.options.instructionText) {\n return {\n ...result,\n instructionText: component.options.instructionText\n }\n }\n\n return result\n}\n\n/**\n * Validator factory for location-based fields.\n * This creates a validator that ensures all required fields are present.\n */\nexport function createLocationFieldValidator(\n component: LocationField\n): CustomValidator {\n return (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n return payload\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"LocationFieldHelpers.js","names":["EastingNorthingField","isFormValue","lowercaseMessageStart","message","charAt","toLowerCase","slice","joinWithAnd","items","translator","t","length","leading","join","last","formatErrorList","messages","formattedMessages","map","msg","index","mergeCssClasses","classNames","tokens","flatMap","name","split","token","trim","filter","Boolean","undefined","Array","from","Set","deduplicateErrorsByHref","errors","error","self","findIndex","err","href","getMapLayers","component","mapLayers","options","layers","sssi","push","getLocationFieldViewModel","viewModel","context","collection","fieldset","existingFieldset","label","subViewModels","getViewModel","fieldErrors","forEach","model","errorMessage","text","hasFieldErrors","type","value","classes","prefix","suffix","toString","baseItem","id","showFieldsetError","legend","result","country","countries","at","lang","language","instructionText","tComponent","instructionSummary","def","createLocationFieldValidator","payload","helpers","values","getFormValueFromState","getStateFromValidForm","missing","keys","key","isState","required"],"sources":["../../../../../src/server/plugins/engine/components/LocationFieldHelpers.ts"],"sourcesContent":["import { type Context, type CustomValidator } from 'joi'\n\nimport { EastingNorthingField } from '~/src/server/plugins/engine/components/EastingNorthingField.js'\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type GeospatialField } from '~/src/server/plugins/engine/components/GeospatialField.js'\nimport { type LatLongField } from '~/src/server/plugins/engine/components/LatLongField.js'\nimport { type OsGridRefField } from '~/src/server/plugins/engine/components/OsGridRefField.js'\nimport {\n type DateInputItem,\n type Label,\n type RenderContext,\n type ViewModel\n} from '~/src/server/plugins/engine/components/types.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport {\n type FormPayload,\n type FormSubmissionError,\n type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport type LocationField =\n | InstanceType<typeof EastingNorthingField>\n | InstanceType<typeof LatLongField>\n\n/**\n * Lowercases the start of a message for concatenation.\n * Handles patterns like:\n * - \"Enter latitude\" -> \"enter latitude\"\n * - \"Enter a valid latitude...\" -> \"enter a valid latitude...\"\n * - \"latitude must be...\" -> \"latitude must be...\"\n */\nfunction lowercaseMessageStart(message: string): string {\n // Lowercase first character for a message\n return message.charAt(0).toLowerCase() + message.slice(1)\n}\n\nexport function joinWithAnd(items: string[], translator: Translator): string {\n const { t } = translator\n if (items.length === 2) {\n return `${items[0]} ${t('common.and')} ${items[1]}`\n }\n\n const leading = items.slice(0, -1).join(', ')\n const last = items[items.length - 1]\n return `${leading} ${t('common.and')} ${last}`\n}\n\nexport function formatErrorList(\n messages: string[],\n translator: Translator\n): string {\n if (!messages.length) {\n return ''\n }\n\n if (messages.length === 1) {\n return messages[0]\n }\n\n const formattedMessages = messages.map((msg, index) =>\n index === 0 ? msg : lowercaseMessageStart(msg)\n )\n\n return joinWithAnd(formattedMessages, translator)\n}\n\nexport function mergeCssClasses(...classNames: (string | undefined)[]) {\n const tokens = classNames\n .flatMap((name) => name?.split(/\\s+/) ?? [])\n .map((token) => token.trim())\n .filter(Boolean)\n\n if (!tokens.length) {\n return undefined\n }\n\n return Array.from(new Set(tokens)).join(' ')\n}\n\nexport function deduplicateErrorsByHref(\n errors?: FormSubmissionError[]\n): FormSubmissionError[] | undefined {\n if (!errors?.length) {\n return undefined\n }\n\n return errors.filter(\n (error, index, self) =>\n index === self.findIndex((err) => err.href === error.href)\n )\n}\n\nexport function getMapLayers(\n component:\n | GeospatialField\n | OsGridRefField\n | LatLongField\n | EastingNorthingField\n) {\n const { mapLayers } = component.options\n const layers = []\n\n if (mapLayers?.sssi) {\n layers.push('sssi')\n }\n\n return layers.join(',')\n}\n\nexport function getLocationFieldViewModel(\n component: LocationField,\n viewModel: ViewModel & {\n label: Label\n id: string\n name: string\n value: FormValue\n },\n context: RenderContext\n) {\n const { collection } = component\n const { fieldset: existingFieldset, label } = viewModel\n\n const subViewModels = collection.getViewModel(context)\n\n const fieldErrors: string[] = []\n subViewModels.forEach(({ model }) => {\n if (model.errorMessage?.text) {\n fieldErrors.push(model.errorMessage.text)\n }\n })\n\n const hasFieldErrors = fieldErrors.length > 0\n\n const items: DateInputItem[] = subViewModels.map(\n ({ model }): DateInputItem => {\n let { label, type, value, classes, prefix, suffix, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text\n }\n\n if (!isFormValue(value)) {\n value = undefined\n }\n\n const baseItem: DateInputItem = {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes: mergeCssClasses(\n classes,\n hasFieldErrors ? 'govuk-input--error' : undefined\n ),\n prefix,\n suffix\n }\n\n if (!hasFieldErrors && errorMessage) {\n baseItem.errorMessage = errorMessage\n }\n\n return baseItem\n }\n )\n\n const showFieldsetError =\n hasFieldErrors || Boolean(viewModel.errorMessage?.text)\n\n viewModel.showFieldsetError = showFieldsetError\n\n if (hasFieldErrors) {\n viewModel.errorMessage = {\n text:\n fieldErrors.length === 1\n ? fieldErrors[0]\n : formatErrorList(fieldErrors, context.translator)\n }\n }\n\n const fieldset = existingFieldset ?? {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const result = {\n ...viewModel,\n fieldset,\n items,\n mapLayers: getMapLayers(component),\n country:\n component instanceof EastingNorthingField\n ? component.options.countries?.at(0)\n : undefined,\n lang: context.translator.language\n }\n\n if (component.options.instructionText) {\n const { t, tComponent } = context.translator\n\n return {\n ...result,\n instructionSummary: t('components.locationFieldBase.howToFind'),\n instructionText:\n tComponent(component.def, 'instructionText') ||\n component.options.instructionText,\n t\n }\n }\n\n return result\n}\n\n/**\n * Validator factory for location-based fields.\n * This creates a validator that ensures all required fields are present.\n */\nexport function createLocationFieldValidator(\n component: LocationField\n): CustomValidator {\n return (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n return payload\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -22,7 +22,7 @@ export class Markdown extends ComponentBase {
|
|
|
22
22
|
} = context.translator;
|
|
23
23
|
return {
|
|
24
24
|
...viewModel,
|
|
25
|
-
content: tComponent(this, 'content') || content,
|
|
25
|
+
content: tComponent(this.def, 'content') || content,
|
|
26
26
|
headerStartLevel: this.headerStartLevel
|
|
27
27
|
};
|
|
28
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markdown.js","names":["ComponentBase","Markdown","content","headerStartLevel","constructor","def","props","options","getViewModel","context","viewModel","tComponent","translator"],"sources":["../../../../../src/server/plugins/engine/components/Markdown.ts"],"sourcesContent":["import { type
|
|
1
|
+
{"version":3,"file":"Markdown.js","names":["ComponentBase","Markdown","content","headerStartLevel","constructor","def","props","options","getViewModel","context","viewModel","tComponent","translator"],"sources":["../../../../../src/server/plugins/engine/components/Markdown.ts"],"sourcesContent":["import { type MarkdownComponent } from '@defra/forms-model'\n\nimport { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\n\nexport class Markdown extends ComponentBase {\n declare options: MarkdownComponent['options']\n content: MarkdownComponent['content']\n headerStartLevel: number\n\n constructor(\n def: MarkdownComponent,\n props: ConstructorParameters<typeof ComponentBase>[1]\n ) {\n super(def, props)\n\n const { content, options } = def\n\n this.content = content\n this.options = options\n this.headerStartLevel = 2\n }\n\n getViewModel(context: RenderContext) {\n const { content, viewModel } = this\n\n const { tComponent } = context.translator\n\n return {\n ...viewModel,\n content: tComponent(this.def, 'content') || content,\n headerStartLevel: this.headerStartLevel\n }\n }\n}\n"],"mappings":"AAEA,SAASA,aAAa;AAGtB,OAAO,MAAMC,QAAQ,SAASD,aAAa,CAAC;EAE1CE,OAAO;EACPC,gBAAgB;EAEhBC,WAAWA,CACTC,GAAsB,EACtBC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEJ,OAAO;MAAEK;IAAQ,CAAC,GAAGF,GAAG;IAEhC,IAAI,CAACH,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACK,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACJ,gBAAgB,GAAG,CAAC;EAC3B;EAEAK,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAM;MAAEP,OAAO;MAAEQ;IAAU,CAAC,GAAG,IAAI;IAEnC,MAAM;MAAEC;IAAW,CAAC,GAAGF,OAAO,CAACG,UAAU;IAEzC,OAAO;MACL,GAAGF,SAAS;MACZR,OAAO,EAAES,UAAU,CAAC,IAAI,CAACN,GAAG,EAAE,SAAS,CAAC,IAAIH,OAAO;MACnDC,gBAAgB,EAAE,IAAI,CAACA;IACzB,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -12,11 +12,13 @@ export declare class MonthYearField extends FormComponent {
|
|
|
12
12
|
collection: ComponentCollection;
|
|
13
13
|
constructor(def: MonthYearFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
14
14
|
getFormValueFromState(state: FormSubmissionState): MonthYearState | undefined;
|
|
15
|
-
getDisplayStringFromFormValue(value: MonthYearState | undefined,
|
|
15
|
+
getDisplayStringFromFormValue(value: MonthYearState | undefined, translator: Translator): string;
|
|
16
16
|
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
17
17
|
getContextValueFromFormValue(value: MonthYearState | undefined): string | null;
|
|
18
18
|
getContextValueFromState(state: FormSubmissionState): string | null;
|
|
19
|
-
getValidationMessagesOverride(translator: Translator):
|
|
19
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
20
|
+
[x: string]: LanguageMessages;
|
|
21
|
+
};
|
|
20
22
|
getViewModel(context: RenderContext): {
|
|
21
23
|
fieldset: {
|
|
22
24
|
attributes?: string | Record<string, string>;
|
|
@@ -64,6 +66,7 @@ export declare class MonthYearField extends FormComponent {
|
|
|
64
66
|
upload?: {
|
|
65
67
|
count: number;
|
|
66
68
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
69
|
+
uploadingLabel?: string;
|
|
67
70
|
};
|
|
68
71
|
};
|
|
69
72
|
isState(value?: FormStateValue | FormState): value is MonthYearState;
|
|
@@ -6,7 +6,7 @@ import { NumberField } from "./NumberField.js";
|
|
|
6
6
|
import { parseStrictDate } from "../date-helper.js";
|
|
7
7
|
import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
|
|
8
8
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
9
|
-
import {
|
|
9
|
+
import { formatDateForLanguage } from "../../payment/helper.js";
|
|
10
10
|
export class MonthYearField extends FormComponent {
|
|
11
11
|
constructor(def, props) {
|
|
12
12
|
super(def, props);
|
|
@@ -15,7 +15,7 @@ export class MonthYearField extends FormComponent {
|
|
|
15
15
|
options
|
|
16
16
|
} = def;
|
|
17
17
|
const isRequired = options.required !== false;
|
|
18
|
-
const customValidationMessages =
|
|
18
|
+
const customValidationMessages = {
|
|
19
19
|
'any.required': messageTemplate.objectMissing,
|
|
20
20
|
'number.base': messageTemplate.objectMissing,
|
|
21
21
|
'number.precision': messageTemplate.dateFormat,
|
|
@@ -23,7 +23,7 @@ export class MonthYearField extends FormComponent {
|
|
|
23
23
|
'number.unsafe': messageTemplate.dateFormat,
|
|
24
24
|
'number.min': messageTemplate.dateFormat,
|
|
25
25
|
'number.max': messageTemplate.dateFormat
|
|
26
|
-
}
|
|
26
|
+
};
|
|
27
27
|
this.collection = new ComponentCollection([{
|
|
28
28
|
type: ComponentType.NumberField,
|
|
29
29
|
name: `${name}__month`,
|
|
@@ -69,15 +69,15 @@ export class MonthYearField extends FormComponent {
|
|
|
69
69
|
const value = super.getFormValueFromState(state);
|
|
70
70
|
return MonthYearField.isMonthYear(value) ? value : undefined;
|
|
71
71
|
}
|
|
72
|
-
getDisplayStringFromFormValue(value,
|
|
72
|
+
getDisplayStringFromFormValue(value, translator) {
|
|
73
73
|
if (!value) {
|
|
74
74
|
return '';
|
|
75
75
|
}
|
|
76
76
|
const date = new Date();
|
|
77
|
+
// Force to first day of month in case current date was say 31st and specified month has fewer than 31 days
|
|
78
|
+
date.setDate(1);
|
|
77
79
|
date.setMonth(value.month - 1);
|
|
78
|
-
const monthString = date
|
|
79
|
-
month: 'long'
|
|
80
|
-
});
|
|
80
|
+
const monthString = formatDateForLanguage(date, 'LLLL', translator.language);
|
|
81
81
|
return `${monthString} ${value.year}`;
|
|
82
82
|
}
|
|
83
83
|
getDisplayStringFromState(state, translator) {
|
|
@@ -98,7 +98,7 @@ export class MonthYearField extends FormComponent {
|
|
|
98
98
|
const {
|
|
99
99
|
t
|
|
100
100
|
} = translator;
|
|
101
|
-
|
|
101
|
+
const messages = {
|
|
102
102
|
'any.required': buildValidationMessages(t).objectMissing,
|
|
103
103
|
'number.base': buildValidationMessages(t).objectMissing,
|
|
104
104
|
'number.precision': buildValidationMessages(t).dateFormat,
|
|
@@ -106,7 +106,11 @@ export class MonthYearField extends FormComponent {
|
|
|
106
106
|
'number.unsafe': buildValidationMessages(t).dateFormat,
|
|
107
107
|
'number.min': buildValidationMessages(t).dateFormat,
|
|
108
108
|
'number.max': buildValidationMessages(t).dateFormat
|
|
109
|
-
}
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
[`${this.name}__month`]: messages,
|
|
112
|
+
[`${this.name}__year`]: messages
|
|
113
|
+
};
|
|
110
114
|
}
|
|
111
115
|
getViewModel(context) {
|
|
112
116
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonthYearField.js","names":["ComponentType","format","isValid","parse","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","parseStrictDate","buildValidationMessages","messageTemplate","convertToLanguageMessages","MonthYearField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorMonthYear","peers","formSchema","stateSchema","getFormValueFromState","state","value","isMonthYear","undefined","getDisplayStringFromFormValue","_translator","date","Date","setMonth","month","monthString","toLocaleString","year","getDisplayStringFromState","translator","getContextValueFromFormValue","getContextValueFromState","getValidationMessagesOverride","t","getViewModel","context","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","dateMin","dateMax","isNumber","component","validator","payload","helpers","values","getStateFromValidForm","missing","keys","key","earliestDate","earliestMonthYear","limit","latestDate","latestMonthYear"],"sources":["../../../../../src/server/plugins/engine/components/MonthYearField.ts"],"sourcesContent":["import { ComponentType, type MonthYearFieldComponent } from '@defra/forms-model'\nimport { format, isValid, parse } from 'date-fns'\nimport {\n type Context,\n type CustomValidator,\n type LanguageMessages,\n type ObjectSchema\n} from 'joi'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport {\n type DateInputItem,\n type MonthYearState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { parseStrictDate } from '~/src/server/plugins/engine/date-helper.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { convertToLanguageMessages } from '~/src/server/utils/type-utils.js'\n\nexport class MonthYearField extends FormComponent {\n declare options: MonthYearFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: MonthYearFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options } = def\n\n const isRequired = options.required !== false\n\n const customValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'any.required': messageTemplate.objectMissing,\n 'number.base': messageTemplate.objectMissing,\n 'number.precision': messageTemplate.dateFormat,\n 'number.integer': messageTemplate.dateFormat,\n 'number.unsafe': messageTemplate.dateFormat,\n 'number.min': messageTemplate.dateFormat,\n 'number.max': messageTemplate.dateFormat\n })\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__month`,\n title: 'components.monthYearField.month',\n schema: { min: 1, max: 12, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-2',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__year`,\n title: 'components.monthYearField.year',\n schema: { min: 1000, max: 3000, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-4',\n customValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n custom: getValidatorMonthYear(this),\n peers: [`${name}__month`, `${name}__year`]\n }\n )\n\n this.options = options\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return MonthYearField.isMonthYear(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: MonthYearState | undefined,\n _translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const date = new Date()\n date.setMonth(value.month - 1)\n\n const monthString = date.toLocaleString('default', { month: 'long' })\n return `${monthString} ${value.year}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: MonthYearState | undefined\n ): string | null {\n if (\n !value ||\n !isValid(\n parseStrictDate(\n value,\n `${value.year}-${value.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-01`, 'yyyy-MM')\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n return convertToLanguageMessages({\n 'any.required': buildValidationMessages(t).objectMissing,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).dateFormat,\n 'number.integer': buildValidationMessages(t).dateFormat,\n 'number.unsafe': buildValidationMessages(t).dateFormat,\n 'number.min': buildValidationMessages(t).dateFormat,\n 'number.max': buildValidationMessages(t).dateFormat\n })\n }\n\n getViewModel(context: RenderContext) {\n const { errors } = context\n const { collection, name } = this\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n // Check for component errors only\n const hasError = errors?.some((error) => error.name === name)\n\n // Use the component collection to generate the subitems\n const items: DateInputItem[] = collection\n .getViewModel(context)\n .map(({ model }) => {\n let { label, type, value, classes, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text // Date component uses string labels\n }\n\n if (hasError || errorMessage) {\n classes = `${classes} govuk-input--error`.trim()\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes\n }\n })\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n return {\n ...viewModel,\n fieldset,\n items\n }\n }\n\n isState(value?: FormStateValue | FormState) {\n return MonthYearField.isMonthYear(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return MonthYearField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n {\n type: 'dateFormatMonth',\n template: '{{#label}} must include a month'\n },\n { type: 'dateFormatYear', template: '{{#label}} must include a year' }\n ],\n advancedSettingsErrors: [\n { type: 'dateEarliest', template: messageTemplate.dateMin },\n { type: 'dateLatest', template: messageTemplate.dateMax }\n ]\n }\n }\n\n static isMonthYear(\n value?: FormStateValue | FormState\n ): value is MonthYearState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport function getValidatorMonthYear(component: MonthYearField) {\n const validator: CustomValidator = (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n const date = parse(\n `${values.year}-${values.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n\n if (!isValid(date)) {\n return helpers.error('date.format', context)\n }\n\n // Minimum date from today\n const earliestDate = options.earliestMonthYear\n ? new Date(`${options.earliestMonthYear}-01`)\n : undefined\n\n if (earliestDate && date < earliestDate) {\n return helpers.error('date.min', { ...context, limit: earliestDate })\n }\n\n // Maximum date from today\n const latestDate = options.latestMonthYear\n ? new Date(`${options.latestMonthYear}-01`)\n : undefined\n\n if (latestDate && date > latestDate) {\n return helpers.error('date.max', { ...context, limit: latestDate })\n }\n\n return payload\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MonthYearField.js","names":["ComponentType","format","isValid","parse","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","parseStrictDate","buildValidationMessages","messageTemplate","formatDateForLanguage","MonthYearField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorMonthYear","peers","formSchema","stateSchema","getFormValueFromState","state","value","isMonthYear","undefined","getDisplayStringFromFormValue","translator","date","Date","setDate","setMonth","month","monthString","language","year","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getValidationMessagesOverride","t","messages","getViewModel","context","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","dateMin","dateMax","isNumber","component","validator","payload","helpers","values","getStateFromValidForm","missing","keys","key","earliestDate","earliestMonthYear","limit","latestDate","latestMonthYear"],"sources":["../../../../../src/server/plugins/engine/components/MonthYearField.ts"],"sourcesContent":["import { ComponentType, type MonthYearFieldComponent } from '@defra/forms-model'\nimport { format, isValid, parse } from 'date-fns'\nimport {\n type Context,\n type CustomValidator,\n type LanguageMessages,\n type ObjectSchema\n} from 'joi'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport {\n type DateInputItem,\n type MonthYearState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { parseStrictDate } from '~/src/server/plugins/engine/date-helper.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { formatDateForLanguage } from '~/src/server/plugins/payment/helper.js'\n\nexport class MonthYearField extends FormComponent {\n declare options: MonthYearFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: MonthYearFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options } = def\n\n const isRequired = options.required !== false\n\n const customValidationMessages = {\n 'any.required': messageTemplate.objectMissing,\n 'number.base': messageTemplate.objectMissing,\n 'number.precision': messageTemplate.dateFormat,\n 'number.integer': messageTemplate.dateFormat,\n 'number.unsafe': messageTemplate.dateFormat,\n 'number.min': messageTemplate.dateFormat,\n 'number.max': messageTemplate.dateFormat\n } as LanguageMessages\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__month`,\n title: 'components.monthYearField.month',\n schema: { min: 1, max: 12, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-2',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__year`,\n title: 'components.monthYearField.year',\n schema: { min: 1000, max: 3000, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-4',\n customValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n custom: getValidatorMonthYear(this),\n peers: [`${name}__month`, `${name}__year`]\n }\n )\n\n this.options = options\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return MonthYearField.isMonthYear(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: MonthYearState | undefined,\n translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const date = new Date()\n // Force to first day of month in case current date was say 31st and specified month has fewer than 31 days\n date.setDate(1)\n date.setMonth(value.month - 1)\n\n const monthString = formatDateForLanguage(date, 'LLLL', translator.language)\n return `${monthString} ${value.year}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: MonthYearState | undefined\n ): string | null {\n if (\n !value ||\n !isValid(\n parseStrictDate(\n value,\n `${value.year}-${value.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-01`, 'yyyy-MM')\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n const messages = {\n 'any.required': buildValidationMessages(t).objectMissing,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).dateFormat,\n 'number.integer': buildValidationMessages(t).dateFormat,\n 'number.unsafe': buildValidationMessages(t).dateFormat,\n 'number.min': buildValidationMessages(t).dateFormat,\n 'number.max': buildValidationMessages(t).dateFormat\n } as LanguageMessages\n return {\n [`${this.name}__month`]: messages,\n [`${this.name}__year`]: messages\n }\n }\n\n getViewModel(context: RenderContext) {\n const { errors } = context\n const { collection, name } = this\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n // Check for component errors only\n const hasError = errors?.some((error) => error.name === name)\n\n // Use the component collection to generate the subitems\n const items: DateInputItem[] = collection\n .getViewModel(context)\n .map(({ model }) => {\n let { label, type, value, classes, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text // Date component uses string labels\n }\n\n if (hasError || errorMessage) {\n classes = `${classes} govuk-input--error`.trim()\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes\n }\n })\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n return {\n ...viewModel,\n fieldset,\n items\n }\n }\n\n isState(value?: FormStateValue | FormState) {\n return MonthYearField.isMonthYear(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return MonthYearField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n {\n type: 'dateFormatMonth',\n template: '{{#label}} must include a month'\n },\n { type: 'dateFormatYear', template: '{{#label}} must include a year' }\n ],\n advancedSettingsErrors: [\n { type: 'dateEarliest', template: messageTemplate.dateMin },\n { type: 'dateLatest', template: messageTemplate.dateMax }\n ]\n }\n }\n\n static isMonthYear(\n value?: FormStateValue | FormState\n ): value is MonthYearState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport function getValidatorMonthYear(component: MonthYearField) {\n const validator: CustomValidator = (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n const date = parse(\n `${values.year}-${values.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n\n if (!isValid(date)) {\n return helpers.error('date.format', context)\n }\n\n // Minimum date from today\n const earliestDate = options.earliestMonthYear\n ? new Date(`${options.earliestMonthYear}-01`)\n : undefined\n\n if (earliestDate && date < earliestDate) {\n return helpers.error('date.min', { ...context, limit: earliestDate })\n }\n\n // Maximum date from today\n const latestDate = options.latestMonthYear\n ? new Date(`${options.latestMonthYear}-01`)\n : undefined\n\n if (latestDate && date > latestDate) {\n return helpers.error('date.max', { ...context, limit: latestDate })\n }\n\n return payload\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -59,6 +59,7 @@ export declare class MultilineTextField extends FormComponent {
|
|
|
59
59
|
upload?: {
|
|
60
60
|
count: number;
|
|
61
61
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
62
|
+
uploadingLabel?: string;
|
|
62
63
|
};
|
|
63
64
|
};
|
|
64
65
|
buildMinMaxText(min?: number, max?: number): string;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { LocationFieldBase } from '../../../../server/plugins/engine/components/LocationFieldBase.js';
|
|
3
|
+
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
3
4
|
import { type ErrorMessageTemplateList } from '../../../../server/plugins/engine/types.js';
|
|
4
5
|
export declare class NationalGridFieldNumberField extends LocationFieldBase {
|
|
5
6
|
options: NationalGridFieldNumberFieldComponent['options'];
|
|
6
|
-
protected getValidationConfig(): {
|
|
7
|
+
protected getValidationConfig(translator: Translator | undefined): {
|
|
7
8
|
pattern: RegExp;
|
|
8
9
|
patternErrorMessage: import("joi").JoiExpression;
|
|
9
10
|
requiredMessage: import("joi").JoiExpression;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
import { EN_GB } from "../../../constants.js";
|
|
1
2
|
import { LocationFieldBase } from "./LocationFieldBase.js";
|
|
2
3
|
import { createLowerFirstExpression } from "./helpers/index.js";
|
|
3
4
|
import { t } from "../i18n/index.js";
|
|
4
5
|
export class NationalGridFieldNumberField extends LocationFieldBase {
|
|
5
|
-
getValidationConfig() {
|
|
6
|
+
getValidationConfig(translator) {
|
|
6
7
|
// Regex for OS national grid field references (NGFR)
|
|
7
8
|
// Validates specific valid OS grid letter combinations with:
|
|
8
9
|
// - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789
|
|
9
10
|
const pattern = /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\s?([0-9]{4})\s?([0-9]{4})$/;
|
|
10
11
|
return {
|
|
11
12
|
pattern,
|
|
12
|
-
patternErrorMessage: createLowerFirstExpression(t('components.nationalGridField.pattern'
|
|
13
|
-
requiredMessage: createLowerFirstExpression(t('components.nationalGridField.required'
|
|
13
|
+
patternErrorMessage: createLowerFirstExpression(translator ? translator.t('components.nationalGridField.pattern') : t('components.nationalGridField.pattern', EN_GB)),
|
|
14
|
+
requiredMessage: createLowerFirstExpression(translator ? translator.t('components.nationalGridField.required') : t('components.nationalGridField.required', EN_GB))
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
17
|
getErrorTemplates() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NationalGridFieldNumberField.js","names":["LocationFieldBase","createLowerFirstExpression","t","NationalGridFieldNumberField","getValidationConfig","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/NationalGridFieldNumberField.ts"],"sourcesContent":["import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'\n\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class NationalGridFieldNumberField extends LocationFieldBase {\n declare options: NationalGridFieldNumberFieldComponent['options']\n\n protected getValidationConfig() {\n // Regex for OS national grid field references (NGFR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?([0-9]{4})\\s?([0-9]{4})$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n t('components.nationalGridField.pattern'
|
|
1
|
+
{"version":3,"file":"NationalGridFieldNumberField.js","names":["EN_GB","LocationFieldBase","createLowerFirstExpression","t","NationalGridFieldNumberField","getValidationConfig","translator","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/NationalGridFieldNumberField.ts"],"sourcesContent":["import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class NationalGridFieldNumberField extends LocationFieldBase {\n declare options: NationalGridFieldNumberFieldComponent['options']\n\n protected getValidationConfig(translator: Translator | undefined) {\n // Regex for OS national grid field references (NGFR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?([0-9]{4})\\s?([0-9]{4})$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.nationalGridField.pattern')\n : t('components.nationalGridField.pattern', EN_GB)\n ),\n requiredMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.nationalGridField.required')\n : t('components.nationalGridField.required', EN_GB)\n )\n }\n }\n\n protected getErrorTemplates() {\n return [\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n )\n }\n ]\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n {\n type: 'required',\n template: createLowerFirstExpression(\n t('components.nationalGridField.required', 'en-GB')\n )\n },\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n )\n }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAEA,SAASA,KAAK;AACd,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,CAAC;AAIV,OAAO,MAAMC,4BAA4B,SAASH,iBAAiB,CAAC;EAGxDI,mBAAmBA,CAACC,UAAkC,EAAE;IAChE;IACA;IACA;IACA,MAAMC,OAAO,GACX,mIAAmI;IAErI,OAAO;MACLA,OAAO;MACPC,mBAAmB,EAAEN,0BAA0B,CAC7CI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,sCAAsC,CAAC,GACpDA,CAAC,CAAC,sCAAsC,EAAEH,KAAK,CACrD,CAAC;MACDS,eAAe,EAAEP,0BAA0B,CACzCI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,uCAAuC,CAAC,GACrDA,CAAC,CAAC,uCAAuC,EAAEH,KAAK,CACtD;IACF,CAAC;EACH;EAEUU,iBAAiBA,CAAA,EAAG;IAC5B,OAAO,CACL;MACEC,IAAI,EAAE,SAAS;MACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD;IACF,CAAC,CACF;EACH;;EAEA;AACF;AACA;EACE,OAAOU,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QACEH,IAAI,EAAE,UAAU;QAChBC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,uCAAuC,EAAE,OAAO,CACpD;MACF,CAAC,EACD;QACEQ,IAAI,EAAE,SAAS;QACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD;MACF,CAAC,CACF;MACDY,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@ import { type NumberFieldComponent } from '@defra/forms-model';
|
|
|
2
2
|
import joi, { type NumberSchema } from 'joi';
|
|
3
3
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
4
4
|
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type Translator } from '../../../../server/plugins/engine/types/index.js';
|
|
5
6
|
import { type ErrorMessageTemplateList, type FormState, type FormStateValue, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
|
|
6
7
|
export declare class NumberField extends FormComponent {
|
|
7
8
|
options: NumberFieldComponent['options'];
|
|
@@ -58,9 +59,13 @@ export declare class NumberField extends FormComponent {
|
|
|
58
59
|
upload?: {
|
|
59
60
|
count: number;
|
|
60
61
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
62
|
+
uploadingLabel?: string;
|
|
61
63
|
};
|
|
62
64
|
};
|
|
63
65
|
isValue(value?: FormStateValue | FormState): value is number;
|
|
66
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
67
|
+
[x: string]: joi.LanguageMessages;
|
|
68
|
+
};
|
|
64
69
|
/**
|
|
65
70
|
* For error preview page that shows all possible errors on a component
|
|
66
71
|
*/
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import joi from 'joi';
|
|
2
2
|
import { FormComponent, isFormValue } from "./FormComponent.js";
|
|
3
|
+
import { withCustomValidationOverrides } from "./helpers/index.js";
|
|
4
|
+
import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
|
|
3
5
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
4
6
|
export class NumberField extends FormComponent {
|
|
5
7
|
constructor(def, props) {
|
|
@@ -97,6 +99,26 @@ export class NumberField extends FormComponent {
|
|
|
97
99
|
isValue(value) {
|
|
98
100
|
return NumberField.isNumber(value);
|
|
99
101
|
}
|
|
102
|
+
getValidationMessagesOverride(translator) {
|
|
103
|
+
const {
|
|
104
|
+
customValidationMessage,
|
|
105
|
+
customValidationMessages
|
|
106
|
+
} = this.options;
|
|
107
|
+
const {
|
|
108
|
+
t
|
|
109
|
+
} = translator;
|
|
110
|
+
const defaults = {
|
|
111
|
+
'any.required': buildValidationMessages(t).objectRequired,
|
|
112
|
+
'number.base': buildValidationMessages(t).objectMissing,
|
|
113
|
+
'number.precision': buildValidationMessages(t).numberPrecision,
|
|
114
|
+
'number.integer': buildValidationMessages(t).numberInteger,
|
|
115
|
+
'number.min': buildValidationMessages(t).numberMin,
|
|
116
|
+
'number.max': buildValidationMessages(t).numberMax
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
[this.name]: withCustomValidationOverrides(defaults, customValidationMessage, customValidationMessages)
|
|
120
|
+
};
|
|
121
|
+
}
|
|
100
122
|
|
|
101
123
|
/**
|
|
102
124
|
* For error preview page that shows all possible errors on a component
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberField.js","names":["joi","FormComponent","isFormValue","messageTemplate","NumberField","constructor","def","props","options","schema","formSchema","number","custom","getValidatorPrecision","label","required","allow","messages","customValidationMessages","empty","min","max","precision","integer","customValidationMessage","message","default","stateSchema","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getViewModel","context","viewModel","attributes","prefix","suffix","inputmode","text","isNumber","getAllPossibleErrors","baseErrors","type","template","numberInteger","advancedSettingsErrors","numberMin","numberMax","numberPrecision","component","validator","helpers","limit","validationSchema","prefs","convert","attempt","error"],"sources":["../../../../../src/server/plugins/engine/components/NumberField.ts"],"sourcesContent":["import { type NumberFieldComponent } from '@defra/forms-model'\nimport joi, { type CustomValidator, type NumberSchema } from 'joi'\n\nimport {\n FormComponent,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class NumberField extends FormComponent {\n declare options: NumberFieldComponent['options']\n declare schema: NumberFieldComponent['schema']\n declare formSchema: NumberSchema\n declare stateSchema: NumberSchema\n\n constructor(\n def: NumberFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, schema } = def\n\n let formSchema = joi\n .number()\n .custom(getValidatorPrecision(this))\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n } else {\n const messages = options.customValidationMessages\n\n formSchema = formSchema.empty('').messages({\n 'any.required':\n messages?.['any.required'] ?? (messageTemplate.required as string)\n })\n }\n\n if (typeof schema.min === 'number') {\n formSchema = formSchema.min(schema.min)\n }\n\n if (typeof schema.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n\n if (typeof schema.precision === 'number' && schema.precision <= 0) {\n formSchema = formSchema.integer()\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'number.base': message,\n 'number.precision': message,\n 'number.integer': message,\n 'number.min': message,\n 'number.max': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n this.schema = schema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getViewModel(context: RenderContext) {\n const { options, schema } = this\n\n const viewModel = super.getViewModel(context)\n let { attributes, prefix, suffix, value } = viewModel\n\n if (typeof schema.precision === 'undefined' || schema.precision <= 0) {\n // If precision isn't provided or provided and\n // less than or equal to 0, use numeric inputmode\n attributes.inputmode = 'numeric'\n }\n\n if (options.prefix) {\n prefix = {\n text: options.prefix\n }\n }\n\n if (options.suffix) {\n suffix = {\n text: options.suffix\n }\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n ...viewModel,\n attributes,\n prefix,\n suffix,\n value\n }\n }\n\n isValue(value?: FormStateValue | FormState) {\n return NumberField.isNumber(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return NumberField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n { type: 'numberInteger', template: messageTemplate.numberInteger }\n ],\n advancedSettingsErrors: [\n { type: 'numberMin', template: messageTemplate.numberMin },\n { type: 'numberMax', template: messageTemplate.numberMax },\n { type: 'numberPrecision', template: messageTemplate.numberPrecision }\n ]\n }\n }\n\n static isNumber(value?: FormStateValue | FormState): value is number {\n return typeof value === 'number'\n }\n}\n\nexport function getValidatorPrecision(component: NumberField) {\n const validator: CustomValidator = (value: number, helpers) => {\n const { options, schema } = component\n\n const { customValidationMessage: custom } = options\n const { precision: limit } = schema\n\n if (!limit || limit <= 0) {\n return value\n }\n\n const validationSchema = joi\n .number()\n .precision(limit)\n .prefs({ convert: false })\n\n try {\n return joi.attempt(value, validationSchema)\n } catch {\n return custom\n ? helpers.message({ custom }, { limit })\n : helpers.error('number.precision', { limit })\n }\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"NumberField.js","names":["joi","FormComponent","isFormValue","withCustomValidationOverrides","buildValidationMessages","messageTemplate","NumberField","constructor","def","props","options","schema","formSchema","number","custom","getValidatorPrecision","label","required","allow","messages","customValidationMessages","empty","min","max","precision","integer","customValidationMessage","message","default","stateSchema","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getViewModel","context","viewModel","attributes","prefix","suffix","inputmode","text","isNumber","getValidationMessagesOverride","translator","t","defaults","objectRequired","objectMissing","numberPrecision","numberInteger","numberMin","numberMax","getAllPossibleErrors","baseErrors","type","template","advancedSettingsErrors","component","validator","helpers","limit","validationSchema","prefs","convert","attempt","error"],"sources":["../../../../../src/server/plugins/engine/components/NumberField.ts"],"sourcesContent":["import { type NumberFieldComponent } from '@defra/forms-model'\nimport joi, { type CustomValidator, type NumberSchema } from 'joi'\n\nimport {\n FormComponent,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { withCustomValidationOverrides } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type Translator } from '~/src/server/plugins/engine/types/index.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class NumberField extends FormComponent {\n declare options: NumberFieldComponent['options']\n declare schema: NumberFieldComponent['schema']\n declare formSchema: NumberSchema\n declare stateSchema: NumberSchema\n\n constructor(\n def: NumberFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, schema } = def\n\n let formSchema = joi\n .number()\n .custom(getValidatorPrecision(this))\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n } else {\n const messages = options.customValidationMessages\n\n formSchema = formSchema.empty('').messages({\n 'any.required':\n messages?.['any.required'] ?? (messageTemplate.required as string)\n })\n }\n\n if (typeof schema.min === 'number') {\n formSchema = formSchema.min(schema.min)\n }\n\n if (typeof schema.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n\n if (typeof schema.precision === 'number' && schema.precision <= 0) {\n formSchema = formSchema.integer()\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'number.base': message,\n 'number.precision': message,\n 'number.integer': message,\n 'number.min': message,\n 'number.max': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n this.schema = schema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getViewModel(context: RenderContext) {\n const { options, schema } = this\n\n const viewModel = super.getViewModel(context)\n let { attributes, prefix, suffix, value } = viewModel\n\n if (typeof schema.precision === 'undefined' || schema.precision <= 0) {\n // If precision isn't provided or provided and\n // less than or equal to 0, use numeric inputmode\n attributes.inputmode = 'numeric'\n }\n\n if (options.prefix) {\n prefix = {\n text: options.prefix\n }\n }\n\n if (options.suffix) {\n suffix = {\n text: options.suffix\n }\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n ...viewModel,\n attributes,\n prefix,\n suffix,\n value\n }\n }\n\n isValue(value?: FormStateValue | FormState) {\n return NumberField.isNumber(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { customValidationMessage, customValidationMessages } = this.options\n const { t } = translator\n const defaults = {\n 'any.required': buildValidationMessages(t).objectRequired,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).numberPrecision,\n 'number.integer': buildValidationMessages(t).numberInteger,\n 'number.min': buildValidationMessages(t).numberMin,\n 'number.max': buildValidationMessages(t).numberMax\n }\n\n return {\n [this.name]: withCustomValidationOverrides(\n defaults,\n customValidationMessage,\n customValidationMessages\n )\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return NumberField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n { type: 'numberInteger', template: messageTemplate.numberInteger }\n ],\n advancedSettingsErrors: [\n { type: 'numberMin', template: messageTemplate.numberMin },\n { type: 'numberMax', template: messageTemplate.numberMax },\n { type: 'numberPrecision', template: messageTemplate.numberPrecision }\n ]\n }\n }\n\n static isNumber(value?: FormStateValue | FormState): value is number {\n return typeof value === 'number'\n }\n}\n\nexport function getValidatorPrecision(component: NumberField) {\n const validator: CustomValidator = (value: number, helpers) => {\n const { options, schema } = component\n\n const { customValidationMessage: custom } = options\n const { precision: limit } = schema\n\n if (!limit || limit <= 0) {\n return value\n }\n\n const validationSchema = joi\n .number()\n .precision(limit)\n .prefs({ convert: false })\n\n try {\n return joi.attempt(value, validationSchema)\n } catch {\n return custom\n ? helpers.message({ custom }, { limit })\n : helpers.error('number.precision', { limit })\n }\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,9 +1,111 @@
|
|
|
1
1
|
import { type OsGridRefFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { LocationFieldBase } from '../../../../server/plugins/engine/components/LocationFieldBase.js';
|
|
3
|
+
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
4
|
+
import { type Translator } from '../../../../server/plugins/engine/types/index.js';
|
|
3
5
|
import { type ErrorMessageTemplateList } from '../../../../server/plugins/engine/types.js';
|
|
4
6
|
export declare class OsGridRefField extends LocationFieldBase {
|
|
5
7
|
options: OsGridRefFieldComponent['options'];
|
|
6
|
-
|
|
8
|
+
getViewModel(context: RenderContext): {
|
|
9
|
+
label: {
|
|
10
|
+
text: string;
|
|
11
|
+
};
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
value: import("../../../../server/plugins/engine/types.js").FormValue;
|
|
15
|
+
type?: string;
|
|
16
|
+
hint?: {
|
|
17
|
+
id?: string;
|
|
18
|
+
text: string;
|
|
19
|
+
};
|
|
20
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
21
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
22
|
+
classes?: string;
|
|
23
|
+
condition?: string;
|
|
24
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
25
|
+
errorMessage?: {
|
|
26
|
+
text: string;
|
|
27
|
+
};
|
|
28
|
+
summaryHtml?: string;
|
|
29
|
+
html?: string;
|
|
30
|
+
attributes: {
|
|
31
|
+
autocomplete?: string;
|
|
32
|
+
maxlength?: number;
|
|
33
|
+
multiple?: string;
|
|
34
|
+
accept?: string;
|
|
35
|
+
inputmode?: string;
|
|
36
|
+
};
|
|
37
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
38
|
+
maxlength?: number;
|
|
39
|
+
maxwords?: number;
|
|
40
|
+
rows?: number;
|
|
41
|
+
items?: import("../../../../server/plugins/engine/components/types.js").ListItem[] | import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
42
|
+
fieldset?: {
|
|
43
|
+
attributes?: string | Record<string, string>;
|
|
44
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
45
|
+
};
|
|
46
|
+
formGroup?: {
|
|
47
|
+
classes?: string;
|
|
48
|
+
attributes?: string | Record<string, string>;
|
|
49
|
+
};
|
|
50
|
+
showFieldsetError?: boolean;
|
|
51
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
52
|
+
upload?: {
|
|
53
|
+
count: number;
|
|
54
|
+
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
55
|
+
uploadingLabel?: string;
|
|
56
|
+
};
|
|
57
|
+
} | {
|
|
58
|
+
instructionText: string;
|
|
59
|
+
label: {
|
|
60
|
+
text: string;
|
|
61
|
+
};
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
value: import("../../../../server/plugins/engine/types.js").FormValue;
|
|
65
|
+
type?: string;
|
|
66
|
+
hint?: {
|
|
67
|
+
id?: string;
|
|
68
|
+
text: string;
|
|
69
|
+
};
|
|
70
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
71
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
72
|
+
classes?: string;
|
|
73
|
+
condition?: string;
|
|
74
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
75
|
+
errorMessage?: {
|
|
76
|
+
text: string;
|
|
77
|
+
};
|
|
78
|
+
summaryHtml?: string;
|
|
79
|
+
html?: string;
|
|
80
|
+
attributes: {
|
|
81
|
+
autocomplete?: string;
|
|
82
|
+
maxlength?: number;
|
|
83
|
+
multiple?: string;
|
|
84
|
+
accept?: string;
|
|
85
|
+
inputmode?: string;
|
|
86
|
+
};
|
|
87
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
88
|
+
maxlength?: number;
|
|
89
|
+
maxwords?: number;
|
|
90
|
+
rows?: number;
|
|
91
|
+
items?: import("../../../../server/plugins/engine/components/types.js").ListItem[] | import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
92
|
+
fieldset?: {
|
|
93
|
+
attributes?: string | Record<string, string>;
|
|
94
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
95
|
+
};
|
|
96
|
+
formGroup?: {
|
|
97
|
+
classes?: string;
|
|
98
|
+
attributes?: string | Record<string, string>;
|
|
99
|
+
};
|
|
100
|
+
showFieldsetError?: boolean;
|
|
101
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
102
|
+
upload?: {
|
|
103
|
+
count: number;
|
|
104
|
+
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
105
|
+
uploadingLabel?: string;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
protected getValidationConfig(translator: Translator | undefined): {
|
|
7
109
|
pattern: RegExp;
|
|
8
110
|
patternErrorMessage: import("joi").JoiExpression;
|
|
9
111
|
requiredMessage: import("joi").JoiExpression;
|