@defra/forms-engine-plugin 4.23.0 → 5.0.0-alpha
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/.server/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
- package/.server/server/forms/simple-form.yaml +106 -3
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +11 -11
- package/.server/server/plugins/engine/components/AutocompleteField.js +2 -2
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +3 -2
- package/.server/server/plugins/engine/components/CheckboxesField.js +4 -9
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -7
- package/.server/server/plugins/engine/components/ComponentCollection.js +106 -51
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +8 -6
- package/.server/server/plugins/engine/components/DatePartsField.js +27 -9
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +13 -11
- package/.server/server/plugins/engine/components/DeclarationField.js +31 -9
- package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +6 -5
- package/.server/server/plugins/engine/components/EastingNorthingField.js +42 -22
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +11 -14
- package/.server/server/plugins/engine/components/EmailAddressField.js +2 -2
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +14 -12
- package/.server/server/plugins/engine/components/FileUploadField.js +22 -12
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +21 -12
- package/.server/server/plugins/engine/components/FormComponent.js +33 -14
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +14 -12
- package/.server/server/plugins/engine/components/GeospatialField.js +19 -13
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/LatLongField.d.ts +6 -5
- package/.server/server/plugins/engine/components/LatLongField.js +32 -20
- package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +7 -6
- package/.server/server/plugins/engine/components/ListFormComponent.js +19 -7
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +17 -16
- package/.server/server/plugins/engine/components/LocationFieldBase.js +2 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +3 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +2 -2
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.d.ts +8 -7
- package/.server/server/plugins/engine/components/Markdown.js +5 -2
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +9 -7
- package/.server/server/plugins/engine/components/MonthYearField.js +26 -8
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +10 -9
- package/.server/server/plugins/engine/components/MultilineTextField.js +2 -2
- package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +14 -6
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/NumberField.d.ts +10 -9
- package/.server/server/plugins/engine/components/NumberField.js +2 -2
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
- package/.server/server/plugins/engine/components/OsGridRefField.js +14 -6
- package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -10
- package/.server/server/plugins/engine/components/PaymentField.js +21 -8
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +11 -11
- package/.server/server/plugins/engine/components/SelectField.js +2 -2
- package/.server/server/plugins/engine/components/SelectField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +4 -4
- package/.server/server/plugins/engine/components/SelectionControlField.js +2 -2
- package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -1
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +10 -9
- package/.server/server/plugins/engine/components/TelephoneNumberField.js +2 -2
- package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +12 -10
- package/.server/server/plugins/engine/components/UkAddressField.js +29 -17
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -0
- package/.server/server/plugins/engine/components/YesNoField.js +9 -0
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.d.ts +3 -2
- package/.server/server/plugins/engine/components/helpers/components.js +11 -8
- package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
- package/.server/server/plugins/engine/components/types.d.ts +8 -1
- package/.server/server/plugins/engine/components/types.js.map +1 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js +8 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
- package/.server/server/plugins/engine/form-context.d.ts +1 -0
- package/.server/server/plugins/engine/form-context.js +4 -2
- package/.server/server/plugins/engine/form-context.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +1 -1
- package/.server/server/plugins/engine/helpers.js +8 -13
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +39 -0
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +50 -0
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +5 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.js +18 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -0
- package/.server/server/plugins/engine/i18n/createTranslator.d.ts +9 -0
- package/.server/server/plugins/engine/i18n/createTranslator.js +51 -0
- package/.server/server/plugins/engine/i18n/createTranslator.js.map +1 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +5 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +57 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -0
- package/.server/server/plugins/engine/i18n/index.d.ts +18 -0
- package/.server/server/plugins/engine/i18n/index.js +71 -0
- package/.server/server/plugins/engine/i18n/index.js.map +1 -0
- package/.server/server/plugins/engine/i18n/translations/cy.json +271 -0
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +271 -0
- package/.server/server/plugins/engine/i18n/types.d.ts +41 -0
- package/.server/server/plugins/engine/i18n/types.js +2 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -0
- package/.server/server/plugins/engine/index.js +3 -2
- package/.server/server/plugins/engine/index.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +9 -1
- package/.server/server/plugins/engine/models/FormModel.js +44 -18
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +5 -2
- package/.server/server/plugins/engine/models/SummaryViewModel.js +44 -18
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
- package/.server/server/plugins/engine/options.js +2 -1
- package/.server/server/plugins/engine/options.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +4 -0
- 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/v1.js +7 -6
- package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +2 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +6 -3
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/PageController.d.ts +3 -1
- package/.server/server/plugins/engine/pageControllers/PageController.js +11 -1
- package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +4 -2
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +52 -21
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +3 -2
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +63 -26
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +3 -1
- package/.server/server/plugins/engine/pageControllers/StartPageController.js +2 -2
- package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js +12 -2
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +4 -3
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +44 -28
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.d.ts +2 -0
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js +24 -0
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/errors.js +3 -2
- package/.server/server/plugins/engine/pageControllers/errors.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +3 -2
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js +4 -4
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +7 -3
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +34 -33
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/plugin.js +2 -0
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/routes/index.js +4 -1
- package/.server/server/plugins/engine/routes/index.js.map +1 -1
- package/.server/server/plugins/engine/routes/questions.js +5 -2
- package/.server/server/plugins/engine/routes/questions.js.map +1 -1
- package/.server/server/plugins/engine/types/index.d.ts +1 -0
- package/.server/server/plugins/engine/types/index.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 +12 -1
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/views/components/_location-field-base.html +1 -1
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +3 -3
- package/.server/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
- package/.server/server/plugins/engine/views/components/osgridreffield.html +1 -1
- package/.server/server/plugins/engine/views/components/paymentfield.html +8 -8
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +4 -4
- package/.server/server/plugins/engine/views/confirmation.html +4 -4
- package/.server/server/plugins/engine/views/exit.html +4 -4
- package/.server/server/plugins/engine/views/file-upload.html +3 -3
- package/.server/server/plugins/engine/views/index.html +3 -3
- package/.server/server/plugins/engine/views/item-delete.html +1 -1
- package/.server/server/plugins/engine/views/partials/form.html +3 -3
- package/.server/server/plugins/engine/views/partials/preview-banner.html +4 -4
- package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
- package/.server/server/plugins/engine/views/repeat-list-summary.html +4 -4
- package/.server/server/plugins/engine/views/summary.html +14 -7
- package/.server/server/plugins/nunjucks/enviroment.test.js +10 -0
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
- package/.server/server/plugins/nunjucks/environment.d.ts +8 -0
- package/.server/server/plugins/nunjucks/environment.js +13 -0
- package/.server/server/plugins/nunjucks/environment.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/answer.js +9 -1
- package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/answer.test.js +13 -2
- package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +24 -19
- package/.server/server/plugins/postcode-lookup/models/index.js +83 -76
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.js +7 -13
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/types.d.ts +1 -0
- package/.server/server/plugins/postcode-lookup/types.js +1 -0
- 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/types.d.ts +2 -1
- package/.server/server/types.js.map +1 -1
- package/.server/server/utils/utils.d.ts +5 -0
- package/.server/server/utils/utils.js +16 -0
- package/.server/server/utils/utils.js.map +1 -1
- package/.server/typings/hapi/index.d.js.map +1 -1
- package/package.json +3 -2
- package/src/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
- package/src/server/forms/simple-form.yaml +106 -3
- package/src/server/plugins/engine/components/AutocompleteField.ts +3 -6
- package/src/server/plugins/engine/components/CheckboxesField.ts +12 -11
- package/src/server/plugins/engine/components/ComponentCollection.ts +143 -61
- package/src/server/plugins/engine/components/DatePartsField.ts +33 -11
- package/src/server/plugins/engine/components/DeclarationField.ts +37 -14
- package/src/server/plugins/engine/components/EastingNorthingField.ts +83 -22
- package/src/server/plugins/engine/components/EmailAddressField.ts +4 -7
- package/src/server/plugins/engine/components/FileUploadField.ts +28 -22
- package/src/server/plugins/engine/components/FormComponent.ts +49 -12
- package/src/server/plugins/engine/components/GeospatialField.ts +36 -21
- package/src/server/plugins/engine/components/LatLongField.ts +52 -21
- package/src/server/plugins/engine/components/ListFormComponent.ts +26 -10
- package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -8
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +3 -3
- package/src/server/plugins/engine/components/Markdown.ts +7 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +32 -10
- package/src/server/plugins/engine/components/MultilineTextField.ts +5 -8
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +25 -11
- package/src/server/plugins/engine/components/NumberField.ts +3 -4
- package/src/server/plugins/engine/components/OsGridRefField.ts +25 -9
- package/src/server/plugins/engine/components/PaymentField.ts +22 -12
- package/src/server/plugins/engine/components/SelectField.ts +3 -6
- package/src/server/plugins/engine/components/SelectionControlField.ts +7 -8
- package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -7
- package/src/server/plugins/engine/components/UkAddressField.ts +33 -18
- package/src/server/plugins/engine/components/YesNoField.ts +10 -0
- package/src/server/plugins/engine/components/helpers/components.ts +13 -6
- package/src/server/plugins/engine/components/types.ts +9 -0
- package/src/server/plugins/engine/configureEnginePlugin.ts +12 -1
- package/src/server/plugins/engine/form-context.ts +8 -2
- package/src/server/plugins/engine/helpers.ts +10 -18
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +69 -0
- package/src/server/plugins/engine/i18n/createFormTranslator.ts +33 -0
- package/src/server/plugins/engine/i18n/createTranslator.ts +61 -0
- package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +61 -0
- package/src/server/plugins/engine/i18n/index.ts +80 -0
- package/src/server/plugins/engine/i18n/translations/cy.json +271 -0
- package/src/server/plugins/engine/i18n/translations/en-GB.json +271 -0
- package/src/server/plugins/engine/i18n/types.ts +62 -0
- package/src/server/plugins/engine/index.ts +4 -2
- package/src/server/plugins/engine/models/FormModel.ts +59 -23
- package/src/server/plugins/engine/models/SummaryViewModel.ts +68 -25
- package/src/server/plugins/engine/options.js +2 -1
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +5 -0
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -3
- package/src/server/plugins/engine/outputFormatters/machine/v1.ts +9 -8
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +7 -3
- package/src/server/plugins/engine/pageControllers/PageController.ts +12 -1
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +53 -21
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +66 -29
- package/src/server/plugins/engine/pageControllers/StartPageController.ts +7 -2
- package/src/server/plugins/engine/pageControllers/StatusPageController.ts +10 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +48 -22
- package/src/server/plugins/engine/pageControllers/__stubs__/translator.ts +28 -0
- package/src/server/plugins/engine/pageControllers/errors.ts +4 -2
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +11 -4
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +43 -53
- package/src/server/plugins/engine/plugin.ts +2 -0
- package/src/server/plugins/engine/routes/index.ts +9 -1
- package/src/server/plugins/engine/routes/questions.ts +5 -1
- package/src/server/plugins/engine/types/index.ts +5 -0
- package/src/server/plugins/engine/types/schema.ts +1 -0
- package/src/server/plugins/engine/types.ts +10 -0
- package/src/server/plugins/engine/views/components/_location-field-base.html +1 -1
- package/src/server/plugins/engine/views/components/fileuploadfield.html +3 -3
- package/src/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
- package/src/server/plugins/engine/views/components/osgridreffield.html +1 -1
- package/src/server/plugins/engine/views/components/paymentfield.html +8 -8
- package/src/server/plugins/engine/views/components/ukaddressfield.html +4 -4
- package/src/server/plugins/engine/views/confirmation.html +4 -4
- package/src/server/plugins/engine/views/exit.html +4 -4
- package/src/server/plugins/engine/views/file-upload.html +3 -3
- package/src/server/plugins/engine/views/index.html +3 -3
- package/src/server/plugins/engine/views/item-delete.html +1 -1
- package/src/server/plugins/engine/views/partials/form.html +3 -3
- package/src/server/plugins/engine/views/partials/preview-banner.html +4 -4
- package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
- package/src/server/plugins/engine/views/repeat-list-summary.html +4 -4
- package/src/server/plugins/engine/views/summary.html +14 -7
- package/src/server/plugins/nunjucks/environment.js +14 -0
- package/src/server/plugins/nunjucks/filters/answer.js +12 -1
- package/src/server/plugins/postcode-lookup/models/index.js +144 -87
- package/src/server/plugins/postcode-lookup/routes/index.js +13 -16
- package/src/server/plugins/postcode-lookup/types.js +1 -0
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/src/server/types.ts +2 -0
- package/src/server/utils/utils.js +14 -0
- package/src/typings/hapi/index.d.ts +1 -0
- package/.server/server/plugins/engine/components/constants.d.ts +0 -1
- package/.server/server/plugins/engine/components/constants.js +0 -2
- package/.server/server/plugins/engine/components/constants.js.map +0 -1
- package/src/server/plugins/engine/components/constants.ts +0 -1
|
@@ -242,20 +242,6 @@ pages:
|
|
|
242
242
|
content: 'Fill in this field'
|
|
243
243
|
options:
|
|
244
244
|
required: false
|
|
245
|
-
next:
|
|
246
|
-
- path: '/pay-for-your-licence'
|
|
247
|
-
- title: Pay for your licence
|
|
248
|
-
path: '/pay-for-your-licence'
|
|
249
|
-
section: section
|
|
250
|
-
components:
|
|
251
|
-
- name: licencePayment
|
|
252
|
-
title: Unicorn breeder licence fee
|
|
253
|
-
type: PaymentField
|
|
254
|
-
hint: You'll be redirected to GOV.UK Pay to complete your payment
|
|
255
|
-
options:
|
|
256
|
-
required: true
|
|
257
|
-
amount: 50
|
|
258
|
-
description: Unicorn breeder annual licence fee
|
|
259
245
|
next:
|
|
260
246
|
- path: '/summary'
|
|
261
247
|
conditions:
|
|
@@ -3,6 +3,57 @@ name: Page events
|
|
|
3
3
|
engine: V2
|
|
4
4
|
schema: 2
|
|
5
5
|
startPage: '/summary'
|
|
6
|
+
metadata:
|
|
7
|
+
language: en-GB
|
|
8
|
+
translations:
|
|
9
|
+
cy:
|
|
10
|
+
components:
|
|
11
|
+
1fb8e182-c709-4792-8f83-e01d8b1fee1a:
|
|
12
|
+
title: Beth yw eich enw cyntaf?
|
|
13
|
+
shortDescription: Eich enw cyntaf
|
|
14
|
+
b68df7f1-d4f4-4c17-83c8-402f584906c9:
|
|
15
|
+
title: Beth yw eich enw olaf?
|
|
16
|
+
shortDescription: Eich enw olaf
|
|
17
|
+
987c1234-56d7-89e0-1234-56789abcdef0:
|
|
18
|
+
title: Llwytho copi o'ch pasbort
|
|
19
|
+
shortDescription: Llwytho pasbort
|
|
20
|
+
987c1234-56d7-89e0-1234-56789abcdef1:
|
|
21
|
+
title: Llwytho copi o'ch trwydded yrru
|
|
22
|
+
shortDescription: Llwytho trwydded yrru
|
|
23
|
+
00738799-3489-4ab2-a57b-542eecb31bfa:
|
|
24
|
+
title: Pryd yw pen-blwydd {{ applicantFirstName }} {{ applicantLastName }}?
|
|
25
|
+
shortDescription: Eich pen-blwydd
|
|
26
|
+
123e4567-e89b-12d3-a456-426614174000:
|
|
27
|
+
title: Beth yw eich cyfeiriad?
|
|
28
|
+
shortDescription: Eich cyfeiriad
|
|
29
|
+
aabbccdd-1122-3344-5566-778899001123:
|
|
30
|
+
title: Oes gennych chi drwydded yrru?
|
|
31
|
+
shortDescription: Trwydded yrru
|
|
32
|
+
aabbccdd-1122-3344-5566-778899001124:
|
|
33
|
+
title: Sut rydych chi fel arfer yn teithio?
|
|
34
|
+
shortDescription: Eich ffordd o deithio
|
|
35
|
+
listItems:
|
|
36
|
+
aabbccdd-1122-3344-5566-778899001126:
|
|
37
|
+
text: Car
|
|
38
|
+
aabbccdd-1122-3344-5566-778899001127:
|
|
39
|
+
text: Bws
|
|
40
|
+
aabbccdd-1122-3344-5566-778899001128:
|
|
41
|
+
text: Trên
|
|
42
|
+
pages:
|
|
43
|
+
622a35ec-3795-418a-81f3-a45746959045:
|
|
44
|
+
title: Eich enw
|
|
45
|
+
23456789-0abc-def1-2345-67890abcdef1:
|
|
46
|
+
title: Llwytho copi o'ch pasbort
|
|
47
|
+
23456789-0abc-def1-2345-67890abcdef2:
|
|
48
|
+
title: Llwytho copi o'ch trwydded yrru
|
|
49
|
+
da0fbdb4-a2de-4650-be16-9ba552af135f:
|
|
50
|
+
title: Dyddiad geni
|
|
51
|
+
449a45f6-4541-4a46-91bd-8b8931b07b50:
|
|
52
|
+
title: Crynodeb
|
|
53
|
+
123e4567-e89b-12d3-a456-426614174001:
|
|
54
|
+
title: Ble rydych chi'n byw?
|
|
55
|
+
aabbccdd-1122-3344-5566-778899001122:
|
|
56
|
+
title: Amdanoch chi
|
|
6
57
|
pages:
|
|
7
58
|
- title: Your name
|
|
8
59
|
path: '/your-name'
|
|
@@ -36,6 +87,21 @@ pages:
|
|
|
36
87
|
id: e18116e0-7c3e-416a-af42-6f229017c5b1
|
|
37
88
|
next: []
|
|
38
89
|
id: 622a35ec-3795-418a-81f3-a45746959045
|
|
90
|
+
- title: Where do you live?
|
|
91
|
+
path: '/where-you-live'
|
|
92
|
+
components:
|
|
93
|
+
- type: UkAddressField
|
|
94
|
+
title: What is your address?
|
|
95
|
+
name: applicantAddress
|
|
96
|
+
shortDescription: Your address
|
|
97
|
+
hint: ''
|
|
98
|
+
options:
|
|
99
|
+
required: true
|
|
100
|
+
usePostcodeLookup: true
|
|
101
|
+
schema: {}
|
|
102
|
+
id: 123e4567-e89b-12d3-a456-426614174000
|
|
103
|
+
next: []
|
|
104
|
+
id: 123e4567-e89b-12d3-a456-426614174001
|
|
39
105
|
- title: Upload a copy of your passport
|
|
40
106
|
controller: FileUploadPageController
|
|
41
107
|
path: '/upload-passport'
|
|
@@ -46,7 +112,7 @@ pages:
|
|
|
46
112
|
shortDescription: Upload passport
|
|
47
113
|
hint: ''
|
|
48
114
|
options:
|
|
49
|
-
required:
|
|
115
|
+
required: false
|
|
50
116
|
schema: {}
|
|
51
117
|
id: 987c1234-56d7-89e0-1234-56789abcdef0
|
|
52
118
|
id: 23456789-0abc-def1-2345-67890abcdef1
|
|
@@ -60,7 +126,7 @@ pages:
|
|
|
60
126
|
shortDescription: Upload drivers licence
|
|
61
127
|
hint: ''
|
|
62
128
|
options:
|
|
63
|
-
required:
|
|
129
|
+
required: false
|
|
64
130
|
schema: {}
|
|
65
131
|
id: 987c1234-56d7-89e0-1234-56789abcdef1
|
|
66
132
|
id: 23456789-0abc-def1-2345-67890abcdef2
|
|
@@ -78,6 +144,29 @@ pages:
|
|
|
78
144
|
id: '00738799-3489-4ab2-a57b-542eecb31bfa'
|
|
79
145
|
next: []
|
|
80
146
|
id: da0fbdb4-a2de-4650-be16-9ba552af135f
|
|
147
|
+
- title: About you
|
|
148
|
+
path: '/about-you'
|
|
149
|
+
components:
|
|
150
|
+
- type: YesNoField
|
|
151
|
+
title: Do you have a driving licence?
|
|
152
|
+
name: hasDrivingLicence
|
|
153
|
+
shortDescription: Driving licence
|
|
154
|
+
hint: ''
|
|
155
|
+
options: {}
|
|
156
|
+
schema: {}
|
|
157
|
+
id: aabbccdd-1122-3344-5566-778899001123
|
|
158
|
+
- type: RadiosField
|
|
159
|
+
title: How do you usually travel?
|
|
160
|
+
name: travelMethod
|
|
161
|
+
shortDescription: Your travel method
|
|
162
|
+
hint: ''
|
|
163
|
+
options:
|
|
164
|
+
required: true
|
|
165
|
+
schema: {}
|
|
166
|
+
list: aabbccdd-1122-3344-5566-778899001125
|
|
167
|
+
id: aabbccdd-1122-3344-5566-778899001124
|
|
168
|
+
next: []
|
|
169
|
+
id: aabbccdd-1122-3344-5566-778899001122
|
|
81
170
|
- title: ''
|
|
82
171
|
path: '/notification-demo'
|
|
83
172
|
components:
|
|
@@ -103,4 +192,18 @@ pages:
|
|
|
103
192
|
controller: SummaryPageController
|
|
104
193
|
conditions: []
|
|
105
194
|
sections: []
|
|
106
|
-
lists:
|
|
195
|
+
lists:
|
|
196
|
+
- id: aabbccdd-1122-3344-5566-778899001125
|
|
197
|
+
name: travelMethods
|
|
198
|
+
title: Travel methods
|
|
199
|
+
type: string
|
|
200
|
+
items:
|
|
201
|
+
- id: aabbccdd-1122-3344-5566-778899001126
|
|
202
|
+
text: Car
|
|
203
|
+
value: car
|
|
204
|
+
- id: aabbccdd-1122-3344-5566-778899001127
|
|
205
|
+
text: Bus
|
|
206
|
+
value: bus
|
|
207
|
+
- id: aabbccdd-1122-3344-5566-778899001128
|
|
208
|
+
text: Train
|
|
209
|
+
value: train
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
import { type AutocompleteFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { SelectField } from '../../../../server/plugins/engine/components/SelectField.js';
|
|
3
|
-
import { type
|
|
3
|
+
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
4
4
|
export declare class AutocompleteField extends SelectField {
|
|
5
5
|
options: AutocompleteFieldComponent['options'];
|
|
6
6
|
constructor(def: AutocompleteFieldComponent, props: ConstructorParameters<typeof SelectField>[1]);
|
|
7
|
-
getViewModel(
|
|
7
|
+
getViewModel(context: RenderContext): {
|
|
8
8
|
formGroup: {
|
|
9
9
|
classes?: string;
|
|
10
10
|
attributes?: string | Record<string, string>;
|
|
11
11
|
};
|
|
12
|
-
items: import("
|
|
12
|
+
items: import("../../../../server/plugins/engine/components/types.js").ListItem[];
|
|
13
13
|
label: {
|
|
14
14
|
text: string;
|
|
15
15
|
};
|
|
16
16
|
id: string;
|
|
17
17
|
name: string;
|
|
18
|
-
value: import("
|
|
18
|
+
value: import("../types.js").FormValue;
|
|
19
19
|
type?: string;
|
|
20
20
|
hint?: {
|
|
21
21
|
id?: string;
|
|
22
22
|
text: string;
|
|
23
23
|
};
|
|
24
|
-
prefix?: import("
|
|
25
|
-
suffix?: import("
|
|
24
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
25
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
26
26
|
classes?: string;
|
|
27
27
|
condition?: string;
|
|
28
|
-
errors?: FormSubmissionError[];
|
|
28
|
+
errors?: import("../types.js").FormSubmissionError[];
|
|
29
29
|
errorMessage?: {
|
|
30
30
|
text: string;
|
|
31
31
|
};
|
|
@@ -38,19 +38,19 @@ export declare class AutocompleteField extends SelectField {
|
|
|
38
38
|
accept?: string;
|
|
39
39
|
inputmode?: string;
|
|
40
40
|
};
|
|
41
|
-
content?: import("
|
|
41
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
42
42
|
maxlength?: number;
|
|
43
43
|
maxwords?: number;
|
|
44
44
|
rows?: number;
|
|
45
45
|
fieldset?: {
|
|
46
46
|
attributes?: string | Record<string, string>;
|
|
47
|
-
legend?: import("
|
|
47
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
48
48
|
};
|
|
49
49
|
showFieldsetError?: boolean;
|
|
50
|
-
components?: import("
|
|
50
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
51
51
|
upload?: {
|
|
52
52
|
count: number;
|
|
53
|
-
summaryList: import("
|
|
53
|
+
summaryList: import("../types.js").SummaryList;
|
|
54
54
|
};
|
|
55
55
|
};
|
|
56
56
|
}
|
|
@@ -19,8 +19,8 @@ export class AutocompleteField extends SelectField {
|
|
|
19
19
|
this.options = options;
|
|
20
20
|
this.formSchema = formSchema;
|
|
21
21
|
}
|
|
22
|
-
getViewModel(
|
|
23
|
-
const viewModel = super.getViewModel(
|
|
22
|
+
getViewModel(context) {
|
|
23
|
+
const viewModel = super.getViewModel(context);
|
|
24
24
|
let {
|
|
25
25
|
formGroup
|
|
26
26
|
} = viewModel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutocompleteField.js","names":["SelectField","messageTemplate","AutocompleteField","constructor","def","props","options","formSchema","required","messages","customValidationMessages","getViewModel","
|
|
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":"AAEA,SAASA,WAAW;AAEpB,SAASC,eAAe;AAExB,OAAO,MAAMC,iBAAiB,SAASF,WAAW,CAAC;EAGjDG,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;AACF","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model';
|
|
2
2
|
import { type ArraySchema } from 'joi';
|
|
3
3
|
import { SelectionControlField } from '../../../../server/plugins/engine/components/SelectionControlField.js';
|
|
4
|
+
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
4
5
|
import { type ErrorMessageTemplateList, type FormState, type FormStateValue, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
|
|
5
6
|
export declare class CheckboxesField extends SelectionControlField {
|
|
6
7
|
options: CheckboxesFieldComponent['options'];
|
|
@@ -10,9 +11,9 @@ export declare class CheckboxesField extends SelectionControlField {
|
|
|
10
11
|
constructor(def: CheckboxesFieldComponent, props: ConstructorParameters<typeof SelectionControlField>[1]);
|
|
11
12
|
getFormValueFromState(state: FormSubmissionState): (string | number | boolean)[] | undefined;
|
|
12
13
|
getFormValue(value?: FormStateValue | FormState): (string | number | boolean)[] | undefined;
|
|
13
|
-
getDisplayStringFromFormValue(selected: (string | number | boolean)[] | undefined): string;
|
|
14
|
+
getDisplayStringFromFormValue(selected: (string | number | boolean)[] | undefined, translator: Translator): string;
|
|
14
15
|
getContextValueFromFormValue(values: (string | number | boolean)[] | undefined): (string | number | boolean)[];
|
|
15
|
-
getDisplayStringFromState(state: FormSubmissionState): string;
|
|
16
|
+
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
16
17
|
getContextValueFromState(state: FormSubmissionState): (string | number | boolean)[];
|
|
17
18
|
/**
|
|
18
19
|
* For error preview page that shows all possible errors on a component
|
|
@@ -52,16 +52,14 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
52
52
|
getFormValue(value) {
|
|
53
53
|
return this.isValue(value) ? value : undefined;
|
|
54
54
|
}
|
|
55
|
-
getDisplayStringFromFormValue(selected) {
|
|
55
|
+
getDisplayStringFromFormValue(selected, translator) {
|
|
56
56
|
const {
|
|
57
57
|
items
|
|
58
58
|
} = this;
|
|
59
59
|
if (!selected) {
|
|
60
60
|
return '';
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
// Map selected values to text
|
|
64
|
-
return items.filter(item => selected.includes(item.value)).map(item => item.text).join(', ');
|
|
62
|
+
return items.filter(item => selected.includes(item.value)).map(item => translator.tListItem(item, 'text') || item.text).join(', ');
|
|
65
63
|
}
|
|
66
64
|
getContextValueFromFormValue(values) {
|
|
67
65
|
/**
|
|
@@ -77,12 +75,9 @@ export class CheckboxesField extends SelectionControlField {
|
|
|
77
75
|
*/
|
|
78
76
|
return values ?? [];
|
|
79
77
|
}
|
|
80
|
-
getDisplayStringFromState(state) {
|
|
81
|
-
// Selected checkbox values
|
|
78
|
+
getDisplayStringFromState(state, translator) {
|
|
82
79
|
const selected = this.getFormValueFromState(state) ?? [];
|
|
83
|
-
|
|
84
|
-
// Map selected values to text
|
|
85
|
-
return this.getDisplayStringFromFormValue(selected);
|
|
80
|
+
return this.getDisplayStringFromFormValue(selected, translator);
|
|
86
81
|
}
|
|
87
82
|
getContextValueFromState(state) {
|
|
88
83
|
const values = this.getFormValueFromState(state);
|
|
@@ -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","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 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 as string,\n 'array.max': messageTemplate.arrayMax as string,\n 'array.length': messageTemplate.arrayLength as string\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 ) {\n const { items } = this\n\n if (!selected) {\n return ''\n }\n\n // Map selected values to text\n return items\n .filter((item) => selected.includes(item.value))\n .map((item) => 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(state: FormSubmissionState) {\n // Selected checkbox values\n const selected = this.getFormValueFromState(state) ?? []\n\n // Map selected values to text\n return this.getDisplayStringFromFormValue(selected)\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","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":"AACA,OAAOA,GAAG,MAA4B,KAAK;AAE3C,SAASC,WAAW;AACpB,SAASC,qBAAqB;AAI9B,SAASC,eAAe;AAQxB,OAAO,MAAMC,eAAe,SAASF,qBAAqB,CAAC;EAMzDG,WAAWA,CACTC,GAA6B,EAC7BC,KAA6D,EAC7D;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC,QAAQ,EAAEC;IAAK,CAAC,GAAG,IAAI;IAC/B,MAAM;MAAEC,OAAO;MAAEC;IAAO,CAAC,GAAGL,GAAG;IAE/B,IAAIM,UAAU,GACZH,IAAI,KAAK,QAAQ,GAAGT,GAAG,CAACa,KAAK,CAAS,CAAC,GAAGb,GAAG,CAACa,KAAK,CAAS,CAAC;IAE/D,MAAMC,WAAW,GAAGd,GAAG,CAACS,IAAI,CAAC,CAAC,CAAC,CAC5BM,KAAK,CAAC,GAAG,IAAI,CAACC,MAAM,CAAC,CACrBC,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;IAEpBL,UAAU,GAAGA,UAAU,CACpBM,KAAK,CAACJ,WAAW,CAAC,CAClBK,MAAM,CAAC,CAAC,CACRF,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC,CACjBG,QAAQ,CAAC,CAAC,CACVC,QAAQ,CAAC;MACR,WAAW,EAAElB,eAAe,CAACmB,QAAQ;MACrC,WAAW,EAAEnB,eAAe,CAACoB,QAAQ;MACrC,cAAc,EAAEpB,eAAe,CAACqB;IAClC,CAAC,CAAC;IAEJ,IAAId,OAAO,CAACU,QAAQ,KAAK,KAAK,EAAE;MAC9BR,UAAU,GAAGA,UAAU,CAACa,QAAQ,CAAC,CAAC;IACpC;IAEA,IAAI,OAAOd,MAAM,EAAEe,MAAM,KAAK,QAAQ,EAAE;MACtCd,UAAU,GAAGA,UAAU,CAACc,MAAM,CAACf,MAAM,CAACe,MAAM,CAAC;IAC/C,CAAC,MAAM;MACL,IAAI,OAAOf,MAAM,EAAEgB,GAAG,KAAK,QAAQ,EAAE;QACnCf,UAAU,GAAGA,UAAU,CAACe,GAAG,CAAChB,MAAM,CAACgB,GAAG,CAAC;MACzC;MAEA,IAAI,OAAOhB,MAAM,EAAEiB,GAAG,KAAK,QAAQ,EAAE;QACnChB,UAAU,GAAGA,UAAU,CAACgB,GAAG,CAACjB,MAAM,CAACiB,GAAG,CAAC;MACzC;IACF;IAEA,IAAI,CAAChB,UAAU,GAAGA,UAAU,CAACiB,OAAO,CAAC,EAAE,CAAC;IACxC,IAAI,CAACC,WAAW,GAAGlB,UAAU,CAACiB,OAAO,CAAC,IAAI,CAAC,CAACE,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,CAACrB,OAAO,GAAGA,OAAO;EACxB;EAEAsB,qBAAqBA,CAACC,KAA0B,EAAE;IAChD,MAAM;MAAEf,KAAK;MAAEgB;IAAK,CAAC,GAAG,IAAI;;IAE5B;IACA,MAAMlB,MAAM,GAAG,IAAI,CAACmB,YAAY,CAACF,KAAK,CAACC,IAAI,CAAC,CAAC,IAAI,EAAE;;IAEnD;IACA,MAAME,QAAQ,GAAGlB,KAAK,CACnBmB,MAAM,CAAEC,IAAI,IAAKtB,MAAM,CAACuB,QAAQ,CAACD,IAAI,CAACE,KAAK,CAAC,CAAC,CAC7CC,GAAG,CAAEH,IAAI,IAAKA,IAAI,CAACE,KAAK,CAAC;IAE5B,OAAOJ,QAAQ,CAACV,MAAM,GAAGU,QAAQ,GAAGM,SAAS;EAC/C;EAEAP,YAAYA,CAACK,KAAkC,EAAE;IAC/C,OAAO,IAAI,CAACG,OAAO,CAACH,KAAK,CAAC,GAAGA,KAAK,GAAGE,SAAS;EAChD;EAEAE,6BAA6BA,CAC3BR,QAAmD,EACnDS,UAAsB,EACtB;IACA,MAAM;MAAE3B;IAAM,CAAC,GAAG,IAAI;IAEtB,IAAI,CAACkB,QAAQ,EAAE;MACb,OAAO,EAAE;IACX;IAEA,OAAOlB,KAAK,CACTmB,MAAM,CAAEC,IAAI,IAAKF,QAAQ,CAACG,QAAQ,CAACD,IAAI,CAACE,KAAK,CAAC,CAAC,CAC/CC,GAAG,CAAEH,IAAI,IAAKO,UAAU,CAACC,SAAS,CAACR,IAAI,EAAE,MAAM,CAAC,IAAIA,IAAI,CAACS,IAAI,CAAC,CAC9DC,IAAI,CAAC,IAAI,CAAC;EACf;EAEAC,4BAA4BA,CAC1BjC,MAAiD,EAClB;IAC/B;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACI,OAAOA,MAAM,IAAI,EAAE;EACrB;EAEAkC,yBAAyBA,CACvBjB,KAA0B,EAC1BY,UAAsB,EACtB;IACA,MAAMT,QAAQ,GAAG,IAAI,CAACJ,qBAAqB,CAACC,KAAK,CAAC,IAAI,EAAE;IACxD,OAAO,IAAI,CAACW,6BAA6B,CAACR,QAAQ,EAAES,UAAU,CAAC;EACjE;EAEAM,wBAAwBA,CAAClB,KAA0B,EAAE;IACnD,MAAMjB,MAAM,GAAG,IAAI,CAACgB,qBAAqB,CAACC,KAAK,CAAC;IAEhD,OAAO,IAAI,CAACgB,4BAA4B,CAACjC,MAAM,CAAC;EAClD;;EAEA;AACF;AACA;EACEoC,oBAAoBA,CAAA,EAA6B;IAC/C,OAAOhD,eAAe,CAACgD,oBAAoB,CAAC,CAAC;EAC/C;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,MAAMC,YAAY,GAAGnD,qBAAqB,CAACkD,oBAAoB,CAAC,CAAC;IAEjE,OAAO;MACL,GAAGC,YAAY;MACfC,sBAAsB,EAAE,CACtB,GAAGD,YAAY,CAACC,sBAAsB,EACtC;QAAE7C,IAAI,EAAE,WAAW;QAAE8C,QAAQ,EAAEpD,eAAe,CAACmB;MAAS,CAAC,EACzD;QAAEb,IAAI,EAAE,WAAW;QAAE8C,QAAQ,EAAEpD,eAAe,CAACoB;MAAS,CAAC,EACzD;QAAEd,IAAI,EAAE,cAAc;QAAE8C,QAAQ,EAAEpD,eAAe,CAACqB;MAAY,CAAC;IAEnE,CAAC;EACH;EAEAmB,OAAOA,CAACH,KAAkC,EAA4B;IACpE,IAAI,CAACgB,KAAK,CAACC,OAAO,CAACjB,KAAK,CAAC,EAAE;MACzB,OAAO,KAAK;IACd;;IAEA;IACA,IAAI,CAACA,KAAK,CAACd,MAAM,EAAE;MACjB,OAAO,IAAI;IACb;IAEA,OAAOc,KAAK,CAACkB,KAAK,CAACzD,WAAW,CAAC;EACjC;AACF","ignoreList":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { type ComponentDef } from '@defra/forms-model';
|
|
2
|
-
import { type CustomValidator, type ErrorReportCollection, type ObjectSchema } from 'joi';
|
|
2
|
+
import joi, { type CustomValidator, type ErrorReportCollection, type ObjectSchema } from 'joi';
|
|
3
3
|
import { type Component, type Field, type Guidance } from '../../../../server/plugins/engine/components/helpers/components.js';
|
|
4
|
-
import { type ComponentViewModel } from '../../../../server/plugins/engine/components/types.js';
|
|
4
|
+
import { type ComponentViewModel, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
5
6
|
import { type FormModel } from '../../../../server/plugins/engine/models/index.js';
|
|
6
7
|
import { type PageControllerClass } from '../../../../server/plugins/engine/pageControllers/helpers/pages.js';
|
|
7
8
|
import { type FormPayload, type FormSubmissionError, type FormSubmissionState, type FormValidationResult } from '../../../../server/plugins/engine/types.js';
|
|
8
|
-
import { type FormQuery } from '../../../../server/routes/types.js';
|
|
9
9
|
export declare class ComponentCollection {
|
|
10
10
|
page?: PageControllerClass;
|
|
11
11
|
parent?: Component;
|
|
@@ -37,18 +37,19 @@ export declare class ComponentCollection {
|
|
|
37
37
|
/**
|
|
38
38
|
* Get all errors for all fields in this collection
|
|
39
39
|
*/
|
|
40
|
-
getErrors(errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
40
|
+
getErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
41
41
|
/**
|
|
42
42
|
* Get view errors for all fields in this collection.
|
|
43
43
|
* For most fields this means filtering to the first error in the list.
|
|
44
44
|
* Composite fields like UKAddress can choose to return more than one error.
|
|
45
45
|
*/
|
|
46
|
-
getViewErrors(errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
47
|
-
getViewModel(
|
|
46
|
+
getViewErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
47
|
+
getViewModel(context: RenderContext): ComponentViewModel[];
|
|
48
|
+
overrideParentTitle(formSchema: joi.ObjectSchema<FormPayload>, translator: Translator | undefined): joi.ObjectSchema<FormPayload>;
|
|
48
49
|
/**
|
|
49
50
|
* Validate form payload
|
|
50
51
|
*/
|
|
51
|
-
validate(value?: FormPayload): FormValidationResult<FormPayload>;
|
|
52
|
+
validate(value?: FormPayload, translator?: Translator): FormValidationResult<FormPayload>;
|
|
52
53
|
/**
|
|
53
54
|
* Helper to get errors from all fields
|
|
54
55
|
*/
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import joi from 'joi';
|
|
2
|
-
import {
|
|
2
|
+
import { isFormState, isFormValue } from "./FormComponent.js";
|
|
3
3
|
import { createComponent } from "./helpers/components.js";
|
|
4
4
|
import { getErrors } from "../helpers.js";
|
|
5
|
-
import { validationOptions as opts } from "../pageControllers/validationOptions.js";
|
|
5
|
+
import { buildLanguageMessages, validationOptions as opts } from "../pageControllers/validationOptions.js";
|
|
6
6
|
export class ComponentCollection {
|
|
7
7
|
page;
|
|
8
8
|
parent;
|
|
@@ -31,47 +31,6 @@ export class ComponentCollection {
|
|
|
31
31
|
[name]: field.stateSchema
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
|
-
|
|
35
|
-
// Add parent field title to collection field errors
|
|
36
|
-
formSchema = formSchema.error(errors => {
|
|
37
|
-
return errors.flatMap(error => {
|
|
38
|
-
if (!isErrorContext(error.local) || error.local.title) {
|
|
39
|
-
return error;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Use field key or first missing child field
|
|
43
|
-
let {
|
|
44
|
-
missing,
|
|
45
|
-
key = missing?.[0]
|
|
46
|
-
} = error.local;
|
|
47
|
-
|
|
48
|
-
// But avoid numeric key used by array payloads
|
|
49
|
-
if (typeof key === 'number') {
|
|
50
|
-
key = error.path[0];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Find the parent field
|
|
54
|
-
const parent = fields.find(item => item.name === key?.split('__').shift());
|
|
55
|
-
|
|
56
|
-
// Find the child field
|
|
57
|
-
const child = (parent?.collection?.fields ?? fields).find(item => item.name === key);
|
|
58
|
-
|
|
59
|
-
// Update error with child label
|
|
60
|
-
if (child && (!error.local.label || error.local.label === 'value')) {
|
|
61
|
-
error.local.label = child.title;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Fix error summary links for missing fields
|
|
65
|
-
if (missing?.length) {
|
|
66
|
-
error.path = missing;
|
|
67
|
-
error.local.key = missing[0];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Update error with parent title
|
|
71
|
-
error.local.title ??= parent?.label;
|
|
72
|
-
return error;
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
34
|
if (schema?.peers) {
|
|
76
35
|
formSchema = formSchema.and(...schema.peers, {
|
|
77
36
|
isPresent: isFormValue
|
|
@@ -143,8 +102,8 @@ export class ComponentCollection {
|
|
|
143
102
|
/**
|
|
144
103
|
* Get all errors for all fields in this collection
|
|
145
104
|
*/
|
|
146
|
-
getErrors(errors) {
|
|
147
|
-
return this.getFieldErrors(field => field.getErrors(errors), errors);
|
|
105
|
+
getErrors(translator, errors) {
|
|
106
|
+
return this.getFieldErrors(field => field.getErrors(translator, errors), errors);
|
|
148
107
|
}
|
|
149
108
|
|
|
150
109
|
/**
|
|
@@ -152,10 +111,10 @@ export class ComponentCollection {
|
|
|
152
111
|
* For most fields this means filtering to the first error in the list.
|
|
153
112
|
* Composite fields like UKAddress can choose to return more than one error.
|
|
154
113
|
*/
|
|
155
|
-
getViewErrors(errors) {
|
|
156
|
-
return this.getFieldErrors(field => field.getViewErrors(errors), errors);
|
|
114
|
+
getViewErrors(translator, errors) {
|
|
115
|
+
return this.getFieldErrors(field => field.getViewErrors(translator, errors), errors);
|
|
157
116
|
}
|
|
158
|
-
getViewModel(
|
|
117
|
+
getViewModel(context) {
|
|
159
118
|
const {
|
|
160
119
|
components
|
|
161
120
|
} = this;
|
|
@@ -164,7 +123,7 @@ export class ComponentCollection {
|
|
|
164
123
|
isFormComponent,
|
|
165
124
|
type
|
|
166
125
|
} = component;
|
|
167
|
-
const model = component
|
|
126
|
+
const model = component.getViewModel(context);
|
|
168
127
|
return {
|
|
169
128
|
type,
|
|
170
129
|
isFormComponent,
|
|
@@ -173,12 +132,108 @@ export class ComponentCollection {
|
|
|
173
132
|
});
|
|
174
133
|
return result;
|
|
175
134
|
}
|
|
135
|
+
overrideParentTitle(formSchema, translator) {
|
|
136
|
+
// Add parent field title to collection field errors
|
|
137
|
+
return formSchema.error(errors => {
|
|
138
|
+
return errors.flatMap(error => {
|
|
139
|
+
if (!isErrorContext(error.local) || error.local.title) {
|
|
140
|
+
return error;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Use field key or first missing child field
|
|
144
|
+
let {
|
|
145
|
+
missing,
|
|
146
|
+
key = missing?.[0]
|
|
147
|
+
} = error.local;
|
|
148
|
+
|
|
149
|
+
// But avoid numeric key used by array payloads
|
|
150
|
+
if (typeof key === 'number') {
|
|
151
|
+
key = error.path[0];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Find the parent field
|
|
155
|
+
const parent = this.fields.find(item => item.name === key?.split('__').shift());
|
|
156
|
+
|
|
157
|
+
// Find the child field
|
|
158
|
+
const child = (parent?.collection?.fields ?? this.fields).find(item => item.name === key);
|
|
159
|
+
|
|
160
|
+
// Update error with child label
|
|
161
|
+
if (child && (!error.local.label || error.local.label === 'value')) {
|
|
162
|
+
error.local.label = child.title;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Fix error summary links for missing fields
|
|
166
|
+
if (missing?.length) {
|
|
167
|
+
error.path = missing;
|
|
168
|
+
error.local.key = missing[0];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Update error with parent title
|
|
172
|
+
if (translator && parent) {
|
|
173
|
+
error.local.title ??= translator.tComponent(parent, 'title');
|
|
174
|
+
} else {
|
|
175
|
+
error.local.title ??= parent?.label;
|
|
176
|
+
}
|
|
177
|
+
return error;
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
}
|
|
176
181
|
|
|
177
182
|
/**
|
|
178
183
|
* Validate form payload
|
|
179
184
|
*/
|
|
180
|
-
validate(value = {}) {
|
|
181
|
-
const
|
|
185
|
+
validate(value = {}, translator) {
|
|
186
|
+
const messages = translator ? buildLanguageMessages(translator.t) : undefined;
|
|
187
|
+
|
|
188
|
+
// When translating, override Joi labels (and custom schema messages where
|
|
189
|
+
// needed) so #label/#title in message templates resolve in the correct language.
|
|
190
|
+
let schema = this.formSchema;
|
|
191
|
+
// Add parent field title to collection field errors
|
|
192
|
+
schema = this.overrideParentTitle(schema, translator);
|
|
193
|
+
if (translator) {
|
|
194
|
+
const {
|
|
195
|
+
t
|
|
196
|
+
} = translator;
|
|
197
|
+
const labelOverrides = {};
|
|
198
|
+
for (const field of this.fields) {
|
|
199
|
+
if (field.collection) {
|
|
200
|
+
// Composite field: translate each sub-field's label using the key constant
|
|
201
|
+
// (e.g. 'components.addressField.line1' → "Llinell cyfeiriad 1") and apply
|
|
202
|
+
// any field-type-specific message overrides (e.g. objectMissing for dates).
|
|
203
|
+
const messagesOverride = field.getValidationMessagesOverride(translator);
|
|
204
|
+
for (const subField of field.collection.fields) {
|
|
205
|
+
const translatedSubLabel = t(subField.title) || subField.label;
|
|
206
|
+
let patchedSchema = subField.formSchema.label(translatedSubLabel);
|
|
207
|
+
if (messagesOverride) {
|
|
208
|
+
patchedSchema = patchedSchema.messages(messagesOverride);
|
|
209
|
+
}
|
|
210
|
+
labelOverrides[subField.name] = patchedSchema;
|
|
211
|
+
}
|
|
212
|
+
} else {
|
|
213
|
+
const translatedLabel = translator.tComponent(field, 'shortDescription') || translator.tComponent(field, 'title');
|
|
214
|
+
const messagesOverride = field.getValidationMessagesOverride(translator);
|
|
215
|
+
let patchedSchema = field.formSchema;
|
|
216
|
+
if (translatedLabel && translatedLabel !== field.label) {
|
|
217
|
+
patchedSchema = patchedSchema.label(translatedLabel);
|
|
218
|
+
}
|
|
219
|
+
if (messagesOverride) {
|
|
220
|
+
patchedSchema = patchedSchema.messages(messagesOverride);
|
|
221
|
+
}
|
|
222
|
+
if (patchedSchema !== field.formSchema) {
|
|
223
|
+
labelOverrides[field.name] = patchedSchema;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (Object.keys(labelOverrides).length) {
|
|
228
|
+
schema = schema.keys(labelOverrides);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const result = schema.validate(value, {
|
|
232
|
+
...opts,
|
|
233
|
+
...(messages && {
|
|
234
|
+
messages
|
|
235
|
+
})
|
|
236
|
+
});
|
|
182
237
|
const details = result.error?.details;
|
|
183
238
|
return {
|
|
184
239
|
value: result.value ?? {},
|