@defra/forms-engine-plugin 5.0.0-alpha.1 → 5.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.public/javascripts/application.min.js +1 -1
- package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
- package/.public/javascripts/application.min.js.map +1 -1
- package/.public/javascripts/shared.min.js +1 -1
- package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
- package/.public/javascripts/shared.min.js.map +1 -1
- package/.public/stylesheets/application.min.css.map +1 -1
- package/.server/client/javascripts/file-upload.js +6 -3
- package/.server/client/javascripts/file-upload.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.js +10 -31
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/govuk.js +2 -1
- package/.server/client/javascripts/govuk.js.map +1 -1
- package/.server/client/javascripts/location-map.js +11 -2
- package/.server/client/javascripts/location-map.js.map +1 -1
- package/.server/client/javascripts/map.d.ts +6 -0
- package/.server/client/javascripts/map.js +37 -0
- package/.server/client/javascripts/map.js.map +1 -1
- package/.server/client/javascripts/maps.d.ts +5 -0
- package/.server/client/javascripts/maps.js +6 -0
- package/.server/client/javascripts/maps.js.map +1 -0
- package/.server/client/javascripts/shared.d.ts +1 -3
- package/.server/client/javascripts/shared.js +1 -3
- package/.server/client/javascripts/shared.js.map +1 -1
- package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
- package/.server/client/javascripts/sssi-dataset.js +37 -39
- package/.server/client/javascripts/sssi-dataset.js.map +1 -1
- package/.server/client/stylesheets/maps.scss +4 -0
- package/.server/client/stylesheets/shared.scss +1 -5
- package/.server/server/constants.d.ts +2 -0
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -1
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
- package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +4 -1
- package/.server/server/plugins/engine/components/CheckboxesField.js +13 -0
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
- package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
- package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
- package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
- package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
- package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
- package/.server/server/plugins/engine/components/Details.d.ts +1 -0
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +29 -2
- package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +12 -0
- package/.server/server/plugins/engine/components/FileUploadField.js +23 -3
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
- package/.server/server/plugins/engine/components/FormComponent.js +5 -2
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +1 -0
- package/.server/server/plugins/engine/components/GeospatialField.js +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/Html.d.ts +1 -0
- package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
- package/.server/server/plugins/engine/components/LatLongField.d.ts +28 -2
- package/.server/server/plugins/engine/components/LatLongField.js +85 -48
- package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
- package/.server/server/plugins/engine/components/List.d.ts +1 -0
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js +18 -5
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +8 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +13 -12
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
- package/.server/server/plugins/engine/components/Markdown.js +1 -1
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
- package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
- package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
- package/.server/server/plugins/engine/components/NumberField.js +16 -0
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
- package/.server/server/plugins/engine/components/OsGridRefField.js +4 -3
- package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
- package/.server/server/plugins/engine/components/PaymentField.js +17 -6
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
- package/.server/server/plugins/engine/components/YesNoField.js +17 -8
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.js +1 -2
- package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +3 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.js +32 -0
- package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
- package/.server/server/plugins/engine/components/helpers/index.js +13 -1
- package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
- package/.server/server/plugins/engine/components/types.d.ts +1 -0
- package/.server/server/plugins/engine/components/types.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +22 -2
- package/.server/server/plugins/engine/helpers.js +44 -5
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +3 -0
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +10 -7
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
- package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
- package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
- package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
- package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
- package/.server/server/plugins/engine/i18n/form.js +35 -0
- package/.server/server/plugins/engine/i18n/form.js.map +1 -0
- package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
- package/.server/server/plugins/engine/i18n/languages.js +19 -0
- package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
- package/.server/server/plugins/engine/i18n/translations/cy.json +85 -8
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +55 -6
- package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -1
- package/.server/server/plugins/engine/index.d.ts +4 -0
- package/.server/server/plugins/engine/index.js +4 -0
- package/.server/server/plugins/engine/index.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
- package/.server/server/plugins/engine/models/FormModel.js +9 -15
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +23 -2
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/types/schema.js +1 -0
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +5 -0
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/views/components/_location-field-base.html +2 -1
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
- package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/.server/server/plugins/engine/views/file-upload.html +1 -1
- package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
- package/.server/server/plugins/payment/helper.d.ts +11 -1
- package/.server/server/plugins/payment/helper.js +18 -2
- package/.server/server/plugins/payment/helper.js.map +1 -1
- package/.server/server/plugins/payment/helper.test.js +2 -1
- package/.server/server/plugins/payment/helper.test.js.map +1 -1
- package/.server/server/plugins/payment/service.d.ts +2 -1
- package/.server/server/plugins/payment/service.js +5 -2
- package/.server/server/plugins/payment/service.js.map +1 -1
- package/.server/server/plugins/payment/service.test.js +7 -3
- package/.server/server/plugins/payment/service.test.js.map +1 -1
- package/.server/server/plugins/payment/types.d.ts +4 -0
- package/.server/server/plugins/payment/types.js +1 -0
- package/.server/server/plugins/payment/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
- package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
- package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
- package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
- package/.server/server/plugins/postcode-lookup/types.js +6 -1
- package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/.server/server/utils/type-utils.d.ts +1 -2
- package/.server/server/utils/type-utils.js +0 -3
- package/.server/server/utils/type-utils.js.map +1 -1
- package/.server/server/utils/utils.d.ts +6 -0
- package/.server/server/utils/utils.js +18 -1
- package/.server/server/utils/utils.js.map +1 -1
- package/.server/server/utils/utils.test.js +21 -1
- package/.server/server/utils/utils.test.js.map +1 -1
- package/package.json +9 -2
- package/src/client/javascripts/file-upload.js +11 -3
- package/src/client/javascripts/geospatial-map.js +7 -34
- package/src/client/javascripts/govuk.js +2 -0
- package/src/client/javascripts/location-map.js +9 -1
- package/src/client/javascripts/map.js +42 -0
- package/src/client/javascripts/maps.js +5 -0
- package/src/client/javascripts/shared.js +1 -3
- package/src/client/javascripts/sssi-dataset.js +39 -41
- package/src/client/stylesheets/maps.scss +4 -0
- package/src/client/stylesheets/shared.scss +1 -5
- package/src/server/constants.js +2 -0
- package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
- package/src/server/plugins/engine/components/CheckboxesField.ts +13 -1
- package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
- package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
- package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
- package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
- package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
- package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
- package/src/server/plugins/engine/components/FileUploadField.ts +24 -3
- package/src/server/plugins/engine/components/FormComponent.ts +6 -5
- package/src/server/plugins/engine/components/GeospatialField.ts +6 -1
- package/src/server/plugins/engine/components/LatLongField.ts +128 -58
- package/src/server/plugins/engine/components/LocationFieldBase.ts +23 -6
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +20 -13
- package/src/server/plugins/engine/components/Markdown.ts +2 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
- package/src/server/plugins/engine/components/NumberField.ts +21 -1
- package/src/server/plugins/engine/components/OsGridRefField.ts +9 -3
- package/src/server/plugins/engine/components/PaymentField.ts +15 -5
- package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
- package/src/server/plugins/engine/components/YesNoField.ts +17 -9
- package/src/server/plugins/engine/components/helpers/components.ts +1 -2
- package/src/server/plugins/engine/components/helpers/geospatial.ts +53 -0
- package/src/server/plugins/engine/components/helpers/index.ts +19 -0
- package/src/server/plugins/engine/components/types.ts +1 -0
- package/src/server/plugins/engine/helpers.ts +52 -5
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +10 -7
- package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
- package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
- package/src/server/plugins/engine/i18n/form.ts +54 -0
- package/src/server/plugins/engine/i18n/languages.ts +19 -0
- package/src/server/plugins/engine/i18n/translations/cy.json +85 -8
- package/src/server/plugins/engine/i18n/translations/en-GB.json +55 -6
- package/src/server/plugins/engine/i18n/types.ts +2 -0
- package/src/server/plugins/engine/index.ts +7 -0
- package/src/server/plugins/engine/models/FormModel.ts +9 -15
- package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +27 -2
- package/src/server/plugins/engine/types/schema.ts +1 -0
- package/src/server/plugins/engine/types.ts +5 -0
- package/src/server/plugins/engine/views/components/_location-field-base.html +2 -1
- package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
- package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
- package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/src/server/plugins/engine/views/file-upload.html +1 -1
- package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
- package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/src/server/plugins/nunjucks/filters/index.js +1 -0
- package/src/server/plugins/payment/helper.js +22 -2
- package/src/server/plugins/payment/service.js +6 -2
- package/src/server/plugins/payment/types.js +1 -0
- package/src/server/plugins/postcode-lookup/models/index.js +75 -43
- package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
- package/src/server/plugins/postcode-lookup/types.js +6 -1
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/src/server/utils/type-utils.ts +1 -11
- package/src/server/utils/utils.js +19 -1
|
@@ -12,11 +12,13 @@ export declare class MonthYearField extends FormComponent {
|
|
|
12
12
|
collection: ComponentCollection;
|
|
13
13
|
constructor(def: MonthYearFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
14
14
|
getFormValueFromState(state: FormSubmissionState): MonthYearState | undefined;
|
|
15
|
-
getDisplayStringFromFormValue(value: MonthYearState | undefined,
|
|
15
|
+
getDisplayStringFromFormValue(value: MonthYearState | undefined, translator: Translator): string;
|
|
16
16
|
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
17
17
|
getContextValueFromFormValue(value: MonthYearState | undefined): string | null;
|
|
18
18
|
getContextValueFromState(state: FormSubmissionState): string | null;
|
|
19
|
-
getValidationMessagesOverride(translator: Translator):
|
|
19
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
20
|
+
[x: string]: LanguageMessages;
|
|
21
|
+
};
|
|
20
22
|
getViewModel(context: RenderContext): {
|
|
21
23
|
fieldset: {
|
|
22
24
|
attributes?: string | Record<string, string>;
|
|
@@ -64,6 +66,7 @@ export declare class MonthYearField extends FormComponent {
|
|
|
64
66
|
upload?: {
|
|
65
67
|
count: number;
|
|
66
68
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
69
|
+
uploadingLabel?: string;
|
|
67
70
|
};
|
|
68
71
|
};
|
|
69
72
|
isState(value?: FormStateValue | FormState): value is MonthYearState;
|
|
@@ -6,7 +6,7 @@ import { NumberField } from "./NumberField.js";
|
|
|
6
6
|
import { parseStrictDate } from "../date-helper.js";
|
|
7
7
|
import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
|
|
8
8
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
9
|
-
import {
|
|
9
|
+
import { formatDateForLanguage } from "../../payment/helper.js";
|
|
10
10
|
export class MonthYearField extends FormComponent {
|
|
11
11
|
constructor(def, props) {
|
|
12
12
|
super(def, props);
|
|
@@ -15,7 +15,7 @@ export class MonthYearField extends FormComponent {
|
|
|
15
15
|
options
|
|
16
16
|
} = def;
|
|
17
17
|
const isRequired = options.required !== false;
|
|
18
|
-
const customValidationMessages =
|
|
18
|
+
const customValidationMessages = {
|
|
19
19
|
'any.required': messageTemplate.objectMissing,
|
|
20
20
|
'number.base': messageTemplate.objectMissing,
|
|
21
21
|
'number.precision': messageTemplate.dateFormat,
|
|
@@ -23,7 +23,7 @@ export class MonthYearField extends FormComponent {
|
|
|
23
23
|
'number.unsafe': messageTemplate.dateFormat,
|
|
24
24
|
'number.min': messageTemplate.dateFormat,
|
|
25
25
|
'number.max': messageTemplate.dateFormat
|
|
26
|
-
}
|
|
26
|
+
};
|
|
27
27
|
this.collection = new ComponentCollection([{
|
|
28
28
|
type: ComponentType.NumberField,
|
|
29
29
|
name: `${name}__month`,
|
|
@@ -69,15 +69,15 @@ export class MonthYearField extends FormComponent {
|
|
|
69
69
|
const value = super.getFormValueFromState(state);
|
|
70
70
|
return MonthYearField.isMonthYear(value) ? value : undefined;
|
|
71
71
|
}
|
|
72
|
-
getDisplayStringFromFormValue(value,
|
|
72
|
+
getDisplayStringFromFormValue(value, translator) {
|
|
73
73
|
if (!value) {
|
|
74
74
|
return '';
|
|
75
75
|
}
|
|
76
76
|
const date = new Date();
|
|
77
|
+
// Force to first day of month in case current date was say 31st and specified month has fewer than 31 days
|
|
78
|
+
date.setDate(1);
|
|
77
79
|
date.setMonth(value.month - 1);
|
|
78
|
-
const monthString = date
|
|
79
|
-
month: 'long'
|
|
80
|
-
});
|
|
80
|
+
const monthString = formatDateForLanguage(date, 'LLLL', translator.language);
|
|
81
81
|
return `${monthString} ${value.year}`;
|
|
82
82
|
}
|
|
83
83
|
getDisplayStringFromState(state, translator) {
|
|
@@ -98,7 +98,7 @@ export class MonthYearField extends FormComponent {
|
|
|
98
98
|
const {
|
|
99
99
|
t
|
|
100
100
|
} = translator;
|
|
101
|
-
|
|
101
|
+
const messages = {
|
|
102
102
|
'any.required': buildValidationMessages(t).objectMissing,
|
|
103
103
|
'number.base': buildValidationMessages(t).objectMissing,
|
|
104
104
|
'number.precision': buildValidationMessages(t).dateFormat,
|
|
@@ -106,7 +106,11 @@ export class MonthYearField extends FormComponent {
|
|
|
106
106
|
'number.unsafe': buildValidationMessages(t).dateFormat,
|
|
107
107
|
'number.min': buildValidationMessages(t).dateFormat,
|
|
108
108
|
'number.max': buildValidationMessages(t).dateFormat
|
|
109
|
-
}
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
[`${this.name}__month`]: messages,
|
|
112
|
+
[`${this.name}__year`]: messages
|
|
113
|
+
};
|
|
110
114
|
}
|
|
111
115
|
getViewModel(context) {
|
|
112
116
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonthYearField.js","names":["ComponentType","format","isValid","parse","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","parseStrictDate","buildValidationMessages","messageTemplate","convertToLanguageMessages","MonthYearField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorMonthYear","peers","formSchema","stateSchema","getFormValueFromState","state","value","isMonthYear","undefined","getDisplayStringFromFormValue","_translator","date","Date","setMonth","month","monthString","toLocaleString","year","getDisplayStringFromState","translator","getContextValueFromFormValue","getContextValueFromState","getValidationMessagesOverride","t","getViewModel","context","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","dateMin","dateMax","isNumber","component","validator","payload","helpers","values","getStateFromValidForm","missing","keys","key","earliestDate","earliestMonthYear","limit","latestDate","latestMonthYear"],"sources":["../../../../../src/server/plugins/engine/components/MonthYearField.ts"],"sourcesContent":["import { ComponentType, type MonthYearFieldComponent } from '@defra/forms-model'\nimport { format, isValid, parse } from 'date-fns'\nimport {\n type Context,\n type CustomValidator,\n type LanguageMessages,\n type ObjectSchema\n} from 'joi'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport {\n type DateInputItem,\n type MonthYearState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { parseStrictDate } from '~/src/server/plugins/engine/date-helper.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { convertToLanguageMessages } from '~/src/server/utils/type-utils.js'\n\nexport class MonthYearField extends FormComponent {\n declare options: MonthYearFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: MonthYearFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options } = def\n\n const isRequired = options.required !== false\n\n const customValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'any.required': messageTemplate.objectMissing,\n 'number.base': messageTemplate.objectMissing,\n 'number.precision': messageTemplate.dateFormat,\n 'number.integer': messageTemplate.dateFormat,\n 'number.unsafe': messageTemplate.dateFormat,\n 'number.min': messageTemplate.dateFormat,\n 'number.max': messageTemplate.dateFormat\n })\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__month`,\n title: 'components.monthYearField.month',\n schema: { min: 1, max: 12, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-2',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__year`,\n title: 'components.monthYearField.year',\n schema: { min: 1000, max: 3000, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-4',\n customValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n custom: getValidatorMonthYear(this),\n peers: [`${name}__month`, `${name}__year`]\n }\n )\n\n this.options = options\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return MonthYearField.isMonthYear(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: MonthYearState | undefined,\n _translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const date = new Date()\n date.setMonth(value.month - 1)\n\n const monthString = date.toLocaleString('default', { month: 'long' })\n return `${monthString} ${value.year}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: MonthYearState | undefined\n ): string | null {\n if (\n !value ||\n !isValid(\n parseStrictDate(\n value,\n `${value.year}-${value.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-01`, 'yyyy-MM')\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n return convertToLanguageMessages({\n 'any.required': buildValidationMessages(t).objectMissing,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).dateFormat,\n 'number.integer': buildValidationMessages(t).dateFormat,\n 'number.unsafe': buildValidationMessages(t).dateFormat,\n 'number.min': buildValidationMessages(t).dateFormat,\n 'number.max': buildValidationMessages(t).dateFormat\n })\n }\n\n getViewModel(context: RenderContext) {\n const { errors } = context\n const { collection, name } = this\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n // Check for component errors only\n const hasError = errors?.some((error) => error.name === name)\n\n // Use the component collection to generate the subitems\n const items: DateInputItem[] = collection\n .getViewModel(context)\n .map(({ model }) => {\n let { label, type, value, classes, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text // Date component uses string labels\n }\n\n if (hasError || errorMessage) {\n classes = `${classes} govuk-input--error`.trim()\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes\n }\n })\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n return {\n ...viewModel,\n fieldset,\n items\n }\n }\n\n isState(value?: FormStateValue | FormState) {\n return MonthYearField.isMonthYear(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return MonthYearField.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 {\n type: 'dateFormatMonth',\n template: '{{#label}} must include a month'\n },\n { type: 'dateFormatYear', template: '{{#label}} must include a year' }\n ],\n advancedSettingsErrors: [\n { type: 'dateEarliest', template: messageTemplate.dateMin },\n { type: 'dateLatest', template: messageTemplate.dateMax }\n ]\n }\n }\n\n static isMonthYear(\n value?: FormStateValue | FormState\n ): value is MonthYearState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport function getValidatorMonthYear(component: MonthYearField) {\n const validator: CustomValidator = (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n const date = parse(\n `${values.year}-${values.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n\n if (!isValid(date)) {\n return helpers.error('date.format', context)\n }\n\n // Minimum date from today\n const earliestDate = options.earliestMonthYear\n ? new Date(`${options.earliestMonthYear}-01`)\n : undefined\n\n if (earliestDate && date < earliestDate) {\n return helpers.error('date.min', { ...context, limit: earliestDate })\n }\n\n // Maximum date from today\n const latestDate = options.latestMonthYear\n ? new Date(`${options.latestMonthYear}-01`)\n : undefined\n\n if (latestDate && date > latestDate) {\n return helpers.error('date.max', { ...context, limit: latestDate })\n }\n\n return payload\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MonthYearField.js","names":["ComponentType","format","isValid","parse","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","parseStrictDate","buildValidationMessages","messageTemplate","formatDateForLanguage","MonthYearField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorMonthYear","peers","formSchema","stateSchema","getFormValueFromState","state","value","isMonthYear","undefined","getDisplayStringFromFormValue","translator","date","Date","setDate","setMonth","month","monthString","language","year","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getValidationMessagesOverride","t","messages","getViewModel","context","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","dateMin","dateMax","isNumber","component","validator","payload","helpers","values","getStateFromValidForm","missing","keys","key","earliestDate","earliestMonthYear","limit","latestDate","latestMonthYear"],"sources":["../../../../../src/server/plugins/engine/components/MonthYearField.ts"],"sourcesContent":["import { ComponentType, type MonthYearFieldComponent } from '@defra/forms-model'\nimport { format, isValid, parse } from 'date-fns'\nimport {\n type Context,\n type CustomValidator,\n type LanguageMessages,\n type ObjectSchema\n} from 'joi'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport {\n type DateInputItem,\n type MonthYearState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { parseStrictDate } from '~/src/server/plugins/engine/date-helper.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { formatDateForLanguage } from '~/src/server/plugins/payment/helper.js'\n\nexport class MonthYearField extends FormComponent {\n declare options: MonthYearFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: MonthYearFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options } = def\n\n const isRequired = options.required !== false\n\n const customValidationMessages = {\n 'any.required': messageTemplate.objectMissing,\n 'number.base': messageTemplate.objectMissing,\n 'number.precision': messageTemplate.dateFormat,\n 'number.integer': messageTemplate.dateFormat,\n 'number.unsafe': messageTemplate.dateFormat,\n 'number.min': messageTemplate.dateFormat,\n 'number.max': messageTemplate.dateFormat\n } as LanguageMessages\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__month`,\n title: 'components.monthYearField.month',\n schema: { min: 1, max: 12, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-2',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__year`,\n title: 'components.monthYearField.year',\n schema: { min: 1000, max: 3000, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-4',\n customValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n custom: getValidatorMonthYear(this),\n peers: [`${name}__month`, `${name}__year`]\n }\n )\n\n this.options = options\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return MonthYearField.isMonthYear(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: MonthYearState | undefined,\n translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const date = new Date()\n // Force to first day of month in case current date was say 31st and specified month has fewer than 31 days\n date.setDate(1)\n date.setMonth(value.month - 1)\n\n const monthString = formatDateForLanguage(date, 'LLLL', translator.language)\n return `${monthString} ${value.year}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: MonthYearState | undefined\n ): string | null {\n if (\n !value ||\n !isValid(\n parseStrictDate(\n value,\n `${value.year}-${value.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-01`, 'yyyy-MM')\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n const messages = {\n 'any.required': buildValidationMessages(t).objectMissing,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).dateFormat,\n 'number.integer': buildValidationMessages(t).dateFormat,\n 'number.unsafe': buildValidationMessages(t).dateFormat,\n 'number.min': buildValidationMessages(t).dateFormat,\n 'number.max': buildValidationMessages(t).dateFormat\n } as LanguageMessages\n return {\n [`${this.name}__month`]: messages,\n [`${this.name}__year`]: messages\n }\n }\n\n getViewModel(context: RenderContext) {\n const { errors } = context\n const { collection, name } = this\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n // Check for component errors only\n const hasError = errors?.some((error) => error.name === name)\n\n // Use the component collection to generate the subitems\n const items: DateInputItem[] = collection\n .getViewModel(context)\n .map(({ model }) => {\n let { label, type, value, classes, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text // Date component uses string labels\n }\n\n if (hasError || errorMessage) {\n classes = `${classes} govuk-input--error`.trim()\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes\n }\n })\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n return {\n ...viewModel,\n fieldset,\n items\n }\n }\n\n isState(value?: FormStateValue | FormState) {\n return MonthYearField.isMonthYear(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return MonthYearField.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 {\n type: 'dateFormatMonth',\n template: '{{#label}} must include a month'\n },\n { type: 'dateFormatYear', template: '{{#label}} must include a year' }\n ],\n advancedSettingsErrors: [\n { type: 'dateEarliest', template: messageTemplate.dateMin },\n { type: 'dateLatest', template: messageTemplate.dateMax }\n ]\n }\n }\n\n static isMonthYear(\n value?: FormStateValue | FormState\n ): value is MonthYearState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport function getValidatorMonthYear(component: MonthYearField) {\n const validator: CustomValidator = (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n const date = parse(\n `${values.year}-${values.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n\n if (!isValid(date)) {\n return helpers.error('date.format', context)\n }\n\n // Minimum date from today\n const earliestDate = options.earliestMonthYear\n ? new Date(`${options.earliestMonthYear}-01`)\n : undefined\n\n if (earliestDate && date < earliestDate) {\n return helpers.error('date.min', { ...context, limit: earliestDate })\n }\n\n // Maximum date from today\n const latestDate = options.latestMonthYear\n ? new Date(`${options.latestMonthYear}-01`)\n : undefined\n\n if (latestDate && date > latestDate) {\n return helpers.error('date.max', { ...context, limit: latestDate })\n }\n\n return payload\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -59,6 +59,7 @@ export declare class MultilineTextField extends FormComponent {
|
|
|
59
59
|
upload?: {
|
|
60
60
|
count: number;
|
|
61
61
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
62
|
+
uploadingLabel?: string;
|
|
62
63
|
};
|
|
63
64
|
};
|
|
64
65
|
buildMinMaxText(min?: number, max?: number): string;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { LocationFieldBase } from '../../../../server/plugins/engine/components/LocationFieldBase.js';
|
|
3
|
+
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
3
4
|
import { type ErrorMessageTemplateList } from '../../../../server/plugins/engine/types.js';
|
|
4
5
|
export declare class NationalGridFieldNumberField extends LocationFieldBase {
|
|
5
6
|
options: NationalGridFieldNumberFieldComponent['options'];
|
|
6
|
-
protected getValidationConfig(): {
|
|
7
|
+
protected getValidationConfig(translator: Translator | undefined): {
|
|
7
8
|
pattern: RegExp;
|
|
8
9
|
patternErrorMessage: import("joi").JoiExpression;
|
|
9
10
|
requiredMessage: import("joi").JoiExpression;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
import { EN_GB } from "../../../constants.js";
|
|
1
2
|
import { LocationFieldBase } from "./LocationFieldBase.js";
|
|
2
3
|
import { createLowerFirstExpression } from "./helpers/index.js";
|
|
3
4
|
import { t } from "../i18n/index.js";
|
|
4
5
|
export class NationalGridFieldNumberField extends LocationFieldBase {
|
|
5
|
-
getValidationConfig() {
|
|
6
|
+
getValidationConfig(translator) {
|
|
6
7
|
// Regex for OS national grid field references (NGFR)
|
|
7
8
|
// Validates specific valid OS grid letter combinations with:
|
|
8
9
|
// - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789
|
|
9
10
|
const pattern = /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\s?([0-9]{4})\s?([0-9]{4})$/;
|
|
10
11
|
return {
|
|
11
12
|
pattern,
|
|
12
|
-
patternErrorMessage: createLowerFirstExpression(t('components.nationalGridField.pattern'
|
|
13
|
-
requiredMessage: createLowerFirstExpression(t('components.nationalGridField.required'
|
|
13
|
+
patternErrorMessage: createLowerFirstExpression(translator ? translator.t('components.nationalGridField.pattern') : t('components.nationalGridField.pattern', EN_GB)),
|
|
14
|
+
requiredMessage: createLowerFirstExpression(translator ? translator.t('components.nationalGridField.required') : t('components.nationalGridField.required', EN_GB))
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
17
|
getErrorTemplates() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NationalGridFieldNumberField.js","names":["LocationFieldBase","createLowerFirstExpression","t","NationalGridFieldNumberField","getValidationConfig","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/NationalGridFieldNumberField.ts"],"sourcesContent":["import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'\n\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class NationalGridFieldNumberField extends LocationFieldBase {\n declare options: NationalGridFieldNumberFieldComponent['options']\n\n protected getValidationConfig() {\n // Regex for OS national grid field references (NGFR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?([0-9]{4})\\s?([0-9]{4})$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n t('components.nationalGridField.pattern'
|
|
1
|
+
{"version":3,"file":"NationalGridFieldNumberField.js","names":["EN_GB","LocationFieldBase","createLowerFirstExpression","t","NationalGridFieldNumberField","getValidationConfig","translator","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/NationalGridFieldNumberField.ts"],"sourcesContent":["import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class NationalGridFieldNumberField extends LocationFieldBase {\n declare options: NationalGridFieldNumberFieldComponent['options']\n\n protected getValidationConfig(translator: Translator | undefined) {\n // Regex for OS national grid field references (NGFR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?([0-9]{4})\\s?([0-9]{4})$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.nationalGridField.pattern')\n : t('components.nationalGridField.pattern', EN_GB)\n ),\n requiredMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.nationalGridField.required')\n : t('components.nationalGridField.required', EN_GB)\n )\n }\n }\n\n protected getErrorTemplates() {\n return [\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n )\n }\n ]\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: 'required',\n template: createLowerFirstExpression(\n t('components.nationalGridField.required', 'en-GB')\n )\n },\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n )\n }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAEA,SAASA,KAAK;AACd,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,CAAC;AAIV,OAAO,MAAMC,4BAA4B,SAASH,iBAAiB,CAAC;EAGxDI,mBAAmBA,CAACC,UAAkC,EAAE;IAChE;IACA;IACA;IACA,MAAMC,OAAO,GACX,mIAAmI;IAErI,OAAO;MACLA,OAAO;MACPC,mBAAmB,EAAEN,0BAA0B,CAC7CI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,sCAAsC,CAAC,GACpDA,CAAC,CAAC,sCAAsC,EAAEH,KAAK,CACrD,CAAC;MACDS,eAAe,EAAEP,0BAA0B,CACzCI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,uCAAuC,CAAC,GACrDA,CAAC,CAAC,uCAAuC,EAAEH,KAAK,CACtD;IACF,CAAC;EACH;EAEUU,iBAAiBA,CAAA,EAAG;IAC5B,OAAO,CACL;MACEC,IAAI,EAAE,SAAS;MACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD;IACF,CAAC,CACF;EACH;;EAEA;AACF;AACA;EACE,OAAOU,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QACEH,IAAI,EAAE,UAAU;QAChBC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,uCAAuC,EAAE,OAAO,CACpD;MACF,CAAC,EACD;QACEQ,IAAI,EAAE,SAAS;QACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD;MACF,CAAC,CACF;MACDY,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@ import { type NumberFieldComponent } from '@defra/forms-model';
|
|
|
2
2
|
import joi, { type NumberSchema } from 'joi';
|
|
3
3
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
4
4
|
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type Translator } from '../../../../server/plugins/engine/types/index.js';
|
|
5
6
|
import { type ErrorMessageTemplateList, type FormState, type FormStateValue, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
|
|
6
7
|
export declare class NumberField extends FormComponent {
|
|
7
8
|
options: NumberFieldComponent['options'];
|
|
@@ -58,9 +59,13 @@ export declare class NumberField extends FormComponent {
|
|
|
58
59
|
upload?: {
|
|
59
60
|
count: number;
|
|
60
61
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
62
|
+
uploadingLabel?: string;
|
|
61
63
|
};
|
|
62
64
|
};
|
|
63
65
|
isValue(value?: FormStateValue | FormState): value is number;
|
|
66
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
67
|
+
[x: string]: joi.LanguageMessages;
|
|
68
|
+
};
|
|
64
69
|
/**
|
|
65
70
|
* For error preview page that shows all possible errors on a component
|
|
66
71
|
*/
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import joi from 'joi';
|
|
2
2
|
import { FormComponent, isFormValue } from "./FormComponent.js";
|
|
3
|
+
import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
|
|
3
4
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
4
5
|
export class NumberField extends FormComponent {
|
|
5
6
|
constructor(def, props) {
|
|
@@ -97,6 +98,21 @@ export class NumberField extends FormComponent {
|
|
|
97
98
|
isValue(value) {
|
|
98
99
|
return NumberField.isNumber(value);
|
|
99
100
|
}
|
|
101
|
+
getValidationMessagesOverride(translator) {
|
|
102
|
+
const {
|
|
103
|
+
t
|
|
104
|
+
} = translator;
|
|
105
|
+
return {
|
|
106
|
+
[this.name]: {
|
|
107
|
+
'any.required': buildValidationMessages(t).objectRequired,
|
|
108
|
+
'number.base': buildValidationMessages(t).objectMissing,
|
|
109
|
+
'number.precision': buildValidationMessages(t).numberPrecision,
|
|
110
|
+
'number.integer': buildValidationMessages(t).numberInteger,
|
|
111
|
+
'number.min': buildValidationMessages(t).numberMin,
|
|
112
|
+
'number.max': buildValidationMessages(t).numberMax
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
100
116
|
|
|
101
117
|
/**
|
|
102
118
|
* For error preview page that shows all possible errors on a component
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberField.js","names":["joi","FormComponent","isFormValue","messageTemplate","NumberField","constructor","def","props","options","schema","formSchema","number","custom","getValidatorPrecision","label","required","allow","messages","customValidationMessages","empty","min","max","precision","integer","customValidationMessage","message","default","stateSchema","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getViewModel","context","viewModel","attributes","prefix","suffix","inputmode","text","isNumber","getAllPossibleErrors","baseErrors","type","template","numberInteger","advancedSettingsErrors","numberMin","numberMax","numberPrecision","component","validator","helpers","limit","validationSchema","prefs","convert","attempt","error"],"sources":["../../../../../src/server/plugins/engine/components/NumberField.ts"],"sourcesContent":["import { type NumberFieldComponent } from '@defra/forms-model'\nimport joi, { type CustomValidator, type NumberSchema } from 'joi'\n\nimport {\n FormComponent,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class NumberField extends FormComponent {\n declare options: NumberFieldComponent['options']\n declare schema: NumberFieldComponent['schema']\n declare formSchema: NumberSchema\n declare stateSchema: NumberSchema\n\n constructor(\n def: NumberFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, schema } = def\n\n let formSchema = joi\n .number()\n .custom(getValidatorPrecision(this))\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n } else {\n const messages = options.customValidationMessages\n\n formSchema = formSchema.empty('').messages({\n 'any.required':\n messages?.['any.required'] ?? (messageTemplate.required as string)\n })\n }\n\n if (typeof schema.min === 'number') {\n formSchema = formSchema.min(schema.min)\n }\n\n if (typeof schema.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n\n if (typeof schema.precision === 'number' && schema.precision <= 0) {\n formSchema = formSchema.integer()\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'number.base': message,\n 'number.precision': message,\n 'number.integer': message,\n 'number.min': message,\n 'number.max': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n this.schema = schema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getViewModel(context: RenderContext) {\n const { options, schema } = this\n\n const viewModel = super.getViewModel(context)\n let { attributes, prefix, suffix, value } = viewModel\n\n if (typeof schema.precision === 'undefined' || schema.precision <= 0) {\n // If precision isn't provided or provided and\n // less than or equal to 0, use numeric inputmode\n attributes.inputmode = 'numeric'\n }\n\n if (options.prefix) {\n prefix = {\n text: options.prefix\n }\n }\n\n if (options.suffix) {\n suffix = {\n text: options.suffix\n }\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n ...viewModel,\n attributes,\n prefix,\n suffix,\n value\n }\n }\n\n isValue(value?: FormStateValue | FormState) {\n return NumberField.isNumber(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return NumberField.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: 'numberInteger', template: messageTemplate.numberInteger }\n ],\n advancedSettingsErrors: [\n { type: 'numberMin', template: messageTemplate.numberMin },\n { type: 'numberMax', template: messageTemplate.numberMax },\n { type: 'numberPrecision', template: messageTemplate.numberPrecision }\n ]\n }\n }\n\n static isNumber(value?: FormStateValue | FormState): value is number {\n return typeof value === 'number'\n }\n}\n\nexport function getValidatorPrecision(component: NumberField) {\n const validator: CustomValidator = (value: number, helpers) => {\n const { options, schema } = component\n\n const { customValidationMessage: custom } = options\n const { precision: limit } = schema\n\n if (!limit || limit <= 0) {\n return value\n }\n\n const validationSchema = joi\n .number()\n .precision(limit)\n .prefs({ convert: false })\n\n try {\n return joi.attempt(value, validationSchema)\n } catch {\n return custom\n ? helpers.message({ custom }, { limit })\n : helpers.error('number.precision', { limit })\n }\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"NumberField.js","names":["joi","FormComponent","isFormValue","buildValidationMessages","messageTemplate","NumberField","constructor","def","props","options","schema","formSchema","number","custom","getValidatorPrecision","label","required","allow","messages","customValidationMessages","empty","min","max","precision","integer","customValidationMessage","message","default","stateSchema","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getViewModel","context","viewModel","attributes","prefix","suffix","inputmode","text","isNumber","getValidationMessagesOverride","translator","t","objectRequired","objectMissing","numberPrecision","numberInteger","numberMin","numberMax","getAllPossibleErrors","baseErrors","type","template","advancedSettingsErrors","component","validator","helpers","limit","validationSchema","prefs","convert","attempt","error"],"sources":["../../../../../src/server/plugins/engine/components/NumberField.ts"],"sourcesContent":["import { type NumberFieldComponent } from '@defra/forms-model'\nimport joi, {\n type CustomValidator,\n type LanguageMessages,\n type NumberSchema\n} from 'joi'\n\nimport {\n FormComponent,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type Translator } from '~/src/server/plugins/engine/types/index.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class NumberField extends FormComponent {\n declare options: NumberFieldComponent['options']\n declare schema: NumberFieldComponent['schema']\n declare formSchema: NumberSchema\n declare stateSchema: NumberSchema\n\n constructor(\n def: NumberFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, schema } = def\n\n let formSchema = joi\n .number()\n .custom(getValidatorPrecision(this))\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n } else {\n const messages = options.customValidationMessages\n\n formSchema = formSchema.empty('').messages({\n 'any.required':\n messages?.['any.required'] ?? (messageTemplate.required as string)\n })\n }\n\n if (typeof schema.min === 'number') {\n formSchema = formSchema.min(schema.min)\n }\n\n if (typeof schema.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n\n if (typeof schema.precision === 'number' && schema.precision <= 0) {\n formSchema = formSchema.integer()\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'number.base': message,\n 'number.precision': message,\n 'number.integer': message,\n 'number.min': message,\n 'number.max': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n this.schema = schema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getViewModel(context: RenderContext) {\n const { options, schema } = this\n\n const viewModel = super.getViewModel(context)\n let { attributes, prefix, suffix, value } = viewModel\n\n if (typeof schema.precision === 'undefined' || schema.precision <= 0) {\n // If precision isn't provided or provided and\n // less than or equal to 0, use numeric inputmode\n attributes.inputmode = 'numeric'\n }\n\n if (options.prefix) {\n prefix = {\n text: options.prefix\n }\n }\n\n if (options.suffix) {\n suffix = {\n text: options.suffix\n }\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n ...viewModel,\n attributes,\n prefix,\n suffix,\n value\n }\n }\n\n isValue(value?: FormStateValue | FormState) {\n return NumberField.isNumber(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n return {\n [this.name]: {\n 'any.required': buildValidationMessages(t).objectRequired,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).numberPrecision,\n 'number.integer': buildValidationMessages(t).numberInteger,\n 'number.min': buildValidationMessages(t).numberMin,\n 'number.max': buildValidationMessages(t).numberMax\n } as LanguageMessages\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return NumberField.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: 'numberInteger', template: messageTemplate.numberInteger }\n ],\n advancedSettingsErrors: [\n { type: 'numberMin', template: messageTemplate.numberMin },\n { type: 'numberMax', template: messageTemplate.numberMax },\n { type: 'numberPrecision', template: messageTemplate.numberPrecision }\n ]\n }\n }\n\n static isNumber(value?: FormStateValue | FormState): value is number {\n return typeof value === 'number'\n }\n}\n\nexport function getValidatorPrecision(component: NumberField) {\n const validator: CustomValidator = (value: number, helpers) => {\n const { options, schema } = component\n\n const { customValidationMessage: custom } = options\n const { precision: limit } = schema\n\n if (!limit || limit <= 0) {\n return value\n }\n\n const validationSchema = joi\n .number()\n .precision(limit)\n .prefs({ convert: false })\n\n try {\n return joi.attempt(value, validationSchema)\n } catch {\n return custom\n ? helpers.message({ custom }, { limit })\n : helpers.error('number.precision', { limit })\n }\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type OsGridRefFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { LocationFieldBase } from '../../../../server/plugins/engine/components/LocationFieldBase.js';
|
|
3
|
+
import { type Translator } from '../../../../server/plugins/engine/types/index.js';
|
|
3
4
|
import { type ErrorMessageTemplateList } from '../../../../server/plugins/engine/types.js';
|
|
4
5
|
export declare class OsGridRefField extends LocationFieldBase {
|
|
5
6
|
options: OsGridRefFieldComponent['options'];
|
|
6
|
-
protected getValidationConfig(): {
|
|
7
|
+
protected getValidationConfig(translator: Translator | undefined): {
|
|
7
8
|
pattern: RegExp;
|
|
8
9
|
patternErrorMessage: import("joi").JoiExpression;
|
|
9
10
|
requiredMessage: import("joi").JoiExpression;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { EN_GB } from "../../../constants.js";
|
|
1
2
|
import { LocationFieldBase } from "./LocationFieldBase.js";
|
|
2
3
|
import { createLowerFirstExpression } from "./helpers/index.js";
|
|
3
4
|
import { t } from "../i18n/index.js";
|
|
4
5
|
export class OsGridRefField extends LocationFieldBase {
|
|
5
|
-
getValidationConfig() {
|
|
6
|
+
getValidationConfig(translator) {
|
|
6
7
|
// Regex for OS national grid references (NGR)
|
|
7
8
|
// Validates specific valid OS grid letter combinations with:
|
|
8
9
|
// - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678
|
|
@@ -12,8 +13,8 @@ export class OsGridRefField extends LocationFieldBase {
|
|
|
12
13
|
const pattern = /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\s?(([0-9]{3})\s?([0-9]{3})|([0-9]{4})\s?([0-9]{4})|([0-9]{5})\s?([0-9]{5}))$/;
|
|
13
14
|
return {
|
|
14
15
|
pattern,
|
|
15
|
-
patternErrorMessage: createLowerFirstExpression(t('components.osGridRefField.pattern'
|
|
16
|
-
requiredMessage: createLowerFirstExpression(t('components.osGridRefField.required'
|
|
16
|
+
patternErrorMessage: createLowerFirstExpression(translator ? translator.t('components.osGridRefField.pattern') : t('components.osGridRefField.pattern', EN_GB)),
|
|
17
|
+
requiredMessage: createLowerFirstExpression(translator ? translator.t('components.osGridRefField.required') : t('components.osGridRefField.required', EN_GB))
|
|
17
18
|
};
|
|
18
19
|
}
|
|
19
20
|
getErrorTemplates() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OsGridRefField.js","names":["LocationFieldBase","createLowerFirstExpression","t","OsGridRefField","getValidationConfig","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/OsGridRefField.ts"],"sourcesContent":["import { type OsGridRefFieldComponent } from '@defra/forms-model'\n\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class OsGridRefField extends LocationFieldBase {\n declare options: OsGridRefFieldComponent['options']\n\n protected getValidationConfig() {\n // Regex for OS national grid references (NGR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n // - 2 letters & 10 digits in 2 blocks of 5 e.g. SO 12345 12345\n // Optional spaces between each block\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?(([0-9]{3})\\s?([0-9]{3})|([0-9]{4})\\s?([0-9]{4})|([0-9]{5})\\s?([0-9]{5}))$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n t('components.osGridRefField.pattern'
|
|
1
|
+
{"version":3,"file":"OsGridRefField.js","names":["EN_GB","LocationFieldBase","createLowerFirstExpression","t","OsGridRefField","getValidationConfig","translator","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/OsGridRefField.ts"],"sourcesContent":["import { type OsGridRefFieldComponent } from '@defra/forms-model'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/types/index.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class OsGridRefField extends LocationFieldBase {\n declare options: OsGridRefFieldComponent['options']\n\n protected getValidationConfig(translator: Translator | undefined) {\n // Regex for OS national grid references (NGR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n // - 2 letters & 10 digits in 2 blocks of 5 e.g. SO 12345 12345\n // Optional spaces between each block\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?(([0-9]{3})\\s?([0-9]{3})|([0-9]{4})\\s?([0-9]{4})|([0-9]{5})\\s?([0-9]{5}))$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.osGridRefField.pattern')\n : t('components.osGridRefField.pattern', EN_GB)\n ),\n requiredMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.osGridRefField.required')\n : t('components.osGridRefField.required', EN_GB)\n )\n }\n }\n\n protected getErrorTemplates() {\n return [\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.osGridRefField.pattern', 'en-GB')\n )\n }\n ]\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: 'required',\n template: createLowerFirstExpression(\n t('components.osGridRefField.required', 'en-GB')\n )\n },\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.osGridRefField.pattern', 'en-GB')\n )\n }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAEA,SAASA,KAAK;AACd,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,CAAC;AAIV,OAAO,MAAMC,cAAc,SAASH,iBAAiB,CAAC;EAG1CI,mBAAmBA,CAACC,UAAkC,EAAE;IAChE;IACA;IACA;IACA;IACA;IACA;IACA,MAAMC,OAAO,GACX,qLAAqL;IAEvL,OAAO;MACLA,OAAO;MACPC,mBAAmB,EAAEN,0BAA0B,CAC7CI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,mCAAmC,CAAC,GACjDA,CAAC,CAAC,mCAAmC,EAAEH,KAAK,CAClD,CAAC;MACDS,eAAe,EAAEP,0BAA0B,CACzCI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,oCAAoC,CAAC,GAClDA,CAAC,CAAC,oCAAoC,EAAEH,KAAK,CACnD;IACF,CAAC;EACH;EAEUU,iBAAiBA,CAAA,EAAG;IAC5B,OAAO,CACL;MACEC,IAAI,EAAE,SAAS;MACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAChD;IACF,CAAC,CACF;EACH;;EAEA;AACF;AACA;EACE,OAAOU,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QACEH,IAAI,EAAE,UAAU;QAChBC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,oCAAoC,EAAE,OAAO,CACjD;MACF,CAAC,EACD;QACEQ,IAAI,EAAE,SAAS;QACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAChD;MACF,CAAC,CACF;MACDY,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -11,6 +11,7 @@ export declare class PaymentField extends FormComponent {
|
|
|
11
11
|
options: PaymentFieldComponent['options'];
|
|
12
12
|
formSchema: ObjectSchema;
|
|
13
13
|
stateSchema: ObjectSchema;
|
|
14
|
+
def: PaymentFieldComponent;
|
|
14
15
|
isAppendageStateSingleObject: boolean;
|
|
15
16
|
constructor(def: PaymentFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
16
17
|
/**
|
|
@@ -68,6 +69,7 @@ export declare class PaymentField extends FormComponent {
|
|
|
68
69
|
upload?: {
|
|
69
70
|
count: number;
|
|
70
71
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
72
|
+
uploadingLabel?: string;
|
|
71
73
|
};
|
|
72
74
|
};
|
|
73
75
|
/**
|
|
@@ -122,6 +124,7 @@ export interface PaymentSessionData {
|
|
|
122
124
|
reference: string;
|
|
123
125
|
amount: number;
|
|
124
126
|
description: string;
|
|
127
|
+
descriptionInEng?: string;
|
|
125
128
|
paymentId: string;
|
|
126
129
|
componentName: string;
|
|
127
130
|
returnUrl: string;
|
|
@@ -13,11 +13,13 @@ export class PaymentField extends FormComponent {
|
|
|
13
13
|
constructor(def, props) {
|
|
14
14
|
super(def, props);
|
|
15
15
|
this.options = def.options;
|
|
16
|
+
this.def = def;
|
|
16
17
|
const paymentStateSchema = joi.object({
|
|
17
18
|
paymentId: joi.string().required(),
|
|
18
19
|
reference: joi.string().required(),
|
|
19
20
|
amount: joi.number().required(),
|
|
20
21
|
description: joi.string().required(),
|
|
22
|
+
descriptionInEng: joi.string().optional(),
|
|
21
23
|
uuid: joi.string().uuid().required(),
|
|
22
24
|
formId: joi.string().required(),
|
|
23
25
|
isLivePayment: joi.boolean().required(),
|
|
@@ -52,6 +54,12 @@ export class PaymentField extends FormComponent {
|
|
|
52
54
|
payload
|
|
53
55
|
} = context;
|
|
54
56
|
const viewModel = super.getViewModel(context);
|
|
57
|
+
const {
|
|
58
|
+
translator
|
|
59
|
+
} = context;
|
|
60
|
+
const {
|
|
61
|
+
tComponent
|
|
62
|
+
} = translator;
|
|
55
63
|
|
|
56
64
|
// Payload is pre-populated from state if a payment has already been made
|
|
57
65
|
const paymentState = this.isPaymentState(payload[this.name]) ? payload[this.name] : undefined;
|
|
@@ -63,7 +71,7 @@ export class PaymentField extends FormComponent {
|
|
|
63
71
|
return {
|
|
64
72
|
...viewModel,
|
|
65
73
|
amount: formatCurrency(amount),
|
|
66
|
-
description: this.options.description,
|
|
74
|
+
description: tComponent(this.def, 'paymentDescription') || this.options.description,
|
|
67
75
|
paymentState
|
|
68
76
|
};
|
|
69
77
|
}
|
|
@@ -157,10 +165,11 @@ export class PaymentField extends FormComponent {
|
|
|
157
165
|
const {
|
|
158
166
|
model
|
|
159
167
|
} = args.controller;
|
|
160
|
-
const language = resolveLanguage(request);
|
|
161
168
|
const {
|
|
162
|
-
|
|
163
|
-
|
|
169
|
+
language,
|
|
170
|
+
t,
|
|
171
|
+
tComponent
|
|
172
|
+
} = model.createTranslator(resolveLanguage(request));
|
|
164
173
|
const state = await args.controller.getState(request);
|
|
165
174
|
const {
|
|
166
175
|
baseUrl
|
|
@@ -182,7 +191,7 @@ export class PaymentField extends FormComponent {
|
|
|
182
191
|
if (resolvedAmount === 0) {
|
|
183
192
|
return h.redirect(summaryUrl).code(StatusCodes.SEE_OTHER);
|
|
184
193
|
}
|
|
185
|
-
const description = options.description;
|
|
194
|
+
const description = tComponent(args.component, 'paymentDescription') || options.description;
|
|
186
195
|
const slug = `/${model.basePath}`;
|
|
187
196
|
const payCallbackUrl = `${baseUrl}/payment-callback?uuid=${uuid}`;
|
|
188
197
|
const paymentPageUrl = args.sourceUrl;
|
|
@@ -194,7 +203,8 @@ export class PaymentField extends FormComponent {
|
|
|
194
203
|
const amountInPence = Math.round(resolvedAmount * 100);
|
|
195
204
|
const payment = await paymentService.createPayment(amountInPence, description, payCallbackUrl, reference, isLivePayment, {
|
|
196
205
|
formId,
|
|
197
|
-
slug
|
|
206
|
+
slug,
|
|
207
|
+
language
|
|
198
208
|
}, prefilledEmail);
|
|
199
209
|
if (!payment) {
|
|
200
210
|
const message = isLivePayment ? t('components.paymentField.cannotTakePayment') : t('components.paymentField.testApiKey');
|
|
@@ -208,6 +218,7 @@ export class PaymentField extends FormComponent {
|
|
|
208
218
|
reference,
|
|
209
219
|
amount: resolvedAmount,
|
|
210
220
|
description,
|
|
221
|
+
descriptionInEng: options.description,
|
|
211
222
|
paymentId: payment.paymentId,
|
|
212
223
|
componentName,
|
|
213
224
|
returnUrl: summaryUrl,
|