@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
|
@@ -2,9 +2,11 @@ import { type FormMetadata, type PaymentFieldComponent } from '@defra/forms-mode
|
|
|
2
2
|
import { type ObjectSchema } from 'joi';
|
|
3
3
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
4
4
|
import { type PaymentState } from '../../../../server/plugins/engine/components/PaymentField.types.js';
|
|
5
|
+
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
6
|
+
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
5
7
|
import { type FormModel } from '../../../../server/plugins/engine/models/index.js';
|
|
6
8
|
import { type FormContext, type FormRequestPayload, type FormResponseToolkit } from '../../../../server/plugins/engine/types/index.js';
|
|
7
|
-
import { type ErrorMessageTemplateList, type
|
|
9
|
+
import { type ErrorMessageTemplateList, type FormState, type FormStateValue, type FormSubmissionState, type PaymentExternalArgs } from '../../../../server/plugins/engine/types.js';
|
|
8
10
|
export declare class PaymentField extends FormComponent {
|
|
9
11
|
options: PaymentFieldComponent['options'];
|
|
10
12
|
formSchema: ObjectSchema;
|
|
@@ -15,8 +17,8 @@ export declare class PaymentField extends FormComponent {
|
|
|
15
17
|
* Gets the PaymentState from form submission state
|
|
16
18
|
*/
|
|
17
19
|
getPaymentStateFromState(state: FormSubmissionState): PaymentState | undefined;
|
|
18
|
-
getDisplayStringFromState(state: FormSubmissionState): string;
|
|
19
|
-
getViewModel(
|
|
20
|
+
getDisplayStringFromState(state: FormSubmissionState, _translator: Translator): string;
|
|
21
|
+
getViewModel(context: RenderContext): {
|
|
20
22
|
amount: string;
|
|
21
23
|
description: string;
|
|
22
24
|
paymentState: PaymentState | undefined;
|
|
@@ -31,11 +33,11 @@ export declare class PaymentField extends FormComponent {
|
|
|
31
33
|
id?: string;
|
|
32
34
|
text: string;
|
|
33
35
|
};
|
|
34
|
-
prefix?: import("../../../../server/plugins/engine/types
|
|
35
|
-
suffix?: import("../../../../server/plugins/engine/types
|
|
36
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
37
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
36
38
|
classes?: string;
|
|
37
39
|
condition?: string;
|
|
38
|
-
errors?: FormSubmissionError[];
|
|
40
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
39
41
|
errorMessage?: {
|
|
40
42
|
text: string;
|
|
41
43
|
};
|
|
@@ -48,21 +50,21 @@ export declare class PaymentField extends FormComponent {
|
|
|
48
50
|
accept?: string;
|
|
49
51
|
inputmode?: string;
|
|
50
52
|
};
|
|
51
|
-
content?: import("../../../../server/plugins/engine/types
|
|
53
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
52
54
|
maxlength?: number;
|
|
53
55
|
maxwords?: number;
|
|
54
56
|
rows?: number;
|
|
55
|
-
items?: import("../../../../server/plugins/engine/types
|
|
57
|
+
items?: import("../../../../server/plugins/engine/components/types.js").ListItem[] | import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
56
58
|
fieldset?: {
|
|
57
59
|
attributes?: string | Record<string, string>;
|
|
58
|
-
legend?: import("../../../../server/plugins/engine/types
|
|
60
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
59
61
|
};
|
|
60
62
|
formGroup?: {
|
|
61
63
|
classes?: string;
|
|
62
64
|
attributes?: string | Record<string, string>;
|
|
63
65
|
};
|
|
64
66
|
showFieldsetError?: boolean;
|
|
65
|
-
components?: import("../../../../server/plugins/engine/types
|
|
67
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
66
68
|
upload?: {
|
|
67
69
|
count: number;
|
|
68
70
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
@@ -7,6 +7,7 @@ import { FormComponent } from "./FormComponent.js";
|
|
|
7
7
|
import { createError, getPluginOptions } from "../helpers.js";
|
|
8
8
|
import { PaymentErrorTypes, PaymentPreAuthError, PaymentSubmissionError } from "../pageControllers/errors.js";
|
|
9
9
|
import { createPaymentService, formatCurrency } from "../../payment/helper.js";
|
|
10
|
+
import { resolveLanguage } from "../../../utils/utils.js";
|
|
10
11
|
export class PaymentField extends FormComponent {
|
|
11
12
|
isAppendageStateSingleObject = true;
|
|
12
13
|
constructor(def, props) {
|
|
@@ -39,15 +40,18 @@ export class PaymentField extends FormComponent {
|
|
|
39
40
|
const value = state[this.name];
|
|
40
41
|
return this.isPaymentState(value) ? value : undefined;
|
|
41
42
|
}
|
|
42
|
-
getDisplayStringFromState(state) {
|
|
43
|
+
getDisplayStringFromState(state, _translator) {
|
|
43
44
|
const value = this.getPaymentStateFromState(state);
|
|
44
45
|
if (!value) {
|
|
45
46
|
return '';
|
|
46
47
|
}
|
|
47
48
|
return `${formatCurrency(value.amount)} - ${value.description}`;
|
|
48
49
|
}
|
|
49
|
-
getViewModel(
|
|
50
|
-
const
|
|
50
|
+
getViewModel(context) {
|
|
51
|
+
const {
|
|
52
|
+
payload
|
|
53
|
+
} = context;
|
|
54
|
+
const viewModel = super.getViewModel(context);
|
|
51
55
|
|
|
52
56
|
// Payload is pre-populated from state if a payment has already been made
|
|
53
57
|
const paymentState = this.isPaymentState(payload[this.name]) ? payload[this.name] : undefined;
|
|
@@ -153,6 +157,10 @@ export class PaymentField extends FormComponent {
|
|
|
153
157
|
const {
|
|
154
158
|
model
|
|
155
159
|
} = args.controller;
|
|
160
|
+
const language = resolveLanguage(request);
|
|
161
|
+
const {
|
|
162
|
+
t
|
|
163
|
+
} = model.createTranslator(language);
|
|
156
164
|
const state = await args.controller.getState(request);
|
|
157
165
|
const {
|
|
158
166
|
baseUrl
|
|
@@ -189,7 +197,7 @@ export class PaymentField extends FormComponent {
|
|
|
189
197
|
slug
|
|
190
198
|
}, prefilledEmail);
|
|
191
199
|
if (!payment) {
|
|
192
|
-
const message = isLivePayment ? '
|
|
200
|
+
const message = isLivePayment ? t('components.paymentField.cannotTakePayment') : t('components.paymentField.testApiKey');
|
|
193
201
|
const govukError = createError(componentName, message);
|
|
194
202
|
request.yar.flash(COMPONENT_STATE_ERROR, govukError, true);
|
|
195
203
|
return h.redirect(`${request.url.pathname}${request.url.search}`).code(StatusCodes.SEE_OTHER);
|
|
@@ -215,6 +223,11 @@ export class PaymentField extends FormComponent {
|
|
|
215
223
|
* @see https://docs.payments.service.gov.uk/delayed_capture/#delay-taking-a-payment
|
|
216
224
|
*/
|
|
217
225
|
async onSubmit(request, _metadata, context) {
|
|
226
|
+
const language = resolveLanguage(request);
|
|
227
|
+
const {
|
|
228
|
+
t
|
|
229
|
+
} = this.model.createTranslator(language);
|
|
230
|
+
|
|
218
231
|
// Zero-amount bypass — no capture needed
|
|
219
232
|
const resolvedAmount = PaymentField.resolveAmount(this.options, this.model, context.state);
|
|
220
233
|
if (resolvedAmount === 0) {
|
|
@@ -222,7 +235,7 @@ export class PaymentField extends FormComponent {
|
|
|
222
235
|
}
|
|
223
236
|
const paymentState = this.getPaymentStateFromState(context.state);
|
|
224
237
|
if (!paymentState) {
|
|
225
|
-
throw new PaymentPreAuthError(this, '
|
|
238
|
+
throw new PaymentPreAuthError(this, t('components.paymentField.completePayment'), true, PaymentErrorTypes.PaymentIncomplete);
|
|
226
239
|
}
|
|
227
240
|
if (paymentState.capture?.status === 'success') {
|
|
228
241
|
return;
|
|
@@ -239,17 +252,17 @@ export class PaymentField extends FormComponent {
|
|
|
239
252
|
* @see https://docs.payments.service.gov.uk/api_reference/#payment-status-lifecycle
|
|
240
253
|
*/
|
|
241
254
|
const status = await paymentService.getPaymentStatus(paymentId, isLivePayment);
|
|
242
|
-
PaymentSubmissionError.checkPaymentAmount(status.amount, resolvedAmount, this);
|
|
255
|
+
PaymentSubmissionError.checkPaymentAmount(status.amount, resolvedAmount, this, t);
|
|
243
256
|
if (status.state.status === 'success') {
|
|
244
257
|
await this.markPaymentCaptured(request, paymentState);
|
|
245
258
|
return;
|
|
246
259
|
}
|
|
247
260
|
if (status.state.status !== 'capturable') {
|
|
248
|
-
throw new PaymentPreAuthError(this, '
|
|
261
|
+
throw new PaymentPreAuthError(this, t('components.paymentField.paymentExpired'), true, PaymentErrorTypes.PaymentExpired);
|
|
249
262
|
}
|
|
250
263
|
const captured = await paymentService.capturePayment(paymentId, status.amount);
|
|
251
264
|
if (!captured) {
|
|
252
|
-
throw new PaymentPreAuthError(this, '
|
|
265
|
+
throw new PaymentPreAuthError(this, t('components.paymentField.submissionFailed'), false);
|
|
253
266
|
}
|
|
254
267
|
await this.markPaymentCaptured(request, paymentState);
|
|
255
268
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentField.js","names":["randomUUID","StatusCodes","joi","logger","COMPONENT_STATE_ERROR","FormComponent","createError","getPluginOptions","PaymentErrorTypes","PaymentPreAuthError","PaymentSubmissionError","createPaymentService","formatCurrency","PaymentField","isAppendageStateSingleObject","constructor","def","props","options","paymentStateSchema","object","paymentId","string","required","reference","amount","number","description","uuid","formId","isLivePayment","boolean","preAuth","status","valid","createdAt","isoDate","unknown","label","formSchema","stateSchema","getPaymentStateFromState","state","value","name","isPaymentState","undefined","getDisplayStringFromState","getViewModel","payload","errors","viewModel","paymentState","Array","isArray","isState","getFormValue","getContextValueFromState","getAllPossibleErrors","baseErrors","type","template","advancedSettingsErrors","resolveAmount","model","conditionalAmounts","length","condition","conditions","warn","fn","dispatcher","request","h","args","componentName","component","controller","getState","baseUrl","server","summaryUrl","basePath","existingPaymentState","redirect","code","SEE_OTHER","isLive","isPreview","formsService","services","paymentService","$$__referenceNumber","resolvedAmount","slug","payCallbackUrl","paymentPageUrl","sourceUrl","prefilledEmail","userConfirmationEmail","userConfirmationEmailAddress","amountInPence","Math","round","payment","createPayment","message","govukError","yar","flash","url","pathname","search","sessionData","returnUrl","failureUrl","set","paymentUrl","onSubmit","_metadata","context","PaymentIncomplete","capture","getPaymentStatus","checkPaymentAmount","markPaymentCaptured","PaymentExpired","captured","capturePayment","updatedState","Date","toISOString","page","currentState","mergeState"],"sources":["../../../../../src/server/plugins/engine/components/PaymentField.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\n\nimport {\n type FormMetadata,\n type PaymentFieldComponent\n} from '@defra/forms-model'\nimport { StatusCodes } from 'http-status-codes'\nimport joi, { type ObjectSchema } from 'joi'\n\nimport { logger } from '~/src/server/common/helpers/logging/logger.js'\nimport { COMPONENT_STATE_ERROR } from '~/src/server/constants.js'\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type PaymentState } from '~/src/server/plugins/engine/components/PaymentField.types.js'\nimport {\n createError,\n getPluginOptions\n} from '~/src/server/plugins/engine/helpers.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n PaymentErrorTypes,\n PaymentPreAuthError,\n PaymentSubmissionError\n} from '~/src/server/plugins/engine/pageControllers/errors.js'\nimport {\n type FormContext,\n type FormRequestPayload,\n type FormResponseToolkit\n} from '~/src/server/plugins/engine/types/index.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState,\n type PaymentExternalArgs\n} from '~/src/server/plugins/engine/types.js'\nimport {\n createPaymentService,\n formatCurrency\n} from '~/src/server/plugins/payment/helper.js'\n\nexport class PaymentField extends FormComponent {\n declare options: PaymentFieldComponent['options']\n declare formSchema: ObjectSchema\n declare stateSchema: ObjectSchema\n isAppendageStateSingleObject = true\n\n constructor(\n def: PaymentFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n this.options = def.options\n\n const paymentStateSchema = joi\n .object({\n paymentId: joi.string().required(),\n reference: joi.string().required(),\n amount: joi.number().required(),\n description: joi.string().required(),\n uuid: joi.string().uuid().required(),\n formId: joi.string().required(),\n isLivePayment: joi.boolean().required(),\n preAuth: joi\n .object({\n status: joi\n .string()\n .valid('success', 'failed', 'started')\n .required(),\n createdAt: joi.string().isoDate().required()\n })\n .required()\n })\n .unknown(true)\n .label(this.label)\n\n this.formSchema = paymentStateSchema\n // 'required()' forces the payment page to be invalid until we have valid payment state\n // i.e. the user will automatically be directed back to the payment page\n // if they attempt to access future pages when no payment entered yet\n this.stateSchema = paymentStateSchema.required()\n }\n\n /**\n * Gets the PaymentState from form submission state\n */\n getPaymentStateFromState(\n state: FormSubmissionState\n ): PaymentState | undefined {\n const value = state[this.name]\n return this.isPaymentState(value) ? value : undefined\n }\n\n getDisplayStringFromState(state: FormSubmissionState): string {\n const value = this.getPaymentStateFromState(state)\n\n if (!value) {\n return ''\n }\n\n return `${formatCurrency(value.amount)} - ${value.description}`\n }\n\n getViewModel(payload: FormPayload, errors?: FormSubmissionError[]) {\n const viewModel = super.getViewModel(payload, errors)\n\n // Payload is pre-populated from state if a payment has already been made\n const paymentState = this.isPaymentState(payload[this.name] as unknown)\n ? (payload[this.name] as unknown as PaymentState)\n : undefined\n\n // Use payment state amount if pre-authorized, otherwise use default.\n // The page controller overrides this with the resolved conditional amount\n // using the full form state (which getViewModel doesn't have access to).\n const amount = paymentState?.amount ?? this.options.amount\n\n return {\n ...viewModel,\n amount: formatCurrency(amount),\n description: this.options.description,\n paymentState\n }\n }\n\n /**\n * Type guard to check if value is PaymentState\n */\n isPaymentState(value: unknown): value is PaymentState {\n return PaymentField.isPaymentState(value)\n }\n\n /**\n * Static type guard to check if value is PaymentState\n */\n static isPaymentState(value: unknown): value is PaymentState {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n\n const state = value as PaymentState\n return (\n typeof state.paymentId === 'string' &&\n typeof state.amount === 'number' &&\n typeof state.description === 'string'\n )\n }\n\n /**\n * Override base isState to validate PaymentState\n */\n isState(value?: FormStateValue | FormState): value is FormState {\n return this.isPaymentState(value)\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isPaymentState(value)\n ? (value as unknown as NonNullable<FormStateValue>)\n : undefined\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n return this.isPaymentState(state)\n ? `Reference: ${state.reference}\\nAmount: ${formatCurrency(state.amount)}`\n : ''\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return PaymentField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n {\n type: 'paymentRequired',\n template: 'Complete the payment to continue'\n }\n ],\n advancedSettingsErrors: []\n }\n }\n\n /**\n * Resolves the payment amount from conditional amounts configuration.\n * Evaluates conditions in order; first true condition wins.\n * Falls back to the default options.amount.\n */\n static resolveAmount(\n options: PaymentFieldComponent['options'],\n model: FormModel,\n state: FormState\n ): number {\n const { conditionalAmounts } = options\n\n if (!conditionalAmounts?.length) {\n return options.amount\n }\n\n for (const { condition, amount } of conditionalAmounts) {\n if (!model.conditions[condition]) {\n logger.warn(\n `[payment] Condition '${condition}' not found in form conditions. Skipping.`\n )\n continue\n }\n if (model.conditions[condition].fn(state)) {\n return amount\n }\n }\n\n return options.amount\n }\n\n /**\n * Dispatcher for external redirect to GOV.UK Pay\n */\n static async dispatcher(\n request: FormRequestPayload,\n h: FormResponseToolkit,\n args: PaymentExternalArgs\n ): Promise<unknown> {\n const { options, name: componentName } = args.component\n const { model } = args.controller\n\n const state = await args.controller.getState(request)\n const { baseUrl } = getPluginOptions(request.server)\n const summaryUrl = `${baseUrl}/${model.basePath}/summary`\n\n const existingPaymentState = state[componentName]\n if (\n PaymentField.isPaymentState(existingPaymentState) &&\n existingPaymentState.preAuth?.status === 'success'\n ) {\n return h.redirect(summaryUrl).code(StatusCodes.SEE_OTHER)\n }\n\n const isLivePayment = args.isLive && !args.isPreview\n const formId = args.controller.model.formId\n const formsService = model.services.formsService\n const paymentService = await createPaymentService(\n isLivePayment,\n formId,\n formsService\n )\n\n const uuid = randomUUID()\n\n const reference = state.$$__referenceNumber as string\n const resolvedAmount = PaymentField.resolveAmount(options, model, state)\n\n // Zero-amount safety net (page skip should prevent this, but defensive)\n if (resolvedAmount === 0) {\n return h.redirect(summaryUrl).code(StatusCodes.SEE_OTHER)\n }\n\n const description = options.description\n\n const slug = `/${model.basePath}`\n\n const payCallbackUrl = `${baseUrl}/payment-callback?uuid=${uuid}`\n const paymentPageUrl = args.sourceUrl\n\n let prefilledEmail: string | undefined\n const userConfirmationEmail = state.userConfirmationEmailAddress\n if (typeof userConfirmationEmail === 'string' && userConfirmationEmail) {\n prefilledEmail = userConfirmationEmail\n }\n\n const amountInPence = Math.round(resolvedAmount * 100)\n const payment = await paymentService.createPayment(\n amountInPence,\n description,\n payCallbackUrl,\n reference,\n isLivePayment,\n { formId, slug },\n prefilledEmail\n )\n\n if (!payment) {\n const message = isLivePayment\n ? 'There is a problem and we cannot take a payment. Contact us (details in the footer of this form) or save your progress and return to the form later.'\n : 'Add a valid test API key before you can preview the payment journey.'\n const govukError = createError(componentName, message)\n request.yar.flash(COMPONENT_STATE_ERROR, govukError, true)\n return h\n .redirect(`${request.url.pathname}${request.url.search}`)\n .code(StatusCodes.SEE_OTHER)\n }\n\n const sessionData: PaymentSessionData = {\n uuid,\n formId,\n reference,\n amount: resolvedAmount,\n description,\n paymentId: payment.paymentId,\n componentName,\n returnUrl: summaryUrl,\n failureUrl: paymentPageUrl,\n isLivePayment\n }\n\n request.yar.set(`payment-${uuid}`, sessionData)\n\n return h.redirect(payment.paymentUrl).code(StatusCodes.SEE_OTHER)\n }\n\n /**\n * Called on form submission to capture the payment\n * @see https://docs.payments.service.gov.uk/delayed_capture/#delay-taking-a-payment\n */\n async onSubmit(\n request: FormRequestPayload,\n _metadata: FormMetadata,\n context: FormContext\n ): Promise<void> {\n // Zero-amount bypass — no capture needed\n const resolvedAmount = PaymentField.resolveAmount(\n this.options,\n this.model,\n context.state\n )\n if (resolvedAmount === 0) {\n return\n }\n\n const paymentState = this.getPaymentStateFromState(context.state)\n\n if (!paymentState) {\n throw new PaymentPreAuthError(\n this,\n 'Complete the payment to continue',\n true,\n PaymentErrorTypes.PaymentIncomplete\n )\n }\n\n if (paymentState.capture?.status === 'success') {\n return\n }\n\n const { paymentId, isLivePayment, formId } = paymentState\n const formsService = this.model.services.formsService\n const paymentService = await createPaymentService(\n isLivePayment,\n formId,\n formsService\n )\n\n /**\n * @see https://docs.payments.service.gov.uk/api_reference/#payment-status-lifecycle\n */\n const status = await paymentService.getPaymentStatus(\n paymentId,\n isLivePayment\n )\n\n PaymentSubmissionError.checkPaymentAmount(\n status.amount,\n resolvedAmount,\n this\n )\n\n if (status.state.status === 'success') {\n await this.markPaymentCaptured(request, paymentState)\n return\n }\n\n if (status.state.status !== 'capturable') {\n throw new PaymentPreAuthError(\n this,\n 'Your payment authorisation has expired. Please add your payment details again.',\n true,\n PaymentErrorTypes.PaymentExpired\n )\n }\n\n const captured = await paymentService.capturePayment(\n paymentId,\n status.amount\n )\n\n if (!captured) {\n throw new PaymentPreAuthError(\n this,\n 'There was a problem and your form was not submitted. Try submitting the form again.',\n false\n )\n }\n\n await this.markPaymentCaptured(request, paymentState)\n }\n\n /**\n * Updates payment state to mark capture as successful\n * This ensures we don't try to re-capture on submission retry\n */\n private async markPaymentCaptured(\n request: FormRequestPayload,\n paymentState: PaymentState\n ): Promise<void> {\n const updatedState: PaymentState = {\n ...paymentState,\n capture: {\n status: 'success',\n createdAt: new Date().toISOString()\n }\n }\n\n if (this.page) {\n const currentState = await this.page.getState(request)\n await this.page.mergeState(request, currentState, {\n [this.name]: updatedState\n })\n }\n }\n}\n\n/**\n * Session data stored when dispatching to GOV.UK Pay\n */\nexport interface PaymentSessionData {\n uuid: string\n formId: string\n reference: string\n amount: number\n description: string\n paymentId: string\n componentName: string\n returnUrl: string\n failureUrl: string\n isLivePayment: boolean\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"PaymentField.js","names":["randomUUID","StatusCodes","joi","logger","COMPONENT_STATE_ERROR","FormComponent","createError","getPluginOptions","PaymentErrorTypes","PaymentPreAuthError","PaymentSubmissionError","createPaymentService","formatCurrency","resolveLanguage","PaymentField","isAppendageStateSingleObject","constructor","def","props","options","paymentStateSchema","object","paymentId","string","required","reference","amount","number","description","uuid","formId","isLivePayment","boolean","preAuth","status","valid","createdAt","isoDate","unknown","label","formSchema","stateSchema","getPaymentStateFromState","state","value","name","isPaymentState","undefined","getDisplayStringFromState","_translator","getViewModel","context","payload","viewModel","paymentState","Array","isArray","isState","getFormValue","getContextValueFromState","getAllPossibleErrors","baseErrors","type","template","advancedSettingsErrors","resolveAmount","model","conditionalAmounts","length","condition","conditions","warn","fn","dispatcher","request","h","args","componentName","component","controller","language","t","createTranslator","getState","baseUrl","server","summaryUrl","basePath","existingPaymentState","redirect","code","SEE_OTHER","isLive","isPreview","formsService","services","paymentService","$$__referenceNumber","resolvedAmount","slug","payCallbackUrl","paymentPageUrl","sourceUrl","prefilledEmail","userConfirmationEmail","userConfirmationEmailAddress","amountInPence","Math","round","payment","createPayment","message","govukError","yar","flash","url","pathname","search","sessionData","returnUrl","failureUrl","set","paymentUrl","onSubmit","_metadata","PaymentIncomplete","capture","getPaymentStatus","checkPaymentAmount","markPaymentCaptured","PaymentExpired","captured","capturePayment","updatedState","Date","toISOString","page","currentState","mergeState"],"sources":["../../../../../src/server/plugins/engine/components/PaymentField.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\n\nimport {\n type FormMetadata,\n type PaymentFieldComponent\n} from '@defra/forms-model'\nimport { StatusCodes } from 'http-status-codes'\nimport joi, { type ObjectSchema } from 'joi'\n\nimport { logger } from '~/src/server/common/helpers/logging/logger.js'\nimport { COMPONENT_STATE_ERROR } from '~/src/server/constants.js'\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type PaymentState } from '~/src/server/plugins/engine/components/PaymentField.types.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport {\n createError,\n getPluginOptions\n} from '~/src/server/plugins/engine/helpers.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n PaymentErrorTypes,\n PaymentPreAuthError,\n PaymentSubmissionError\n} from '~/src/server/plugins/engine/pageControllers/errors.js'\nimport {\n type FormContext,\n type FormRequestPayload,\n type FormResponseToolkit\n} from '~/src/server/plugins/engine/types/index.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState,\n type PaymentExternalArgs\n} from '~/src/server/plugins/engine/types.js'\nimport {\n createPaymentService,\n formatCurrency\n} from '~/src/server/plugins/payment/helper.js'\nimport { resolveLanguage } from '~/src/server/utils/utils.js'\n\nexport class PaymentField extends FormComponent {\n declare options: PaymentFieldComponent['options']\n declare formSchema: ObjectSchema\n declare stateSchema: ObjectSchema\n isAppendageStateSingleObject = true\n\n constructor(\n def: PaymentFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n this.options = def.options\n\n const paymentStateSchema = joi\n .object({\n paymentId: joi.string().required(),\n reference: joi.string().required(),\n amount: joi.number().required(),\n description: joi.string().required(),\n uuid: joi.string().uuid().required(),\n formId: joi.string().required(),\n isLivePayment: joi.boolean().required(),\n preAuth: joi\n .object({\n status: joi\n .string()\n .valid('success', 'failed', 'started')\n .required(),\n createdAt: joi.string().isoDate().required()\n })\n .required()\n })\n .unknown(true)\n .label(this.label)\n\n this.formSchema = paymentStateSchema\n // 'required()' forces the payment page to be invalid until we have valid payment state\n // i.e. the user will automatically be directed back to the payment page\n // if they attempt to access future pages when no payment entered yet\n this.stateSchema = paymentStateSchema.required()\n }\n\n /**\n * Gets the PaymentState from form submission state\n */\n getPaymentStateFromState(\n state: FormSubmissionState\n ): PaymentState | undefined {\n const value = state[this.name]\n return this.isPaymentState(value) ? value : undefined\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n _translator: Translator\n ): string {\n const value = this.getPaymentStateFromState(state)\n\n if (!value) {\n return ''\n }\n\n return `${formatCurrency(value.amount)} - ${value.description}`\n }\n\n getViewModel(context: RenderContext) {\n const { payload } = context\n const viewModel = super.getViewModel(context)\n\n // Payload is pre-populated from state if a payment has already been made\n const paymentState = this.isPaymentState(payload[this.name] as unknown)\n ? (payload[this.name] as unknown as PaymentState)\n : undefined\n\n // Use payment state amount if pre-authorized, otherwise use default.\n // The page controller overrides this with the resolved conditional amount\n // using the full form state (which getViewModel doesn't have access to).\n const amount = paymentState?.amount ?? this.options.amount\n\n return {\n ...viewModel,\n amount: formatCurrency(amount),\n description: this.options.description,\n paymentState\n }\n }\n\n /**\n * Type guard to check if value is PaymentState\n */\n isPaymentState(value: unknown): value is PaymentState {\n return PaymentField.isPaymentState(value)\n }\n\n /**\n * Static type guard to check if value is PaymentState\n */\n static isPaymentState(value: unknown): value is PaymentState {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n\n const state = value as PaymentState\n return (\n typeof state.paymentId === 'string' &&\n typeof state.amount === 'number' &&\n typeof state.description === 'string'\n )\n }\n\n /**\n * Override base isState to validate PaymentState\n */\n isState(value?: FormStateValue | FormState): value is FormState {\n return this.isPaymentState(value)\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isPaymentState(value)\n ? (value as unknown as NonNullable<FormStateValue>)\n : undefined\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n return this.isPaymentState(state)\n ? `Reference: ${state.reference}\\nAmount: ${formatCurrency(state.amount)}`\n : ''\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return PaymentField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n {\n type: 'paymentRequired',\n template: 'Complete the payment to continue'\n }\n ],\n advancedSettingsErrors: []\n }\n }\n\n /**\n * Resolves the payment amount from conditional amounts configuration.\n * Evaluates conditions in order; first true condition wins.\n * Falls back to the default options.amount.\n */\n static resolveAmount(\n options: PaymentFieldComponent['options'],\n model: FormModel,\n state: FormState\n ): number {\n const { conditionalAmounts } = options\n\n if (!conditionalAmounts?.length) {\n return options.amount\n }\n\n for (const { condition, amount } of conditionalAmounts) {\n if (!model.conditions[condition]) {\n logger.warn(\n `[payment] Condition '${condition}' not found in form conditions. Skipping.`\n )\n continue\n }\n if (model.conditions[condition].fn(state)) {\n return amount\n }\n }\n\n return options.amount\n }\n\n /**\n * Dispatcher for external redirect to GOV.UK Pay\n */\n static async dispatcher(\n request: FormRequestPayload,\n h: FormResponseToolkit,\n args: PaymentExternalArgs\n ): Promise<unknown> {\n const { options, name: componentName } = args.component\n const { model } = args.controller\n const language = resolveLanguage(request)\n const { t } = model.createTranslator(language)\n const state = await args.controller.getState(request)\n const { baseUrl } = getPluginOptions(request.server)\n const summaryUrl = `${baseUrl}/${model.basePath}/summary`\n\n const existingPaymentState = state[componentName]\n if (\n PaymentField.isPaymentState(existingPaymentState) &&\n existingPaymentState.preAuth?.status === 'success'\n ) {\n return h.redirect(summaryUrl).code(StatusCodes.SEE_OTHER)\n }\n\n const isLivePayment = args.isLive && !args.isPreview\n const formId = args.controller.model.formId\n const formsService = model.services.formsService\n const paymentService = await createPaymentService(\n isLivePayment,\n formId,\n formsService\n )\n\n const uuid = randomUUID()\n\n const reference = state.$$__referenceNumber as string\n const resolvedAmount = PaymentField.resolveAmount(options, model, state)\n\n // Zero-amount safety net (page skip should prevent this, but defensive)\n if (resolvedAmount === 0) {\n return h.redirect(summaryUrl).code(StatusCodes.SEE_OTHER)\n }\n\n const description = options.description\n\n const slug = `/${model.basePath}`\n\n const payCallbackUrl = `${baseUrl}/payment-callback?uuid=${uuid}`\n const paymentPageUrl = args.sourceUrl\n\n let prefilledEmail: string | undefined\n const userConfirmationEmail = state.userConfirmationEmailAddress\n if (typeof userConfirmationEmail === 'string' && userConfirmationEmail) {\n prefilledEmail = userConfirmationEmail\n }\n\n const amountInPence = Math.round(resolvedAmount * 100)\n const payment = await paymentService.createPayment(\n amountInPence,\n description,\n payCallbackUrl,\n reference,\n isLivePayment,\n { formId, slug },\n prefilledEmail\n )\n\n if (!payment) {\n const message = isLivePayment\n ? t('components.paymentField.cannotTakePayment')\n : t('components.paymentField.testApiKey')\n const govukError = createError(componentName, message)\n request.yar.flash(COMPONENT_STATE_ERROR, govukError, true)\n return h\n .redirect(`${request.url.pathname}${request.url.search}`)\n .code(StatusCodes.SEE_OTHER)\n }\n\n const sessionData: PaymentSessionData = {\n uuid,\n formId,\n reference,\n amount: resolvedAmount,\n description,\n paymentId: payment.paymentId,\n componentName,\n returnUrl: summaryUrl,\n failureUrl: paymentPageUrl,\n isLivePayment\n }\n\n request.yar.set(`payment-${uuid}`, sessionData)\n\n return h.redirect(payment.paymentUrl).code(StatusCodes.SEE_OTHER)\n }\n\n /**\n * Called on form submission to capture the payment\n * @see https://docs.payments.service.gov.uk/delayed_capture/#delay-taking-a-payment\n */\n async onSubmit(\n request: FormRequestPayload,\n _metadata: FormMetadata,\n context: FormContext\n ): Promise<void> {\n const language = resolveLanguage(request)\n const { t } = this.model.createTranslator(language)\n\n // Zero-amount bypass — no capture needed\n const resolvedAmount = PaymentField.resolveAmount(\n this.options,\n this.model,\n context.state\n )\n if (resolvedAmount === 0) {\n return\n }\n\n const paymentState = this.getPaymentStateFromState(context.state)\n\n if (!paymentState) {\n throw new PaymentPreAuthError(\n this,\n t('components.paymentField.completePayment'),\n true,\n PaymentErrorTypes.PaymentIncomplete\n )\n }\n\n if (paymentState.capture?.status === 'success') {\n return\n }\n\n const { paymentId, isLivePayment, formId } = paymentState\n const formsService = this.model.services.formsService\n const paymentService = await createPaymentService(\n isLivePayment,\n formId,\n formsService\n )\n\n /**\n * @see https://docs.payments.service.gov.uk/api_reference/#payment-status-lifecycle\n */\n const status = await paymentService.getPaymentStatus(\n paymentId,\n isLivePayment\n )\n\n PaymentSubmissionError.checkPaymentAmount(\n status.amount,\n resolvedAmount,\n this,\n t\n )\n\n if (status.state.status === 'success') {\n await this.markPaymentCaptured(request, paymentState)\n return\n }\n\n if (status.state.status !== 'capturable') {\n throw new PaymentPreAuthError(\n this,\n t('components.paymentField.paymentExpired'),\n true,\n PaymentErrorTypes.PaymentExpired\n )\n }\n\n const captured = await paymentService.capturePayment(\n paymentId,\n status.amount\n )\n\n if (!captured) {\n throw new PaymentPreAuthError(\n this,\n t('components.paymentField.submissionFailed'),\n false\n )\n }\n\n await this.markPaymentCaptured(request, paymentState)\n }\n\n /**\n * Updates payment state to mark capture as successful\n * This ensures we don't try to re-capture on submission retry\n */\n private async markPaymentCaptured(\n request: FormRequestPayload,\n paymentState: PaymentState\n ): Promise<void> {\n const updatedState: PaymentState = {\n ...paymentState,\n capture: {\n status: 'success',\n createdAt: new Date().toISOString()\n }\n }\n\n if (this.page) {\n const currentState = await this.page.getState(request)\n await this.page.mergeState(request, currentState, {\n [this.name]: updatedState\n })\n }\n }\n}\n\n/**\n * Session data stored when dispatching to GOV.UK Pay\n */\nexport interface PaymentSessionData {\n uuid: string\n formId: string\n reference: string\n amount: number\n description: string\n paymentId: string\n componentName: string\n returnUrl: string\n failureUrl: string\n isLivePayment: boolean\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import { type AutocompleteFieldComponent, type SelectFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { ListFormComponent } from '../../../../server/plugins/engine/components/ListFormComponent.js';
|
|
3
|
-
import { type
|
|
3
|
+
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
4
4
|
export declare class SelectField extends ListFormComponent {
|
|
5
5
|
options: SelectFieldComponent['options'] | AutocompleteFieldComponent['options'];
|
|
6
6
|
constructor(def: SelectFieldComponent | AutocompleteFieldComponent, props: ConstructorParameters<typeof ListFormComponent>[1]);
|
|
7
|
-
getViewModel(
|
|
8
|
-
items: import("
|
|
7
|
+
getViewModel(context: RenderContext): {
|
|
8
|
+
items: import("../../../../server/plugins/engine/components/types.js").ListItem[];
|
|
9
9
|
label: {
|
|
10
10
|
text: string;
|
|
11
11
|
};
|
|
12
12
|
id: string;
|
|
13
13
|
name: string;
|
|
14
|
-
value: import("
|
|
14
|
+
value: import("../types.js").FormValue;
|
|
15
15
|
type?: string;
|
|
16
16
|
hint?: {
|
|
17
17
|
id?: string;
|
|
18
18
|
text: string;
|
|
19
19
|
};
|
|
20
|
-
prefix?: import("
|
|
21
|
-
suffix?: import("
|
|
20
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
21
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
22
22
|
classes?: string;
|
|
23
23
|
condition?: string;
|
|
24
|
-
errors?: FormSubmissionError[];
|
|
24
|
+
errors?: import("../types.js").FormSubmissionError[];
|
|
25
25
|
errorMessage?: {
|
|
26
26
|
text: string;
|
|
27
27
|
};
|
|
@@ -34,23 +34,23 @@ export declare class SelectField extends ListFormComponent {
|
|
|
34
34
|
accept?: string;
|
|
35
35
|
inputmode?: string;
|
|
36
36
|
};
|
|
37
|
-
content?: import("
|
|
37
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
38
38
|
maxlength?: number;
|
|
39
39
|
maxwords?: number;
|
|
40
40
|
rows?: number;
|
|
41
41
|
fieldset?: {
|
|
42
42
|
attributes?: string | Record<string, string>;
|
|
43
|
-
legend?: import("
|
|
43
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
44
44
|
};
|
|
45
45
|
formGroup?: {
|
|
46
46
|
classes?: string;
|
|
47
47
|
attributes?: string | Record<string, string>;
|
|
48
48
|
};
|
|
49
49
|
showFieldsetError?: boolean;
|
|
50
|
-
components?: import("
|
|
50
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
51
51
|
upload?: {
|
|
52
52
|
count: number;
|
|
53
|
-
summaryList: import("
|
|
53
|
+
summaryList: import("../types.js").SummaryList;
|
|
54
54
|
};
|
|
55
55
|
};
|
|
56
56
|
}
|
|
@@ -16,8 +16,8 @@ export class SelectField extends ListFormComponent {
|
|
|
16
16
|
this.formSchema = formSchema;
|
|
17
17
|
this.options = options;
|
|
18
18
|
}
|
|
19
|
-
getViewModel(
|
|
20
|
-
const viewModel = super.getViewModel(
|
|
19
|
+
getViewModel(context) {
|
|
20
|
+
const viewModel = super.getViewModel(context);
|
|
21
21
|
let {
|
|
22
22
|
items
|
|
23
23
|
} = viewModel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectField.js","names":["ListFormComponent","SelectField","constructor","def","props","options","formSchema","required","allow","empty","getViewModel","
|
|
1
|
+
{"version":3,"file":"SelectField.js","names":["ListFormComponent","SelectField","constructor","def","props","options","formSchema","required","allow","empty","getViewModel","context","viewModel","items","value"],"sources":["../../../../../src/server/plugins/engine/components/SelectField.ts"],"sourcesContent":["import {\n type AutocompleteFieldComponent,\n type SelectFieldComponent\n} from '@defra/forms-model'\n\nimport { ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\n\nexport class SelectField extends ListFormComponent {\n declare options:\n | SelectFieldComponent['options']\n | AutocompleteFieldComponent['options']\n\n constructor(\n def: SelectFieldComponent | AutocompleteFieldComponent,\n props: ConstructorParameters<typeof ListFormComponent>[1]\n ) {\n super(def, props)\n\n const { options } = def\n let { formSchema } = this\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n } else {\n formSchema = formSchema.empty('')\n }\n\n this.formSchema = formSchema\n this.options = options\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n let { items } = viewModel\n\n items = [{ value: '' }, ...items]\n\n return {\n ...viewModel,\n items\n }\n }\n}\n"],"mappings":"AAKA,SAASA,iBAAiB;AAG1B,OAAO,MAAMC,WAAW,SAASD,iBAAiB,CAAC;EAKjDE,WAAWA,CACTC,GAAsD,EACtDC,KAAyD,EACzD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC;IAAQ,CAAC,GAAGF,GAAG;IACvB,IAAI;MAAEG;IAAW,CAAC,GAAG,IAAI;IAEzB,IAAID,OAAO,CAACE,QAAQ,KAAK,KAAK,EAAE;MAC9BD,UAAU,GAAGA,UAAU,CAACE,KAAK,CAAC,EAAE,CAAC;IACnC,CAAC,MAAM;MACLF,UAAU,GAAGA,UAAU,CAACG,KAAK,CAAC,EAAE,CAAC;IACnC;IAEA,IAAI,CAACH,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACD,OAAO,GAAGA,OAAO;EACxB;EAEAK,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAMC,SAAS,GAAG,KAAK,CAACF,YAAY,CAACC,OAAO,CAAC;IAC7C,IAAI;MAAEE;IAAM,CAAC,GAAGD,SAAS;IAEzBC,KAAK,GAAG,CAAC;MAAEC,KAAK,EAAE;IAAG,CAAC,EAAE,GAAGD,KAAK,CAAC;IAEjC,OAAO;MACL,GAAGD,SAAS;MACZC;IACF,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { ListFormComponent } from '../../../../server/plugins/engine/components/ListFormComponent.js';
|
|
2
|
-
import { type ListItem } from '../../../../server/plugins/engine/components/types.js';
|
|
3
|
-
import { type ErrorMessageTemplateList
|
|
2
|
+
import { type ListItem, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
3
|
+
import { type ErrorMessageTemplateList } from '../../../../server/plugins/engine/types.js';
|
|
4
4
|
/**
|
|
5
5
|
* "Selection controls" are checkboxes and radios (and switches), as per Material UI nomenclature.
|
|
6
6
|
*/
|
|
7
7
|
export declare class SelectionControlField extends ListFormComponent {
|
|
8
|
-
getViewModel(
|
|
8
|
+
getViewModel(context: RenderContext): {
|
|
9
9
|
fieldset: {
|
|
10
10
|
attributes?: string | Record<string, string>;
|
|
11
11
|
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
@@ -26,7 +26,7 @@ export declare class SelectionControlField extends ListFormComponent {
|
|
|
26
26
|
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
27
27
|
classes?: string;
|
|
28
28
|
condition?: string;
|
|
29
|
-
errors?: FormSubmissionError[];
|
|
29
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
30
30
|
errorMessage?: {
|
|
31
31
|
text: string;
|
|
32
32
|
};
|
|
@@ -4,11 +4,11 @@ import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
|
4
4
|
* "Selection controls" are checkboxes and radios (and switches), as per Material UI nomenclature.
|
|
5
5
|
*/
|
|
6
6
|
export class SelectionControlField extends ListFormComponent {
|
|
7
|
-
getViewModel(
|
|
7
|
+
getViewModel(context) {
|
|
8
8
|
const {
|
|
9
9
|
options
|
|
10
10
|
} = this;
|
|
11
|
-
const viewModel = super.getViewModel(
|
|
11
|
+
const viewModel = super.getViewModel(context);
|
|
12
12
|
let {
|
|
13
13
|
fieldset,
|
|
14
14
|
items,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionControlField.js","names":["ListFormComponent","messageTemplate","SelectionControlField","getViewModel","
|
|
1
|
+
{"version":3,"file":"SelectionControlField.js","names":["ListFormComponent","messageTemplate","SelectionControlField","getViewModel","context","options","viewModel","fieldset","items","label","legend","text","classes","map","item","selected","checked","itemModel","bold","getAllPossibleErrors","baseErrors","type","template","selectRequired","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/SelectionControlField.ts"],"sourcesContent":["import { ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js'\nimport {\n type ListItem,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\n/**\n * \"Selection controls\" are checkboxes and radios (and switches), as per Material UI nomenclature.\n */\nexport class SelectionControlField extends ListFormComponent {\n getViewModel(context: RenderContext) {\n const { options } = this\n\n const viewModel = super.getViewModel(context)\n let { fieldset, items, label } = viewModel\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n items = items.map((item) => {\n const { selected: checked } = item\n const itemModel = { ...item, checked } satisfies ListItem\n\n if ('bold' in options && options.bold) {\n itemModel.label ??= {}\n itemModel.label.classes = 'govuk-label--s'\n }\n\n return itemModel\n })\n\n return {\n ...viewModel,\n fieldset,\n items\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return SelectionControlField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'selectRequired', template: messageTemplate.selectRequired }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAAA,SAASA,iBAAiB;AAK1B,SAASC,eAAe;AAGxB;AACA;AACA;AACA,OAAO,MAAMC,qBAAqB,SAASF,iBAAiB,CAAC;EAC3DG,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAM;MAAEC;IAAQ,CAAC,GAAG,IAAI;IAExB,MAAMC,SAAS,GAAG,KAAK,CAACH,YAAY,CAACC,OAAO,CAAC;IAC7C,IAAI;MAAEG,QAAQ;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAGH,SAAS;IAE1CC,QAAQ,KAAK;MACXG,MAAM,EAAE;QACNC,IAAI,EAAEF,KAAK,CAACE,IAAI;QAChBC,OAAO,EAAE;MACX;IACF,CAAC;IAEDJ,KAAK,GAAGA,KAAK,CAACK,GAAG,CAAEC,IAAI,IAAK;MAC1B,MAAM;QAAEC,QAAQ,EAAEC;MAAQ,CAAC,GAAGF,IAAI;MAClC,MAAMG,SAAS,GAAG;QAAE,GAAGH,IAAI;QAAEE;MAAQ,CAAoB;MAEzD,IAAI,MAAM,IAAIX,OAAO,IAAIA,OAAO,CAACa,IAAI,EAAE;QACrCD,SAAS,CAACR,KAAK,KAAK,CAAC,CAAC;QACtBQ,SAAS,CAACR,KAAK,CAACG,OAAO,GAAG,gBAAgB;MAC5C;MAEA,OAAOK,SAAS;IAClB,CAAC,CAAC;IAEF,OAAO;MACL,GAAGX,SAAS;MACZC,QAAQ;MACRC;IACF,CAAC;EACH;;EAEA;AACF;AACA;EACEW,oBAAoBA,CAAA,EAA6B;IAC/C,OAAOjB,qBAAqB,CAACiB,oBAAoB,CAAC,CAAC;EACrD;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QAAEC,IAAI,EAAE,gBAAgB;QAAEC,QAAQ,EAAErB,eAAe,CAACsB;MAAe,CAAC,CACrE;MACDC,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { type TelephoneNumberFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { type StringSchema } from 'joi';
|
|
3
3
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
4
|
-
import { type
|
|
4
|
+
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type ErrorMessageTemplateList } from '../../../../server/plugins/engine/types.js';
|
|
5
6
|
export declare class TelephoneNumberField extends FormComponent {
|
|
6
7
|
options: TelephoneNumberFieldComponent['options'];
|
|
7
8
|
formSchema: StringSchema;
|
|
8
9
|
stateSchema: StringSchema;
|
|
9
10
|
constructor(def: TelephoneNumberFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
10
|
-
getViewModel(
|
|
11
|
+
getViewModel(context: RenderContext): {
|
|
11
12
|
type: string;
|
|
12
13
|
label: {
|
|
13
14
|
text: string;
|
|
@@ -19,11 +20,11 @@ export declare class TelephoneNumberField extends FormComponent {
|
|
|
19
20
|
id?: string;
|
|
20
21
|
text: string;
|
|
21
22
|
};
|
|
22
|
-
prefix?: import("
|
|
23
|
-
suffix?: import("
|
|
23
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
24
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
24
25
|
classes?: string;
|
|
25
26
|
condition?: string;
|
|
26
|
-
errors?: FormSubmissionError[];
|
|
27
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
27
28
|
errorMessage?: {
|
|
28
29
|
text: string;
|
|
29
30
|
};
|
|
@@ -36,21 +37,21 @@ export declare class TelephoneNumberField extends FormComponent {
|
|
|
36
37
|
accept?: string;
|
|
37
38
|
inputmode?: string;
|
|
38
39
|
};
|
|
39
|
-
content?: import("
|
|
40
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
40
41
|
maxlength?: number;
|
|
41
42
|
maxwords?: number;
|
|
42
43
|
rows?: number;
|
|
43
|
-
items?: import("
|
|
44
|
+
items?: import("../../../../server/plugins/engine/components/types.js").ListItem[] | import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
44
45
|
fieldset?: {
|
|
45
46
|
attributes?: string | Record<string, string>;
|
|
46
|
-
legend?: import("
|
|
47
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
47
48
|
};
|
|
48
49
|
formGroup?: {
|
|
49
50
|
classes?: string;
|
|
50
51
|
attributes?: string | Record<string, string>;
|
|
51
52
|
};
|
|
52
53
|
showFieldsetError?: boolean;
|
|
53
|
-
components?: import("
|
|
54
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
54
55
|
upload?: {
|
|
55
56
|
count: number;
|
|
56
57
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
@@ -33,8 +33,8 @@ export class TelephoneNumberField extends FormComponent {
|
|
|
33
33
|
this.stateSchema = formSchema.default(null).allow(null);
|
|
34
34
|
this.options = options;
|
|
35
35
|
}
|
|
36
|
-
getViewModel(
|
|
37
|
-
const viewModel = super.getViewModel(
|
|
36
|
+
getViewModel(context) {
|
|
37
|
+
const viewModel = super.getViewModel(context);
|
|
38
38
|
const {
|
|
39
39
|
attributes
|
|
40
40
|
} = viewModel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TelephoneNumberField.js","names":["FormComponent","addClassOptionIfNone","INVALID_ERROR_CODE","joi","messageTemplate","TelephoneNumberField","constructor","def","props","options","format","formSchema","string","trim","phoneNumber","label","required","allow","customValidationMessage","message","messages","customValidationMessages","default","stateSchema","getViewModel","
|
|
1
|
+
{"version":3,"file":"TelephoneNumberField.js","names":["FormComponent","addClassOptionIfNone","INVALID_ERROR_CODE","joi","messageTemplate","TelephoneNumberField","constructor","def","props","options","format","formSchema","string","trim","phoneNumber","label","required","allow","customValidationMessage","message","messages","customValidationMessages","default","stateSchema","getViewModel","context","viewModel","attributes","autocomplete","type","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/TelephoneNumberField.ts"],"sourcesContent":["import { type TelephoneNumberFieldComponent } from '@defra/forms-model'\nimport { type StringSchema } from 'joi'\n\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { addClassOptionIfNone } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n INVALID_ERROR_CODE,\n joi\n} from '~/src/server/plugins/engine/components/helpers/telephone.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class TelephoneNumberField extends FormComponent {\n declare options: TelephoneNumberFieldComponent['options']\n declare formSchema: StringSchema\n declare stateSchema: StringSchema\n\n constructor(\n def: TelephoneNumberFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options } = def\n const { format } = options\n\n let formSchema = joi\n .string()\n .trim()\n .phoneNumber({ format })\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'string.empty': message,\n 'string.pattern.base': message,\n [INVALID_ERROR_CODE]: message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n addClassOptionIfNone(options, 'govuk-input--width-20')\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n const { attributes } = viewModel\n\n attributes.autocomplete = 'tel'\n\n return {\n ...viewModel,\n type: 'tel'\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return TelephoneNumberField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n { type: 'format', template: messageTemplate.format }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAGA,SAASA,aAAa;AACtB,SAASC,oBAAoB;AAC7B,SACEC,kBAAkB,EAClBC,GAAG;AAGL,SAASC,eAAe;AAGxB,OAAO,MAAMC,oBAAoB,SAASL,aAAa,CAAC;EAKtDM,WAAWA,CACTC,GAAkC,EAClCC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC;IAAQ,CAAC,GAAGF,GAAG;IACvB,MAAM;MAAEG;IAAO,CAAC,GAAGD,OAAO;IAE1B,IAAIE,UAAU,GAAGR,GAAG,CACjBS,MAAM,CAAC,CAAC,CACRC,IAAI,CAAC,CAAC,CACNC,WAAW,CAAC;MAAEJ;IAAO,CAAC,CAAC,CACvBK,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC,CACjBC,QAAQ,CAAC,CAAC;IAEb,IAAIP,OAAO,CAACO,QAAQ,KAAK,KAAK,EAAE;MAC9BL,UAAU,GAAGA,UAAU,CAACM,KAAK,CAAC,EAAE,CAAC;IACnC;IAEA,IAAIR,OAAO,CAACS,uBAAuB,EAAE;MACnC,MAAMC,OAAO,GAAGV,OAAO,CAACS,uBAAuB;MAE/CP,UAAU,GAAGA,UAAU,CAACS,QAAQ,CAAC;QAC/B,cAAc,EAAED,OAAO;QACvB,cAAc,EAAEA,OAAO;QACvB,qBAAqB,EAAEA,OAAO;QAC9B,CAACjB,kBAAkB,GAAGiB;MACxB,CAAC,CAAC;IACJ,CAAC,MAAM,IAAIV,OAAO,CAACY,wBAAwB,EAAE;MAC3CV,UAAU,GAAGA,UAAU,CAACS,QAAQ,CAACX,OAAO,CAACY,wBAAwB,CAAC;IACpE;IAEApB,oBAAoB,CAACQ,OAAO,EAAE,uBAAuB,CAAC;IAEtD,IAAI,CAACE,UAAU,GAAGA,UAAU,CAACW,OAAO,CAAC,EAAE,CAAC;IACxC,IAAI,CAACC,WAAW,GAAGZ,UAAU,CAACW,OAAO,CAAC,IAAI,CAAC,CAACL,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,CAACR,OAAO,GAAGA,OAAO;EACxB;EAEAe,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAMC,SAAS,GAAG,KAAK,CAACF,YAAY,CAACC,OAAO,CAAC;IAC7C,MAAM;MAAEE;IAAW,CAAC,GAAGD,SAAS;IAEhCC,UAAU,CAACC,YAAY,GAAG,KAAK;IAE/B,OAAO;MACL,GAAGF,SAAS;MACZG,IAAI,EAAE;IACR,CAAC;EACH;;EAEA;AACF;AACA;EACEC,oBAAoBA,CAAA,EAA6B;IAC/C,OAAOzB,oBAAoB,CAACyB,oBAAoB,CAAC,CAAC;EACpD;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QAAEF,IAAI,EAAE,UAAU;QAAEG,QAAQ,EAAE5B,eAAe,CAACY;MAAS,CAAC,EACxD;QAAEa,IAAI,EAAE,QAAQ;QAAEG,QAAQ,EAAE5B,eAAe,CAACM;MAAO,CAAC,CACrD;MACDuB,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -2,6 +2,8 @@ import { type UkAddressFieldComponent } from '@defra/forms-model';
|
|
|
2
2
|
import { type ObjectSchema } from 'joi';
|
|
3
3
|
import { ComponentCollection } from '../../../../server/plugins/engine/components/ComponentCollection.js';
|
|
4
4
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
5
|
+
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
6
|
+
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
5
7
|
import { type FormRequestPayload, type FormResponseToolkit } from '../../../../server/plugins/engine/types/index.js';
|
|
6
8
|
import { type ErrorMessageTemplateList, type FormPayload, type FormState, type FormStateValue, type FormSubmissionError, type FormSubmissionState, type PostcodeLookupExternalArgs } from '../../../../server/plugins/engine/types.js';
|
|
7
9
|
export declare class UkAddressField extends FormComponent {
|
|
@@ -13,19 +15,19 @@ export declare class UkAddressField extends FormComponent {
|
|
|
13
15
|
getFormValueFromState(state: FormSubmissionState): UkAddressState | undefined;
|
|
14
16
|
getContextValueFromFormValue(value: UkAddressState | undefined): string[] | null;
|
|
15
17
|
getContextValueFromState(state: FormSubmissionState): string[] | null;
|
|
16
|
-
getDisplayStringFromFormValue(value: UkAddressState | undefined): string;
|
|
17
|
-
getDisplayStringFromState(state: FormSubmissionState): string;
|
|
18
|
+
getDisplayStringFromFormValue(value: UkAddressState | undefined, _translator: Translator): string;
|
|
19
|
+
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
18
20
|
/**
|
|
19
21
|
* Returns one error per child field
|
|
20
22
|
*/
|
|
21
|
-
getViewErrors(errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
22
|
-
getViewModel(
|
|
23
|
+
getViewErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
24
|
+
getViewModel(context: RenderContext): {
|
|
23
25
|
value: string | undefined;
|
|
24
26
|
fieldset: {
|
|
25
27
|
attributes?: string | Record<string, string>;
|
|
26
|
-
legend?: import("../../../../server/plugins/engine/types
|
|
28
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
27
29
|
};
|
|
28
|
-
components: import("../../../../server/plugins/engine/types
|
|
30
|
+
components: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
29
31
|
usePostcodeLookup: boolean;
|
|
30
32
|
label: {
|
|
31
33
|
text: string;
|
|
@@ -37,8 +39,8 @@ export declare class UkAddressField extends FormComponent {
|
|
|
37
39
|
id?: string;
|
|
38
40
|
text: string;
|
|
39
41
|
};
|
|
40
|
-
prefix?: import("../../../../server/plugins/engine/types
|
|
41
|
-
suffix?: import("../../../../server/plugins/engine/types
|
|
42
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
43
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
42
44
|
classes?: string;
|
|
43
45
|
condition?: string;
|
|
44
46
|
errors?: FormSubmissionError[];
|
|
@@ -54,11 +56,11 @@ export declare class UkAddressField extends FormComponent {
|
|
|
54
56
|
accept?: string;
|
|
55
57
|
inputmode?: string;
|
|
56
58
|
};
|
|
57
|
-
content?: import("../../../../server/plugins/engine/types
|
|
59
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
58
60
|
maxlength?: number;
|
|
59
61
|
maxwords?: number;
|
|
60
62
|
rows?: number;
|
|
61
|
-
items?: import("../../../../server/plugins/engine/types
|
|
63
|
+
items?: import("../../../../server/plugins/engine/components/types.js").ListItem[] | import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
62
64
|
formGroup?: {
|
|
63
65
|
classes?: string;
|
|
64
66
|
attributes?: string | Record<string, string>;
|