@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
|
@@ -5,3 +5,5 @@ export const EXTERNAL_STATE_PAYLOAD: "EXTERNAL_STATE_PAYLOAD";
|
|
|
5
5
|
export const EXTERNAL_STATE_APPENDAGE: "EXTERNAL_STATE_APPENDAGE";
|
|
6
6
|
export const COMPONENT_STATE_ERROR: "COMPONENT_STATE_ERROR";
|
|
7
7
|
export const PAYMENT_EXPIRED_NOTIFICATION: "PAYMENT_EXPIRED_NOTIFICATION";
|
|
8
|
+
export const EN_GB: "en-GB";
|
|
9
|
+
export const CY: "cy";
|
|
@@ -5,4 +5,6 @@ export const EXTERNAL_STATE_PAYLOAD = 'EXTERNAL_STATE_PAYLOAD';
|
|
|
5
5
|
export const EXTERNAL_STATE_APPENDAGE = 'EXTERNAL_STATE_APPENDAGE';
|
|
6
6
|
export const COMPONENT_STATE_ERROR = 'COMPONENT_STATE_ERROR';
|
|
7
7
|
export const PAYMENT_EXPIRED_NOTIFICATION = 'PAYMENT_EXPIRED_NOTIFICATION';
|
|
8
|
+
export const EN_GB = 'en-GB'; // English language
|
|
9
|
+
export const CY = 'cy'; // Welsh language
|
|
8
10
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["FORM_VERSION_METADATA_KEY","PREVIEW_PATH_PREFIX","FORM_PREFIX","EXTERNAL_STATE_PAYLOAD","EXTERNAL_STATE_APPENDAGE","COMPONENT_STATE_ERROR","PAYMENT_EXPIRED_NOTIFICATION"],"sources":["../../src/server/constants.js"],"sourcesContent":["export const FORM_VERSION_METADATA_KEY = '$$__formVersion'\nexport const PREVIEW_PATH_PREFIX = '/preview'\nexport const FORM_PREFIX = ''\nexport const EXTERNAL_STATE_PAYLOAD = 'EXTERNAL_STATE_PAYLOAD'\nexport const EXTERNAL_STATE_APPENDAGE = 'EXTERNAL_STATE_APPENDAGE'\nexport const COMPONENT_STATE_ERROR = 'COMPONENT_STATE_ERROR'\nexport const PAYMENT_EXPIRED_NOTIFICATION = 'PAYMENT_EXPIRED_NOTIFICATION'\n"],"mappings":"AAAA,OAAO,MAAMA,yBAAyB,GAAG,iBAAiB;AAC1D,OAAO,MAAMC,mBAAmB,GAAG,UAAU;AAC7C,OAAO,MAAMC,WAAW,GAAG,EAAE;AAC7B,OAAO,MAAMC,sBAAsB,GAAG,wBAAwB;AAC9D,OAAO,MAAMC,wBAAwB,GAAG,0BAA0B;AAClE,OAAO,MAAMC,qBAAqB,GAAG,uBAAuB;AAC5D,OAAO,MAAMC,4BAA4B,GAAG,8BAA8B","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"constants.js","names":["FORM_VERSION_METADATA_KEY","PREVIEW_PATH_PREFIX","FORM_PREFIX","EXTERNAL_STATE_PAYLOAD","EXTERNAL_STATE_APPENDAGE","COMPONENT_STATE_ERROR","PAYMENT_EXPIRED_NOTIFICATION","EN_GB","CY"],"sources":["../../src/server/constants.js"],"sourcesContent":["export const FORM_VERSION_METADATA_KEY = '$$__formVersion'\nexport const PREVIEW_PATH_PREFIX = '/preview'\nexport const FORM_PREFIX = ''\nexport const EXTERNAL_STATE_PAYLOAD = 'EXTERNAL_STATE_PAYLOAD'\nexport const EXTERNAL_STATE_APPENDAGE = 'EXTERNAL_STATE_APPENDAGE'\nexport const COMPONENT_STATE_ERROR = 'COMPONENT_STATE_ERROR'\nexport const PAYMENT_EXPIRED_NOTIFICATION = 'PAYMENT_EXPIRED_NOTIFICATION'\nexport const EN_GB = 'en-GB' // English language\nexport const CY = 'cy' // Welsh language\n"],"mappings":"AAAA,OAAO,MAAMA,yBAAyB,GAAG,iBAAiB;AAC1D,OAAO,MAAMC,mBAAmB,GAAG,UAAU;AAC7C,OAAO,MAAMC,WAAW,GAAG,EAAE;AAC7B,OAAO,MAAMC,sBAAsB,GAAG,wBAAwB;AAC9D,OAAO,MAAMC,wBAAwB,GAAG,0BAA0B;AAClE,OAAO,MAAMC,qBAAqB,GAAG,uBAAuB;AAC5D,OAAO,MAAMC,4BAA4B,GAAG,8BAA8B;AAC1E,OAAO,MAAMC,KAAK,GAAG,OAAO,EAAC;AAC7B,OAAO,MAAMC,EAAE,GAAG,IAAI,EAAC","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type FormDefinition } from '@defra/forms-model';
|
|
2
|
+
/**
|
|
3
|
+
* A minimal, schema-valid V2 definition: one YesNo question page and a
|
|
4
|
+
* summary page. Each call returns a fresh object, so tests can mutate their
|
|
5
|
+
* copy freely without affecting each other.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildDefinition(): FormDefinition;
|
|
8
|
+
/**
|
|
9
|
+
* A definition that passes schema validation but cannot be used by the
|
|
10
|
+
* engine: a ListItemRef condition points at the YesNoField (boolean), so the
|
|
11
|
+
* condition expression builder produces an unparseable expression. Distilled
|
|
12
|
+
* from a real production incident.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildBrokenConditionDefinition(): FormDefinition;
|
|
15
|
+
/**
|
|
16
|
+
* A schema-valid definition whose first page names a controller that is
|
|
17
|
+
* neither built in nor registered by the host application.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildUnknownControllerDefinition(): FormDefinition;
|
|
20
|
+
/**
|
|
21
|
+
* Schema-valid (component types are free strings in the schema), but the
|
|
22
|
+
* question uses a type the engine has no component class for.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildUnknownComponentDefinition(): FormDefinition;
|
|
25
|
+
/**
|
|
26
|
+
* A definition that fails schema validation: the question page appears
|
|
27
|
+
* twice, violating the pages uniqueness rule.
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildSchemaInvalidDefinition(): FormDefinition;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ComponentType, ConditionType, ControllerType, Engine, OperatorName, SchemaVersion } from '@defra/forms-model';
|
|
2
|
+
const YES_NO_COMPONENT_ID = 'a7c0242f-2a31-45b2-8c71-ff2ac7f53288';
|
|
3
|
+
const USER_TYPE_LIST_ID = '4fa26e9c-07cf-47cd-a9dd-5cec0dd3f544';
|
|
4
|
+
const EXISTING_USER_ITEM_ID = '55fe0067-d011-4d33-886c-e1aa266637c3';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A minimal, schema-valid V2 definition: one YesNo question page and a
|
|
8
|
+
* summary page. Each call returns a fresh object, so tests can mutate their
|
|
9
|
+
* copy freely without affecting each other.
|
|
10
|
+
*/
|
|
11
|
+
export function buildDefinition() {
|
|
12
|
+
return {
|
|
13
|
+
name: 'Stub definition',
|
|
14
|
+
engine: Engine.V2,
|
|
15
|
+
schema: SchemaVersion.V2,
|
|
16
|
+
startPage: '/summary',
|
|
17
|
+
pages: [{
|
|
18
|
+
id: '449c053b-9201-4312-9a75-187afc6ba48b',
|
|
19
|
+
path: '/licence',
|
|
20
|
+
title: 'Licence',
|
|
21
|
+
components: [{
|
|
22
|
+
id: YES_NO_COMPONENT_ID,
|
|
23
|
+
name: 'xVrYaJ',
|
|
24
|
+
type: ComponentType.YesNoField,
|
|
25
|
+
title: 'Do you have a licence?',
|
|
26
|
+
shortDescription: 'Licence',
|
|
27
|
+
options: {
|
|
28
|
+
required: true
|
|
29
|
+
}
|
|
30
|
+
}],
|
|
31
|
+
next: []
|
|
32
|
+
}, {
|
|
33
|
+
id: '449c053b-9201-4312-9a75-187afc6ba48c',
|
|
34
|
+
path: '/summary',
|
|
35
|
+
title: 'Summary',
|
|
36
|
+
controller: ControllerType.Summary,
|
|
37
|
+
components: []
|
|
38
|
+
}],
|
|
39
|
+
lists: [],
|
|
40
|
+
sections: [],
|
|
41
|
+
conditions: []
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A definition that passes schema validation but cannot be used by the
|
|
47
|
+
* engine: a ListItemRef condition points at the YesNoField (boolean), so the
|
|
48
|
+
* condition expression builder produces an unparseable expression. Distilled
|
|
49
|
+
* from a real production incident.
|
|
50
|
+
*/
|
|
51
|
+
export function buildBrokenConditionDefinition() {
|
|
52
|
+
const definition = buildDefinition();
|
|
53
|
+
definition.name = 'Broken condition fixture';
|
|
54
|
+
const questionPage = definition.pages[0]
|
|
55
|
+
// A YesNoField cannot legitimately carry a custom list — that is the
|
|
56
|
+
// corruption this fixture models — so the TS component types (rightly)
|
|
57
|
+
// have no `list` property here and a cast is required.
|
|
58
|
+
;
|
|
59
|
+
questionPage.components[0].list = USER_TYPE_LIST_ID;
|
|
60
|
+
definition.lists = [{
|
|
61
|
+
id: USER_TYPE_LIST_ID,
|
|
62
|
+
name: 'XtfRYR',
|
|
63
|
+
title: 'User type list',
|
|
64
|
+
type: 'string',
|
|
65
|
+
items: [{
|
|
66
|
+
id: EXISTING_USER_ITEM_ID,
|
|
67
|
+
text: 'existing user',
|
|
68
|
+
value: 'existing user'
|
|
69
|
+
}, {
|
|
70
|
+
id: '2277c7e5-7fef-46c6-993b-d294116d6d6b',
|
|
71
|
+
text: 'new user',
|
|
72
|
+
value: 'new user'
|
|
73
|
+
}]
|
|
74
|
+
}];
|
|
75
|
+
definition.conditions = [{
|
|
76
|
+
id: '3f9d3a35-6dee-4706-806c-3f776129f631',
|
|
77
|
+
displayName: 'Existing user',
|
|
78
|
+
items: [{
|
|
79
|
+
id: '7d7f58ee-c860-4d24-8a13-de5cb9af53d8',
|
|
80
|
+
componentId: YES_NO_COMPONENT_ID,
|
|
81
|
+
operator: OperatorName.Is,
|
|
82
|
+
type: ConditionType.ListItemRef,
|
|
83
|
+
value: {
|
|
84
|
+
listId: USER_TYPE_LIST_ID,
|
|
85
|
+
itemId: [EXISTING_USER_ITEM_ID]
|
|
86
|
+
}
|
|
87
|
+
}]
|
|
88
|
+
}];
|
|
89
|
+
return definition;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* A schema-valid definition whose first page names a controller that is
|
|
94
|
+
* neither built in nor registered by the host application.
|
|
95
|
+
*/
|
|
96
|
+
export function buildUnknownControllerDefinition() {
|
|
97
|
+
const definition = buildDefinition();
|
|
98
|
+
definition.name = 'Unknown controller fixture';
|
|
99
|
+
definition.pages[0].controller = 'NoSuchPageController';
|
|
100
|
+
return definition;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Schema-valid (component types are free strings in the schema), but the
|
|
105
|
+
* question uses a type the engine has no component class for.
|
|
106
|
+
*/
|
|
107
|
+
export function buildUnknownComponentDefinition() {
|
|
108
|
+
const definition = buildDefinition();
|
|
109
|
+
definition.name = 'Unknown component fixture';
|
|
110
|
+
const questionPage = definition.pages[0];
|
|
111
|
+
questionPage.components[0].type = 'MyUnknownField';
|
|
112
|
+
return definition;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* A definition that fails schema validation: the question page appears
|
|
117
|
+
* twice, violating the pages uniqueness rule.
|
|
118
|
+
*/
|
|
119
|
+
export function buildSchemaInvalidDefinition() {
|
|
120
|
+
const definition = buildDefinition();
|
|
121
|
+
definition.name = 'Schema invalid fixture';
|
|
122
|
+
definition.pages.push(buildDefinition().pages[0]);
|
|
123
|
+
return definition;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.js","names":["ComponentType","ConditionType","ControllerType","Engine","OperatorName","SchemaVersion","YES_NO_COMPONENT_ID","USER_TYPE_LIST_ID","EXISTING_USER_ITEM_ID","buildDefinition","name","engine","V2","schema","startPage","pages","id","path","title","components","type","YesNoField","shortDescription","options","required","next","controller","Summary","lists","sections","conditions","buildBrokenConditionDefinition","definition","questionPage","list","items","text","value","displayName","componentId","operator","Is","ListItemRef","listId","itemId","buildUnknownControllerDefinition","buildUnknownComponentDefinition","buildSchemaInvalidDefinition","push"],"sources":["../../../../../src/server/plugins/engine/__stubs__/definitions.ts"],"sourcesContent":["import {\n ComponentType,\n ConditionType,\n ControllerType,\n Engine,\n OperatorName,\n SchemaVersion,\n type FormDefinition,\n type PageQuestion\n} from '@defra/forms-model'\n\nconst YES_NO_COMPONENT_ID = 'a7c0242f-2a31-45b2-8c71-ff2ac7f53288'\nconst USER_TYPE_LIST_ID = '4fa26e9c-07cf-47cd-a9dd-5cec0dd3f544'\nconst EXISTING_USER_ITEM_ID = '55fe0067-d011-4d33-886c-e1aa266637c3'\n\n/**\n * A minimal, schema-valid V2 definition: one YesNo question page and a\n * summary page. Each call returns a fresh object, so tests can mutate their\n * copy freely without affecting each other.\n */\nexport function buildDefinition(): FormDefinition {\n return {\n name: 'Stub definition',\n engine: Engine.V2,\n schema: SchemaVersion.V2,\n startPage: '/summary',\n pages: [\n {\n id: '449c053b-9201-4312-9a75-187afc6ba48b',\n path: '/licence',\n title: 'Licence',\n components: [\n {\n id: YES_NO_COMPONENT_ID,\n name: 'xVrYaJ',\n type: ComponentType.YesNoField,\n title: 'Do you have a licence?',\n shortDescription: 'Licence',\n options: { required: true }\n }\n ],\n next: []\n },\n {\n id: '449c053b-9201-4312-9a75-187afc6ba48c',\n path: '/summary',\n title: 'Summary',\n controller: ControllerType.Summary,\n components: []\n }\n ],\n lists: [],\n sections: [],\n conditions: []\n }\n}\n\n/**\n * A definition that passes schema validation but cannot be used by the\n * engine: a ListItemRef condition points at the YesNoField (boolean), so the\n * condition expression builder produces an unparseable expression. Distilled\n * from a real production incident.\n */\nexport function buildBrokenConditionDefinition(): FormDefinition {\n const definition = buildDefinition()\n\n definition.name = 'Broken condition fixture'\n\n const questionPage = definition.pages[0] as PageQuestion\n // A YesNoField cannot legitimately carry a custom list — that is the\n // corruption this fixture models — so the TS component types (rightly)\n // have no `list` property here and a cast is required.\n ;(questionPage.components[0] as { list?: string }).list = USER_TYPE_LIST_ID\n definition.lists = [\n {\n id: USER_TYPE_LIST_ID,\n name: 'XtfRYR',\n title: 'User type list',\n type: 'string',\n items: [\n {\n id: EXISTING_USER_ITEM_ID,\n text: 'existing user',\n value: 'existing user'\n },\n {\n id: '2277c7e5-7fef-46c6-993b-d294116d6d6b',\n text: 'new user',\n value: 'new user'\n }\n ]\n }\n ]\n definition.conditions = [\n {\n id: '3f9d3a35-6dee-4706-806c-3f776129f631',\n displayName: 'Existing user',\n items: [\n {\n id: '7d7f58ee-c860-4d24-8a13-de5cb9af53d8',\n componentId: YES_NO_COMPONENT_ID,\n operator: OperatorName.Is,\n type: ConditionType.ListItemRef,\n value: {\n listId: USER_TYPE_LIST_ID,\n itemId: [EXISTING_USER_ITEM_ID]\n }\n }\n ]\n }\n ]\n\n return definition\n}\n\n/**\n * A schema-valid definition whose first page names a controller that is\n * neither built in nor registered by the host application.\n */\nexport function buildUnknownControllerDefinition(): FormDefinition {\n const definition = buildDefinition()\n\n definition.name = 'Unknown controller fixture'\n definition.pages[0].controller =\n 'NoSuchPageController' as unknown as ControllerType\n\n return definition\n}\n\n/**\n * Schema-valid (component types are free strings in the schema), but the\n * question uses a type the engine has no component class for.\n */\nexport function buildUnknownComponentDefinition(): FormDefinition {\n const definition = buildDefinition()\n\n definition.name = 'Unknown component fixture'\n const questionPage = definition.pages[0] as PageQuestion\n questionPage.components[0].type = 'MyUnknownField' as unknown as ComponentType\n\n return definition\n}\n\n/**\n * A definition that fails schema validation: the question page appears\n * twice, violating the pages uniqueness rule.\n */\nexport function buildSchemaInvalidDefinition(): FormDefinition {\n const definition = buildDefinition()\n\n definition.name = 'Schema invalid fixture'\n definition.pages.push(buildDefinition().pages[0])\n\n return definition\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type AutocompleteFieldComponent } from '@defra/forms-model';
|
|
2
|
+
import { type LanguageMessages } from 'joi';
|
|
2
3
|
import { SelectField } from '../../../../server/plugins/engine/components/SelectField.js';
|
|
3
4
|
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type Translator } from '../../../../server/plugins/engine/types/index.js';
|
|
4
6
|
export declare class AutocompleteField extends SelectField {
|
|
5
7
|
options: AutocompleteFieldComponent['options'];
|
|
6
8
|
constructor(def: AutocompleteFieldComponent, props: ConstructorParameters<typeof SelectField>[1]);
|
|
@@ -15,7 +17,7 @@ export declare class AutocompleteField extends SelectField {
|
|
|
15
17
|
};
|
|
16
18
|
id: string;
|
|
17
19
|
name: string;
|
|
18
|
-
value: import("
|
|
20
|
+
value: import("../../../../server/plugins/engine/types/index.js").FormValue;
|
|
19
21
|
type?: string;
|
|
20
22
|
hint?: {
|
|
21
23
|
id?: string;
|
|
@@ -25,7 +27,7 @@ export declare class AutocompleteField extends SelectField {
|
|
|
25
27
|
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
26
28
|
classes?: string;
|
|
27
29
|
condition?: string;
|
|
28
|
-
errors?: import("
|
|
30
|
+
errors?: import("../../../../server/plugins/engine/types/index.js").FormSubmissionError[];
|
|
29
31
|
errorMessage?: {
|
|
30
32
|
text: string;
|
|
31
33
|
};
|
|
@@ -50,7 +52,11 @@ export declare class AutocompleteField extends SelectField {
|
|
|
50
52
|
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
51
53
|
upload?: {
|
|
52
54
|
count: number;
|
|
53
|
-
summaryList: import("
|
|
55
|
+
summaryList: import("../../../../server/plugins/engine/types/index.js").SummaryList;
|
|
56
|
+
uploadingLabel?: string;
|
|
54
57
|
};
|
|
55
58
|
};
|
|
59
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
60
|
+
[x: string]: LanguageMessages;
|
|
61
|
+
};
|
|
56
62
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SelectField } from "./SelectField.js";
|
|
2
|
+
import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
|
|
2
3
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
3
4
|
export class AutocompleteField extends SelectField {
|
|
4
5
|
constructor(def, props) {
|
|
@@ -33,5 +34,16 @@ export class AutocompleteField extends SelectField {
|
|
|
33
34
|
formGroup
|
|
34
35
|
};
|
|
35
36
|
}
|
|
37
|
+
getValidationMessagesOverride(translator) {
|
|
38
|
+
const {
|
|
39
|
+
t
|
|
40
|
+
} = translator;
|
|
41
|
+
return {
|
|
42
|
+
[this.name]: {
|
|
43
|
+
'any.required': buildValidationMessages(t).objectRequired,
|
|
44
|
+
'any.only': buildValidationMessages(t).objectRequired
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
36
48
|
}
|
|
37
49
|
//# sourceMappingURL=AutocompleteField.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutocompleteField.js","names":["SelectField","messageTemplate","AutocompleteField","constructor","def","props","options","formSchema","required","messages","customValidationMessages","getViewModel","context","viewModel","formGroup","attributes"],"sources":["../../../../../src/server/plugins/engine/components/AutocompleteField.ts"],"sourcesContent":["import { type AutocompleteFieldComponent } from '@defra/forms-model'\n\nimport { SelectField } from '~/src/server/plugins/engine/components/SelectField.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\n\nexport class AutocompleteField extends SelectField {\n declare options: AutocompleteFieldComponent['options']\n\n constructor(\n def: AutocompleteFieldComponent,\n props: ConstructorParameters<typeof SelectField>[1]\n ) {\n super(def, props)\n\n const { options } = def\n let { formSchema } = this\n\n if (options.required !== false) {\n const messages = options.customValidationMessages\n\n formSchema = formSchema.messages({\n 'any.only':\n messages?.['any.only'] ?? (messageTemplate.required as string),\n 'any.required':\n messages?.['any.required'] ?? (messageTemplate.required as string)\n })\n }\n\n this.options = options\n this.formSchema = formSchema\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n let { formGroup } = viewModel\n\n formGroup ??= {}\n formGroup.attributes = {\n 'data-module': 'govuk-accessible-autocomplete'\n }\n\n return {\n ...viewModel,\n formGroup\n }\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"AutocompleteField.js","names":["SelectField","buildValidationMessages","messageTemplate","AutocompleteField","constructor","def","props","options","formSchema","required","messages","customValidationMessages","getViewModel","context","viewModel","formGroup","attributes","getValidationMessagesOverride","translator","t","name","objectRequired"],"sources":["../../../../../src/server/plugins/engine/components/AutocompleteField.ts"],"sourcesContent":["import { type AutocompleteFieldComponent } from '@defra/forms-model'\nimport { type LanguageMessages } from 'joi'\n\nimport { SelectField } from '~/src/server/plugins/engine/components/SelectField.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type Translator } from '~/src/server/plugins/engine/types/index.js'\n\nexport class AutocompleteField extends SelectField {\n declare options: AutocompleteFieldComponent['options']\n\n constructor(\n def: AutocompleteFieldComponent,\n props: ConstructorParameters<typeof SelectField>[1]\n ) {\n super(def, props)\n\n const { options } = def\n let { formSchema } = this\n\n if (options.required !== false) {\n const messages = options.customValidationMessages\n\n formSchema = formSchema.messages({\n 'any.only':\n messages?.['any.only'] ?? (messageTemplate.required as string),\n 'any.required':\n messages?.['any.required'] ?? (messageTemplate.required as string)\n })\n }\n\n this.options = options\n this.formSchema = formSchema\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n let { formGroup } = viewModel\n\n formGroup ??= {}\n formGroup.attributes = {\n 'data-module': 'govuk-accessible-autocomplete'\n }\n\n return {\n ...viewModel,\n formGroup\n }\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n return {\n [this.name]: {\n 'any.required': buildValidationMessages(t).objectRequired,\n 'any.only': buildValidationMessages(t).objectRequired\n } as LanguageMessages\n }\n }\n}\n"],"mappings":"AAGA,SAASA,WAAW;AAEpB,SAASC,uBAAuB;AAChC,SAASC,eAAe;AAGxB,OAAO,MAAMC,iBAAiB,SAASH,WAAW,CAAC;EAGjDI,WAAWA,CACTC,GAA+B,EAC/BC,KAAmD,EACnD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC;IAAQ,CAAC,GAAGF,GAAG;IACvB,IAAI;MAAEG;IAAW,CAAC,GAAG,IAAI;IAEzB,IAAID,OAAO,CAACE,QAAQ,KAAK,KAAK,EAAE;MAC9B,MAAMC,QAAQ,GAAGH,OAAO,CAACI,wBAAwB;MAEjDH,UAAU,GAAGA,UAAU,CAACE,QAAQ,CAAC;QAC/B,UAAU,EACRA,QAAQ,GAAG,UAAU,CAAC,IAAKR,eAAe,CAACO,QAAmB;QAChE,cAAc,EACZC,QAAQ,GAAG,cAAc,CAAC,IAAKR,eAAe,CAACO;MACnD,CAAC,CAAC;IACJ;IAEA,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,UAAU,GAAGA,UAAU;EAC9B;EAEAI,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAMC,SAAS,GAAG,KAAK,CAACF,YAAY,CAACC,OAAO,CAAC;IAC7C,IAAI;MAAEE;IAAU,CAAC,GAAGD,SAAS;IAE7BC,SAAS,KAAK,CAAC,CAAC;IAChBA,SAAS,CAACC,UAAU,GAAG;MACrB,aAAa,EAAE;IACjB,CAAC;IAED,OAAO;MACL,GAAGF,SAAS;MACZC;IACF,CAAC;EACH;EAEAE,6BAA6BA,CAACC,UAAsB,EAAE;IACpD,MAAM;MAAEC;IAAE,CAAC,GAAGD,UAAU;IACxB,OAAO;MACL,CAAC,IAAI,CAACE,IAAI,GAAG;QACX,cAAc,EAAEnB,uBAAuB,CAACkB,CAAC,CAAC,CAACE,cAAc;QACzD,UAAU,EAAEpB,uBAAuB,CAACkB,CAAC,CAAC,CAACE;MACzC;IACF,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -8,6 +8,11 @@ export declare class CheckboxesField extends SelectionControlField {
|
|
|
8
8
|
schema: CheckboxesFieldComponent['schema'];
|
|
9
9
|
formSchema: ArraySchema<string> | ArraySchema<number>;
|
|
10
10
|
stateSchema: ArraySchema<string> | ArraySchema<number>;
|
|
11
|
+
limits: {
|
|
12
|
+
min?: number;
|
|
13
|
+
max?: number;
|
|
14
|
+
length?: number;
|
|
15
|
+
};
|
|
11
16
|
constructor(def: CheckboxesFieldComponent, props: ConstructorParameters<typeof SelectionControlField>[1]);
|
|
12
17
|
getFormValueFromState(state: FormSubmissionState): (string | number | boolean)[] | undefined;
|
|
13
18
|
getFormValue(value?: FormStateValue | FormState): (string | number | boolean)[] | undefined;
|
|
@@ -15,6 +20,13 @@ export declare class CheckboxesField extends SelectionControlField {
|
|
|
15
20
|
getContextValueFromFormValue(values: (string | number | boolean)[] | undefined): (string | number | boolean)[];
|
|
16
21
|
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
17
22
|
getContextValueFromState(state: FormSubmissionState): (string | number | boolean)[];
|
|
23
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
24
|
+
[x: string]: {
|
|
25
|
+
'array.min': string;
|
|
26
|
+
'array.max': string;
|
|
27
|
+
'array.length': string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
18
30
|
/**
|
|
19
31
|
* For error preview page that shows all possible errors on a component
|
|
20
32
|
*/
|
|
@@ -24,4 +36,13 @@ export declare class CheckboxesField extends SelectionControlField {
|
|
|
24
36
|
*/
|
|
25
37
|
static getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
26
38
|
isValue(value?: FormStateValue | FormState): value is Item['value'][];
|
|
39
|
+
static buildErrorMessages(language: string, limits?: {
|
|
40
|
+
min?: number;
|
|
41
|
+
max?: number;
|
|
42
|
+
length?: number;
|
|
43
|
+
}): {
|
|
44
|
+
'array.min': string;
|
|
45
|
+
'array.max': string;
|
|
46
|
+
'array.length': string;
|
|
47
|
+
};
|
|
27
48
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import joi from 'joi';
|
|
2
|
+
import { EN_GB } from "../../../constants.js";
|
|
2
3
|
import { isFormValue } from "./FormComponent.js";
|
|
3
4
|
import { SelectionControlField } from "./SelectionControlField.js";
|
|
5
|
+
import { t as tPlugin } from "../i18n/index.js";
|
|
4
6
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
5
7
|
export class CheckboxesField extends SelectionControlField {
|
|
6
8
|
constructor(def, props) {
|
|
@@ -14,24 +16,26 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
14
16
|
} = def;
|
|
15
17
|
let formSchema = type === 'string' ? joi.array() : joi.array();
|
|
16
18
|
const itemsSchema = joi[type]().valid(...this.values).label(this.label);
|
|
17
|
-
formSchema = formSchema.items(itemsSchema).single().label(this.label).required()
|
|
18
|
-
|
|
19
|
-
'array.max': messageTemplate.arrayMax,
|
|
20
|
-
'array.length': messageTemplate.arrayLength
|
|
21
|
-
});
|
|
19
|
+
formSchema = formSchema.items(itemsSchema).single().label(this.label).required();
|
|
20
|
+
const limits = {};
|
|
22
21
|
if (options.required === false) {
|
|
23
22
|
formSchema = formSchema.optional();
|
|
24
23
|
}
|
|
25
24
|
if (typeof schema?.length === 'number') {
|
|
26
25
|
formSchema = formSchema.length(schema.length);
|
|
26
|
+
limits.length = schema.length;
|
|
27
27
|
} else {
|
|
28
28
|
if (typeof schema?.min === 'number') {
|
|
29
29
|
formSchema = formSchema.min(schema.min);
|
|
30
|
+
limits.min = schema.min;
|
|
30
31
|
}
|
|
31
32
|
if (typeof schema?.max === 'number') {
|
|
32
33
|
formSchema = formSchema.max(schema.max);
|
|
34
|
+
limits.max = schema.max;
|
|
33
35
|
}
|
|
34
36
|
}
|
|
37
|
+
this.limits = limits;
|
|
38
|
+
formSchema = formSchema.messages(CheckboxesField.buildErrorMessages(EN_GB, limits));
|
|
35
39
|
this.formSchema = formSchema.default([]);
|
|
36
40
|
this.stateSchema = formSchema.default(null).allow(null);
|
|
37
41
|
this.options = options;
|
|
@@ -83,6 +87,14 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
83
87
|
const values = this.getFormValueFromState(state);
|
|
84
88
|
return this.getContextValueFromFormValue(values);
|
|
85
89
|
}
|
|
90
|
+
getValidationMessagesOverride(translator) {
|
|
91
|
+
const {
|
|
92
|
+
language
|
|
93
|
+
} = translator;
|
|
94
|
+
return {
|
|
95
|
+
[this.name]: CheckboxesField.buildErrorMessages(language, this.limits)
|
|
96
|
+
};
|
|
97
|
+
}
|
|
86
98
|
|
|
87
99
|
/**
|
|
88
100
|
* For error preview page that shows all possible errors on a component
|
|
@@ -121,5 +133,18 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
121
133
|
}
|
|
122
134
|
return value.every(isFormValue);
|
|
123
135
|
}
|
|
136
|
+
static buildErrorMessages(language, limits = {}) {
|
|
137
|
+
return {
|
|
138
|
+
'array.min': tPlugin('validation.arrayMin', language, {
|
|
139
|
+
count: limits.min ?? 1
|
|
140
|
+
}),
|
|
141
|
+
'array.max': tPlugin('validation.arrayMax', language, {
|
|
142
|
+
count: limits.max ?? 1
|
|
143
|
+
}),
|
|
144
|
+
'array.length': tPlugin('validation.arrayLength', language, {
|
|
145
|
+
count: limits.length ?? 1
|
|
146
|
+
})
|
|
147
|
+
};
|
|
148
|
+
}
|
|
124
149
|
}
|
|
125
150
|
//# sourceMappingURL=CheckboxesField.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckboxesField.js","names":["joi","isFormValue","SelectionControlField","messageTemplate","CheckboxesField","constructor","def","props","listType","type","options","schema","formSchema","array","itemsSchema","valid","values","label","items","single","required","messages","arrayMin","arrayMax","arrayLength","optional","length","min","max","default","stateSchema","allow","getFormValueFromState","state","name","getFormValue","selected","filter","item","includes","value","map","undefined","isValue","getDisplayStringFromFormValue","translator","tListItem","text","join","getContextValueFromFormValue","getDisplayStringFromState","getContextValueFromState","getAllPossibleErrors","parentErrors","advancedSettingsErrors","template","Array","isArray","every"],"sources":["../../../../../src/server/plugins/engine/components/CheckboxesField.ts"],"sourcesContent":["import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'\nimport joi, { type ArraySchema } from 'joi'\n\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport { type QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class CheckboxesField extends SelectionControlField {\n declare options: CheckboxesFieldComponent['options']\n declare schema: CheckboxesFieldComponent['schema']\n declare formSchema: ArraySchema<string> | ArraySchema<number>\n declare stateSchema: ArraySchema<string> | ArraySchema<number>\n\n constructor(\n def: CheckboxesFieldComponent,\n props: ConstructorParameters<typeof SelectionControlField>[1]\n ) {\n super(def, props)\n\n const { listType: type } = this\n const { options, schema } = def\n\n let formSchema =\n type === 'string' ? joi.array<string>() : joi.array<number>()\n\n const itemsSchema = joi[type]()\n .valid(...this.values)\n .label(this.label)\n\n formSchema = formSchema\n .items(itemsSchema)\n .single()\n .label(this.label)\n .required()\n .messages({\n 'array.min': messageTemplate.arrayMin,\n 'array.max': messageTemplate.arrayMax,\n 'array.length': messageTemplate.arrayLength\n })\n\n if (options.required === false) {\n formSchema = formSchema.optional()\n }\n\n if (typeof schema?.length === 'number') {\n formSchema = formSchema.length(schema.length)\n } else {\n if (typeof schema?.min === 'number') {\n formSchema = formSchema.min(schema.min)\n }\n\n if (typeof schema?.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n }\n\n this.formSchema = formSchema.default([])\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { items, name } = this\n\n // State checkbox values\n const values = this.getFormValue(state[name]) ?? []\n\n // Map (or discard) state values to item values\n const selected = items\n .filter((item) => values.includes(item.value))\n .map((item) => item.value)\n\n return selected.length ? selected : undefined\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n selected: (string | number | boolean)[] | undefined,\n translator: Translator\n ) {\n const { items } = this\n\n if (!selected) {\n return ''\n }\n\n return items\n .filter((item) => selected.includes(item.value))\n .map((item) => translator.tListItem(item, 'text') || item.text)\n .join(', ')\n }\n\n getContextValueFromFormValue(\n values: (string | number | boolean)[] | undefined\n ): (string | number | boolean)[] {\n /**\n * For evaluation context purposes, optional {@link CheckboxesField}\n * with an undefined value (i.e. nothing selected) should default to [].\n * This way conditions are not evaluated against `undefined` which throws errors.\n * Currently these errors are caught and the evaluation returns default `false`.\n * @see {@link QuestionPageController.getNextPath} for `undefined` return value\n * @see {@link FormModel.makeCondition} for try/catch block with default `false`\n * For negative conditions this is a problem because E.g.\n * The condition: 'selectedchecks' does not contain 'someval'\n * should return true IF 'selectedchecks' is undefined, not throw and return false.\n */\n return values ?? []\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const selected = this.getFormValueFromState(state) ?? []\n return this.getDisplayStringFromFormValue(selected, translator)\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const values = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(values)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return CheckboxesField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n const parentErrors = SelectionControlField.getAllPossibleErrors()\n\n return {\n ...parentErrors,\n advancedSettingsErrors: [\n ...parentErrors.advancedSettingsErrors,\n { type: 'array.min', template: messageTemplate.arrayMin },\n { type: 'array.max', template: messageTemplate.arrayMax },\n { type: 'array.length', template: messageTemplate.arrayLength }\n ]\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CheckboxesField.js","names":["joi","EN_GB","isFormValue","SelectionControlField","t","tPlugin","messageTemplate","CheckboxesField","constructor","def","props","listType","type","options","schema","formSchema","array","itemsSchema","valid","values","label","items","single","required","limits","optional","length","min","max","messages","buildErrorMessages","default","stateSchema","allow","getFormValueFromState","state","name","getFormValue","selected","filter","item","includes","value","map","undefined","isValue","getDisplayStringFromFormValue","translator","tListItem","text","join","getContextValueFromFormValue","getDisplayStringFromState","getContextValueFromState","getValidationMessagesOverride","language","getAllPossibleErrors","parentErrors","advancedSettingsErrors","template","arrayMin","arrayMax","arrayLength","Array","isArray","every","count"],"sources":["../../../../../src/server/plugins/engine/components/CheckboxesField.ts"],"sourcesContent":["import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'\nimport joi, { type ArraySchema } from 'joi'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport { type QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class CheckboxesField extends SelectionControlField {\n declare options: CheckboxesFieldComponent['options']\n declare schema: CheckboxesFieldComponent['schema']\n declare formSchema: ArraySchema<string> | ArraySchema<number>\n declare stateSchema: ArraySchema<string> | ArraySchema<number>\n declare limits: { min?: number; max?: number; length?: number }\n\n constructor(\n def: CheckboxesFieldComponent,\n props: ConstructorParameters<typeof SelectionControlField>[1]\n ) {\n super(def, props)\n\n const { listType: type } = this\n const { options, schema } = def\n\n let formSchema =\n type === 'string' ? joi.array<string>() : joi.array<number>()\n\n const itemsSchema = joi[type]()\n .valid(...this.values)\n .label(this.label)\n\n formSchema = formSchema\n .items(itemsSchema)\n .single()\n .label(this.label)\n .required()\n\n const limits: { min?: number; max?: number; length?: number } = {}\n\n if (options.required === false) {\n formSchema = formSchema.optional()\n }\n\n if (typeof schema?.length === 'number') {\n formSchema = formSchema.length(schema.length)\n limits.length = schema.length\n } else {\n if (typeof schema?.min === 'number') {\n formSchema = formSchema.min(schema.min)\n limits.min = schema.min\n }\n\n if (typeof schema?.max === 'number') {\n formSchema = formSchema.max(schema.max)\n limits.max = schema.max\n }\n }\n\n this.limits = limits\n\n formSchema = formSchema.messages(\n CheckboxesField.buildErrorMessages(EN_GB, limits)\n )\n\n this.formSchema = formSchema.default([])\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { items, name } = this\n\n // State checkbox values\n const values = this.getFormValue(state[name]) ?? []\n\n // Map (or discard) state values to item values\n const selected = items\n .filter((item) => values.includes(item.value))\n .map((item) => item.value)\n\n return selected.length ? selected : undefined\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n selected: (string | number | boolean)[] | undefined,\n translator: Translator\n ) {\n const { items } = this\n\n if (!selected) {\n return ''\n }\n\n return items\n .filter((item) => selected.includes(item.value))\n .map((item) => translator.tListItem(item, 'text') || item.text)\n .join(', ')\n }\n\n getContextValueFromFormValue(\n values: (string | number | boolean)[] | undefined\n ): (string | number | boolean)[] {\n /**\n * For evaluation context purposes, optional {@link CheckboxesField}\n * with an undefined value (i.e. nothing selected) should default to [].\n * This way conditions are not evaluated against `undefined` which throws errors.\n * Currently these errors are caught and the evaluation returns default `false`.\n * @see {@link QuestionPageController.getNextPath} for `undefined` return value\n * @see {@link FormModel.makeCondition} for try/catch block with default `false`\n * For negative conditions this is a problem because E.g.\n * The condition: 'selectedchecks' does not contain 'someval'\n * should return true IF 'selectedchecks' is undefined, not throw and return false.\n */\n return values ?? []\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const selected = this.getFormValueFromState(state) ?? []\n return this.getDisplayStringFromFormValue(selected, translator)\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const values = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(values)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { language } = translator\n return {\n [this.name]: CheckboxesField.buildErrorMessages(language, this.limits)\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return CheckboxesField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n const parentErrors = SelectionControlField.getAllPossibleErrors()\n\n return {\n ...parentErrors,\n advancedSettingsErrors: [\n ...parentErrors.advancedSettingsErrors,\n { type: 'array.min', template: messageTemplate.arrayMin },\n { type: 'array.max', template: messageTemplate.arrayMax },\n { type: 'array.length', template: messageTemplate.arrayLength }\n ]\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n\n static buildErrorMessages(\n language: string,\n limits: { min?: number; max?: number; length?: number } = {}\n ) {\n return {\n 'array.min': tPlugin('validation.arrayMin', language, {\n count: limits.min ?? 1\n }),\n 'array.max': tPlugin('validation.arrayMax', language, {\n count: limits.max ?? 1\n }),\n 'array.length': tPlugin('validation.arrayLength', language, {\n count: limits.length ?? 1\n })\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,6 +21,7 @@ export declare class ComponentBase {
|
|
|
21
21
|
}>['options'];
|
|
22
22
|
isFormComponent: boolean;
|
|
23
23
|
model: FormModel;
|
|
24
|
+
def: ComponentDef;
|
|
24
25
|
/** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
|
|
25
26
|
formSchema: ComponentSchema;
|
|
26
27
|
stateSchema: ComponentSchema;
|
|
@@ -12,6 +12,7 @@ export class ComponentBase {
|
|
|
12
12
|
options;
|
|
13
13
|
isFormComponent = false;
|
|
14
14
|
model;
|
|
15
|
+
def;
|
|
15
16
|
|
|
16
17
|
/** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
|
|
17
18
|
formSchema = joi.string();
|
|
@@ -21,6 +22,7 @@ export class ComponentBase {
|
|
|
21
22
|
this.type = def.type;
|
|
22
23
|
this.name = def.name;
|
|
23
24
|
this.title = def.title;
|
|
25
|
+
this.def = def;
|
|
24
26
|
if ('schema' in def) {
|
|
25
27
|
this.schema = def.schema;
|
|
26
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentBase.js","names":["isConditionalRevealType","joi","ComponentBase","id","page","parent","collection","type","name","title","schema","options","isFormComponent","model","formSchema","string","stateSchema","constructor","
|
|
1
|
+
{"version":3,"file":"ComponentBase.js","names":["isConditionalRevealType","joi","ComponentBase","id","page","parent","collection","type","name","title","schema","options","isFormComponent","model","def","formSchema","string","stateSchema","constructor","props","viewModel","attributes","autocomplete","classes","condition"],"sources":["../../../../../src/server/plugins/engine/components/ComponentBase.ts"],"sourcesContent":["import { isConditionalRevealType, type ComponentDef } from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\n type DateSchema,\n type NumberSchema,\n type ObjectSchema,\n type StringSchema\n} from 'joi'\n\nimport { type ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport { type Component } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { type ViewModel } from '~/src/server/plugins/engine/components/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\n\nexport class ComponentBase {\n id?: string\n page?: PageControllerClass\n parent: Component | undefined\n collection: ComponentCollection | undefined\n\n type: ComponentDef['type']\n name: ComponentDef['name']\n title: ComponentDef['title']\n schema?: Extract<ComponentDef, { schema?: object }>['schema']\n options?: Extract<ComponentDef, { options: object }>['options']\n\n isFormComponent = false\n model: FormModel\n def: ComponentDef\n\n /** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */\n formSchema: ComponentSchema = joi.string()\n stateSchema: ComponentSchema = joi.string()\n\n constructor(\n def: ComponentDef,\n props: {\n page?: PageControllerClass\n parent?: Component\n model: FormModel\n }\n ) {\n this.id = def.id\n this.type = def.type\n this.name = def.name\n this.title = def.title\n this.def = def\n\n if ('schema' in def) {\n this.schema = def.schema\n }\n\n if ('options' in def) {\n this.options = def.options\n }\n\n this.page = props.page\n this.parent = props.parent\n this.model = props.model\n }\n\n get viewModel() {\n const { options, type } = this\n\n const viewModel: ViewModel = {\n attributes: {}\n }\n\n if (!options) {\n return viewModel\n }\n\n if ('autocomplete' in options) {\n viewModel.attributes.autocomplete = options.autocomplete\n }\n\n if ('classes' in options) {\n viewModel.classes = options.classes\n }\n\n if ('condition' in options && isConditionalRevealType(type)) {\n viewModel.condition = options.condition\n }\n\n return viewModel\n }\n}\n\nexport type ComponentSchema =\n | ArraySchema<string>\n | ArraySchema<number>\n | ArraySchema<boolean>\n | ArraySchema<object>\n | BooleanSchema<string>\n | BooleanSchema\n | DateSchema\n | NumberSchema<string>\n | NumberSchema\n | ObjectSchema\n | StringSchema\n"],"mappings":"AAAA,SAASA,uBAAuB,QAA2B,oBAAoB;AAC/E,OAAOC,GAAG,MAOH,KAAK;AAQZ,OAAO,MAAMC,aAAa,CAAC;EACzBC,EAAE;EACFC,IAAI;EACJC,MAAM;EACNC,UAAU;EAEVC,IAAI;EACJC,IAAI;EACJC,KAAK;EACLC,MAAM;EACNC,OAAO;EAEPC,eAAe,GAAG,KAAK;EACvBC,KAAK;EACLC,GAAG;;EAEH;EACAC,UAAU,GAAoBd,GAAG,CAACe,MAAM,CAAC,CAAC;EAC1CC,WAAW,GAAoBhB,GAAG,CAACe,MAAM,CAAC,CAAC;EAE3CE,WAAWA,CACTJ,GAAiB,EACjBK,KAIC,EACD;IACA,IAAI,CAAChB,EAAE,GAAGW,GAAG,CAACX,EAAE;IAChB,IAAI,CAACI,IAAI,GAAGO,GAAG,CAACP,IAAI;IACpB,IAAI,CAACC,IAAI,GAAGM,GAAG,CAACN,IAAI;IACpB,IAAI,CAACC,KAAK,GAAGK,GAAG,CAACL,KAAK;IACtB,IAAI,CAACK,GAAG,GAAGA,GAAG;IAEd,IAAI,QAAQ,IAAIA,GAAG,EAAE;MACnB,IAAI,CAACJ,MAAM,GAAGI,GAAG,CAACJ,MAAM;IAC1B;IAEA,IAAI,SAAS,IAAII,GAAG,EAAE;MACpB,IAAI,CAACH,OAAO,GAAGG,GAAG,CAACH,OAAO;IAC5B;IAEA,IAAI,CAACP,IAAI,GAAGe,KAAK,CAACf,IAAI;IACtB,IAAI,CAACC,MAAM,GAAGc,KAAK,CAACd,MAAM;IAC1B,IAAI,CAACQ,KAAK,GAAGM,KAAK,CAACN,KAAK;EAC1B;EAEA,IAAIO,SAASA,CAAA,EAAG;IACd,MAAM;MAAET,OAAO;MAAEJ;IAAK,CAAC,GAAG,IAAI;IAE9B,MAAMa,SAAoB,GAAG;MAC3BC,UAAU,EAAE,CAAC;IACf,CAAC;IAED,IAAI,CAACV,OAAO,EAAE;MACZ,OAAOS,SAAS;IAClB;IAEA,IAAI,cAAc,IAAIT,OAAO,EAAE;MAC7BS,SAAS,CAACC,UAAU,CAACC,YAAY,GAAGX,OAAO,CAACW,YAAY;IAC1D;IAEA,IAAI,SAAS,IAAIX,OAAO,EAAE;MACxBS,SAAS,CAACG,OAAO,GAAGZ,OAAO,CAACY,OAAO;IACrC;IAEA,IAAI,WAAW,IAAIZ,OAAO,IAAIX,uBAAuB,CAACO,IAAI,CAAC,EAAE;MAC3Da,SAAS,CAACI,SAAS,GAAGb,OAAO,CAACa,SAAS;IACzC;IAEA,OAAOJ,SAAS;EAClB;AACF","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import joi from 'joi';
|
|
2
2
|
import { isFormState, isFormValue } from "./FormComponent.js";
|
|
3
3
|
import { createComponent } from "./helpers/components.js";
|
|
4
|
+
import { getTranslatedLabel } from "./helpers/index.js";
|
|
4
5
|
import { getErrors } from "../helpers.js";
|
|
5
6
|
import { buildLanguageMessages, validationOptions as opts } from "../pageControllers/validationOptions.js";
|
|
6
7
|
export class ComponentCollection {
|
|
@@ -204,20 +205,23 @@ export class ComponentCollection {
|
|
|
204
205
|
for (const subField of field.collection.fields) {
|
|
205
206
|
const translatedSubLabel = t(subField.title) || subField.label;
|
|
206
207
|
let patchedSchema = subField.formSchema.label(translatedSubLabel);
|
|
207
|
-
|
|
208
|
-
|
|
208
|
+
const subFieldMessages = messagesOverride ? messagesOverride[subField.name] : undefined;
|
|
209
|
+
if (subFieldMessages) {
|
|
210
|
+
patchedSchema = patchedSchema.messages(subFieldMessages);
|
|
209
211
|
}
|
|
210
212
|
labelOverrides[subField.name] = patchedSchema;
|
|
211
213
|
}
|
|
212
214
|
} else {
|
|
213
|
-
const
|
|
215
|
+
const fieldDef = field.def;
|
|
216
|
+
const translatedLabel = getTranslatedLabel(fieldDef, translator);
|
|
214
217
|
const messagesOverride = field.getValidationMessagesOverride(translator);
|
|
215
218
|
let patchedSchema = field.formSchema;
|
|
216
219
|
if (translatedLabel && translatedLabel !== field.label) {
|
|
217
220
|
patchedSchema = patchedSchema.label(translatedLabel);
|
|
218
221
|
}
|
|
219
|
-
|
|
220
|
-
|
|
222
|
+
const fieldMessages = messagesOverride ? messagesOverride[field.name] : undefined;
|
|
223
|
+
if (fieldMessages) {
|
|
224
|
+
patchedSchema = patchedSchema.messages(fieldMessages);
|
|
221
225
|
}
|
|
222
226
|
if (patchedSchema !== field.formSchema) {
|
|
223
227
|
labelOverrides[field.name] = patchedSchema;
|
|
@@ -235,9 +239,10 @@ export class ComponentCollection {
|
|
|
235
239
|
})
|
|
236
240
|
});
|
|
237
241
|
const details = result.error?.details;
|
|
242
|
+
const language = translator?.language;
|
|
238
243
|
return {
|
|
239
244
|
value: result.value ?? {},
|
|
240
|
-
errors: this.page?.getErrors(details) ?? getErrors(details)
|
|
245
|
+
errors: this.page?.getErrors(details, language) ?? getErrors(language, details)
|
|
241
246
|
};
|
|
242
247
|
}
|
|
243
248
|
|