@defra/forms-engine-plugin 5.0.0-alpha.3 → 5.0.0-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.public/37c964ca545c240f010a.mjs +2 -0
- package/.public/37c964ca545c240f010a.mjs.LICENSE.txt +4 -0
- package/.public/assets-manifest.json +3 -0
- package/.public/javascripts/application.min.js +1 -1
- package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
- package/.public/javascripts/application.min.js.map +1 -1
- package/.public/javascripts/shared.min.js +1 -1
- package/.public/javascripts/shared.min.js.LICENSE.txt +9 -0
- package/.public/javascripts/shared.min.js.map +1 -1
- package/.public/javascripts/vendor/@defra.min.js +1 -1
- package/.public/javascripts/vendor/@defra.min.js.map +1 -1
- package/.public/javascripts/vendor/maplibre-gl.min.js +1 -1
- package/.public/javascripts/vendor/maplibre-gl.min.js.LICENSE.txt +3 -3
- package/.public/javascripts/vendor/maplibre-gl.min.js.map +1 -1
- package/.public/stylesheets/application.min.css +1 -1
- package/.public/stylesheets/application.min.css.map +1 -1
- package/.server/client/javascripts/file-upload.js +6 -3
- package/.server/client/javascripts/file-upload.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.d.ts +159 -5
- package/.server/client/javascripts/geospatial-map.js +161 -81
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.test.js +152 -0
- package/.server/client/javascripts/geospatial-map.test.js.map +1 -0
- package/.server/client/javascripts/govuk.js +2 -1
- package/.server/client/javascripts/govuk.js.map +1 -1
- package/.server/client/javascripts/location-map.d.ts +44 -0
- package/.server/client/javascripts/location-map.js +55 -6
- package/.server/client/javascripts/location-map.js.map +1 -1
- package/.server/client/javascripts/map-constants.d.ts +3 -0
- package/.server/client/javascripts/map-constants.js +4 -0
- package/.server/client/javascripts/map-constants.js.map +1 -0
- package/.server/client/javascripts/map.d.ts +17 -4
- package/.server/client/javascripts/map.js +59 -6
- package/.server/client/javascripts/map.js.map +1 -1
- package/.server/client/javascripts/maps.d.ts +5 -0
- package/.server/client/javascripts/maps.js +6 -0
- package/.server/client/javascripts/maps.js.map +1 -0
- package/.server/client/javascripts/shared.d.ts +1 -4
- package/.server/client/javascripts/shared.js +1 -4
- package/.server/client/javascripts/shared.js.map +1 -1
- package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
- package/.server/client/javascripts/sssi-dataset.js +37 -39
- package/.server/client/javascripts/sssi-dataset.js.map +1 -1
- package/.server/client/stylesheets/maps.scss +4 -0
- package/.server/client/stylesheets/shared.scss +1 -5
- package/.server/server/constants.d.ts +2 -0
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -1
- package/.server/server/forms/components.json +8 -0
- package/.server/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
- package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +8 -3
- package/.server/server/plugins/engine/components/AutocompleteField.js +17 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +23 -2
- package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentBase.d.ts +2 -1
- package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
- package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.js +12 -7
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
- package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +6 -3
- package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
- package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
- package/.server/server/plugins/engine/components/Details.d.ts +1 -0
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
- package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +23 -2
- package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
- package/.server/server/plugins/engine/components/FormComponent.js +5 -2
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
- package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/Html.d.ts +1 -0
- package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
- package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
- package/.server/server/plugins/engine/components/LatLongField.js +85 -48
- package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
- package/.server/server/plugins/engine/components/List.d.ts +1 -0
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +3 -2
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js +31 -7
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
- package/.server/server/plugins/engine/components/Markdown.js +1 -1
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
- package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
- package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
- package/.server/server/plugins/engine/components/NumberField.js +22 -0
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
- package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
- package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +2 -0
- package/.server/server/plugins/engine/components/PaymentField.js +9 -5
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
- package/.server/server/plugins/engine/components/TrackingField.d.ts +21 -0
- package/.server/server/plugins/engine/components/TrackingField.js +46 -0
- package/.server/server/plugins/engine/components/TrackingField.js.map +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -2
- package/.server/server/plugins/engine/components/YesNoField.js +22 -8
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.d.ts +1 -1
- package/.server/server/plugins/engine/components/helpers/components.js +6 -3
- package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.js +58 -17
- package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/index.d.ts +21 -1
- package/.server/server/plugins/engine/components/helpers/index.js +45 -1
- package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
- package/.server/server/plugins/engine/components/index.d.ts +1 -0
- package/.server/server/plugins/engine/components/index.js +1 -0
- package/.server/server/plugins/engine/components/index.js.map +1 -1
- package/.server/server/plugins/engine/components/types.d.ts +1 -0
- package/.server/server/plugins/engine/components/types.js.map +1 -1
- package/.server/server/plugins/engine/errors.d.ts +49 -0
- package/.server/server/plugins/engine/errors.js +75 -0
- package/.server/server/plugins/engine/errors.js.map +1 -0
- package/.server/server/plugins/engine/form-availability.d.ts +3 -2
- package/.server/server/plugins/engine/form-availability.js +3 -2
- package/.server/server/plugins/engine/form-availability.js.map +1 -1
- package/.server/server/plugins/engine/form-context.js +2 -2
- package/.server/server/plugins/engine/form-context.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +23 -2
- package/.server/server/plugins/engine/helpers.js +44 -5
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
- package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
- package/.server/server/plugins/engine/i18n/createFormTranslator.js +27 -5
- package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
- package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
- package/.server/server/plugins/engine/i18n/form.js +35 -0
- package/.server/server/plugins/engine/i18n/form.js.map +1 -0
- package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
- package/.server/server/plugins/engine/i18n/languages.js +19 -0
- package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
- package/.server/server/plugins/engine/i18n/translations/cy.json +176 -7
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +110 -6
- package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -1
- package/.server/server/plugins/engine/index.d.ts +4 -0
- package/.server/server/plugins/engine/index.js +4 -0
- package/.server/server/plugins/engine/index.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
- package/.server/server/plugins/engine/models/FormModel.js +35 -23
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
- package/.server/server/plugins/engine/models/types.d.ts +28 -1
- package/.server/server/plugins/engine/models/types.js.map +1 -1
- package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
- package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
- package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
- package/.server/server/plugins/engine/options.js +2 -1
- package/.server/server/plugins/engine/options.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +2 -2
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/plugin.js +3 -0
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/referenceNumbers.d.ts +1 -0
- package/.server/server/plugins/engine/referenceNumbers.js +1 -0
- package/.server/server/plugins/engine/referenceNumbers.js.map +1 -1
- package/.server/server/plugins/engine/routes/index.js +9 -4
- package/.server/server/plugins/engine/routes/index.js.map +1 -1
- package/.server/server/plugins/engine/types/enums.d.ts +3 -3
- package/.server/server/plugins/engine/types/enums.js +5 -4
- package/.server/server/plugins/engine/types/enums.js.map +1 -1
- package/.server/server/plugins/engine/types/schema.js +15 -4
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +24 -2
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/unavailable-response.js +5 -2
- package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
- package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
- package/.server/server/plugins/engine/views/components/trackingfield.html +3 -0
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/.server/server/plugins/engine/views/file-upload.html +1 -1
- package/.server/server/plugins/engine/views/summary.html +1 -0
- package/.server/server/plugins/engine/views/unavailable.html +14 -11
- package/.server/server/plugins/map/routes/index.d.ts +4 -0
- package/.server/server/plugins/map/routes/index.js +12 -4
- package/.server/server/plugins/map/routes/index.js.map +1 -1
- package/.server/server/plugins/map/routes/index.test.js +7 -0
- package/.server/server/plugins/map/routes/index.test.js.map +1 -0
- package/.server/server/plugins/map/routes/vts/README.md +38 -0
- package/.server/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
- package/.server/server/plugins/map/routes/vts/countries.geojson +10 -39283
- package/.server/server/plugins/map/types.d.ts +24 -2
- package/.server/server/plugins/map/types.js +9 -2
- package/.server/server/plugins/map/types.js.map +1 -1
- package/.server/server/plugins/nunjucks/enviroment.test.js +11 -4
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
- package/.server/server/plugins/payment/helper.d.ts +11 -1
- package/.server/server/plugins/payment/helper.js +18 -2
- package/.server/server/plugins/payment/helper.js.map +1 -1
- package/.server/server/plugins/payment/helper.test.js +2 -1
- package/.server/server/plugins/payment/helper.test.js.map +1 -1
- package/.server/server/plugins/payment/service.d.ts +2 -1
- package/.server/server/plugins/payment/service.js +5 -2
- package/.server/server/plugins/payment/service.js.map +1 -1
- package/.server/server/plugins/payment/service.test.js +7 -3
- package/.server/server/plugins/payment/service.test.js.map +1 -1
- package/.server/server/plugins/payment/types.d.ts +4 -0
- package/.server/server/plugins/payment/types.js +1 -0
- package/.server/server/plugins/payment/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
- package/.server/server/plugins/postcode-lookup/models/index.js +103 -36
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
- package/.server/server/plugins/postcode-lookup/routes/index.js +64 -18
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
- package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
- package/.server/server/plugins/postcode-lookup/types.js +6 -1
- package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/.server/server/utils/type-utils.d.ts +1 -2
- package/.server/server/utils/type-utils.js +0 -3
- package/.server/server/utils/type-utils.js.map +1 -1
- package/.server/server/utils/utils.d.ts +6 -0
- package/.server/server/utils/utils.js +18 -1
- package/.server/server/utils/utils.js.map +1 -1
- package/.server/server/utils/utils.test.js +21 -1
- package/.server/server/utils/utils.test.js.map +1 -1
- package/.server/typings/geodesy/index.d.js +2 -0
- package/.server/typings/geodesy/index.d.js.map +1 -0
- package/.server/typings/hapi/index.d.js.map +1 -1
- package/package.json +24 -9
- package/src/client/javascripts/file-upload.js +11 -3
- package/src/client/javascripts/geospatial-map.js +181 -86
- package/src/client/javascripts/govuk.js +2 -0
- package/src/client/javascripts/location-map.js +62 -6
- package/src/client/javascripts/map-constants.js +3 -0
- package/src/client/javascripts/map.js +66 -9
- package/src/client/javascripts/maps.js +5 -0
- package/src/client/javascripts/shared.js +1 -4
- package/src/client/javascripts/sssi-dataset.js +39 -41
- package/src/client/stylesheets/maps.scss +4 -0
- package/src/client/stylesheets/shared.scss +1 -5
- package/src/server/constants.js +2 -0
- package/src/server/forms/components.json +8 -0
- package/src/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
- package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
- package/src/server/plugins/engine/components/AutocompleteField.ts +20 -0
- package/src/server/plugins/engine/components/CheckboxesField.ts +41 -8
- package/src/server/plugins/engine/components/ComponentBase.ts +6 -4
- package/src/server/plugins/engine/components/ComponentCollection.ts +17 -15
- package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
- package/src/server/plugins/engine/components/DeclarationField.ts +10 -10
- package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
- package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
- package/src/server/plugins/engine/components/FileUploadField.ts +46 -5
- package/src/server/plugins/engine/components/FormComponent.ts +6 -5
- package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
- package/src/server/plugins/engine/components/LatLongField.ts +128 -58
- package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
- package/src/server/plugins/engine/components/LocationFieldBase.ts +41 -8
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
- package/src/server/plugins/engine/components/Markdown.ts +2 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
- package/src/server/plugins/engine/components/NumberField.ts +24 -0
- package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
- package/src/server/plugins/engine/components/PaymentField.ts +9 -4
- package/src/server/plugins/engine/components/TrackingField.ts +64 -0
- package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
- package/src/server/plugins/engine/components/YesNoField.ts +27 -9
- package/src/server/plugins/engine/components/helpers/components.ts +8 -3
- package/src/server/plugins/engine/components/helpers/geospatial.ts +87 -24
- package/src/server/plugins/engine/components/helpers/index.ts +64 -1
- package/src/server/plugins/engine/components/index.ts +1 -0
- package/src/server/plugins/engine/components/types.ts +1 -0
- package/src/server/plugins/engine/errors.ts +78 -0
- package/src/server/plugins/engine/form-availability.ts +8 -2
- package/src/server/plugins/engine/form-context.ts +4 -2
- package/src/server/plugins/engine/helpers.ts +52 -5
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
- package/src/server/plugins/engine/i18n/createFormTranslator.ts +43 -12
- package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
- package/src/server/plugins/engine/i18n/form.ts +54 -0
- package/src/server/plugins/engine/i18n/languages.ts +19 -0
- package/src/server/plugins/engine/i18n/translations/cy.json +176 -7
- package/src/server/plugins/engine/i18n/translations/en-GB.json +110 -6
- package/src/server/plugins/engine/i18n/types.ts +2 -0
- package/src/server/plugins/engine/index.ts +7 -0
- package/src/server/plugins/engine/models/FormModel.ts +46 -23
- package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
- package/src/server/plugins/engine/models/types.ts +31 -0
- package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
- package/src/server/plugins/engine/options.js +2 -1
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +2 -2
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
- package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
- package/src/server/plugins/engine/plugin.ts +6 -0
- package/src/server/plugins/engine/referenceNumbers.ts +2 -0
- package/src/server/plugins/engine/routes/index.ts +9 -3
- package/src/server/plugins/engine/types/enums.ts +4 -3
- package/src/server/plugins/engine/types/schema.ts +22 -5
- package/src/server/plugins/engine/types.ts +28 -1
- package/src/server/plugins/engine/unavailable-response.ts +6 -2
- package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
- package/src/server/plugins/engine/views/components/trackingfield.html +3 -0
- package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/src/server/plugins/engine/views/file-upload.html +1 -1
- package/src/server/plugins/engine/views/summary.html +1 -0
- package/src/server/plugins/engine/views/unavailable.html +14 -11
- package/src/server/plugins/map/routes/index.js +29 -4
- package/src/server/plugins/map/routes/vts/README.md +38 -0
- package/src/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
- package/src/server/plugins/map/routes/vts/countries.geojson +10 -39283
- package/src/server/plugins/map/types.js +9 -2
- package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/src/server/plugins/nunjucks/filters/index.js +1 -0
- package/src/server/plugins/payment/helper.js +22 -2
- package/src/server/plugins/payment/service.js +6 -2
- package/src/server/plugins/payment/types.js +1 -0
- package/src/server/plugins/postcode-lookup/models/index.js +91 -46
- package/src/server/plugins/postcode-lookup/routes/index.js +96 -24
- package/src/server/plugins/postcode-lookup/types.js +6 -1
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/src/server/utils/type-utils.ts +1 -11
- package/src/server/utils/utils.js +19 -1
- package/src/typings/geodesy/index.d.ts +18 -0
- package/src/typings/hapi/index.d.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckboxesField.js","names":["joi","isFormValue","SelectionControlField","messageTemplate","CheckboxesField","constructor","def","props","listType","type","options","schema","formSchema","array","itemsSchema","valid","values","label","items","single","required","messages","arrayMin","arrayMax","arrayLength","optional","length","min","max","default","stateSchema","allow","getFormValueFromState","state","name","getFormValue","selected","filter","item","includes","value","map","undefined","isValue","getDisplayStringFromFormValue","translator","tListItem","text","join","getContextValueFromFormValue","getDisplayStringFromState","getContextValueFromState","getAllPossibleErrors","parentErrors","advancedSettingsErrors","template","Array","isArray","every"],"sources":["../../../../../src/server/plugins/engine/components/CheckboxesField.ts"],"sourcesContent":["import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'\nimport joi, { type ArraySchema } from 'joi'\n\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport { type QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.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 CheckboxesField extends SelectionControlField {\n declare options: CheckboxesFieldComponent['options']\n declare schema: CheckboxesFieldComponent['schema']\n declare formSchema: ArraySchema<string> | ArraySchema<number>\n declare stateSchema: ArraySchema<string> | ArraySchema<number>\n\n constructor(\n def: CheckboxesFieldComponent,\n props: ConstructorParameters<typeof SelectionControlField>[1]\n ) {\n super(def, props)\n\n const { listType: type } = this\n const { options, schema } = def\n\n let formSchema =\n type === 'string' ? joi.array<string>() : joi.array<number>()\n\n const itemsSchema = joi[type]()\n .valid(...this.values)\n .label(this.label)\n\n formSchema = formSchema\n .items(itemsSchema)\n .single()\n .label(this.label)\n .required()\n .messages({\n 'array.min': messageTemplate.arrayMin,\n 'array.max': messageTemplate.arrayMax,\n 'array.length': messageTemplate.arrayLength\n })\n\n if (options.required === false) {\n formSchema = formSchema.optional()\n }\n\n if (typeof schema?.length === 'number') {\n formSchema = formSchema.length(schema.length)\n } else {\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\n this.formSchema = formSchema.default([])\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { items, name } = this\n\n // State checkbox values\n const values = this.getFormValue(state[name]) ?? []\n\n // Map (or discard) state values to item values\n const selected = items\n .filter((item) => values.includes(item.value))\n .map((item) => item.value)\n\n return selected.length ? selected : undefined\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n selected: (string | number | boolean)[] | undefined,\n translator: Translator\n ) {\n const { items } = this\n\n if (!selected) {\n return ''\n }\n\n return items\n .filter((item) => selected.includes(item.value))\n .map((item) => translator.tListItem(item, 'text') || item.text)\n .join(', ')\n }\n\n getContextValueFromFormValue(\n values: (string | number | boolean)[] | undefined\n ): (string | number | boolean)[] {\n /**\n * For evaluation context purposes, optional {@link CheckboxesField}\n * with an undefined value (i.e. nothing selected) should default to [].\n * This way conditions are not evaluated against `undefined` which throws errors.\n * Currently these errors are caught and the evaluation returns default `false`.\n * @see {@link QuestionPageController.getNextPath} for `undefined` return value\n * @see {@link FormModel.makeCondition} for try/catch block with default `false`\n * For negative conditions this is a problem because E.g.\n * The condition: 'selectedchecks' does not contain 'someval'\n * should return true IF 'selectedchecks' is undefined, not throw and return false.\n */\n return values ?? []\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const selected = this.getFormValueFromState(state) ?? []\n return this.getDisplayStringFromFormValue(selected, translator)\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const values = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(values)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return CheckboxesField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n const parentErrors = SelectionControlField.getAllPossibleErrors()\n\n return {\n ...parentErrors,\n advancedSettingsErrors: [\n ...parentErrors.advancedSettingsErrors,\n { type: 'array.min', template: messageTemplate.arrayMin },\n { type: 'array.max', template: messageTemplate.arrayMax },\n { type: 'array.length', template: messageTemplate.arrayLength }\n ]\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CheckboxesField.js","names":["joi","EN_GB","isFormValue","SelectionControlField","t","tPlugin","messageTemplate","CheckboxesField","constructor","def","props","listType","type","options","schema","formSchema","array","itemsSchema","valid","values","label","items","single","required","limits","optional","length","min","max","messages","buildErrorMessages","default","stateSchema","allow","getFormValueFromState","state","name","getFormValue","selected","filter","item","includes","value","map","undefined","isValue","getDisplayStringFromFormValue","translator","tListItem","text","join","getContextValueFromFormValue","getDisplayStringFromState","getContextValueFromState","getValidationMessagesOverride","language","getAllPossibleErrors","parentErrors","advancedSettingsErrors","template","arrayMin","arrayMax","arrayLength","Array","isArray","every","count"],"sources":["../../../../../src/server/plugins/engine/components/CheckboxesField.ts"],"sourcesContent":["import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'\nimport joi, { type ArraySchema } from 'joi'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport { type QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.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 CheckboxesField extends SelectionControlField {\n declare options: CheckboxesFieldComponent['options']\n declare schema: CheckboxesFieldComponent['schema']\n declare formSchema: ArraySchema<string[]> | ArraySchema<number[]>\n declare stateSchema: ArraySchema<string[]> | ArraySchema<number[]>\n declare limits: { min?: number; max?: number; length?: number }\n\n constructor(\n def: CheckboxesFieldComponent,\n props: ConstructorParameters<typeof SelectionControlField>[1]\n ) {\n super(def, props)\n\n const { listType: type } = this\n const { options, schema } = def\n\n let formSchema =\n type === 'string' ? joi.array<string[]>() : joi.array<number[]>()\n\n const itemsSchema = joi[type]()\n .valid(...this.values)\n .label(this.label)\n\n formSchema = formSchema\n .items(itemsSchema)\n .single()\n .label(this.label)\n .required()\n\n const limits: { min?: number; max?: number; length?: number } = {}\n\n if (options.required === false) {\n formSchema = formSchema.optional()\n }\n\n if (typeof schema?.length === 'number') {\n formSchema = formSchema.length(schema.length)\n limits.length = schema.length\n } else {\n if (typeof schema?.min === 'number') {\n formSchema = formSchema.min(schema.min)\n limits.min = schema.min\n }\n\n if (typeof schema?.max === 'number') {\n formSchema = formSchema.max(schema.max)\n limits.max = schema.max\n }\n }\n\n this.limits = limits\n\n formSchema = formSchema.messages(\n CheckboxesField.buildErrorMessages(EN_GB, limits)\n )\n\n this.formSchema = formSchema.default([])\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { items, name } = this\n\n // State checkbox values\n const values = this.getFormValue(state[name]) ?? []\n\n // Map (or discard) state values to item values\n const selected = items\n .filter((item) => values.includes(item.value))\n .map((item) => item.value)\n\n return selected.length ? selected : undefined\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n selected: (string | number | boolean)[] | undefined,\n translator: Translator\n ) {\n const { items } = this\n\n if (!selected) {\n return ''\n }\n\n return items\n .filter((item) => selected.includes(item.value))\n .map((item) => translator.tListItem(item, 'text') || item.text)\n .join(', ')\n }\n\n getContextValueFromFormValue(\n values: (string | number | boolean)[] | undefined\n ): (string | number | boolean)[] {\n /**\n * For evaluation context purposes, optional {@link CheckboxesField}\n * with an undefined value (i.e. nothing selected) should default to [].\n * This way conditions are not evaluated against `undefined` which throws errors.\n * Currently these errors are caught and the evaluation returns default `false`.\n * @see {@link QuestionPageController.getNextPath} for `undefined` return value\n * @see {@link FormModel.makeCondition} for try/catch block with default `false`\n * For negative conditions this is a problem because E.g.\n * The condition: 'selectedchecks' does not contain 'someval'\n * should return true IF 'selectedchecks' is undefined, not throw and return false.\n */\n return values ?? []\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const selected = this.getFormValueFromState(state) ?? []\n return this.getDisplayStringFromFormValue(selected, translator)\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const values = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(values)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { language } = translator\n return {\n [this.name]: CheckboxesField.buildErrorMessages(language, this.limits)\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return CheckboxesField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n const parentErrors = SelectionControlField.getAllPossibleErrors()\n\n return {\n ...parentErrors,\n advancedSettingsErrors: [\n ...parentErrors.advancedSettingsErrors,\n { type: 'array.min', template: messageTemplate.arrayMin },\n { type: 'array.max', template: messageTemplate.arrayMax },\n { type: 'array.length', template: messageTemplate.arrayLength }\n ]\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n\n static buildErrorMessages(\n language: string,\n limits: { min?: number; max?: number; length?: number } = {}\n ) {\n return {\n 'array.min': tPlugin('validation.arrayMin', language, {\n count: limits.min ?? 1\n }),\n 'array.max': tPlugin('validation.arrayMax', language, {\n count: limits.max ?? 1\n }),\n 'array.length': tPlugin('validation.arrayLength', language, {\n count: limits.length ?? 1\n })\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,6 +21,7 @@ export declare class ComponentBase {
|
|
|
21
21
|
}>['options'];
|
|
22
22
|
isFormComponent: boolean;
|
|
23
23
|
model: FormModel;
|
|
24
|
+
def: ComponentDef;
|
|
24
25
|
/** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
|
|
25
26
|
formSchema: ComponentSchema;
|
|
26
27
|
stateSchema: ComponentSchema;
|
|
@@ -31,4 +32,4 @@ export declare class ComponentBase {
|
|
|
31
32
|
});
|
|
32
33
|
get viewModel(): ViewModel;
|
|
33
34
|
}
|
|
34
|
-
export type ComponentSchema = ArraySchema<string> | ArraySchema<number> | ArraySchema<boolean> | ArraySchema<object> | BooleanSchema<string> | BooleanSchema | DateSchema | NumberSchema<string> | NumberSchema | ObjectSchema | StringSchema;
|
|
35
|
+
export type ComponentSchema = ArraySchema<string[]> | ArraySchema<number[]> | ArraySchema<boolean[]> | ArraySchema<object[]> | BooleanSchema<string> | BooleanSchema | DateSchema | NumberSchema<string> | NumberSchema | ObjectSchema | StringSchema;
|
|
@@ -12,6 +12,7 @@ export class ComponentBase {
|
|
|
12
12
|
options;
|
|
13
13
|
isFormComponent = false;
|
|
14
14
|
model;
|
|
15
|
+
def;
|
|
15
16
|
|
|
16
17
|
/** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
|
|
17
18
|
formSchema = joi.string();
|
|
@@ -21,6 +22,7 @@ export class ComponentBase {
|
|
|
21
22
|
this.type = def.type;
|
|
22
23
|
this.name = def.name;
|
|
23
24
|
this.title = def.title;
|
|
25
|
+
this.def = def;
|
|
24
26
|
if ('schema' in def) {
|
|
25
27
|
this.schema = def.schema;
|
|
26
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentBase.js","names":["isConditionalRevealType","joi","ComponentBase","id","page","parent","collection","type","name","title","schema","options","isFormComponent","model","formSchema","string","stateSchema","constructor","
|
|
1
|
+
{"version":3,"file":"ComponentBase.js","names":["isConditionalRevealType","joi","ComponentBase","id","page","parent","collection","type","name","title","schema","options","isFormComponent","model","def","formSchema","string","stateSchema","constructor","props","viewModel","attributes","autocomplete","classes","condition"],"sources":["../../../../../src/server/plugins/engine/components/ComponentBase.ts"],"sourcesContent":["import { isConditionalRevealType, type ComponentDef } from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\n type DateSchema,\n type NumberSchema,\n type ObjectSchema,\n type StringSchema\n} from 'joi'\n\nimport { type ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport { type Component } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { type ViewModel } from '~/src/server/plugins/engine/components/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\n\nexport class ComponentBase {\n id?: string\n page?: PageControllerClass\n parent: Component | undefined\n collection: ComponentCollection | undefined\n\n type: ComponentDef['type']\n name: ComponentDef['name']\n title: ComponentDef['title']\n schema?: Extract<ComponentDef, { schema?: object }>['schema']\n options?: Extract<ComponentDef, { options: object }>['options']\n\n isFormComponent = false\n model: FormModel\n def: ComponentDef\n\n /** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */\n formSchema: ComponentSchema = joi.string()\n stateSchema: ComponentSchema = joi.string()\n\n constructor(\n def: ComponentDef,\n props: {\n page?: PageControllerClass\n parent?: Component\n model: FormModel\n }\n ) {\n this.id = def.id\n this.type = def.type\n this.name = def.name\n this.title = def.title\n this.def = def\n\n if ('schema' in def) {\n this.schema = def.schema\n }\n\n if ('options' in def) {\n this.options = def.options\n }\n\n this.page = props.page\n this.parent = props.parent\n this.model = props.model\n }\n\n get viewModel() {\n const { options, type } = this\n\n const viewModel: ViewModel = {\n attributes: {}\n }\n\n if (!options) {\n return viewModel\n }\n\n if ('autocomplete' in options) {\n viewModel.attributes.autocomplete = options.autocomplete\n }\n\n if ('classes' in options) {\n viewModel.classes = options.classes\n }\n\n if ('condition' in options && isConditionalRevealType(type)) {\n viewModel.condition = options.condition\n }\n\n return viewModel\n }\n}\n\nexport type ComponentSchema =\n | ArraySchema<string[]>\n | ArraySchema<number[]>\n | ArraySchema<boolean[]>\n | ArraySchema<object[]>\n | BooleanSchema<string>\n | BooleanSchema\n | DateSchema\n | NumberSchema<string>\n | NumberSchema\n | ObjectSchema\n | StringSchema\n"],"mappings":"AAAA,SAASA,uBAAuB,QAA2B,oBAAoB;AAC/E,OAAOC,GAAG,MAOH,KAAK;AAQZ,OAAO,MAAMC,aAAa,CAAC;EACzBC,EAAE;EACFC,IAAI;EACJC,MAAM;EACNC,UAAU;EAEVC,IAAI;EACJC,IAAI;EACJC,KAAK;EACLC,MAAM;EACNC,OAAO;EAEPC,eAAe,GAAG,KAAK;EACvBC,KAAK;EACLC,GAAG;;EAEH;EACAC,UAAU,GAAoBd,GAAG,CAACe,MAAM,CAAC,CAAC;EAC1CC,WAAW,GAAoBhB,GAAG,CAACe,MAAM,CAAC,CAAC;EAE3CE,WAAWA,CACTJ,GAAiB,EACjBK,KAIC,EACD;IACA,IAAI,CAAChB,EAAE,GAAGW,GAAG,CAACX,EAAE;IAChB,IAAI,CAACI,IAAI,GAAGO,GAAG,CAACP,IAAI;IACpB,IAAI,CAACC,IAAI,GAAGM,GAAG,CAACN,IAAI;IACpB,IAAI,CAACC,KAAK,GAAGK,GAAG,CAACL,KAAK;IACtB,IAAI,CAACK,GAAG,GAAGA,GAAG;IAEd,IAAI,QAAQ,IAAIA,GAAG,EAAE;MACnB,IAAI,CAACJ,MAAM,GAAGI,GAAG,CAACJ,MAAM;IAC1B;IAEA,IAAI,SAAS,IAAII,GAAG,EAAE;MACpB,IAAI,CAACH,OAAO,GAAGG,GAAG,CAACH,OAAO;IAC5B;IAEA,IAAI,CAACP,IAAI,GAAGe,KAAK,CAACf,IAAI;IACtB,IAAI,CAACC,MAAM,GAAGc,KAAK,CAACd,MAAM;IAC1B,IAAI,CAACQ,KAAK,GAAGM,KAAK,CAACN,KAAK;EAC1B;EAEA,IAAIO,SAASA,CAAA,EAAG;IACd,MAAM;MAAET,OAAO;MAAEJ;IAAK,CAAC,GAAG,IAAI;IAE9B,MAAMa,SAAoB,GAAG;MAC3BC,UAAU,EAAE,CAAC;IACf,CAAC;IAED,IAAI,CAACV,OAAO,EAAE;MACZ,OAAOS,SAAS;IAClB;IAEA,IAAI,cAAc,IAAIT,OAAO,EAAE;MAC7BS,SAAS,CAACC,UAAU,CAACC,YAAY,GAAGX,OAAO,CAACW,YAAY;IAC1D;IAEA,IAAI,SAAS,IAAIX,OAAO,EAAE;MACxBS,SAAS,CAACG,OAAO,GAAGZ,OAAO,CAACY,OAAO;IACrC;IAEA,IAAI,WAAW,IAAIZ,OAAO,IAAIX,uBAAuB,CAACO,IAAI,CAAC,EAAE;MAC3Da,SAAS,CAACI,SAAS,GAAGb,OAAO,CAACa,SAAS;IACzC;IAEA,OAAOJ,SAAS;EAClB;AACF","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import joi from 'joi';
|
|
2
2
|
import { isFormState, isFormValue } from "./FormComponent.js";
|
|
3
3
|
import { createComponent } from "./helpers/components.js";
|
|
4
|
+
import { getTranslatedLabel } from "./helpers/index.js";
|
|
4
5
|
import { getErrors } from "../helpers.js";
|
|
5
6
|
import { buildLanguageMessages, validationOptions as opts } from "../pageControllers/validationOptions.js";
|
|
6
7
|
export class ComponentCollection {
|
|
@@ -170,7 +171,7 @@ export class ComponentCollection {
|
|
|
170
171
|
|
|
171
172
|
// Update error with parent title
|
|
172
173
|
if (translator && parent) {
|
|
173
|
-
error.local.title ??=
|
|
174
|
+
error.local.title ??= getTranslatedLabel(parent.def, translator);
|
|
174
175
|
} else {
|
|
175
176
|
error.local.title ??= parent?.label;
|
|
176
177
|
}
|
|
@@ -204,20 +205,23 @@ export class ComponentCollection {
|
|
|
204
205
|
for (const subField of field.collection.fields) {
|
|
205
206
|
const translatedSubLabel = t(subField.title) || subField.label;
|
|
206
207
|
let patchedSchema = subField.formSchema.label(translatedSubLabel);
|
|
207
|
-
|
|
208
|
-
|
|
208
|
+
const subFieldMessages = messagesOverride ? messagesOverride[subField.name] : undefined;
|
|
209
|
+
if (subFieldMessages) {
|
|
210
|
+
patchedSchema = patchedSchema.messages(subFieldMessages);
|
|
209
211
|
}
|
|
210
212
|
labelOverrides[subField.name] = patchedSchema;
|
|
211
213
|
}
|
|
212
214
|
} else {
|
|
213
|
-
const
|
|
215
|
+
const fieldDef = field.def;
|
|
216
|
+
const translatedLabel = getTranslatedLabel(fieldDef, translator);
|
|
214
217
|
const messagesOverride = field.getValidationMessagesOverride(translator);
|
|
215
218
|
let patchedSchema = field.formSchema;
|
|
216
219
|
if (translatedLabel && translatedLabel !== field.label) {
|
|
217
220
|
patchedSchema = patchedSchema.label(translatedLabel);
|
|
218
221
|
}
|
|
219
|
-
|
|
220
|
-
|
|
222
|
+
const fieldMessages = messagesOverride ? messagesOverride[field.name] : undefined;
|
|
223
|
+
if (fieldMessages) {
|
|
224
|
+
patchedSchema = patchedSchema.messages(fieldMessages);
|
|
221
225
|
}
|
|
222
226
|
if (patchedSchema !== field.formSchema) {
|
|
223
227
|
labelOverrides[field.name] = patchedSchema;
|
|
@@ -235,9 +239,10 @@ export class ComponentCollection {
|
|
|
235
239
|
})
|
|
236
240
|
});
|
|
237
241
|
const details = result.error?.details;
|
|
242
|
+
const language = translator?.language;
|
|
238
243
|
return {
|
|
239
244
|
value: result.value ?? {},
|
|
240
|
-
errors: this.page?.getErrors(details) ?? getErrors(details)
|
|
245
|
+
errors: this.page?.getErrors(details, language) ?? getErrors(language, details)
|
|
241
246
|
};
|
|
242
247
|
}
|
|
243
248
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentCollection.js","names":["joi","isFormState","isFormValue","createComponent","getErrors","buildLanguageMessages","validationOptions","opts","ComponentCollection","page","parent","components","fields","guidance","formSchema","stateSchema","constructor","defs","props","schema","map","def","filter","component","isFormComponent","object","required","field","collection","name","concat","keys","peers","and","isPresent","custom","flatMap","getFormDataFromState","state","payload","forEach","Object","assign","getFormValueFromState","value","entries","key","split","pop","getStateFromValidForm","getContextValueFromState","context","translator","errors","getFieldErrors","getViewErrors","getViewModel","result","type","model","overrideParentTitle","error","isErrorContext","local","title","missing","path","find","item","shift","child","label","length","tComponent","validate","messages","t","undefined","labelOverrides","messagesOverride","getValidationMessagesOverride","subField","translatedSubLabel","patchedSchema","translatedLabel","details","callback","list","fieldErrors","push"],"sources":["../../../../../src/server/plugins/engine/components/ComponentCollection.ts"],"sourcesContent":["import { type ComponentDef } from '@defra/forms-model'\nimport joi, {\n type CustomValidator,\n type ErrorReportCollection,\n type ObjectSchema\n} from 'joi'\n\nimport {\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n createComponent,\n type Component,\n type Field,\n type Guidance\n} from '~/src/server/plugins/engine/components/helpers/components.js'\nimport {\n type ComponentViewModel,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { getErrors } from '~/src/server/plugins/engine/helpers.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n buildLanguageMessages,\n validationOptions as opts\n} from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type FormPayload,\n type FormState,\n type FormSubmissionError,\n type FormSubmissionState,\n type FormValidationResult\n} from '~/src/server/plugins/engine/types.js'\n\nexport class ComponentCollection {\n page?: PageControllerClass\n parent?: Component\n\n components: Component[]\n fields: Field[]\n guidance: Guidance[]\n\n formSchema: ObjectSchema<FormPayload>\n stateSchema: ObjectSchema<FormSubmissionState>\n\n constructor(\n defs: ComponentDef[],\n props: {\n page?: PageControllerClass\n parent?: Component\n model: FormModel\n },\n schema?: {\n /**\n * Defines an all-or-nothing relationship between keys where if one\n * of the peers is present, all of them are required as well\n */\n peers?: string[]\n\n /**\n * Defines a custom validation rule for the object schema\n */\n custom?: CustomValidator\n }\n ) {\n const components = defs.map((def) => createComponent(def, props))\n\n const fields = components.filter(\n (component): component is Field => component.isFormComponent\n )\n\n const guidance = components.filter(\n (component): component is Guidance => !component.isFormComponent\n )\n\n let formSchema = joi.object<FormPayload>().required()\n let stateSchema = joi.object<FormSubmissionState>().required()\n\n // Add each field or concat collection\n for (const field of fields) {\n const { collection, name } = field\n\n formSchema = collection\n ? formSchema.concat(collection.formSchema)\n : formSchema.keys({ [name]: field.formSchema })\n\n stateSchema = collection\n ? stateSchema.concat(collection.stateSchema)\n : stateSchema.keys({ [name]: field.stateSchema })\n }\n\n if (schema?.peers) {\n formSchema = formSchema.and(...schema.peers, {\n isPresent: isFormValue\n })\n }\n\n if (schema?.custom) {\n formSchema = formSchema.custom(schema.custom)\n }\n\n this.page = props.page\n this.parent = props.parent\n\n this.components = components\n this.fields = fields\n this.guidance = guidance\n\n this.formSchema = formSchema\n this.stateSchema = stateSchema\n }\n\n get keys() {\n return this.fields.flatMap((field) => {\n const { name, collection } = field\n\n if (collection) {\n const { fields } = collection\n return [name, ...fields.map(({ name }) => name)]\n }\n\n return [name]\n })\n }\n\n getFormDataFromState(state: FormSubmissionState) {\n const payload: FormPayload = {}\n\n this.fields.forEach((component) => {\n Object.assign(payload, component.getFormDataFromState(state))\n })\n\n return payload\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const payload: FormPayload = {}\n\n // Remove name prefix for formatted value\n for (const [name, value] of Object.entries(\n this.getFormDataFromState(state)\n )) {\n const key = name.split('__').pop()\n if (!key) {\n continue\n }\n\n payload[key] = value\n }\n\n return payload\n }\n\n getStateFromValidForm(payload: FormPayload) {\n const state: FormState = {}\n\n this.fields.forEach((component) => {\n Object.assign(state, component.getStateFromValidForm(payload))\n })\n\n return state\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const context: FormState = {}\n\n for (const component of this.fields) {\n context[component.name] = component.getContextValueFromState(state)\n }\n\n return context\n }\n\n /**\n * Get all errors for all fields in this collection\n */\n getErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n return this.getFieldErrors(\n (field) => field.getErrors(translator, errors),\n errors\n )\n }\n\n /**\n * Get view errors for all fields in this collection.\n * For most fields this means filtering to the first error in the list.\n * Composite fields like UKAddress can choose to return more than one error.\n */\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n return this.getFieldErrors(\n (field) => field.getViewErrors(translator, errors),\n errors\n )\n }\n\n getViewModel(context: RenderContext) {\n const { components } = this\n\n const result: ComponentViewModel[] = components.map((component) => {\n const { isFormComponent, type } = component\n\n const model = component.getViewModel(context)\n\n return { type, isFormComponent, model }\n })\n\n return result\n }\n\n overrideParentTitle(\n formSchema: joi.ObjectSchema<FormPayload>,\n translator: Translator | undefined\n ) {\n // Add parent field title to collection field errors\n return formSchema.error((errors) => {\n return errors.flatMap((error) => {\n if (!isErrorContext(error.local) || error.local.title) {\n return error\n }\n\n // Use field key or first missing child field\n let { missing, key = missing?.[0] } = error.local\n\n // But avoid numeric key used by array payloads\n if (typeof key === 'number') {\n key = error.path[0]\n }\n\n // Find the parent field\n const parent = this.fields.find(\n (item) => item.name === key?.split('__').shift()\n )\n\n // Find the child field\n const child = (parent?.collection?.fields ?? this.fields).find(\n (item) => item.name === key\n )\n\n // Update error with child label\n if (child && (!error.local.label || error.local.label === 'value')) {\n error.local.label = child.title\n }\n\n // Fix error summary links for missing fields\n if (missing?.length) {\n error.path = missing\n error.local.key = missing[0]\n }\n\n // Update error with parent title\n if (translator && parent) {\n error.local.title ??= translator.tComponent(\n parent as ComponentDef,\n 'title'\n )\n } else {\n error.local.title ??= parent?.label\n }\n\n return error\n })\n })\n }\n\n /**\n * Validate form payload\n */\n validate(\n value: FormPayload = {},\n translator?: Translator\n ): FormValidationResult<FormPayload> {\n const messages = translator\n ? buildLanguageMessages(translator.t)\n : undefined\n\n // When translating, override Joi labels (and custom schema messages where\n // needed) so #label/#title in message templates resolve in the correct language.\n let schema = this.formSchema\n // Add parent field title to collection field errors\n schema = this.overrideParentTitle(schema, translator)\n\n if (translator) {\n const { t } = translator\n const labelOverrides: Record<string, joi.Schema> = {}\n\n for (const field of this.fields) {\n if (field.collection) {\n // Composite field: translate each sub-field's label using the key constant\n // (e.g. 'components.addressField.line1' → \"Llinell cyfeiriad 1\") and apply\n // any field-type-specific message overrides (e.g. objectMissing for dates).\n const messagesOverride =\n field.getValidationMessagesOverride(translator)\n for (const subField of field.collection.fields) {\n const translatedSubLabel = t(subField.title) || subField.label\n let patchedSchema = subField.formSchema.label(translatedSubLabel)\n if (messagesOverride) {\n patchedSchema = patchedSchema.messages(messagesOverride)\n }\n labelOverrides[subField.name] = patchedSchema\n }\n } else {\n const translatedLabel =\n translator.tComponent(\n field as unknown as ComponentDef,\n 'shortDescription'\n ) ||\n translator.tComponent(field as unknown as ComponentDef, 'title')\n const messagesOverride =\n field.getValidationMessagesOverride(translator)\n let patchedSchema = field.formSchema\n if (translatedLabel && translatedLabel !== field.label) {\n patchedSchema = patchedSchema.label(translatedLabel)\n }\n if (messagesOverride) {\n patchedSchema = patchedSchema.messages(messagesOverride)\n }\n if (patchedSchema !== field.formSchema) {\n labelOverrides[field.name] = patchedSchema\n }\n }\n }\n\n if (Object.keys(labelOverrides).length) {\n schema = schema.keys(labelOverrides)\n }\n }\n\n const result = schema.validate(value, {\n ...opts,\n ...(messages && { messages })\n })\n\n const details = result.error?.details\n\n return {\n value: (result.value ?? {}) as typeof value,\n errors: this.page?.getErrors(details) ?? getErrors(details)\n }\n }\n\n /**\n * Helper to get errors from all fields\n */\n private getFieldErrors(\n callback: (field: Field) => FormSubmissionError[] | undefined,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const { fields } = this\n\n if (!errors?.length) {\n return\n }\n\n const list: FormSubmissionError[] = []\n\n for (const field of fields) {\n const fieldErrors = callback(field)\n\n if (fieldErrors?.length) {\n list.push(...fieldErrors)\n }\n }\n\n if (!list.length) {\n return\n }\n\n return list\n }\n}\n\n/**\n * Check for field local state\n */\nexport function isErrorContext(\n value?: unknown\n): value is ErrorReportCollection['local'] {\n return isFormState(value) && typeof value.label === 'string'\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ComponentCollection.js","names":["joi","isFormState","isFormValue","createComponent","getTranslatedLabel","getErrors","buildLanguageMessages","validationOptions","opts","ComponentCollection","page","parent","components","fields","guidance","formSchema","stateSchema","constructor","defs","props","schema","map","def","filter","component","isFormComponent","object","required","field","collection","name","concat","keys","peers","and","isPresent","custom","flatMap","getFormDataFromState","state","payload","forEach","Object","assign","getFormValueFromState","value","entries","key","split","pop","getStateFromValidForm","getContextValueFromState","context","translator","errors","getFieldErrors","getViewErrors","getViewModel","result","type","model","overrideParentTitle","error","isErrorContext","local","title","missing","path","find","item","shift","child","label","length","validate","messages","t","undefined","labelOverrides","messagesOverride","getValidationMessagesOverride","subField","translatedSubLabel","patchedSchema","subFieldMessages","fieldDef","translatedLabel","fieldMessages","details","language","callback","list","fieldErrors","push"],"sources":["../../../../../src/server/plugins/engine/components/ComponentCollection.ts"],"sourcesContent":["import { type ComponentDef } from '@defra/forms-model'\nimport joi, {\n type CustomValidator,\n type ErrorReportCollection,\n type ObjectSchema\n} from 'joi'\n\nimport {\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n createComponent,\n type Component,\n type Field,\n type Guidance\n} from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { getTranslatedLabel } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n type ComponentViewModel,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { getErrors } from '~/src/server/plugins/engine/helpers.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n buildLanguageMessages,\n validationOptions as opts\n} from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type FormPayload,\n type FormState,\n type FormSubmissionError,\n type FormSubmissionState,\n type FormValidationResult\n} from '~/src/server/plugins/engine/types.js'\n\nexport class ComponentCollection {\n page?: PageControllerClass\n parent?: Component\n\n components: Component[]\n fields: Field[]\n guidance: Guidance[]\n\n formSchema: ObjectSchema<FormPayload>\n stateSchema: ObjectSchema<FormSubmissionState>\n\n constructor(\n defs: ComponentDef[],\n props: {\n page?: PageControllerClass\n parent?: Component\n model: FormModel\n },\n schema?: {\n /**\n * Defines an all-or-nothing relationship between keys where if one\n * of the peers is present, all of them are required as well\n */\n peers?: string[]\n\n /**\n * Defines a custom validation rule for the object schema\n */\n custom?: CustomValidator\n }\n ) {\n const components = defs.map((def) => createComponent(def, props))\n\n const fields = components.filter(\n (component): component is Field => component.isFormComponent\n )\n\n const guidance = components.filter(\n (component): component is Guidance => !component.isFormComponent\n )\n\n let formSchema = joi.object<FormPayload>().required()\n let stateSchema = joi.object<FormSubmissionState>().required()\n\n // Add each field or concat collection\n for (const field of fields) {\n const { collection, name } = field\n\n formSchema = collection\n ? formSchema.concat(collection.formSchema)\n : formSchema.keys({ [name]: field.formSchema })\n\n stateSchema = collection\n ? stateSchema.concat(collection.stateSchema)\n : stateSchema.keys({ [name]: field.stateSchema })\n }\n\n if (schema?.peers) {\n formSchema = formSchema.and(...schema.peers, {\n isPresent: isFormValue\n })\n }\n\n if (schema?.custom) {\n formSchema = formSchema.custom(schema.custom)\n }\n\n this.page = props.page\n this.parent = props.parent\n\n this.components = components\n this.fields = fields\n this.guidance = guidance\n\n this.formSchema = formSchema\n this.stateSchema = stateSchema\n }\n\n get keys() {\n return this.fields.flatMap((field) => {\n const { name, collection } = field\n\n if (collection) {\n const { fields } = collection\n return [name, ...fields.map(({ name }) => name)]\n }\n\n return [name]\n })\n }\n\n getFormDataFromState(state: FormSubmissionState) {\n const payload: FormPayload = {}\n\n this.fields.forEach((component) => {\n Object.assign(payload, component.getFormDataFromState(state))\n })\n\n return payload\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const payload: FormPayload = {}\n\n // Remove name prefix for formatted value\n for (const [name, value] of Object.entries(\n this.getFormDataFromState(state)\n )) {\n const key = name.split('__').pop()\n if (!key) {\n continue\n }\n\n payload[key] = value\n }\n\n return payload\n }\n\n getStateFromValidForm(payload: FormPayload) {\n const state: FormState = {}\n\n this.fields.forEach((component) => {\n Object.assign(state, component.getStateFromValidForm(payload))\n })\n\n return state\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const context: FormState = {}\n\n for (const component of this.fields) {\n context[component.name] = component.getContextValueFromState(state)\n }\n\n return context\n }\n\n /**\n * Get all errors for all fields in this collection\n */\n getErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n return this.getFieldErrors(\n (field) => field.getErrors(translator, errors),\n errors\n )\n }\n\n /**\n * Get view errors for all fields in this collection.\n * For most fields this means filtering to the first error in the list.\n * Composite fields like UKAddress can choose to return more than one error.\n */\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n return this.getFieldErrors(\n (field) => field.getViewErrors(translator, errors),\n errors\n )\n }\n\n getViewModel(context: RenderContext) {\n const { components } = this\n\n const result: ComponentViewModel[] = components.map((component) => {\n const { isFormComponent, type } = component\n\n const model = component.getViewModel(context)\n\n return { type, isFormComponent, model }\n })\n\n return result\n }\n\n overrideParentTitle(\n formSchema: joi.ObjectSchema<FormPayload>,\n translator: Translator | undefined\n ) {\n // Add parent field title to collection field errors\n return formSchema.error((errors) => {\n return errors.flatMap((error) => {\n if (!isErrorContext(error.local) || error.local.title) {\n return error\n }\n\n // Use field key or first missing child field\n let { missing, key = missing?.[0] } = error.local\n\n // But avoid numeric key used by array payloads\n if (typeof key === 'number') {\n key = error.path[0]\n }\n\n // Find the parent field\n const parent = this.fields.find(\n (item) => item.name === key?.split('__').shift()\n )\n\n // Find the child field\n const child = (parent?.collection?.fields ?? this.fields).find(\n (item) => item.name === key\n )\n\n // Update error with child label\n if (child && (!error.local.label || error.local.label === 'value')) {\n error.local.label = child.title\n }\n\n // Fix error summary links for missing fields\n if (missing?.length) {\n error.path = missing\n error.local.key = missing[0]\n }\n\n // Update error with parent title\n if (translator && parent) {\n error.local.title ??= getTranslatedLabel(parent.def, translator)\n } else {\n error.local.title ??= parent?.label\n }\n\n return error\n })\n })\n }\n\n /**\n * Validate form payload\n */\n validate(\n value: FormPayload = {},\n translator?: Translator\n ): FormValidationResult<FormPayload> {\n const messages = translator\n ? buildLanguageMessages(translator.t)\n : undefined\n\n // When translating, override Joi labels (and custom schema messages where\n // needed) so #label/#title in message templates resolve in the correct language.\n let schema = this.formSchema\n // Add parent field title to collection field errors\n schema = this.overrideParentTitle(schema, translator)\n\n if (translator) {\n const { t } = translator\n const labelOverrides: Record<string, joi.Schema> = {}\n\n for (const field of this.fields) {\n if (field.collection) {\n // Composite field: translate each sub-field's label using the key constant\n // (e.g. 'components.addressField.line1' → \"Llinell cyfeiriad 1\") and apply\n // any field-type-specific message overrides (e.g. objectMissing for dates).\n const messagesOverride =\n field.getValidationMessagesOverride(translator)\n for (const subField of field.collection.fields) {\n const translatedSubLabel = t(subField.title) || subField.label\n let patchedSchema = subField.formSchema.label(translatedSubLabel)\n const subFieldMessages = messagesOverride\n ? messagesOverride[subField.name]\n : undefined\n if (subFieldMessages) {\n patchedSchema = patchedSchema.messages(subFieldMessages)\n }\n labelOverrides[subField.name] = patchedSchema\n }\n } else {\n const fieldDef = field.def\n const translatedLabel = getTranslatedLabel(fieldDef, translator)\n const messagesOverride =\n field.getValidationMessagesOverride(translator)\n let patchedSchema = field.formSchema\n if (translatedLabel && translatedLabel !== field.label) {\n patchedSchema = patchedSchema.label(translatedLabel)\n }\n const fieldMessages = messagesOverride\n ? messagesOverride[field.name]\n : undefined\n if (fieldMessages) {\n patchedSchema = patchedSchema.messages(fieldMessages)\n }\n if (patchedSchema !== field.formSchema) {\n labelOverrides[field.name] = patchedSchema\n }\n }\n }\n\n if (Object.keys(labelOverrides).length) {\n schema = schema.keys(labelOverrides)\n }\n }\n\n const result = schema.validate(value, {\n ...opts,\n ...(messages && { messages })\n })\n\n const details = result.error?.details\n const language = translator?.language\n\n return {\n value: (result.value ?? {}) as typeof value,\n errors:\n this.page?.getErrors(details, language) ?? getErrors(language, details)\n }\n }\n\n /**\n * Helper to get errors from all fields\n */\n private getFieldErrors(\n callback: (field: Field) => FormSubmissionError[] | undefined,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const { fields } = this\n\n if (!errors?.length) {\n return\n }\n\n const list: FormSubmissionError[] = []\n\n for (const field of fields) {\n const fieldErrors = callback(field)\n\n if (fieldErrors?.length) {\n list.push(...fieldErrors)\n }\n }\n\n if (!list.length) {\n return\n }\n\n return list\n }\n}\n\n/**\n * Check for field local state\n */\nexport function isErrorContext(\n value?: unknown\n): value is ErrorReportCollection['local'] {\n return isFormState(value) && typeof value.label === 'string'\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type DatePartsFieldComponent } from '@defra/forms-model';
|
|
2
|
-
import { type CustomValidator, type ObjectSchema } from 'joi';
|
|
2
|
+
import { type CustomValidator, type LanguageMessages, type ObjectSchema } from 'joi';
|
|
3
3
|
import { ComponentCollection } from '../../../../server/plugins/engine/components/ComponentCollection.js';
|
|
4
4
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
5
5
|
import { type DateInputItem, type DatePartsState, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
@@ -12,11 +12,13 @@ export declare class DatePartsField extends FormComponent {
|
|
|
12
12
|
collection: ComponentCollection;
|
|
13
13
|
constructor(def: DatePartsFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
14
14
|
getFormValueFromState(state: FormSubmissionState): DatePartsState | undefined;
|
|
15
|
-
getDisplayStringFromFormValue(formValue: DatePartsState | undefined,
|
|
15
|
+
getDisplayStringFromFormValue(formValue: DatePartsState | undefined, translator: Translator): string;
|
|
16
16
|
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
17
17
|
getContextValueFromFormValue(value: DatePartsState | 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 DatePartsField 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 DatePartsState;
|
|
@@ -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 DatePartsField extends FormComponent {
|
|
11
11
|
constructor(def, props) {
|
|
12
12
|
super(def, props);
|
|
@@ -15,7 +15,7 @@ export class DatePartsField 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 DatePartsField 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}__day`,
|
|
@@ -84,11 +84,11 @@ export class DatePartsField extends FormComponent {
|
|
|
84
84
|
const value = super.getFormValueFromState(state);
|
|
85
85
|
return this.isState(value) ? value : undefined;
|
|
86
86
|
}
|
|
87
|
-
getDisplayStringFromFormValue(formValue,
|
|
87
|
+
getDisplayStringFromFormValue(formValue, translator) {
|
|
88
88
|
if (!formValue) {
|
|
89
89
|
return '';
|
|
90
90
|
}
|
|
91
|
-
return
|
|
91
|
+
return formatDateForLanguage(`${formValue.year}-${formValue.month}-${formValue.day}`, 'd MMMM yyyy', translator.language);
|
|
92
92
|
}
|
|
93
93
|
getDisplayStringFromState(state, translator) {
|
|
94
94
|
const value = this.getFormValueFromState(state);
|
|
@@ -108,7 +108,7 @@ export class DatePartsField extends FormComponent {
|
|
|
108
108
|
const {
|
|
109
109
|
t
|
|
110
110
|
} = translator;
|
|
111
|
-
|
|
111
|
+
const messages = {
|
|
112
112
|
'any.required': buildValidationMessages(t).objectMissing,
|
|
113
113
|
'number.base': buildValidationMessages(t).objectMissing,
|
|
114
114
|
'number.precision': buildValidationMessages(t).dateFormat,
|
|
@@ -116,7 +116,12 @@ export class DatePartsField extends FormComponent {
|
|
|
116
116
|
'number.unsafe': buildValidationMessages(t).dateFormat,
|
|
117
117
|
'number.min': buildValidationMessages(t).dateFormat,
|
|
118
118
|
'number.max': buildValidationMessages(t).dateFormat
|
|
119
|
-
}
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
[`${this.name}__day`]: messages,
|
|
122
|
+
[`${this.name}__month`]: messages,
|
|
123
|
+
[`${this.name}__year`]: messages
|
|
124
|
+
};
|
|
120
125
|
}
|
|
121
126
|
getViewModel(context) {
|
|
122
127
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePartsField.js","names":["ComponentType","add","format","isValid","parse","startOfToday","sub","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","parseStrictDate","buildValidationMessages","messageTemplate","convertToLanguageMessages","DatePartsField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorDate","peers","formSchema","stateSchema","getFormValueFromState","state","value","isState","undefined","getDisplayStringFromFormValue","formValue","_translator","year","month","day","getDisplayStringFromState","translator","getContextValueFromFormValue","Date","getContextValueFromState","getValidationMessagesOverride","t","getViewModel","context","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isDateParts","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","dateMin","dateMax","isNumber","component","validator","payload","helpers","values","getStateFromValidForm","missing","keys","key","date","maxDaysInPast","days","limit","maxDaysInFuture","earliestDate","latestDate"],"sources":["../../../../../src/server/plugins/engine/components/DatePartsField.ts"],"sourcesContent":["import { ComponentType, type DatePartsFieldComponent } from '@defra/forms-model'\nimport { add, format, isValid, parse, startOfToday, sub } from 'date-fns'\nimport { type Context, type CustomValidator, type ObjectSchema } 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 DatePartsState,\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 DatePartsField extends FormComponent {\n declare options: DatePartsFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: DatePartsFieldComponent,\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 = 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}__day`,\n title: 'components.dateField.day',\n schema: { min: 1, max: 31, 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}__month`,\n title: 'components.dateField.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.dateField.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: getValidatorDate(this),\n peers: [`${name}__day`, `${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 this.isState(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n formValue: DatePartsState | undefined,\n _translator: Translator\n ) {\n if (!formValue) {\n return ''\n }\n\n return format(\n `${formValue.year}-${formValue.month}-${formValue.day}`,\n 'd MMMM yyyy'\n )\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(value: DatePartsState | undefined) {\n if (\n !value ||\n !isValid(\n parseStrictDate(\n value,\n `${value.year}-${value.month}-${value.day}`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-${value.day}`, 'yyyy-MM-dd')\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 DatePartsField.isDateParts(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return DatePartsField.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: 'dateFormat', template: messageTemplate.dateFormat },\n { type: 'dateFormatDay', template: '{{#label}} must include a day' },\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: 'dateMin', template: messageTemplate.dateMin },\n { type: 'dateMax', template: messageTemplate.dateMax },\n { type: 'dateEarliest', template: messageTemplate.dateMin },\n { type: 'dateLatest', template: messageTemplate.dateMax }\n ]\n }\n }\n\n static isDateParts(\n value?: FormStateValue | FormState\n ): value is DatePartsState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.day) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport function getValidatorDate(component: DatePartsField) {\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}-${values.day}`,\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 dateMin =\n options.maxDaysInPast || options.maxDaysInPast === 0\n ? sub(startOfToday(), { days: options.maxDaysInPast })\n : undefined\n\n if (dateMin && date < dateMin) {\n return helpers.error('date.min', { ...context, limit: dateMin })\n }\n\n // Maximum date from today\n const dateMax =\n options.maxDaysInFuture || options.maxDaysInFuture === 0\n ? add(startOfToday(), { days: options.maxDaysInFuture })\n : undefined\n\n if (dateMax && date > dateMax) {\n return helpers.error('date.max', { ...context, limit: dateMax })\n }\n\n // Minimum date from today\n const earliestDate = options.earliestDate\n ? new Date(options.earliestDate)\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.latestDate\n ? new Date(options.latestDate)\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":"AAAA,SAASA,aAAa,QAAsC,oBAAoB;AAChF,SAASC,GAAG,EAAEC,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,YAAY,EAAEC,GAAG,QAAQ,UAAU;AAGzE,SAASC,mBAAmB;AAC5B,SACEC,aAAa,EACbC,WAAW,EACXC,WAAW;AAEb,SAASC,WAAW;AAMpB,SAASC,eAAe;AACxB,SAASC,uBAAuB;AAEhC,SAASC,eAAe;AAQxB,SAASC,yBAAyB;AAElC,OAAO,MAAMC,cAAc,SAASR,aAAa,CAAC;EAMhDS,WAAWA,CACTC,GAA4B,EAC5BC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC,IAAI;MAAEC;IAAQ,CAAC,GAAGH,GAAG;IAE7B,MAAMI,UAAU,GAAGD,OAAO,CAACE,QAAQ,KAAK,KAAK;IAE7C,MAAMC,wBAAwB,GAAGT,yBAAyB,CAAC;MACzD,cAAc,EAAED,eAAe,CAACW,aAAa;MAC7C,aAAa,EAAEX,eAAe,CAACW,aAAa;MAC5C,kBAAkB,EAAEX,eAAe,CAACY,UAAU;MAC9C,gBAAgB,EAAEZ,eAAe,CAACY,UAAU;MAC5C,eAAe,EAAEZ,eAAe,CAACY,UAAU;MAC3C,YAAY,EAAEZ,eAAe,CAACY,UAAU;MACxC,YAAY,EAAEZ,eAAe,CAACY;IAChC,CAAC,CAAC;IAEF,IAAI,CAACC,UAAU,GAAG,IAAIpB,mBAAmB,CACvC,CACE;MACEqB,IAAI,EAAE5B,aAAa,CAACW,WAAW;MAC/BS,IAAI,EAAE,GAAGA,IAAI,OAAO;MACpBS,KAAK,EAAE,0BAA0B;MACjCC,MAAM,EAAE;QAAEC,GAAG,EAAE,CAAC;QAAEC,GAAG,EAAE,EAAE;QAAEC,SAAS,EAAE;MAAE,CAAC;MACzCZ,OAAO,EAAE;QACPE,QAAQ,EAAED,UAAU;QACpBY,YAAY,EAAE,IAAI;QAClBC,OAAO,EAAE,sBAAsB;QAC/BX;MACF;IACF,CAAC,EACD;MACEI,IAAI,EAAE5B,aAAa,CAACW,WAAW;MAC/BS,IAAI,EAAE,GAAGA,IAAI,SAAS;MACtBS,KAAK,EAAE,4BAA4B;MACnCC,MAAM,EAAE;QAAEC,GAAG,EAAE,CAAC;QAAEC,GAAG,EAAE,EAAE;QAAEC,SAAS,EAAE;MAAE,CAAC;MACzCZ,OAAO,EAAE;QACPE,QAAQ,EAAED,UAAU;QACpBY,YAAY,EAAE,IAAI;QAClBC,OAAO,EAAE,sBAAsB;QAC/BX;MACF;IACF,CAAC,EACD;MACEI,IAAI,EAAE5B,aAAa,CAACW,WAAW;MAC/BS,IAAI,EAAE,GAAGA,IAAI,QAAQ;MACrBS,KAAK,EAAE,2BAA2B;MAClCC,MAAM,EAAE;QAAEC,GAAG,EAAE,IAAI;QAAEC,GAAG,EAAE,IAAI;QAAEC,SAAS,EAAE;MAAE,CAAC;MAC9CZ,OAAO,EAAE;QACPE,QAAQ,EAAED,UAAU;QACpBY,YAAY,EAAE,IAAI;QAClBC,OAAO,EAAE,sBAAsB;QAC/BX;MACF;IACF,CAAC,CACF,EACD;MAAE,GAAGL,KAAK;MAAEiB,MAAM,EAAE;IAAK,CAAC,EAC1B;MACEC,MAAM,EAAEC,gBAAgB,CAAC,IAAI,CAAC;MAC9BC,KAAK,EAAE,CAAC,GAAGnB,IAAI,OAAO,EAAE,GAAGA,IAAI,SAAS,EAAE,GAAGA,IAAI,QAAQ;IAC3D,CACF,CAAC;IAED,IAAI,CAACC,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACmB,UAAU,GAAG,IAAI,CAACb,UAAU,CAACa,UAAU;IAC5C,IAAI,CAACC,WAAW,GAAG,IAAI,CAACd,UAAU,CAACc,WAAW;EAChD;EAEAC,qBAAqBA,CAACC,KAA0B,EAAE;IAChD,MAAMC,KAAK,GAAG,KAAK,CAACF,qBAAqB,CAACC,KAAK,CAAC;IAChD,OAAO,IAAI,CAACE,OAAO,CAACD,KAAK,CAAC,GAAGA,KAAK,GAAGE,SAAS;EAChD;EAEAC,6BAA6BA,CAC3BC,SAAqC,EACrCC,WAAuB,EACvB;IACA,IAAI,CAACD,SAAS,EAAE;MACd,OAAO,EAAE;IACX;IAEA,OAAO9C,MAAM,CACX,GAAG8C,SAAS,CAACE,IAAI,IAAIF,SAAS,CAACG,KAAK,IAAIH,SAAS,CAACI,GAAG,EAAE,EACvD,aACF,CAAC;EACH;EAEAC,yBAAyBA,CACvBV,KAA0B,EAC1BW,UAAsB,EACtB;IACA,MAAMV,KAAK,GAAG,IAAI,CAACF,qBAAqB,CAACC,KAAK,CAAC;IAE/C,OAAO,IAAI,CAACI,6BAA6B,CAACH,KAAK,EAAEU,UAAU,CAAC;EAC9D;EAEAC,4BAA4BA,CAACX,KAAiC,EAAE;IAC9D,IACE,CAACA,KAAK,IACN,CAACzC,OAAO,CACNS,eAAe,CACbgC,KAAK,EACL,GAAGA,KAAK,CAACM,IAAI,IAAIN,KAAK,CAACO,KAAK,IAAIP,KAAK,CAACQ,GAAG,EAAE,EAC3C,YAAY,EACZ,IAAII,IAAI,CAAC,CACX,CACF,CAAC,EACD;MACA,OAAO,IAAI;IACb;IAEA,OAAOtD,MAAM,CAAC,GAAG0C,KAAK,CAACM,IAAI,IAAIN,KAAK,CAACO,KAAK,IAAIP,KAAK,CAACQ,GAAG,EAAE,EAAE,YAAY,CAAC;EAC1E;EAEAK,wBAAwBA,CAACd,KAA0B,EAAE;IACnD,MAAMC,KAAK,GAAG,IAAI,CAACF,qBAAqB,CAACC,KAAK,CAAC;IAE/C,OAAO,IAAI,CAACY,4BAA4B,CAACX,KAAK,CAAC;EACjD;EAEAc,6BAA6BA,CAACJ,UAAsB,EAAE;IACpD,MAAM;MAAEK;IAAE,CAAC,GAAGL,UAAU;IACxB,OAAOvC,yBAAyB,CAAC;MAC/B,cAAc,EAAEF,uBAAuB,CAAC8C,CAAC,CAAC,CAAClC,aAAa;MACxD,aAAa,EAAEZ,uBAAuB,CAAC8C,CAAC,CAAC,CAAClC,aAAa;MACvD,kBAAkB,EAAEZ,uBAAuB,CAAC8C,CAAC,CAAC,CAACjC,UAAU;MACzD,gBAAgB,EAAEb,uBAAuB,CAAC8C,CAAC,CAAC,CAACjC,UAAU;MACvD,eAAe,EAAEb,uBAAuB,CAAC8C,CAAC,CAAC,CAACjC,UAAU;MACtD,YAAY,EAAEb,uBAAuB,CAAC8C,CAAC,CAAC,CAACjC,UAAU;MACnD,YAAY,EAAEb,uBAAuB,CAAC8C,CAAC,CAAC,CAACjC;IAC3C,CAAC,CAAC;EACJ;EAEAkC,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAM;MAAEC;IAAO,CAAC,GAAGD,OAAO;IAC1B,MAAM;MAAElC,UAAU;MAAEP;IAAK,CAAC,GAAG,IAAI;IAEjC,MAAM2C,SAAS,GAAG,KAAK,CAACH,YAAY,CAACC,OAAO,CAAC;IAC7C,IAAI;MAAEG,QAAQ;MAAEC;IAAM,CAAC,GAAGF,SAAS;;IAEnC;IACA,MAAMG,QAAQ,GAAGJ,MAAM,EAAEK,IAAI,CAAEC,KAAK,IAAKA,KAAK,CAAChD,IAAI,KAAKA,IAAI,CAAC;;IAE7D;IACA,MAAMiD,KAAsB,GAAG1C,UAAU,CACtCiC,YAAY,CAACC,OAAO,CAAC,CACrBS,GAAG,CAAC,CAAC;MAAEC;IAAM,CAAC,KAAK;MAClB,IAAI;QAAEN,KAAK;QAAErC,IAAI;QAAEgB,KAAK;QAAET,OAAO;QAAEqC;MAAa,CAAC,GAAGD,KAAK;MAEzD,IAAIN,KAAK,EAAE;QACTA,KAAK,CAACQ,QAAQ,GAAG,MAAMR,KAAK,CAACS,IAAI,EAAC;MACpC;MAEA,IAAIR,QAAQ,IAAIM,YAAY,EAAE;QAC5BrC,OAAO,GAAG,GAAGA,OAAO,qBAAqB,CAACwC,IAAI,CAAC,CAAC;MAClD;;MAEA;MACA;MACA,IAAI,CAACjE,WAAW,CAACkC,KAAK,CAAC,EAAE;QACvBA,KAAK,GAAGE,SAAS;MACnB;MAEA,OAAO;QACLmB,KAAK;QACLW,EAAE,EAAEL,KAAK,CAACK,EAAE;QACZxD,IAAI,EAAEmD,KAAK,CAACnD,IAAI;QAChBQ,IAAI;QACJgB,KAAK;QACLT;MACF,CAAC;IACH,CAAC,CAAC;IAEJ6B,QAAQ,KAAK;MACXa,MAAM,EAAE;QACNH,IAAI,EAAET,KAAK,CAACS,IAAI;QAChBvC,OAAO,EAAE;MACX;IACF,CAAC;IAED,OAAO;MACL,GAAG4B,SAAS;MACZC,QAAQ;MACRK;IACF,CAAC;EACH;EAEAxB,OAAOA,CAACD,KAAkC,EAAE;IAC1C,OAAO5B,cAAc,CAAC8D,WAAW,CAAClC,KAAK,CAAC;EAC1C;;EAEA;AACF;AACA;EACEmC,oBAAoBA,CAAA,EAA6B;IAC/C,OAAO/D,cAAc,CAAC+D,oBAAoB,CAAC,CAAC;EAC9C;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QAAEpD,IAAI,EAAE,UAAU;QAAEqD,QAAQ,EAAEnE,eAAe,CAACS;MAAS,CAAC,EACxD;QAAEK,IAAI,EAAE,YAAY;QAAEqD,QAAQ,EAAEnE,eAAe,CAACY;MAAW,CAAC,EAC5D;QAAEE,IAAI,EAAE,eAAe;QAAEqD,QAAQ,EAAE;MAAgC,CAAC,EACpE;QACErD,IAAI,EAAE,iBAAiB;QACvBqD,QAAQ,EAAE;MACZ,CAAC,EACD;QAAErD,IAAI,EAAE,gBAAgB;QAAEqD,QAAQ,EAAE;MAAiC,CAAC,CACvE;MACDC,sBAAsB,EAAE,CACtB;QAAEtD,IAAI,EAAE,SAAS;QAAEqD,QAAQ,EAAEnE,eAAe,CAACqE;MAAQ,CAAC,EACtD;QAAEvD,IAAI,EAAE,SAAS;QAAEqD,QAAQ,EAAEnE,eAAe,CAACsE;MAAQ,CAAC,EACtD;QAAExD,IAAI,EAAE,cAAc;QAAEqD,QAAQ,EAAEnE,eAAe,CAACqE;MAAQ,CAAC,EAC3D;QAAEvD,IAAI,EAAE,YAAY;QAAEqD,QAAQ,EAAEnE,eAAe,CAACsE;MAAQ,CAAC;IAE7D,CAAC;EACH;EAEA,OAAON,WAAWA,CAChBlC,KAAkC,EACT;IACzB,OACEnC,WAAW,CAACmC,KAAK,CAAC,IAClBjC,WAAW,CAAC0E,QAAQ,CAACzC,KAAK,CAACQ,GAAG,CAAC,IAC/BzC,WAAW,CAAC0E,QAAQ,CAACzC,KAAK,CAACO,KAAK,CAAC,IACjCxC,WAAW,CAAC0E,QAAQ,CAACzC,KAAK,CAACM,IAAI,CAAC;EAEpC;AACF;AAEA,OAAO,SAASZ,gBAAgBA,CAACgD,SAAyB,EAAE;EAC1D,MAAMC,SAA0B,GAAGA,CAACC,OAAoB,EAAEC,OAAO,KAAK;IACpE,MAAM;MAAE9D,UAAU;MAAEP,IAAI;MAAEC;IAAQ,CAAC,GAAGiE,SAAS;IAE/C,MAAMI,MAAM,GAAGJ,SAAS,CAAC5C,qBAAqB,CAC5C4C,SAAS,CAACK,qBAAqB,CAACH,OAAO,CACzC,CAAC;IAED,MAAM3B,OAAgB,GAAG;MACvB+B,OAAO,EAAEjE,UAAU,CAACkE,IAAI;MACxBC,GAAG,EAAE1E;IACP,CAAC;IAED,IAAI,CAACkE,SAAS,CAACzC,OAAO,CAAC6C,MAAM,CAAC,EAAE;MAC9B,OAAOrE,OAAO,CAACE,QAAQ,KAAK,KAAK,GAC7BkE,OAAO,CAACrB,KAAK,CAAC,iBAAiB,EAAEP,OAAO,CAAC,GACzC2B,OAAO;IACb;IAEA,MAAMO,IAAI,GAAG3F,KAAK,CAChB,GAAGsF,MAAM,CAACxC,IAAI,IAAIwC,MAAM,CAACvC,KAAK,IAAIuC,MAAM,CAACtC,GAAG,EAAE,EAC9C,YAAY,EACZ,IAAII,IAAI,CAAC,CACX,CAAC;IAED,IAAI,CAACrD,OAAO,CAAC4F,IAAI,CAAC,EAAE;MAClB,OAAON,OAAO,CAACrB,KAAK,CAAC,aAAa,EAAEP,OAAO,CAAC;IAC9C;;IAEA;IACA,MAAMsB,OAAO,GACX9D,OAAO,CAAC2E,aAAa,IAAI3E,OAAO,CAAC2E,aAAa,KAAK,CAAC,GAChD1F,GAAG,CAACD,YAAY,CAAC,CAAC,EAAE;MAAE4F,IAAI,EAAE5E,OAAO,CAAC2E;IAAc,CAAC,CAAC,GACpDlD,SAAS;IAEf,IAAIqC,OAAO,IAAIY,IAAI,GAAGZ,OAAO,EAAE;MAC7B,OAAOM,OAAO,CAACrB,KAAK,CAAC,UAAU,EAAE;QAAE,GAAGP,OAAO;QAAEqC,KAAK,EAAEf;MAAQ,CAAC,CAAC;IAClE;;IAEA;IACA,MAAMC,OAAO,GACX/D,OAAO,CAAC8E,eAAe,IAAI9E,OAAO,CAAC8E,eAAe,KAAK,CAAC,GACpDlG,GAAG,CAACI,YAAY,CAAC,CAAC,EAAE;MAAE4F,IAAI,EAAE5E,OAAO,CAAC8E;IAAgB,CAAC,CAAC,GACtDrD,SAAS;IAEf,IAAIsC,OAAO,IAAIW,IAAI,GAAGX,OAAO,EAAE;MAC7B,OAAOK,OAAO,CAACrB,KAAK,CAAC,UAAU,EAAE;QAAE,GAAGP,OAAO;QAAEqC,KAAK,EAAEd;MAAQ,CAAC,CAAC;IAClE;;IAEA;IACA,MAAMgB,YAAY,GAAG/E,OAAO,CAAC+E,YAAY,GACrC,IAAI5C,IAAI,CAACnC,OAAO,CAAC+E,YAAY,CAAC,GAC9BtD,SAAS;IAEb,IAAIsD,YAAY,IAAIL,IAAI,GAAGK,YAAY,EAAE;MACvC,OAAOX,OAAO,CAACrB,KAAK,CAAC,UAAU,EAAE;QAAE,GAAGP,OAAO;QAAEqC,KAAK,EAAEE;MAAa,CAAC,CAAC;IACvE;;IAEA;IACA,MAAMC,UAAU,GAAGhF,OAAO,CAACgF,UAAU,GACjC,IAAI7C,IAAI,CAACnC,OAAO,CAACgF,UAAU,CAAC,GAC5BvD,SAAS;IAEb,IAAIuD,UAAU,IAAIN,IAAI,GAAGM,UAAU,EAAE;MACnC,OAAOZ,OAAO,CAACrB,KAAK,CAAC,UAAU,EAAE;QAAE,GAAGP,OAAO;QAAEqC,KAAK,EAAEG;MAAW,CAAC,CAAC;IACrE;IAEA,OAAOb,OAAO;EAChB,CAAC;EAED,OAAOD,SAAS;AAClB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DatePartsField.js","names":["ComponentType","add","format","isValid","parse","startOfToday","sub","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","parseStrictDate","buildValidationMessages","messageTemplate","formatDateForLanguage","DatePartsField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorDate","peers","formSchema","stateSchema","getFormValueFromState","state","value","isState","undefined","getDisplayStringFromFormValue","formValue","translator","year","month","day","language","getDisplayStringFromState","getContextValueFromFormValue","Date","getContextValueFromState","getValidationMessagesOverride","t","messages","getViewModel","context","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isDateParts","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","dateMin","dateMax","isNumber","component","validator","payload","helpers","values","getStateFromValidForm","missing","keys","key","date","maxDaysInPast","days","limit","maxDaysInFuture","earliestDate","latestDate"],"sources":["../../../../../src/server/plugins/engine/components/DatePartsField.ts"],"sourcesContent":["import { ComponentType, type DatePartsFieldComponent } from '@defra/forms-model'\nimport { add, format, isValid, parse, startOfToday, sub } 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 DatePartsState,\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 DatePartsField extends FormComponent {\n declare options: DatePartsFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: DatePartsFieldComponent,\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}__day`,\n title: 'components.dateField.day',\n schema: { min: 1, max: 31, 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}__month`,\n title: 'components.dateField.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.dateField.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: getValidatorDate(this),\n peers: [`${name}__day`, `${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 this.isState(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n formValue: DatePartsState | undefined,\n translator: Translator\n ) {\n if (!formValue) {\n return ''\n }\n\n return formatDateForLanguage(\n `${formValue.year}-${formValue.month}-${formValue.day}`,\n 'd MMMM yyyy',\n translator.language\n )\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(value: DatePartsState | undefined) {\n if (\n !value ||\n !isValid(\n parseStrictDate(\n value,\n `${value.year}-${value.month}-${value.day}`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-${value.day}`, 'yyyy-MM-dd')\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}__day`]: messages,\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 DatePartsField.isDateParts(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return DatePartsField.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: 'dateFormat', template: messageTemplate.dateFormat },\n { type: 'dateFormatDay', template: '{{#label}} must include a day' },\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: 'dateMin', template: messageTemplate.dateMin },\n { type: 'dateMax', template: messageTemplate.dateMax },\n { type: 'dateEarliest', template: messageTemplate.dateMin },\n { type: 'dateLatest', template: messageTemplate.dateMax }\n ]\n }\n }\n\n static isDateParts(\n value?: FormStateValue | FormState\n ): value is DatePartsState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.day) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport function getValidatorDate(component: DatePartsField) {\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}-${values.day}`,\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 dateMin =\n options.maxDaysInPast || options.maxDaysInPast === 0\n ? sub(startOfToday(), { days: options.maxDaysInPast })\n : undefined\n\n if (dateMin && date < dateMin) {\n return helpers.error('date.min', { ...context, limit: dateMin })\n }\n\n // Maximum date from today\n const dateMax =\n options.maxDaysInFuture || options.maxDaysInFuture === 0\n ? add(startOfToday(), { days: options.maxDaysInFuture })\n : undefined\n\n if (dateMax && date > dateMax) {\n return helpers.error('date.max', { ...context, limit: dateMax })\n }\n\n // Minimum date from today\n const earliestDate = options.earliestDate\n ? new Date(options.earliestDate)\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.latestDate\n ? new Date(options.latestDate)\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,5 +1,5 @@
|
|
|
1
1
|
import { type DeclarationFieldComponent, type Item } from '@defra/forms-model';
|
|
2
|
-
import { type ArraySchema, type BooleanSchema
|
|
2
|
+
import joi, { type ArraySchema, type BooleanSchema } 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
5
|
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
@@ -7,7 +7,7 @@ import { type ErrorMessageTemplateList, type FormPayload, type FormState, type F
|
|
|
7
7
|
export declare class DeclarationField extends FormComponent {
|
|
8
8
|
options: DeclarationFieldComponent['options'];
|
|
9
9
|
declarationConfirmationLabel: string | undefined;
|
|
10
|
-
formSchema: ArraySchema<
|
|
10
|
+
formSchema: ArraySchema<string[]>;
|
|
11
11
|
stateSchema: BooleanSchema;
|
|
12
12
|
content: string;
|
|
13
13
|
headerStartLevel: number;
|
|
@@ -17,7 +17,9 @@ export declare class DeclarationField extends FormComponent {
|
|
|
17
17
|
getStateFromValidForm(payload: FormPayload): FormState;
|
|
18
18
|
getContextValueFromFormValue(value: FormValue | FormPayload): boolean;
|
|
19
19
|
getFormValue(value?: FormStateValue | FormState): (string | number | boolean)[] | undefined;
|
|
20
|
-
getValidationMessagesOverride(translator: Translator):
|
|
20
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
21
|
+
[x: string]: joi.LanguageMessages;
|
|
22
|
+
};
|
|
21
23
|
getDisplayStringFromFormValue(value: FormValue | FormPayload, translator: Translator): string;
|
|
22
24
|
getViewModel(context: RenderContext): {
|
|
23
25
|
hint: {
|
|
@@ -70,6 +72,7 @@ export declare class DeclarationField extends FormComponent {
|
|
|
70
72
|
upload?: {
|
|
71
73
|
count: number;
|
|
72
74
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
75
|
+
uploadingLabel?: string;
|
|
73
76
|
};
|
|
74
77
|
};
|
|
75
78
|
isValue(value?: FormStateValue | FormState): value is Item['value'][];
|
|
@@ -70,9 +70,11 @@ export class DeclarationField extends FormComponent {
|
|
|
70
70
|
} = buildValidationMessages(translator.t);
|
|
71
71
|
const msg = declarationRequired;
|
|
72
72
|
return {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
[this.name]: {
|
|
74
|
+
'any.required': msg,
|
|
75
|
+
'any.unknown': msg,
|
|
76
|
+
'array.includesRequiredUnknowns': msg
|
|
77
|
+
}
|
|
76
78
|
};
|
|
77
79
|
}
|
|
78
80
|
getDisplayStringFromFormValue(value, translator) {
|
|
@@ -93,7 +95,7 @@ export class DeclarationField extends FormComponent {
|
|
|
93
95
|
hint,
|
|
94
96
|
declarationConfirmationLabel = t('components.declarationField.defaultLabel')
|
|
95
97
|
} = this;
|
|
96
|
-
const content = tComponent(this, 'content');
|
|
98
|
+
const content = tComponent(this.def, 'content');
|
|
97
99
|
const viewModel = super.getViewModel(context);
|
|
98
100
|
let {
|
|
99
101
|
fieldset,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeclarationField.js","names":["ComponentType","hasFormComponents","isFormType","joi","FormComponent","isFormValue","buildValidationMessages","messageTemplate","DeclarationField","headerStartLevel","constructor","def","props","options","content","checkboxSchema","string","valid","required","formSchema","array","items","strip","label","single","messages","declarationRequired","stateSchema","boolean","cast","declarationConfirmationLabel","formComponents","page","pageDef","components","numOfQuestionsOnPage","filter","q","type","length","hasGuidance","some","comp","idx","Markdown","getFormValueFromState","state","name","getFormDataFromState","getStateFromValidForm","payload","payloadValue","value","isValue","every","v","getContextValueFromFormValue","getFormValue","undefined","getValidationMessagesOverride","translator","t","msg","getDisplayStringFromFormValue","getViewModel","context","tComponent","hint","viewModel","fieldset","legend","text","classes","isChecked","Array","isArray","x","checked","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isBool"],"sources":["../../../../../src/server/plugins/engine/components/DeclarationField.ts"],"sourcesContent":["import {\n ComponentType,\n hasFormComponents,\n isFormType,\n type ComponentDef,\n type DeclarationFieldComponent,\n type Item\n} from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\n type LanguageMessages,\n type StringSchema\n} 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 { 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 type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport class DeclarationField extends FormComponent {\n declare options: DeclarationFieldComponent['options']\n\n declare declarationConfirmationLabel: string | undefined\n\n declare formSchema: ArraySchema<StringSchema[]>\n declare stateSchema: BooleanSchema\n declare content: string\n headerStartLevel: number\n\n constructor(\n def: DeclarationFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, content } = def\n\n let checkboxSchema = joi.string().valid('true')\n\n if (options.required !== false) {\n checkboxSchema = checkboxSchema.required()\n }\n\n const formSchema = joi\n .array()\n .items(checkboxSchema, joi.string().valid('unchecked').strip())\n .label(this.label)\n .single()\n .messages({\n 'any.required': messageTemplate.declarationRequired as string,\n 'any.unknown': messageTemplate.declarationRequired as string,\n 'array.includesRequiredUnknowns':\n messageTemplate.declarationRequired as string\n }) as ArraySchema<StringSchema[]>\n\n this.formSchema = formSchema\n this.stateSchema = joi.boolean().cast('string').label(this.label).required()\n\n this.options = options\n this.content = content\n // Store only the form-authored label (if provided). If absent, getViewModel\n // resolves the default via t() at render time so the correct language is used.\n this.declarationConfirmationLabel = options.declarationConfirmationLabel\n const formComponents = hasFormComponents(props.page?.pageDef)\n ? props.page.pageDef.components\n : []\n const numOfQuestionsOnPage = formComponents.filter((q) =>\n isFormType(q.type)\n ).length\n const hasGuidance = formComponents.some(\n (comp, idx) => comp.type === ComponentType.Markdown && idx === 0\n )\n this.headerStartLevel = numOfQuestionsOnPage < 2 && !hasGuidance ? 2 : 3\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return state[name] === true ? 'true' : 'false'\n }\n\n getFormDataFromState(state: FormSubmissionState): FormPayload {\n const { name } = this\n return { [name]: state[name] === true ? 'true' : 'false' }\n }\n\n getStateFromValidForm(payload: FormPayload): FormState {\n const { name } = this\n const payloadValue = payload[name]\n const value =\n this.isValue(payloadValue) &&\n payloadValue.length > 0 &&\n payloadValue.every((v) => {\n return v === 'true'\n })\n\n return { [name]: value }\n }\n\n getContextValueFromFormValue(value: FormValue | FormPayload): boolean {\n return value === 'true'\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { declarationRequired } = buildValidationMessages(translator.t)\n const msg = declarationRequired as unknown as string\n return {\n 'any.required': msg,\n 'any.unknown': msg,\n 'array.includesRequiredUnknowns': msg\n } as unknown as LanguageMessages\n }\n\n getDisplayStringFromFormValue(\n value: FormValue | FormPayload,\n translator: Translator\n ): string {\n const { t } = translator\n return value === 'true'\n ? (this.declarationConfirmationLabel ??\n t('components.declarationField.defaultLabel'))\n : t('components.declarationField.notProvided')\n }\n\n getViewModel(context: RenderContext) {\n const { payload } = context\n const { t, tComponent } = context.translator\n\n const {\n hint,\n declarationConfirmationLabel = t(\n 'components.declarationField.defaultLabel'\n )\n } = this\n const content = tComponent(this as unknown as ComponentDef, 'content')\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const payloadValue = payload[this.name]\n const isChecked =\n payloadValue === 'true' ||\n payloadValue === true ||\n (Array.isArray(payloadValue) && payloadValue.some((x) => x === 'true'))\n\n return {\n ...viewModel,\n hint: hint ? { text: hint } : undefined,\n fieldset,\n content,\n items: [\n {\n text: declarationConfirmationLabel,\n value: 'true',\n checked: isChecked\n }\n ],\n headerStartLevel: this.headerStartLevel\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return DeclarationField.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.declarationRequired }\n ],\n advancedSettingsErrors: []\n }\n }\n\n static isBool(value?: FormStateValue | FormState): value is boolean {\n return isFormValue(value) && typeof value === 'boolean'\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DeclarationField.js","names":["ComponentType","hasFormComponents","isFormType","joi","FormComponent","isFormValue","buildValidationMessages","messageTemplate","DeclarationField","headerStartLevel","constructor","def","props","options","content","checkboxSchema","string","valid","required","formSchema","array","items","strip","label","single","messages","declarationRequired","stateSchema","boolean","cast","declarationConfirmationLabel","formComponents","page","pageDef","components","numOfQuestionsOnPage","filter","q","type","length","hasGuidance","some","comp","idx","Markdown","getFormValueFromState","state","name","getFormDataFromState","getStateFromValidForm","payload","payloadValue","value","isValue","every","v","getContextValueFromFormValue","getFormValue","undefined","getValidationMessagesOverride","translator","t","msg","getDisplayStringFromFormValue","getViewModel","context","tComponent","hint","viewModel","fieldset","legend","text","classes","isChecked","Array","isArray","x","checked","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isBool"],"sources":["../../../../../src/server/plugins/engine/components/DeclarationField.ts"],"sourcesContent":["import {\n ComponentType,\n hasFormComponents,\n isFormType,\n type DeclarationFieldComponent,\n type Item\n} from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\n type LanguageMessages\n} 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 { 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 type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport class DeclarationField extends FormComponent {\n declare options: DeclarationFieldComponent['options']\n\n declare declarationConfirmationLabel: string | undefined\n\n declare formSchema: ArraySchema<string[]>\n declare stateSchema: BooleanSchema\n declare content: string\n headerStartLevel: number\n\n constructor(\n def: DeclarationFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, content } = def\n\n let checkboxSchema = joi.string().valid('true')\n\n if (options.required !== false) {\n checkboxSchema = checkboxSchema.required()\n }\n\n const formSchema = joi\n .array()\n .items(checkboxSchema, joi.string().valid('unchecked').strip())\n .label(this.label)\n .single()\n .messages({\n 'any.required': messageTemplate.declarationRequired as string,\n 'any.unknown': messageTemplate.declarationRequired as string,\n 'array.includesRequiredUnknowns':\n messageTemplate.declarationRequired as string\n })\n\n this.formSchema = formSchema\n this.stateSchema = joi.boolean().cast('string').label(this.label).required()\n\n this.options = options\n this.content = content\n // Store only the form-authored label (if provided). If absent, getViewModel\n // resolves the default via t() at render time so the correct language is used.\n this.declarationConfirmationLabel = options.declarationConfirmationLabel\n const formComponents = hasFormComponents(props.page?.pageDef)\n ? props.page.pageDef.components\n : []\n const numOfQuestionsOnPage = formComponents.filter((q) =>\n isFormType(q.type)\n ).length\n const hasGuidance = formComponents.some(\n (comp, idx) => comp.type === ComponentType.Markdown && idx === 0\n )\n this.headerStartLevel = numOfQuestionsOnPage < 2 && !hasGuidance ? 2 : 3\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return state[name] === true ? 'true' : 'false'\n }\n\n getFormDataFromState(state: FormSubmissionState): FormPayload {\n const { name } = this\n return { [name]: state[name] === true ? 'true' : 'false' }\n }\n\n getStateFromValidForm(payload: FormPayload): FormState {\n const { name } = this\n const payloadValue = payload[name]\n const value =\n this.isValue(payloadValue) &&\n payloadValue.length > 0 &&\n payloadValue.every((v) => {\n return v === 'true'\n })\n\n return { [name]: value }\n }\n\n getContextValueFromFormValue(value: FormValue | FormPayload): boolean {\n return value === 'true'\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { declarationRequired } = buildValidationMessages(translator.t)\n const msg = declarationRequired as unknown as string\n return {\n [this.name]: {\n 'any.required': msg,\n 'any.unknown': msg,\n 'array.includesRequiredUnknowns': msg\n } as unknown as LanguageMessages\n }\n }\n\n getDisplayStringFromFormValue(\n value: FormValue | FormPayload,\n translator: Translator\n ): string {\n const { t } = translator\n return value === 'true'\n ? (this.declarationConfirmationLabel ??\n t('components.declarationField.defaultLabel'))\n : t('components.declarationField.notProvided')\n }\n\n getViewModel(context: RenderContext) {\n const { payload } = context\n const { t, tComponent } = context.translator\n\n const {\n hint,\n declarationConfirmationLabel = t(\n 'components.declarationField.defaultLabel'\n )\n } = this\n const content = tComponent(this.def, 'content')\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const payloadValue = payload[this.name]\n const isChecked =\n payloadValue === 'true' ||\n payloadValue === true ||\n (Array.isArray(payloadValue) && payloadValue.some((x) => x === 'true'))\n\n return {\n ...viewModel,\n hint: hint ? { text: hint } : undefined,\n fieldset,\n content,\n items: [\n {\n text: declarationConfirmationLabel,\n value: 'true',\n checked: isChecked\n }\n ],\n headerStartLevel: this.headerStartLevel\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return DeclarationField.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.declarationRequired }\n ],\n advancedSettingsErrors: []\n }\n }\n\n static isBool(value?: FormStateValue | FormState): value is boolean {\n return isFormValue(value) && typeof value === 'boolean'\n }\n}\n"],"mappings":"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","ignoreList":[]}
|