@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
|
@@ -6,6 +6,7 @@ import Joi from 'joi'
|
|
|
6
6
|
|
|
7
7
|
import { isRepeatState } from '../components/FormComponent.js'
|
|
8
8
|
import { redirectPath } from '../helpers.js'
|
|
9
|
+
import { type Translator } from '../i18n/types.js'
|
|
9
10
|
import { type FormModel } from '../models/index.js'
|
|
10
11
|
import { QuestionPageController } from './QuestionPageController.js'
|
|
11
12
|
import {
|
|
@@ -193,9 +194,20 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
193
194
|
return super.proceed(request, h, nextPath)
|
|
194
195
|
}
|
|
195
196
|
|
|
196
|
-
const
|
|
197
|
+
const translator = this.getTranslator(request)
|
|
198
|
+
const { t } = translator
|
|
197
199
|
|
|
198
|
-
|
|
200
|
+
const viewModel = this.getListSummaryViewModel(
|
|
201
|
+
request,
|
|
202
|
+
context,
|
|
203
|
+
list,
|
|
204
|
+
translator
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
return h.view(this.listSummaryViewName, {
|
|
208
|
+
...viewModel,
|
|
209
|
+
t
|
|
210
|
+
})
|
|
199
211
|
}
|
|
200
212
|
}
|
|
201
213
|
|
|
@@ -220,6 +232,9 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
220
232
|
return super.proceed(request, h, nextPath)
|
|
221
233
|
}
|
|
222
234
|
|
|
235
|
+
const translator = this.getTranslator(request)
|
|
236
|
+
const { t } = translator
|
|
237
|
+
|
|
223
238
|
const { action } = this.getFormParams(request)
|
|
224
239
|
|
|
225
240
|
const hasErrorMin =
|
|
@@ -232,7 +247,6 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
232
247
|
// Show error if repeat limits apply
|
|
233
248
|
if (hasErrorMin || hasErrorMax) {
|
|
234
249
|
const count = hasErrorMax ? schema.max : schema.min
|
|
235
|
-
const itemTitle = `answer${count === 1 ? '' : 's'}`
|
|
236
250
|
|
|
237
251
|
context.errors = [
|
|
238
252
|
{
|
|
@@ -240,14 +254,22 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
240
254
|
href: '',
|
|
241
255
|
name: '',
|
|
242
256
|
text: hasErrorMax
|
|
243
|
-
?
|
|
244
|
-
:
|
|
257
|
+
? t('pages.repeater.tooMany', { count })
|
|
258
|
+
: t('pages.repeater.tooFew', { count })
|
|
245
259
|
}
|
|
246
260
|
]
|
|
247
261
|
|
|
248
|
-
const viewModel = this.getListSummaryViewModel(
|
|
262
|
+
const viewModel = this.getListSummaryViewModel(
|
|
263
|
+
request,
|
|
264
|
+
context,
|
|
265
|
+
list,
|
|
266
|
+
translator
|
|
267
|
+
)
|
|
249
268
|
|
|
250
|
-
return h.view(this.listSummaryViewName,
|
|
269
|
+
return h.view(this.listSummaryViewName, {
|
|
270
|
+
...viewModel,
|
|
271
|
+
t
|
|
272
|
+
})
|
|
251
273
|
}
|
|
252
274
|
|
|
253
275
|
if (action === FormAction.AddAnother) {
|
|
@@ -281,11 +303,14 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
281
303
|
const itemId = this.getItemId(request)
|
|
282
304
|
const item = this.getItemFromList(list, itemId)
|
|
283
305
|
|
|
306
|
+
const translator = this.getTranslator(request)
|
|
307
|
+
const { t } = translator
|
|
308
|
+
|
|
284
309
|
if (!item || list.length === 1) {
|
|
285
310
|
throw Boom.notFound(
|
|
286
311
|
item
|
|
287
|
-
? '
|
|
288
|
-
: '
|
|
312
|
+
? t('pages.repeater.lastItemCannotBeRemoved')
|
|
313
|
+
: t('pages.repeater.itemToRemoveNotFound')
|
|
289
314
|
)
|
|
290
315
|
}
|
|
291
316
|
|
|
@@ -294,11 +319,12 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
294
319
|
return h.view(this.listDeleteViewName, {
|
|
295
320
|
...viewModel,
|
|
296
321
|
context,
|
|
297
|
-
backLink: this.getBackLink(request, context),
|
|
298
|
-
pageTitle: '
|
|
322
|
+
backLink: this.getBackLink(request, context, t),
|
|
323
|
+
pageTitle: t('pages.repeater.removeAnswer'),
|
|
299
324
|
itemTitle: `${title} ${list.indexOf(item) + 1}`,
|
|
300
|
-
buttonConfirm: { text: '
|
|
301
|
-
buttonCancel: { text: '
|
|
325
|
+
buttonConfirm: { text: t('pages.repeater.remove') },
|
|
326
|
+
buttonCancel: { text: t('pages.repeater.cancel') },
|
|
327
|
+
t
|
|
302
328
|
} satisfies ItemDeletePageViewModel)
|
|
303
329
|
}
|
|
304
330
|
}
|
|
@@ -318,11 +344,13 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
318
344
|
const itemId = this.getItemId(request)
|
|
319
345
|
const item = this.getItemFromList(list, itemId)
|
|
320
346
|
|
|
347
|
+
const { t } = this.getTranslator(request)
|
|
348
|
+
|
|
321
349
|
if (!item || list.length === 1) {
|
|
322
350
|
throw Boom.notFound(
|
|
323
351
|
item
|
|
324
|
-
? '
|
|
325
|
-
: '
|
|
352
|
+
? t('pages.repeater.lastItemCannotBeRemoved')
|
|
353
|
+
: t('pages.repeater.itemToRemoveNotFound')
|
|
326
354
|
)
|
|
327
355
|
}
|
|
328
356
|
|
|
@@ -343,17 +371,21 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
343
371
|
|
|
344
372
|
getViewModel(
|
|
345
373
|
request: FormContextRequest,
|
|
346
|
-
context: FormContext
|
|
374
|
+
context: FormContext,
|
|
375
|
+
translator: Translator
|
|
347
376
|
): FormPageViewModel {
|
|
348
377
|
const { state } = context
|
|
378
|
+
const { tPage } = translator
|
|
349
379
|
|
|
350
380
|
const list = this.getListFromState(state)
|
|
351
381
|
const itemId = this.getItemId(request)
|
|
352
382
|
const item = this.getItemFromList(list, itemId)
|
|
353
383
|
|
|
354
|
-
const viewModel = super.getViewModel(request, context)
|
|
384
|
+
const viewModel = super.getViewModel(request, context, translator)
|
|
355
385
|
const itemNumber = item ? list.indexOf(item) + 1 : list.length + 1
|
|
356
|
-
const
|
|
386
|
+
const title =
|
|
387
|
+
tPage(this.pageDef, 'repeatTitle') || this.pageDef.repeat.options.title
|
|
388
|
+
const repeatCaption = `${title} ${itemNumber}`
|
|
357
389
|
|
|
358
390
|
return {
|
|
359
391
|
...viewModel,
|
|
@@ -367,12 +399,15 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
367
399
|
getListSummaryViewModel(
|
|
368
400
|
request: FormContextRequest,
|
|
369
401
|
context: FormContext,
|
|
370
|
-
list: RepeatListState
|
|
402
|
+
list: RepeatListState,
|
|
403
|
+
translator: Translator
|
|
371
404
|
): RepeaterSummaryPageViewModel {
|
|
372
405
|
const { collection, href, repeat } = this
|
|
373
406
|
const { query } = request
|
|
374
407
|
const { isForceAccess, errors } = context
|
|
375
408
|
|
|
409
|
+
const { t } = translator
|
|
410
|
+
|
|
376
411
|
const { title } = repeat.options
|
|
377
412
|
|
|
378
413
|
const summaryList: SummaryList = {
|
|
@@ -396,9 +431,11 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
396
431
|
href: redirectPath(`${href}/${item.itemId}`, {
|
|
397
432
|
returnUrl: query.returnUrl ?? this.getHref(summaryPath)
|
|
398
433
|
}),
|
|
399
|
-
text: '
|
|
434
|
+
text: t('pages.repeater.change'),
|
|
400
435
|
classes: 'govuk-link--no-visited-state',
|
|
401
|
-
visuallyHiddenText:
|
|
436
|
+
visuallyHiddenText: t('pages.repeater.visuallyHiddenItem', {
|
|
437
|
+
index: index + 1
|
|
438
|
+
})
|
|
402
439
|
})
|
|
403
440
|
|
|
404
441
|
if (count > 1) {
|
|
@@ -406,15 +443,17 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
406
443
|
href: redirectPath(`${href}/${item.itemId}/confirm-delete`, {
|
|
407
444
|
returnUrl: query.returnUrl
|
|
408
445
|
}),
|
|
409
|
-
text: '
|
|
446
|
+
text: t('pages.repeater.remove'),
|
|
410
447
|
classes: 'govuk-link--no-visited-state',
|
|
411
|
-
visuallyHiddenText:
|
|
448
|
+
visuallyHiddenText: t('pages.repeater.visuallyHiddenItem', {
|
|
449
|
+
index: index + 1
|
|
450
|
+
})
|
|
412
451
|
})
|
|
413
452
|
}
|
|
414
453
|
}
|
|
415
454
|
|
|
416
455
|
const itemDisplayText = collection.fields.length
|
|
417
|
-
? collection.fields[0].getDisplayStringFromState(item)
|
|
456
|
+
? collection.fields[0].getDisplayStringFromState(item, translator)
|
|
418
457
|
: ''
|
|
419
458
|
|
|
420
459
|
summaryList.rows.push({
|
|
@@ -422,7 +461,7 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
422
461
|
text: `${title} ${index + 1}`
|
|
423
462
|
},
|
|
424
463
|
value: {
|
|
425
|
-
text: itemDisplayText || '
|
|
464
|
+
text: itemDisplayText || t('pages.repeater.notProvided')
|
|
426
465
|
},
|
|
427
466
|
actions: {
|
|
428
467
|
items
|
|
@@ -431,13 +470,11 @@ export class RepeatPageController extends QuestionPageController {
|
|
|
431
470
|
})
|
|
432
471
|
}
|
|
433
472
|
|
|
434
|
-
const unit = count === 1 ? 'answer' : 'answers'
|
|
435
|
-
|
|
436
473
|
return {
|
|
437
474
|
...this.viewModel,
|
|
438
|
-
backLink: this.getBackLink(request, context),
|
|
475
|
+
backLink: this.getBackLink(request, context, t),
|
|
439
476
|
repeatTitle: title,
|
|
440
|
-
pageTitle:
|
|
477
|
+
pageTitle: t('pages.repeater.pageTitle', { count }),
|
|
441
478
|
showTitle: true,
|
|
442
479
|
context,
|
|
443
480
|
errors,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Translator } from '../i18n/types.js'
|
|
1
2
|
import { QuestionPageController } from './QuestionPageController.js'
|
|
2
3
|
import { type FormContext } from '../types.js'
|
|
3
4
|
import { type FormRequest } from '../../../routes/types.js'
|
|
@@ -11,9 +12,13 @@ export class StartPageController extends QuestionPageController {
|
|
|
11
12
|
|
|
12
13
|
allowSaveAndExit = false
|
|
13
14
|
|
|
14
|
-
getViewModel(
|
|
15
|
+
getViewModel(
|
|
16
|
+
request: FormRequest,
|
|
17
|
+
context: FormContext,
|
|
18
|
+
translator: Translator
|
|
19
|
+
) {
|
|
15
20
|
return {
|
|
16
|
-
...super.getViewModel(request, context),
|
|
21
|
+
...super.getViewModel(request, context, translator),
|
|
17
22
|
isStartPage: true
|
|
18
23
|
}
|
|
19
24
|
}
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
type FormRequest,
|
|
9
9
|
type FormResponseToolkit
|
|
10
10
|
} from '../../../routes/types.js'
|
|
11
|
+
import { resolveLanguage } from '../../../utils/utils.js'
|
|
11
12
|
|
|
12
13
|
export class StatusPageController extends QuestionPageController {
|
|
13
14
|
declare pageDef: PageStatus
|
|
@@ -32,6 +33,10 @@ export class StatusPageController extends QuestionPageController {
|
|
|
32
33
|
) => {
|
|
33
34
|
const { viewModel, viewName } = this
|
|
34
35
|
|
|
36
|
+
const language = resolveLanguage(request)
|
|
37
|
+
const translator = this.model.createTranslator(language)
|
|
38
|
+
const { t, tForm } = translator
|
|
39
|
+
|
|
35
40
|
const cacheService = getCacheService(request.server)
|
|
36
41
|
const confirmationState = await cacheService.getConfirmationState(request)
|
|
37
42
|
|
|
@@ -55,10 +60,13 @@ export class StatusPageController extends QuestionPageController {
|
|
|
55
60
|
|
|
56
61
|
return h.view(viewName, {
|
|
57
62
|
...viewModel,
|
|
58
|
-
submissionGuidance,
|
|
59
63
|
formName,
|
|
64
|
+
submissionGuidance,
|
|
60
65
|
showReferenceNumber: this.showReferenceNumber,
|
|
61
|
-
referenceNumber: confirmationState.referenceNumber
|
|
66
|
+
referenceNumber: confirmationState.referenceNumber,
|
|
67
|
+
t,
|
|
68
|
+
tForm,
|
|
69
|
+
context
|
|
62
70
|
})
|
|
63
71
|
}
|
|
64
72
|
}
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
createError,
|
|
21
21
|
getCacheService
|
|
22
22
|
} from '../helpers.js'
|
|
23
|
+
import { type Translator } from '../i18n/types.js'
|
|
23
24
|
import {
|
|
24
25
|
SummaryViewModel,
|
|
25
26
|
type FormModel
|
|
@@ -89,11 +90,13 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
89
90
|
|
|
90
91
|
getSummaryViewModel(
|
|
91
92
|
request: FormContextRequest,
|
|
92
|
-
context: FormContext
|
|
93
|
+
context: FormContext,
|
|
94
|
+
translator: Translator
|
|
93
95
|
): SummaryViewModel {
|
|
94
|
-
const
|
|
96
|
+
const { t } = translator
|
|
97
|
+
|
|
98
|
+
const viewModel = new SummaryViewModel(request, this, context, translator)
|
|
95
99
|
|
|
96
|
-
const { query } = request
|
|
97
100
|
const { payload, errors, state } = context
|
|
98
101
|
|
|
99
102
|
const paymentField = this.findPaymentField()
|
|
@@ -110,7 +113,8 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
110
113
|
viewModel.paymentState = paymentState
|
|
111
114
|
viewModel.paymentDetails = this.buildPaymentDetails(
|
|
112
115
|
paymentField,
|
|
113
|
-
paymentState
|
|
116
|
+
paymentState,
|
|
117
|
+
t
|
|
114
118
|
)
|
|
115
119
|
}
|
|
116
120
|
|
|
@@ -126,9 +130,13 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
126
130
|
}
|
|
127
131
|
}
|
|
128
132
|
|
|
129
|
-
const components = this.collection.getViewModel(
|
|
133
|
+
const components = this.collection.getViewModel({
|
|
134
|
+
payload,
|
|
135
|
+
errors,
|
|
136
|
+
translator
|
|
137
|
+
})
|
|
130
138
|
|
|
131
|
-
viewModel.backLink = this.getBackLink(request, context)
|
|
139
|
+
viewModel.backLink = this.getBackLink(request, context, t)
|
|
132
140
|
viewModel.feedbackLink = this.feedbackLink
|
|
133
141
|
viewModel.phaseTag = this.phaseTag
|
|
134
142
|
viewModel.components = components
|
|
@@ -142,32 +150,33 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
142
150
|
paymentField: PaymentField,
|
|
143
151
|
paymentState: NonNullable<
|
|
144
152
|
ReturnType<PaymentField['getPaymentStateFromState']>
|
|
145
|
-
|
|
153
|
+
>,
|
|
154
|
+
t: (key: string, opts?: Record<string, unknown>) => string
|
|
146
155
|
) {
|
|
147
156
|
const rows = [
|
|
148
157
|
{
|
|
149
|
-
key: { text: '
|
|
158
|
+
key: { text: t('pages.summary.paymentFor') },
|
|
150
159
|
value: { text: paymentState.description }
|
|
151
160
|
},
|
|
152
161
|
{
|
|
153
|
-
key: { text: '
|
|
162
|
+
key: { text: t('pages.summary.totalAmount') },
|
|
154
163
|
value: { text: formatCurrency(paymentState.amount) }
|
|
155
164
|
},
|
|
156
165
|
{
|
|
157
|
-
key: { text: '
|
|
166
|
+
key: { text: t('pages.summary.reference') },
|
|
158
167
|
value: { text: paymentState.reference }
|
|
159
168
|
}
|
|
160
169
|
]
|
|
161
170
|
|
|
162
171
|
if (paymentState.preAuth?.createdAt) {
|
|
163
172
|
rows.push({
|
|
164
|
-
key: { text: '
|
|
173
|
+
key: { text: t('pages.summary.dateOfPayment') },
|
|
165
174
|
value: { text: formatPaymentDate(paymentState.preAuth.createdAt) }
|
|
166
175
|
})
|
|
167
176
|
}
|
|
168
177
|
|
|
169
178
|
return {
|
|
170
|
-
title: { text: '
|
|
179
|
+
title: { text: t('pages.summary.paymentDetailsTitle') },
|
|
171
180
|
summaryList: { rows }
|
|
172
181
|
}
|
|
173
182
|
}
|
|
@@ -183,6 +192,9 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
183
192
|
) => {
|
|
184
193
|
const { viewName } = this
|
|
185
194
|
|
|
195
|
+
const translator = this.getTranslator(request)
|
|
196
|
+
const { t } = translator
|
|
197
|
+
|
|
186
198
|
// After GOV.UK Pay callback, auto-submit the form instead of
|
|
187
199
|
// showing CYA again. The payment is already pre-authorized.
|
|
188
200
|
if (request.query.paymentComplete === 'true') {
|
|
@@ -195,11 +207,12 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
195
207
|
|
|
196
208
|
await this.reconcilePaymentState(request, context)
|
|
197
209
|
|
|
198
|
-
const viewModel = this.getSummaryViewModel(request, context)
|
|
210
|
+
const viewModel = this.getSummaryViewModel(request, context, translator)
|
|
199
211
|
|
|
200
212
|
viewModel.hasMissingNotificationEmail =
|
|
201
213
|
await this.hasMissingNotificationEmail(request, context)
|
|
202
214
|
|
|
215
|
+
viewModel.t = t
|
|
203
216
|
return h.view(viewName, viewModel)
|
|
204
217
|
}
|
|
205
218
|
}
|
|
@@ -270,7 +283,8 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
270
283
|
checkEmailAddressForLiveFormSubmission(notificationEmail, isPreview)
|
|
271
284
|
|
|
272
285
|
if (notificationEmail) {
|
|
273
|
-
const
|
|
286
|
+
const translator = this.getTranslator(request)
|
|
287
|
+
const viewModel = this.getSummaryViewModel(request, context, translator)
|
|
274
288
|
|
|
275
289
|
try {
|
|
276
290
|
await submitForm(
|
|
@@ -279,7 +293,8 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
279
293
|
request,
|
|
280
294
|
viewModel,
|
|
281
295
|
model,
|
|
282
|
-
notificationEmail
|
|
296
|
+
notificationEmail,
|
|
297
|
+
translator
|
|
283
298
|
)
|
|
284
299
|
} catch (error) {
|
|
285
300
|
return this.handleSubmissionError(error, request, h)
|
|
@@ -388,12 +403,17 @@ export class SummaryPageController extends QuestionPageController {
|
|
|
388
403
|
request: FormRequestPayload,
|
|
389
404
|
h: FormResponseToolkit
|
|
390
405
|
) {
|
|
406
|
+
const { t } = this.getTranslator(request)
|
|
407
|
+
|
|
391
408
|
const helpUrl = error.helpLink ?? DEFAULT_PAYMENT_HELP_URL
|
|
392
|
-
const
|
|
409
|
+
const contactUsLink = `<a href="${helpUrl}" target="_blank" rel="noopener noreferrer" class="govuk-link">${t('pages.summary.contactUsLinkText')}</a>`
|
|
410
|
+
const helpLinkHtml = t('pages.summary.submissionFailedContactSuffix', {
|
|
411
|
+
contactUsLink
|
|
412
|
+
})
|
|
393
413
|
|
|
394
414
|
const govukError = createError(
|
|
395
415
|
'submission',
|
|
396
|
-
|
|
416
|
+
`${t('pages.summary.submissionFailed')}${helpLinkHtml}.`
|
|
397
417
|
)
|
|
398
418
|
|
|
399
419
|
request.yar.flash(COMPONENT_STATE_ERROR, govukError, true)
|
|
@@ -420,7 +440,8 @@ export async function submitForm(
|
|
|
420
440
|
request: FormRequestPayload,
|
|
421
441
|
summaryViewModel: SummaryViewModel,
|
|
422
442
|
model: FormModel,
|
|
423
|
-
emailAddress: string
|
|
443
|
+
emailAddress: string,
|
|
444
|
+
translator: Translator
|
|
424
445
|
) {
|
|
425
446
|
await finaliseComponents(request, formMetadata, context, model)
|
|
426
447
|
|
|
@@ -434,6 +455,7 @@ export async function submitForm(
|
|
|
434
455
|
const items = getFormSubmissionData(
|
|
435
456
|
summaryViewModel.context,
|
|
436
457
|
summaryViewModel.details,
|
|
458
|
+
translator,
|
|
437
459
|
model
|
|
438
460
|
)
|
|
439
461
|
|
|
@@ -444,6 +466,7 @@ export async function submitForm(
|
|
|
444
466
|
items,
|
|
445
467
|
emailAddress,
|
|
446
468
|
request.yar.id,
|
|
469
|
+
translator,
|
|
447
470
|
summaryViewModel.context.referenceNumber
|
|
448
471
|
)
|
|
449
472
|
|
|
@@ -523,6 +546,7 @@ function submitData(
|
|
|
523
546
|
items: DetailItem[],
|
|
524
547
|
retrievalKey: string,
|
|
525
548
|
sessionId: string,
|
|
549
|
+
translator: Translator,
|
|
526
550
|
referenceNumber: string
|
|
527
551
|
) {
|
|
528
552
|
const { formSubmissionService } = model.services
|
|
@@ -532,8 +556,8 @@ function submitData(
|
|
|
532
556
|
sessionId,
|
|
533
557
|
retrievalKey,
|
|
534
558
|
referenceNumber,
|
|
535
|
-
main: buildMainRecords(items),
|
|
536
|
-
repeaters: buildRepeaterRecords(items)
|
|
559
|
+
main: buildMainRecords(items, translator),
|
|
560
|
+
repeaters: buildRepeaterRecords(items, translator)
|
|
537
561
|
}
|
|
538
562
|
return submit(payload)
|
|
539
563
|
}
|
|
@@ -541,6 +565,7 @@ function submitData(
|
|
|
541
565
|
export function getFormSubmissionData(
|
|
542
566
|
context: FormContext,
|
|
543
567
|
details: Detail[],
|
|
568
|
+
translator: Translator,
|
|
544
569
|
model: FormModel
|
|
545
570
|
) {
|
|
546
571
|
const items = context.relevantPages
|
|
@@ -551,7 +576,7 @@ export function getFormSubmissionData(
|
|
|
551
576
|
)
|
|
552
577
|
.flat()
|
|
553
578
|
|
|
554
|
-
const paymentItems = getPaymentFieldItems(context, model)
|
|
579
|
+
const paymentItems = getPaymentFieldItems(context, translator, model)
|
|
555
580
|
|
|
556
581
|
return [...items, ...paymentItems]
|
|
557
582
|
}
|
|
@@ -562,6 +587,7 @@ export function getFormSubmissionData(
|
|
|
562
587
|
*/
|
|
563
588
|
function getPaymentFieldItems(
|
|
564
589
|
context: FormContext,
|
|
590
|
+
translator: Translator,
|
|
565
591
|
model: FormModel
|
|
566
592
|
): DetailItemField[] {
|
|
567
593
|
const items: DetailItemField[] = []
|
|
@@ -577,7 +603,7 @@ function getPaymentFieldItems(
|
|
|
577
603
|
field,
|
|
578
604
|
state: context.state,
|
|
579
605
|
href: page.href,
|
|
580
|
-
value: field.getDisplayStringFromState(context.state)
|
|
606
|
+
value: field.getDisplayStringFromState(context.state, translator)
|
|
581
607
|
})
|
|
582
608
|
}
|
|
583
609
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { t as resolveKey } from '../../i18n/index.js'
|
|
2
|
+
import { type Translator } from '../../i18n/types.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Shared Translator stub for tests where translation content is not the focus.
|
|
6
|
+
* Uses the real English i18n keys so tests that assert on English text still pass.
|
|
7
|
+
* Each tX function resolves the entity's property via the real English t() so
|
|
8
|
+
* i18n key constants (e.g. 'components.yesNoField.yes') resolve to their English
|
|
9
|
+
* values ("Yes") rather than being returned verbatim.
|
|
10
|
+
*/
|
|
11
|
+
function resolveEntity(entity: unknown, prop: string): string {
|
|
12
|
+
if (typeof entity !== 'object' || entity === null) return ''
|
|
13
|
+
const raw =
|
|
14
|
+
((entity as Record<string, unknown>)[prop] as string | undefined) ?? ''
|
|
15
|
+
if (!raw) return ''
|
|
16
|
+
return resolveKey(raw, 'en-GB') || raw
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const stubTranslator: Translator = {
|
|
20
|
+
t: (key: string, opts?: Record<string, unknown>) =>
|
|
21
|
+
resolveKey(key, 'en-GB', opts),
|
|
22
|
+
tForm: (prop) => resolveEntity({}, prop),
|
|
23
|
+
tPage: (entity, prop) => resolveEntity(entity, prop as string),
|
|
24
|
+
tComponent: (entity, prop) => resolveEntity(entity, prop as string),
|
|
25
|
+
tSection: (entity, prop) => resolveEntity(entity, prop as string),
|
|
26
|
+
tListItem: (entity, prop) => resolveEntity(entity, prop as string),
|
|
27
|
+
language: 'en-GB'
|
|
28
|
+
}
|
|
@@ -65,12 +65,14 @@ export class PaymentSubmissionError extends Error {
|
|
|
65
65
|
static checkPaymentAmount(
|
|
66
66
|
stateAmount: number,
|
|
67
67
|
expectedAmount: number | undefined,
|
|
68
|
-
component: FormComponent
|
|
68
|
+
component: FormComponent,
|
|
69
|
+
t: (key: string) => string
|
|
69
70
|
) {
|
|
70
71
|
if (stateAmount / 100 !== expectedAmount) {
|
|
72
|
+
const message = t('components.paymentField.paymentAmountMismatch')
|
|
71
73
|
throw new PaymentPreAuthError(
|
|
72
74
|
component,
|
|
73
|
-
|
|
75
|
+
message,
|
|
74
76
|
true,
|
|
75
77
|
PaymentErrorTypes.PaymentIncomplete
|
|
76
78
|
)
|
|
@@ -3,6 +3,7 @@ import { type SubmitPayload } from '@defra/forms-model'
|
|
|
3
3
|
import { GeospatialField } from '../../components/GeospatialField.js'
|
|
4
4
|
import { PaymentField } from '../../components/PaymentField.js'
|
|
5
5
|
import { getAnswer } from '../../components/helpers/components.js'
|
|
6
|
+
import { type Translator } from '../../i18n/types.js'
|
|
6
7
|
import {
|
|
7
8
|
type DetailItem,
|
|
8
9
|
type DetailItemField
|
|
@@ -23,7 +24,10 @@ export interface SubmitRecord {
|
|
|
23
24
|
* Regular fields are converted to single records, while PaymentField
|
|
24
25
|
* components are expanded into four separate records.
|
|
25
26
|
*/
|
|
26
|
-
export function buildMainRecords(
|
|
27
|
+
export function buildMainRecords(
|
|
28
|
+
items: DetailItem[],
|
|
29
|
+
translator: Translator
|
|
30
|
+
): SubmitRecord[] {
|
|
27
31
|
const fieldItems = items.filter(
|
|
28
32
|
(item): item is DetailItemField => 'field' in item
|
|
29
33
|
)
|
|
@@ -46,7 +50,7 @@ export function buildMainRecords(items: DetailItem[]): SubmitRecord[] {
|
|
|
46
50
|
records.push({
|
|
47
51
|
name: item.name,
|
|
48
52
|
title: item.label,
|
|
49
|
-
value: getAnswer(item.field, item.state, { format: 'data' })
|
|
53
|
+
value: getAnswer(item.field, item.state, translator, { format: 'data' })
|
|
50
54
|
})
|
|
51
55
|
}
|
|
52
56
|
}
|
|
@@ -102,7 +106,8 @@ export function buildPaymentRecords(item: DetailItemField): SubmitRecord[] {
|
|
|
102
106
|
* Builds the repeater submission records from repeater items.
|
|
103
107
|
*/
|
|
104
108
|
export function buildRepeaterRecords(
|
|
105
|
-
items: DetailItem[]
|
|
109
|
+
items: DetailItem[],
|
|
110
|
+
translator: Translator
|
|
106
111
|
): SubmitPayload['repeaters'] {
|
|
107
112
|
return items
|
|
108
113
|
.filter((item) => 'subItems' in item)
|
|
@@ -119,7 +124,9 @@ export function buildRepeaterRecords(
|
|
|
119
124
|
const formValue = subItem.field.getFormValueFromState(subItem.state)
|
|
120
125
|
value = formValue === undefined ? '' : JSON.stringify(formValue)
|
|
121
126
|
} else {
|
|
122
|
-
value = getAnswer(subItem.field, subItem.state, {
|
|
127
|
+
value = getAnswer(subItem.field, subItem.state, translator, {
|
|
128
|
+
format: 'data'
|
|
129
|
+
})
|
|
123
130
|
}
|
|
124
131
|
|
|
125
132
|
return {
|