@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template","govukRebrand"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\nexport function govukRebrand() {\n return true\n}\n\nenvironment.addGlobal('govukRebrand', govukRebrand())\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,IAAI,QAAQ,WAAW;AAEzC,SAASC,aAAa,QAAQ,oBAAoB;AAClD,OAAOC,QAAQ,MAAM,UAAU;AAC/B,OAAOC,UAAU,MAAM,SAAS;AAEhC,SAASC,MAAM;AACf,SAASC,gBAAgB;AACzB,OAAO,KAAKC,OAAO;AAEnB,MAAMC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","t","i18nT","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template","govukRebrand","tGlobal","key","opts"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport { t as i18nT } from '~/src/server/plugins/engine/i18n/index.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\nexport function govukRebrand() {\n return true\n}\n\nenvironment.addGlobal('govukRebrand', govukRebrand())\n\n/**\n * Global t() function — en-GB fallback for templates not wired to a specific language.\n * Per-request page controllers override this by passing t in their view model.\n * @param {string} key\n * @param {Record<string, unknown>} [opts]\n * @returns {string}\n */\nexport function tGlobal(key, opts) {\n return i18nT(key, 'en-GB', opts)\n}\n\nenvironment.addGlobal('t', tGlobal)\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,7 +16,15 @@ export function answer(name) {
|
|
|
16
16
|
if (!component?.isFormComponent) {
|
|
17
17
|
return undefined;
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
const field = /** @type {Field} */component;
|
|
20
|
+
const {
|
|
21
|
+
translator
|
|
22
|
+
} = context;
|
|
23
|
+
|
|
24
|
+
// Fallback if no translator in the context
|
|
25
|
+
return getAnswer(field, context.relevantState, translator ?? field.model.createTranslator(), {
|
|
26
|
+
format: 'summary'
|
|
27
|
+
});
|
|
20
28
|
}
|
|
21
29
|
|
|
22
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answer.js","names":["getAnswer","answer","name","context","ctx","undefined","component","componentMap","get","isFormComponent","relevantState"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\n\n/**\n * Nunjucks filter to get the answer for a component\n * @this {NunjucksContext}\n * @param {string} name - The name of the component to check\n */\nexport function answer(name) {\n const { context } = this.ctx\n\n if (!context) {\n return undefined\n }\n\n const component = context.componentMap.get(name)\n\n if (!component?.isFormComponent) {\n return undefined\n }\n\n
|
|
1
|
+
{"version":3,"file":"answer.js","names":["getAnswer","answer","name","context","ctx","undefined","component","componentMap","get","isFormComponent","field","translator","relevantState","model","createTranslator","format"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\n\n/**\n * Nunjucks filter to get the answer for a component\n * @this {NunjucksContext}\n * @param {string} name - The name of the component to check\n */\nexport function answer(name) {\n const { context } = this.ctx\n\n if (!context) {\n return undefined\n }\n\n const component = context.componentMap.get(name)\n\n if (!component?.isFormComponent) {\n return undefined\n }\n\n const field = /** @type {Field} */ (component)\n const { translator } = context\n\n // Fallback if no translator in the context\n return getAnswer(\n field,\n context.relevantState,\n translator ?? field.model.createTranslator(),\n {\n format: 'summary'\n }\n )\n}\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { Field } from '~/src/server/plugins/engine/components/helpers/components.js'\n */\n"],"mappings":"AAAA,SAASA,SAAS;;AAElB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAACC,IAAI,EAAE;EAC3B,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAI,CAACC,GAAG;EAE5B,IAAI,CAACD,OAAO,EAAE;IACZ,OAAOE,SAAS;EAClB;EAEA,MAAMC,SAAS,GAAGH,OAAO,CAACI,YAAY,CAACC,GAAG,CAACN,IAAI,CAAC;EAEhD,IAAI,CAACI,SAAS,EAAEG,eAAe,EAAE;IAC/B,OAAOJ,SAAS;EAClB;EAEA,MAAMK,KAAK,GAAG,oBAAsBJ,SAAU;EAC9C,MAAM;IAAEK;EAAW,CAAC,GAAGR,OAAO;;EAE9B;EACA,OAAOH,SAAS,CACdU,KAAK,EACLP,OAAO,CAACS,aAAa,EACrBD,UAAU,IAAID,KAAK,CAACG,KAAK,CAACC,gBAAgB,CAAC,CAAC,EAC5C;IACEC,MAAM,EAAE;EACV,CACF,CAAC;AACH;;AAEA;AACA;AACA;AACA","ignoreList":[]}
|
|
@@ -52,13 +52,24 @@ describe('answer Nunjucks filter', () => {
|
|
|
52
52
|
it('returns the answer', () => {
|
|
53
53
|
const mockFormComponent = {
|
|
54
54
|
isFormComponent: true,
|
|
55
|
-
someProperty: 'value'
|
|
55
|
+
someProperty: 'value',
|
|
56
|
+
model: {
|
|
57
|
+
createTranslator: jest.fn().mockImplementation(() => {
|
|
58
|
+
return {
|
|
59
|
+
t: jest.fn().mockReturnValue('translated text')
|
|
60
|
+
};
|
|
61
|
+
})
|
|
62
|
+
}
|
|
56
63
|
};
|
|
57
64
|
mockThis.ctx.context?.componentMap.set('validFormComponent',
|
|
58
65
|
// @ts-expect-error - simplified mock component for testing
|
|
59
66
|
mockFormComponent);
|
|
60
67
|
const result = answer.call(mockThis, 'validFormComponent');
|
|
61
|
-
expect(getAnswer).toHaveBeenCalledWith(mockFormComponent, mockThis.ctx.context?.relevantState
|
|
68
|
+
expect(getAnswer).toHaveBeenCalledWith(mockFormComponent, mockThis.ctx.context?.relevantState, {
|
|
69
|
+
t: expect.anything()
|
|
70
|
+
}, {
|
|
71
|
+
format: 'summary'
|
|
72
|
+
});
|
|
62
73
|
expect(result).toBe('test answer');
|
|
63
74
|
});
|
|
64
75
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answer.test.js","names":["getAnswer","answer","jest","mock","fn","describe","mockThis","beforeEach","clearAllMocks","ctx","context","componentMap","Map","relevantState","someState","mocked","mockReturnValue","it","undefined","result","call","expect","toBeUndefined","not","toHaveBeenCalled","set","isFormComponent","mockFormComponent","someProperty","toHaveBeenCalledWith","toBe"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.test.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'\n\njest.mock(\n '~/src/server/plugins/engine/components/helpers/components.ts',\n () => ({\n getAnswer: jest.fn()\n })\n)\n\ndescribe('answer Nunjucks filter', () => {\n /** @type { NunjucksContext } */\n let mockThis\n\n beforeEach(() => {\n jest.clearAllMocks()\n\n mockThis = /** @type {NunjucksContext} */ (\n /** @type {unknown} */ ({\n ctx: {\n context: {\n componentMap: new Map(),\n relevantState: { someState: 'value' }\n }\n }\n })\n )\n\n jest.mocked(getAnswer).mockReturnValue('test answer')\n })\n\n describe('missing context', () => {\n it('returns undefined', () => {\n mockThis.ctx.context = undefined\n\n const result = answer.call(mockThis, 'componentName')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('component lookup', () => {\n it('returns undefined for non-existent component', () => {\n const result = answer.call(mockThis, 'nonExistentComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('non-form component', () => {\n it('returns undefined', () => {\n mockThis.ctx.context?.componentMap.set(\n 'nonFormComponent',\n // @ts-expect-error - simplified mock component for testing\n { isFormComponent: false }\n )\n\n const result = answer.call(mockThis, 'nonFormComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('valid form component', () => {\n it('returns the answer', () => {\n const mockFormComponent = {\n isFormComponent: true,\n someProperty: 'value'\n }\n mockThis.ctx.context?.componentMap.set(\n 'validFormComponent',\n // @ts-expect-error - simplified mock component for testing\n mockFormComponent\n )\n\n const result = answer.call(mockThis, 'validFormComponent')\n\n expect(getAnswer).toHaveBeenCalledWith(\n mockFormComponent,\n mockThis.ctx.context?.relevantState\n )\n expect(result).toBe('test answer')\n })\n })\n})\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n */\n"],"mappings":"AAAA,SAASA,SAAS;AAClB,SAASC,MAAM;AAEfC,IAAI,CAACC,IAAI,kDAEP,OAAO;EACLH,SAAS,EAAEE,IAAI,CAACE,EAAE,CAAC;AACrB,CAAC,CACH,CAAC;AAEDC,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvC;EACA,IAAIC,QAAQ;EAEZC,UAAU,CAAC,MAAM;IACfL,IAAI,CAACM,aAAa,CAAC,CAAC;IAEpBF,QAAQ,GAAG;IACT,sBAAwB;MACtBG,GAAG,EAAE;QACHC,OAAO,EAAE;UACPC,YAAY,EAAE,IAAIC,GAAG,CAAC,CAAC;UACvBC,aAAa,EAAE;YAAEC,SAAS,EAAE;UAAQ;QACtC;MACF;IACF,CACD;IAEDZ,IAAI,CAACa,MAAM,CAACf,SAAS,CAAC,CAACgB,eAAe,CAAC,aAAa,CAAC;EACvD,CAAC,CAAC;EAEFX,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAChCY,EAAE,CAAC,mBAAmB,EAAE,MAAM;MAC5BX,QAAQ,CAACG,GAAG,CAACC,OAAO,GAAGQ,SAAS;MAEhC,MAAMC,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,eAAe,CAAC;MAErDe,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,kBAAkB,EAAE,MAAM;IACjCY,EAAE,CAAC,8CAA8C,EAAE,MAAM;MACvD,MAAME,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,sBAAsB,CAAC;MAE5De,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,oBAAoB,EAAE,MAAM;IACnCY,EAAE,CAAC,mBAAmB,EAAE,MAAM;MAC5BX,QAAQ,CAACG,GAAG,CAACC,OAAO,EAAEC,YAAY,CAACc,GAAG,CACpC,kBAAkB;MAClB;MACA;QAAEC,eAAe,EAAE;MAAM,CAC3B,CAAC;MAED,MAAMP,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,kBAAkB,CAAC;MAExDe,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,sBAAsB,EAAE,MAAM;IACrCY,EAAE,CAAC,oBAAoB,EAAE,MAAM;MAC7B,MAAMU,iBAAiB,GAAG;QACxBD,eAAe,EAAE,IAAI;QACrBE,YAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"answer.test.js","names":["getAnswer","answer","jest","mock","fn","describe","mockThis","beforeEach","clearAllMocks","ctx","context","componentMap","Map","relevantState","someState","mocked","mockReturnValue","it","undefined","result","call","expect","toBeUndefined","not","toHaveBeenCalled","set","isFormComponent","mockFormComponent","someProperty","model","createTranslator","mockImplementation","t","toHaveBeenCalledWith","anything","format","toBe"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.test.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'\n\njest.mock(\n '~/src/server/plugins/engine/components/helpers/components.ts',\n () => ({\n getAnswer: jest.fn()\n })\n)\n\ndescribe('answer Nunjucks filter', () => {\n /** @type { NunjucksContext } */\n let mockThis\n\n beforeEach(() => {\n jest.clearAllMocks()\n\n mockThis = /** @type {NunjucksContext} */ (\n /** @type {unknown} */ ({\n ctx: {\n context: {\n componentMap: new Map(),\n relevantState: { someState: 'value' }\n }\n }\n })\n )\n\n jest.mocked(getAnswer).mockReturnValue('test answer')\n })\n\n describe('missing context', () => {\n it('returns undefined', () => {\n mockThis.ctx.context = undefined\n\n const result = answer.call(mockThis, 'componentName')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('component lookup', () => {\n it('returns undefined for non-existent component', () => {\n const result = answer.call(mockThis, 'nonExistentComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('non-form component', () => {\n it('returns undefined', () => {\n mockThis.ctx.context?.componentMap.set(\n 'nonFormComponent',\n // @ts-expect-error - simplified mock component for testing\n { isFormComponent: false }\n )\n\n const result = answer.call(mockThis, 'nonFormComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('valid form component', () => {\n it('returns the answer', () => {\n const mockFormComponent = {\n isFormComponent: true,\n someProperty: 'value',\n model: {\n createTranslator: jest.fn().mockImplementation(() => {\n return {\n t: jest.fn().mockReturnValue('translated text')\n }\n })\n }\n }\n mockThis.ctx.context?.componentMap.set(\n 'validFormComponent',\n // @ts-expect-error - simplified mock component for testing\n mockFormComponent\n )\n\n const result = answer.call(mockThis, 'validFormComponent')\n\n expect(getAnswer).toHaveBeenCalledWith(\n mockFormComponent,\n mockThis.ctx.context?.relevantState,\n { t: expect.anything() },\n { format: 'summary' }\n )\n expect(result).toBe('test answer')\n })\n })\n})\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* @this {NunjucksContext}
|
|
4
4
|
* @param {string} name - The name of the component
|
|
5
5
|
*/
|
|
6
|
-
export function field(this: NunjucksContext, name: string): import("../../engine/components/TextField.js").TextField | import("../../engine/components/SelectField.js").SelectField | import("../../engine/components/RadiosField.js").RadiosField | import("../../engine/components/YesNoField.js").YesNoField | import("../../engine/components/CheckboxesField.js").CheckboxesField | import("../../engine/components/DatePartsField.js").DatePartsField | import("../../engine/components/DeclarationField.js").DeclarationField | import("../../engine/components/EastingNorthingField.js").EastingNorthingField | import("../../engine/components/EmailAddressField.js").EmailAddressField | import("../../engine/components/LatLongField.js").LatLongField | import("../../engine/components/MonthYearField.js").MonthYearField | import("../../engine/components/MultilineTextField.js").MultilineTextField | import("../../engine/components/NationalGridFieldNumberField.js").NationalGridFieldNumberField | import("../../engine/components/NumberField.js").NumberField | import("../../engine/components/OsGridRefField.js").OsGridRefField | import("../../engine/components/TelephoneNumberField.js").TelephoneNumberField | import("../../engine/components/UkAddressField.js").UkAddressField | import("../../engine/components/FileUploadField.js").FileUploadField | import("../../engine/components/HiddenField.js").HiddenField | import("../../engine/components/
|
|
6
|
+
export function field(this: NunjucksContext, name: string): import("../../engine/components/TextField.js").TextField | import("../../engine/components/PaymentField.js").PaymentField | import("../../engine/components/SelectField.js").SelectField | import("../../engine/components/RadiosField.js").RadiosField | import("../../engine/components/YesNoField.js").YesNoField | import("../../engine/components/CheckboxesField.js").CheckboxesField | import("../../engine/components/DatePartsField.js").DatePartsField | import("../../engine/components/DeclarationField.js").DeclarationField | import("../../engine/components/EastingNorthingField.js").EastingNorthingField | import("../../engine/components/EmailAddressField.js").EmailAddressField | import("../../engine/components/LatLongField.js").LatLongField | import("../../engine/components/MonthYearField.js").MonthYearField | import("../../engine/components/MultilineTextField.js").MultilineTextField | import("../../engine/components/NationalGridFieldNumberField.js").NationalGridFieldNumberField | import("../../engine/components/NumberField.js").NumberField | import("../../engine/components/OsGridRefField.js").OsGridRefField | import("../../engine/components/TelephoneNumberField.js").TelephoneNumberField | import("../../engine/components/UkAddressField.js").UkAddressField | import("../../engine/components/FileUploadField.js").FileUploadField | import("../../engine/components/HiddenField.js").HiddenField | import("../../engine/components/GeospatialField.js").GeospatialField | import("../../engine/components/Details.js").Details | import("../../engine/components/Html.js").Html | import("../../engine/components/InsetText.js").InsetText | import("../../engine/components/List.js").List | import("../../engine/components/Markdown.js").Markdown | import("../../engine/components/NotificationBanner.js").NotificationBanner | undefined;
|
|
7
7
|
import type { NunjucksContext } from '../../../../server/plugins/nunjucks/types.js';
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postcode lookup details form payload schema
|
|
3
|
+
* @param {string} [language]
|
|
4
|
+
* @returns {ObjectSchema<PostcodeLookupDetailsPayload>}
|
|
5
|
+
*/
|
|
6
|
+
export function createDetailsPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupDetailsPayload>;
|
|
7
|
+
/**
|
|
8
|
+
* Postcode lookup select form payload schema
|
|
9
|
+
* @param {string} [language]
|
|
10
|
+
* @returns {ObjectSchema<PostcodeLookupSelectPayload>}
|
|
11
|
+
*/
|
|
12
|
+
export function createSelectPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupSelectPayload>;
|
|
13
|
+
/**
|
|
14
|
+
* Postcode lookup manual form payload schema
|
|
15
|
+
* @param {string} [language]
|
|
16
|
+
* @returns {ObjectSchema<PostcodeLookupManualPayload>}
|
|
17
|
+
*/
|
|
18
|
+
export function createManualPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupManualPayload>;
|
|
1
19
|
/**
|
|
2
20
|
* The postcode lookup details form view model
|
|
3
21
|
* @param {PostcodeLookupSessionData} data
|
|
@@ -119,6 +137,8 @@ export function selectViewModel(data: {
|
|
|
119
137
|
singleAddress: Address | undefined;
|
|
120
138
|
hasAddresses: boolean;
|
|
121
139
|
hasMultipleAddresses: boolean;
|
|
140
|
+
addressesFoundText: string | undefined;
|
|
141
|
+
noAddressFoundText: string | undefined;
|
|
122
142
|
buttons: {
|
|
123
143
|
continueButton: {
|
|
124
144
|
href: string | undefined;
|
|
@@ -230,26 +250,11 @@ export namespace steps {
|
|
|
230
250
|
}
|
|
231
251
|
export const JOURNEY_BASE_URL: "/postcode-lookup";
|
|
232
252
|
export const stepSchema: Joi.StringSchema<string>;
|
|
233
|
-
/**
|
|
234
|
-
* Postcode lookup details form payload schema
|
|
235
|
-
* @type {ObjectSchema<PostcodeLookupDetailsPayload>}
|
|
236
|
-
*/
|
|
237
|
-
export const detailsPayloadSchema: Joi.ObjectSchema<PostcodeLookupDetailsPayload>;
|
|
238
|
-
/**
|
|
239
|
-
* Postcode lookup select form payload schema
|
|
240
|
-
* @type {ObjectSchema<PostcodeLookupSelectPayload>}
|
|
241
|
-
*/
|
|
242
|
-
export const selectPayloadSchema: Joi.ObjectSchema<PostcodeLookupSelectPayload>;
|
|
243
|
-
/**
|
|
244
|
-
* Postcode lookup manual form payload schema
|
|
245
|
-
* @type {ObjectSchema<PostcodeLookupManualPayload>}
|
|
246
|
-
*/
|
|
247
|
-
export const manualPayloadSchema: Joi.ObjectSchema<PostcodeLookupManualPayload>;
|
|
248
253
|
export type OptionalValidationErrorItem = Joi.ValidationErrorItem | undefined;
|
|
254
|
+
import type { PostcodeLookupDetailsPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
255
|
+
import Joi from 'joi';
|
|
256
|
+
import type { PostcodeLookupSelectPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
257
|
+
import type { PostcodeLookupManualPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
249
258
|
import type { PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
250
259
|
import type { PostcodeLookupDetailsData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
251
|
-
import type { PostcodeLookupSelectPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
252
260
|
import type { Address } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
253
|
-
import type { PostcodeLookupManualPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
254
|
-
import Joi from 'joi';
|
|
255
|
-
import type { PostcodeLookupDetailsPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Joi from 'joi';
|
|
2
|
+
import { t as i18nT } from "../../engine/i18n/index.js";
|
|
2
3
|
import * as service from "../service.js";
|
|
3
4
|
import { crumbSchema } from "../../../schemas/index.js";
|
|
4
5
|
|
|
@@ -11,7 +12,6 @@ const line2FieldName = 'addressLine2';
|
|
|
11
12
|
const townFieldName = 'town';
|
|
12
13
|
const countyFieldName = 'county';
|
|
13
14
|
const postcodeFieldName = 'postcode';
|
|
14
|
-
const selectLabelText = 'Select an address';
|
|
15
15
|
const GOVUK_MARGIN_RIGHT_1 = 'govuk-!-margin-right-1';
|
|
16
16
|
export const steps = {
|
|
17
17
|
// Step 1: Postcode/building name input
|
|
@@ -114,17 +114,18 @@ async function getAddresses(postcodeQuery, buildingNameQuery, apiKey) {
|
|
|
114
114
|
* @param {PostcodeLookupDetailsData | undefined} details
|
|
115
115
|
* @param {OptionalValidationErrorItem} postcodeQueryError
|
|
116
116
|
* @param {OptionalValidationErrorItem} buildingNameQueryError
|
|
117
|
+
* @param {string} language
|
|
117
118
|
*/
|
|
118
|
-
function getDetailsFields(details, postcodeQueryError, buildingNameQueryError) {
|
|
119
|
+
function getDetailsFields(details, postcodeQueryError, buildingNameQueryError, language) {
|
|
119
120
|
return {
|
|
120
121
|
[postcodeQueryFieldName]: {
|
|
121
122
|
id: postcodeQueryFieldName,
|
|
122
123
|
name: postcodeQueryFieldName,
|
|
123
124
|
label: {
|
|
124
|
-
text: '
|
|
125
|
+
text: i18nT('postcodeLookup.postcodeLabel', language)
|
|
125
126
|
},
|
|
126
127
|
hint: {
|
|
127
|
-
text: '
|
|
128
|
+
text: i18nT('postcodeLookup.postcodeHint', language)
|
|
128
129
|
},
|
|
129
130
|
value: details?.postcodeQuery,
|
|
130
131
|
errorMessage: postcodeQueryError && {
|
|
@@ -135,10 +136,10 @@ function getDetailsFields(details, postcodeQueryError, buildingNameQueryError) {
|
|
|
135
136
|
id: buildingNameQueryFieldName,
|
|
136
137
|
name: buildingNameQueryFieldName,
|
|
137
138
|
label: {
|
|
138
|
-
text: '
|
|
139
|
+
text: i18nT('postcodeLookup.buildingNameLabel', language)
|
|
139
140
|
},
|
|
140
141
|
hint: {
|
|
141
|
-
text: '
|
|
142
|
+
text: i18nT('postcodeLookup.buildingNameHint', language)
|
|
142
143
|
},
|
|
143
144
|
value: details?.buildingNameQuery,
|
|
144
145
|
errorMessage: buildingNameQueryError && {
|
|
@@ -156,8 +157,10 @@ function getDetailsFields(details, postcodeQueryError, buildingNameQueryError) {
|
|
|
156
157
|
* @param {PostcodeLookupSelectPayload | undefined} payload
|
|
157
158
|
* @param {OptionalValidationErrorItem} uprnError
|
|
158
159
|
* @param {Address[]} addresses
|
|
160
|
+
* @param {string} language
|
|
159
161
|
*/
|
|
160
|
-
function getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses) {
|
|
162
|
+
function getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses, language) {
|
|
163
|
+
const selectAddressText = i18nT('postcodeLookup.selectAddress', language);
|
|
161
164
|
return {
|
|
162
165
|
[postcodeQueryFieldName]: {
|
|
163
166
|
id: postcodeQueryFieldName,
|
|
@@ -175,14 +178,14 @@ function getSelectFields(details, hasMultipleAddresses, singleAddress, payload,
|
|
|
175
178
|
id: uprnFieldName,
|
|
176
179
|
name: uprnFieldName,
|
|
177
180
|
label: hasMultipleAddresses ? {
|
|
178
|
-
text:
|
|
181
|
+
text: selectAddressText
|
|
179
182
|
} : undefined,
|
|
180
183
|
value: singleAddress ? singleAddress.uprn : payload?.uprn,
|
|
181
184
|
errorMessage: uprnError && {
|
|
182
185
|
text: uprnError.message
|
|
183
186
|
},
|
|
184
187
|
items: hasMultipleAddresses ? [{
|
|
185
|
-
text:
|
|
188
|
+
text: selectAddressText,
|
|
186
189
|
value: ''
|
|
187
190
|
}].concat(addresses.map(item => ({
|
|
188
191
|
text: item.formatted,
|
|
@@ -201,14 +204,15 @@ function getSelectFields(details, hasMultipleAddresses, singleAddress, payload,
|
|
|
201
204
|
* @param {OptionalValidationErrorItem} townError
|
|
202
205
|
* @param {OptionalValidationErrorItem} countyError
|
|
203
206
|
* @param {OptionalValidationErrorItem} postcodeError
|
|
207
|
+
* @param {string} language
|
|
204
208
|
*/
|
|
205
|
-
function getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError) {
|
|
209
|
+
function getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError, language) {
|
|
206
210
|
return {
|
|
207
211
|
[line1FieldName]: {
|
|
208
212
|
id: line1FieldName,
|
|
209
213
|
name: line1FieldName,
|
|
210
214
|
label: {
|
|
211
|
-
text: '
|
|
215
|
+
text: i18nT('postcodeLookup.addressLine1Label', language)
|
|
212
216
|
},
|
|
213
217
|
value: payload?.addressLine1,
|
|
214
218
|
errorMessage: line1Error && {
|
|
@@ -219,7 +223,7 @@ function getManualFields(payload, line1Error, line2Error, townError, countyError
|
|
|
219
223
|
id: line2FieldName,
|
|
220
224
|
name: line2FieldName,
|
|
221
225
|
label: {
|
|
222
|
-
text: '
|
|
226
|
+
text: i18nT('postcodeLookup.addressLine2Label', language)
|
|
223
227
|
},
|
|
224
228
|
value: payload?.addressLine2,
|
|
225
229
|
errorMessage: line2Error && {
|
|
@@ -230,7 +234,7 @@ function getManualFields(payload, line1Error, line2Error, townError, countyError
|
|
|
230
234
|
id: townFieldName,
|
|
231
235
|
name: townFieldName,
|
|
232
236
|
label: {
|
|
233
|
-
text: '
|
|
237
|
+
text: i18nT('postcodeLookup.townLabel', language)
|
|
234
238
|
},
|
|
235
239
|
classes: 'govuk-!-width-two-thirds',
|
|
236
240
|
value: payload?.town,
|
|
@@ -242,7 +246,7 @@ function getManualFields(payload, line1Error, line2Error, townError, countyError
|
|
|
242
246
|
id: countyFieldName,
|
|
243
247
|
name: countyFieldName,
|
|
244
248
|
label: {
|
|
245
|
-
text: '
|
|
249
|
+
text: i18nT('postcodeLookup.countyLabel', language)
|
|
246
250
|
},
|
|
247
251
|
value: payload?.county,
|
|
248
252
|
errorMessage: countyError && {
|
|
@@ -253,7 +257,7 @@ function getManualFields(payload, line1Error, line2Error, townError, countyError
|
|
|
253
257
|
id: postcodeFieldName,
|
|
254
258
|
name: postcodeFieldName,
|
|
255
259
|
label: {
|
|
256
|
-
text: '
|
|
260
|
+
text: i18nT('postcodeLookup.postcodeLabel', language)
|
|
257
261
|
},
|
|
258
262
|
classes: 'govuk-input--width-10',
|
|
259
263
|
value: payload?.postcode,
|
|
@@ -271,47 +275,56 @@ const sharedPayloadSchemaKeys = {
|
|
|
271
275
|
|
|
272
276
|
/**
|
|
273
277
|
* Postcode lookup details form payload schema
|
|
274
|
-
* @
|
|
278
|
+
* @param {string} [language]
|
|
279
|
+
* @returns {ObjectSchema<PostcodeLookupDetailsPayload>}
|
|
275
280
|
*/
|
|
276
|
-
export
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
281
|
+
export function createDetailsPayloadSchema(language = 'en-GB') {
|
|
282
|
+
return Joi.object().keys({
|
|
283
|
+
...sharedPayloadSchemaKeys,
|
|
284
|
+
[postcodeQueryFieldName]: Joi.string().pattern(/^[a-zA-Z]{1,2}\d[a-zA-Z\d]?\s?\d[a-zA-Z]{2}$/).trim().required().messages({
|
|
285
|
+
'string.pattern.base': i18nT('postcodeLookup.validation.invalidPostcode', language),
|
|
286
|
+
'*': i18nT('postcodeLookup.validation.requiredPostcode', language)
|
|
287
|
+
}),
|
|
288
|
+
[buildingNameQueryFieldName]: Joi.string().trim().required().allow('').trim()
|
|
289
|
+
}).required();
|
|
290
|
+
}
|
|
284
291
|
|
|
285
292
|
/**
|
|
286
293
|
* Postcode lookup select form payload schema
|
|
287
|
-
* @
|
|
294
|
+
* @param {string} [language]
|
|
295
|
+
* @returns {ObjectSchema<PostcodeLookupSelectPayload>}
|
|
288
296
|
*/
|
|
289
|
-
export
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
})
|
|
297
|
+
export function createSelectPayloadSchema(language = 'en-GB') {
|
|
298
|
+
return Joi.object().keys({
|
|
299
|
+
...sharedPayloadSchemaKeys,
|
|
300
|
+
[uprnFieldName]: Joi.string().required().messages({
|
|
301
|
+
'*': i18nT('postcodeLookup.validation.selectAddress', language)
|
|
302
|
+
})
|
|
303
|
+
}).required();
|
|
304
|
+
}
|
|
295
305
|
|
|
296
306
|
/**
|
|
297
307
|
* Postcode lookup manual form payload schema
|
|
298
|
-
* @
|
|
308
|
+
* @param {string} [language]
|
|
309
|
+
* @returns {ObjectSchema<PostcodeLookupManualPayload>}
|
|
299
310
|
*/
|
|
300
|
-
export
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
})
|
|
311
|
+
export function createManualPayloadSchema(language = 'en-GB') {
|
|
312
|
+
return Joi.object().keys({
|
|
313
|
+
...sharedPayloadSchemaKeys,
|
|
314
|
+
[line1FieldName]: Joi.string().trim().required().messages({
|
|
315
|
+
'*': i18nT('postcodeLookup.validation.requiredAddressLine1', language)
|
|
316
|
+
}),
|
|
317
|
+
[line2FieldName]: Joi.string().trim().allow('').required(),
|
|
318
|
+
[townFieldName]: Joi.string().trim().required().messages({
|
|
319
|
+
'*': i18nT('postcodeLookup.validation.requiredTown', language)
|
|
320
|
+
}),
|
|
321
|
+
[countyFieldName]: Joi.string().trim().allow('').required(),
|
|
322
|
+
[postcodeFieldName]: Joi.string().pattern(/^[a-zA-Z]{1,2}\d[a-zA-Z\d]?\s?\d[a-zA-Z]{2}$/).trim().required().messages({
|
|
323
|
+
'string.pattern.base': i18nT('postcodeLookup.validation.invalidManualPostcode', language),
|
|
324
|
+
'*': i18nT('postcodeLookup.validation.requiredManualPostcode', language)
|
|
325
|
+
})
|
|
326
|
+
}).required();
|
|
327
|
+
}
|
|
315
328
|
|
|
316
329
|
/**
|
|
317
330
|
* Get the postcode lookup href
|
|
@@ -332,7 +345,8 @@ export function detailsViewModel(data, payload, err) {
|
|
|
332
345
|
const {
|
|
333
346
|
componentTitle: pageTitle,
|
|
334
347
|
formName,
|
|
335
|
-
sourceUrl
|
|
348
|
+
sourceUrl,
|
|
349
|
+
language = 'en-GB'
|
|
336
350
|
} = data.initial;
|
|
337
351
|
const backLink = {
|
|
338
352
|
href: sourceUrl
|
|
@@ -342,17 +356,13 @@ export function detailsViewModel(data, payload, err) {
|
|
|
342
356
|
postcodeQueryError,
|
|
343
357
|
buildingNameQueryError
|
|
344
358
|
} = buildErrors(err);
|
|
345
|
-
|
|
346
|
-
// Model fields
|
|
347
|
-
const fields = getDetailsFields(payload ?? data.details, postcodeQueryError, buildingNameQueryError);
|
|
348
|
-
|
|
349
|
-
// Model buttons
|
|
359
|
+
const fields = getDetailsFields(payload ?? data.details, postcodeQueryError, buildingNameQueryError, language);
|
|
350
360
|
const continueButton = {
|
|
351
|
-
text: '
|
|
361
|
+
text: i18nT('postcodeLookup.findAddress', language),
|
|
352
362
|
classes: GOVUK_MARGIN_RIGHT_1
|
|
353
363
|
};
|
|
354
364
|
const manualLink = {
|
|
355
|
-
text: '
|
|
365
|
+
text: i18nT('postcodeLookup.enterManually', language),
|
|
356
366
|
href: getHref(steps.manual)
|
|
357
367
|
};
|
|
358
368
|
return {
|
|
@@ -390,8 +400,7 @@ export async function selectViewModel(data, payload, err) {
|
|
|
390
400
|
postcodeQuery,
|
|
391
401
|
buildingNameQuery
|
|
392
402
|
} = details;
|
|
393
|
-
|
|
394
|
-
// Search for addresses
|
|
403
|
+
const language = initial.language ?? 'en-GB';
|
|
395
404
|
const {
|
|
396
405
|
hasAddresses,
|
|
397
406
|
hasMultipleAddresses,
|
|
@@ -399,7 +408,7 @@ export async function selectViewModel(data, payload, err) {
|
|
|
399
408
|
addresses,
|
|
400
409
|
addressCount
|
|
401
410
|
} = await getAddresses(postcodeQuery, buildingNameQuery, apiKey);
|
|
402
|
-
const title = hasAddresses ? initial.componentTitle : '
|
|
411
|
+
const title = hasAddresses ? initial.componentTitle : i18nT('postcodeLookup.noAddressFoundTitle', language);
|
|
403
412
|
const formPath = initial.sourceUrl;
|
|
404
413
|
const href = getHref();
|
|
405
414
|
const backLink = {
|
|
@@ -409,24 +418,25 @@ export async function selectViewModel(data, payload, err) {
|
|
|
409
418
|
errors,
|
|
410
419
|
uprnError
|
|
411
420
|
} = buildErrors(err);
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
const fields = getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses);
|
|
421
|
+
const fields = getSelectFields(details, hasMultipleAddresses, singleAddress, payload, uprnError, addresses, language);
|
|
422
|
+
const searchAgainText = i18nT('postcodeLookup.searchAgain', language);
|
|
415
423
|
const searchAgainLink = {
|
|
416
|
-
text:
|
|
424
|
+
text: searchAgainText,
|
|
417
425
|
href
|
|
418
426
|
};
|
|
419
|
-
|
|
420
|
-
// Model buttons
|
|
421
427
|
const continueButton = {
|
|
422
428
|
href: hasAddresses ? undefined : href,
|
|
423
|
-
text: hasAddresses ? '
|
|
429
|
+
text: hasAddresses ? i18nT('postcodeLookup.useThisAddress', language) : searchAgainText,
|
|
424
430
|
classes: GOVUK_MARGIN_RIGHT_1
|
|
425
431
|
};
|
|
426
432
|
const manualLink = {
|
|
427
|
-
text: '
|
|
433
|
+
text: i18nT('postcodeLookup.enterManually', language),
|
|
428
434
|
href: `${href}?step=${steps.manual}`
|
|
429
435
|
};
|
|
436
|
+
const addressesFoundText = hasAddresses ? i18nT('postcodeLookup.addressFound', language, {
|
|
437
|
+
count: addressCount
|
|
438
|
+
}) : undefined;
|
|
439
|
+
const noAddressFoundText = !hasAddresses ? i18nT('postcodeLookup.noAddressFoundBody', language) : undefined;
|
|
430
440
|
return {
|
|
431
441
|
step: steps.select,
|
|
432
442
|
showTitle: true,
|
|
@@ -442,6 +452,8 @@ export async function selectViewModel(data, payload, err) {
|
|
|
442
452
|
singleAddress,
|
|
443
453
|
hasAddresses,
|
|
444
454
|
hasMultipleAddresses,
|
|
455
|
+
addressesFoundText,
|
|
456
|
+
noAddressFoundText,
|
|
445
457
|
buttons: {
|
|
446
458
|
continueButton,
|
|
447
459
|
manualLink
|
|
@@ -459,7 +471,8 @@ export function manualViewModel(data, payload, err) {
|
|
|
459
471
|
const {
|
|
460
472
|
componentTitle,
|
|
461
473
|
sourceUrl,
|
|
462
|
-
componentHint
|
|
474
|
+
componentHint,
|
|
475
|
+
language = 'en-GB'
|
|
463
476
|
} = data.initial;
|
|
464
477
|
const formPath = sourceUrl;
|
|
465
478
|
const href = getHref();
|
|
@@ -474,22 +487,16 @@ export function manualViewModel(data, payload, err) {
|
|
|
474
487
|
countyError,
|
|
475
488
|
postcodeError
|
|
476
489
|
} = buildErrors(err);
|
|
477
|
-
|
|
478
|
-
// Model hint
|
|
479
490
|
const hint = componentHint && {
|
|
480
491
|
text: componentHint
|
|
481
492
|
};
|
|
482
|
-
|
|
483
|
-
// Model fields
|
|
484
|
-
const fields = getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError);
|
|
485
|
-
|
|
486
|
-
// Model buttons
|
|
493
|
+
const fields = getManualFields(payload, line1Error, line2Error, townError, countyError, postcodeError, language);
|
|
487
494
|
const continueButton = {
|
|
488
|
-
text: '
|
|
495
|
+
text: i18nT('postcodeLookup.useThisAddress', language),
|
|
489
496
|
classes: GOVUK_MARGIN_RIGHT_1
|
|
490
497
|
};
|
|
491
498
|
const detailsLink = {
|
|
492
|
-
text: '
|
|
499
|
+
text: i18nT('postcodeLookup.findAnAddressInstead', language),
|
|
493
500
|
href
|
|
494
501
|
};
|
|
495
502
|
return {
|