@defra/forms-engine-plugin 5.0.0-alpha.2 → 5.0.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.public/javascripts/application.min.js +1 -1
- package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
- package/.public/javascripts/application.min.js.map +1 -1
- package/.public/javascripts/shared.min.js +1 -1
- package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
- package/.public/javascripts/shared.min.js.map +1 -1
- package/.public/stylesheets/application.min.css.map +1 -1
- package/.server/client/javascripts/file-upload.js +6 -3
- package/.server/client/javascripts/file-upload.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.d.ts +153 -5
- package/.server/client/javascripts/geospatial-map.js +157 -77
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/govuk.js +2 -1
- package/.server/client/javascripts/govuk.js.map +1 -1
- package/.server/client/javascripts/location-map.d.ts +44 -0
- package/.server/client/javascripts/location-map.js +54 -5
- package/.server/client/javascripts/location-map.js.map +1 -1
- package/.server/client/javascripts/map-constants.d.ts +3 -0
- package/.server/client/javascripts/map-constants.js +4 -0
- package/.server/client/javascripts/map-constants.js.map +1 -0
- package/.server/client/javascripts/map.d.ts +10 -0
- package/.server/client/javascripts/map.js +42 -0
- package/.server/client/javascripts/map.js.map +1 -1
- package/.server/client/javascripts/maps.d.ts +5 -0
- package/.server/client/javascripts/maps.js +6 -0
- package/.server/client/javascripts/maps.js.map +1 -0
- package/.server/client/javascripts/shared.d.ts +1 -4
- package/.server/client/javascripts/shared.js +1 -4
- package/.server/client/javascripts/shared.js.map +1 -1
- package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
- package/.server/client/javascripts/sssi-dataset.js +37 -39
- package/.server/client/javascripts/sssi-dataset.js.map +1 -1
- package/.server/client/stylesheets/maps.scss +4 -0
- package/.server/client/stylesheets/shared.scss +1 -5
- package/.server/server/constants.d.ts +2 -0
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -1
- package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
- package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +21 -0
- package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
- package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
- package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
- package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
- package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
- package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
- package/.server/server/plugins/engine/components/Details.d.ts +1 -0
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
- package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +21 -0
- package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
- package/.server/server/plugins/engine/components/FormComponent.js +5 -2
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
- package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/Html.d.ts +1 -0
- package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
- package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
- package/.server/server/plugins/engine/components/LatLongField.js +85 -48
- package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
- package/.server/server/plugins/engine/components/List.d.ts +1 -0
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js +25 -6
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
- package/.server/server/plugins/engine/components/Markdown.js +1 -1
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
- package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
- package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
- package/.server/server/plugins/engine/components/NumberField.js +16 -0
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
- package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
- package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
- package/.server/server/plugins/engine/components/PaymentField.js +17 -6
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
- package/.server/server/plugins/engine/components/YesNoField.js +17 -8
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.js +3 -3
- package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.js +56 -15
- package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
- package/.server/server/plugins/engine/components/helpers/index.js +13 -1
- package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
- package/.server/server/plugins/engine/components/types.d.ts +1 -0
- package/.server/server/plugins/engine/components/types.js.map +1 -1
- package/.server/server/plugins/engine/errors.d.ts +49 -0
- package/.server/server/plugins/engine/errors.js +75 -0
- package/.server/server/plugins/engine/errors.js.map +1 -0
- package/.server/server/plugins/engine/form-availability.d.ts +3 -2
- package/.server/server/plugins/engine/form-availability.js +3 -2
- package/.server/server/plugins/engine/form-availability.js.map +1 -1
- package/.server/server/plugins/engine/form-context.js +2 -2
- package/.server/server/plugins/engine/form-context.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +22 -2
- package/.server/server/plugins/engine/helpers.js +44 -5
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
- package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
- package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
- package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
- package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
- package/.server/server/plugins/engine/i18n/form.js +35 -0
- package/.server/server/plugins/engine/i18n/form.js.map +1 -0
- package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
- package/.server/server/plugins/engine/i18n/languages.js +19 -0
- package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
- package/.server/server/plugins/engine/i18n/translations/cy.json +192 -9
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +125 -7
- package/.server/server/plugins/engine/i18n/types.d.ts +3 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -1
- package/.server/server/plugins/engine/index.d.ts +4 -0
- package/.server/server/plugins/engine/index.js +4 -0
- package/.server/server/plugins/engine/index.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
- package/.server/server/plugins/engine/models/FormModel.js +19 -17
- 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/unavailable-view-model.d.ts +11 -2
- package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
- package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/types/schema.js +1 -0
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +5 -0
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/unavailable-response.js +5 -2
- package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
- package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
- package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
- package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/.server/server/plugins/engine/views/file-upload.html +1 -1
- package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
- package/.server/server/plugins/engine/views/unavailable.html +14 -11
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
- package/.server/server/plugins/payment/helper.d.ts +11 -1
- package/.server/server/plugins/payment/helper.js +18 -2
- package/.server/server/plugins/payment/helper.js.map +1 -1
- package/.server/server/plugins/payment/helper.test.js +2 -1
- package/.server/server/plugins/payment/helper.test.js.map +1 -1
- package/.server/server/plugins/payment/service.d.ts +2 -1
- package/.server/server/plugins/payment/service.js +5 -2
- package/.server/server/plugins/payment/service.js.map +1 -1
- package/.server/server/plugins/payment/service.test.js +7 -3
- package/.server/server/plugins/payment/service.test.js.map +1 -1
- package/.server/server/plugins/payment/types.d.ts +4 -0
- package/.server/server/plugins/payment/types.js +1 -0
- package/.server/server/plugins/payment/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
- package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
- package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
- package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
- package/.server/server/plugins/postcode-lookup/types.js +6 -1
- package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/.server/server/utils/type-utils.d.ts +1 -2
- package/.server/server/utils/type-utils.js +0 -3
- package/.server/server/utils/type-utils.js.map +1 -1
- package/.server/server/utils/utils.d.ts +6 -0
- package/.server/server/utils/utils.js +18 -1
- package/.server/server/utils/utils.js.map +1 -1
- package/.server/server/utils/utils.test.js +21 -1
- package/.server/server/utils/utils.test.js.map +1 -1
- package/package.json +20 -5
- package/src/client/javascripts/file-upload.js +11 -3
- package/src/client/javascripts/geospatial-map.js +176 -81
- package/src/client/javascripts/govuk.js +2 -0
- package/src/client/javascripts/location-map.js +60 -4
- package/src/client/javascripts/map-constants.js +3 -0
- package/src/client/javascripts/map.js +47 -0
- package/src/client/javascripts/maps.js +5 -0
- package/src/client/javascripts/shared.js +1 -4
- package/src/client/javascripts/sssi-dataset.js +39 -41
- package/src/client/stylesheets/maps.scss +4 -0
- package/src/client/stylesheets/shared.scss +1 -5
- package/src/server/constants.js +2 -0
- package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
- package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
- package/src/server/plugins/engine/components/CheckboxesField.ts +38 -5
- package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
- package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
- package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
- package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
- package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
- package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
- package/src/server/plugins/engine/components/FileUploadField.ts +44 -3
- package/src/server/plugins/engine/components/FormComponent.ts +6 -5
- package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
- package/src/server/plugins/engine/components/LatLongField.ts +128 -58
- package/src/server/plugins/engine/components/LocationFieldBase.ts +30 -7
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
- package/src/server/plugins/engine/components/Markdown.ts +2 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
- package/src/server/plugins/engine/components/NumberField.ts +21 -1
- package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
- package/src/server/plugins/engine/components/PaymentField.ts +15 -5
- package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
- package/src/server/plugins/engine/components/YesNoField.ts +17 -9
- package/src/server/plugins/engine/components/helpers/components.ts +3 -3
- package/src/server/plugins/engine/components/helpers/geospatial.ts +84 -21
- package/src/server/plugins/engine/components/helpers/index.ts +19 -0
- package/src/server/plugins/engine/components/types.ts +1 -0
- package/src/server/plugins/engine/errors.ts +78 -0
- package/src/server/plugins/engine/form-availability.ts +8 -2
- package/src/server/plugins/engine/form-context.ts +4 -2
- package/src/server/plugins/engine/helpers.ts +52 -5
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
- package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
- package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
- package/src/server/plugins/engine/i18n/form.ts +54 -0
- package/src/server/plugins/engine/i18n/languages.ts +19 -0
- package/src/server/plugins/engine/i18n/translations/cy.json +192 -9
- package/src/server/plugins/engine/i18n/translations/en-GB.json +125 -7
- package/src/server/plugins/engine/i18n/types.ts +3 -0
- package/src/server/plugins/engine/index.ts +7 -0
- package/src/server/plugins/engine/models/FormModel.ts +21 -17
- package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
- package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
- package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
- package/src/server/plugins/engine/types/schema.ts +1 -0
- package/src/server/plugins/engine/types.ts +5 -0
- package/src/server/plugins/engine/unavailable-response.ts +6 -2
- package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
- package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
- package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
- package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/src/server/plugins/engine/views/file-upload.html +1 -1
- package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
- package/src/server/plugins/engine/views/unavailable.html +14 -11
- package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/src/server/plugins/nunjucks/filters/index.js +1 -0
- package/src/server/plugins/payment/helper.js +22 -2
- package/src/server/plugins/payment/service.js +6 -2
- package/src/server/plugins/payment/types.js +1 -0
- package/src/server/plugins/postcode-lookup/models/index.js +75 -43
- package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
- package/src/server/plugins/postcode-lookup/types.js +6 -1
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/src/server/utils/type-utils.ts +1 -11
- package/src/server/utils/utils.js +19 -1
|
@@ -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","tComponent","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 ??= 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 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":"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","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, type
|
|
2
|
+
import joi, { type ArraySchema, type BooleanSchema, type StringSchema } 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';
|
|
@@ -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 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 [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":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type EastingNorthingFieldComponent } from '@defra/forms-model';
|
|
2
|
-
import { type ObjectSchema } from 'joi';
|
|
2
|
+
import { 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 EastingNorthingState, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
@@ -12,7 +12,7 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
12
12
|
collection: ComponentCollection;
|
|
13
13
|
constructor(def: EastingNorthingFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
14
14
|
getFormValueFromState(state: FormSubmissionState): EastingNorthingState | undefined;
|
|
15
|
-
getDisplayStringFromFormValue(value: EastingNorthingState | undefined,
|
|
15
|
+
getDisplayStringFromFormValue(value: EastingNorthingState | undefined, translator: Translator): string;
|
|
16
16
|
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
17
17
|
getContextValueFromFormValue(value: EastingNorthingState | undefined): string | null;
|
|
18
18
|
getContextValueFromState(state: FormSubmissionState): string | null;
|
|
@@ -23,6 +23,8 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
23
23
|
};
|
|
24
24
|
items: import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
25
25
|
mapLayers: string;
|
|
26
|
+
country: import("@defra/forms-model").GeospatialFieldOptionsCountry | undefined;
|
|
27
|
+
lang: string;
|
|
26
28
|
label: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
27
29
|
type?: string;
|
|
28
30
|
id: string;
|
|
@@ -62,15 +64,20 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
62
64
|
upload?: {
|
|
63
65
|
count: number;
|
|
64
66
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
67
|
+
uploadingLabel?: string;
|
|
65
68
|
};
|
|
66
69
|
} | {
|
|
70
|
+
instructionSummary: string;
|
|
67
71
|
instructionText: string;
|
|
72
|
+
t: (key: string, opts?: Record<string, unknown>) => string;
|
|
68
73
|
fieldset: {
|
|
69
74
|
attributes?: string | Record<string, string>;
|
|
70
75
|
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
71
76
|
};
|
|
72
77
|
items: import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
73
78
|
mapLayers: string;
|
|
79
|
+
country: import("@defra/forms-model").GeospatialFieldOptionsCountry | undefined;
|
|
80
|
+
lang: string;
|
|
74
81
|
label: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
75
82
|
type?: string;
|
|
76
83
|
id: string;
|
|
@@ -110,10 +117,15 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
110
117
|
upload?: {
|
|
111
118
|
count: number;
|
|
112
119
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
120
|
+
uploadingLabel?: string;
|
|
113
121
|
};
|
|
114
122
|
};
|
|
123
|
+
getErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
115
124
|
getViewErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
116
125
|
isState(value?: FormStateValue | FormState): value is EastingNorthingState;
|
|
126
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
127
|
+
[x: string]: LanguageMessages;
|
|
128
|
+
};
|
|
117
129
|
/**
|
|
118
130
|
* For error preview page that shows all possible errors on a component
|
|
119
131
|
*/
|
|
@@ -123,4 +135,23 @@ export declare class EastingNorthingField extends FormComponent {
|
|
|
123
135
|
*/
|
|
124
136
|
static getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
125
137
|
static isEastingNorthing(value?: FormStateValue | FormState): value is EastingNorthingState;
|
|
138
|
+
static buildErrorMessages(label: string, eastingMin: number, eastingMax: number, northingMin: number, northingMax: number, language: string): {
|
|
139
|
+
eastingValidationMessages: LanguageMessages;
|
|
140
|
+
northingValidationMessages: LanguageMessages;
|
|
141
|
+
};
|
|
142
|
+
static getMinMax(schema: {
|
|
143
|
+
easting?: {
|
|
144
|
+
min?: number;
|
|
145
|
+
max?: number;
|
|
146
|
+
};
|
|
147
|
+
northing?: {
|
|
148
|
+
min?: number;
|
|
149
|
+
max?: number;
|
|
150
|
+
};
|
|
151
|
+
} | undefined): {
|
|
152
|
+
eastingMin: number;
|
|
153
|
+
eastingMax: number;
|
|
154
|
+
northingMin: number;
|
|
155
|
+
northingMax: number;
|
|
156
|
+
};
|
|
126
157
|
}
|