@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,7 +12,10 @@ import {
|
|
|
12
12
|
getLocationFieldViewModel
|
|
13
13
|
} from './LocationFieldHelpers.js'
|
|
14
14
|
import { NumberField } from './NumberField.js'
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
createLowerFirstExpression,
|
|
17
|
+
getTranslatedLabel
|
|
18
|
+
} from './helpers/index.js'
|
|
16
19
|
import {
|
|
17
20
|
type LatLongState,
|
|
18
21
|
type RenderContext
|
|
@@ -28,7 +31,6 @@ import {
|
|
|
28
31
|
type FormSubmissionError,
|
|
29
32
|
type FormSubmissionState
|
|
30
33
|
} from '../types.js'
|
|
31
|
-
import { convertToLanguageMessages } from '../../../utils/type-utils.js'
|
|
32
34
|
|
|
33
35
|
// Precision constants
|
|
34
36
|
// UK latitude/longitude requires high precision for accurate location (within ~11mm)
|
|
@@ -50,59 +52,18 @@ export class LatLongField extends FormComponent {
|
|
|
50
52
|
|
|
51
53
|
const isRequired = options.required !== false
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const latitudeMax = schema?.latitude?.max ?? 60.859
|
|
56
|
-
const longitudeMin = schema?.longitude?.min ?? -13.687
|
|
57
|
-
const longitudeMax = schema?.longitude?.max ?? 1.767
|
|
58
|
-
|
|
59
|
-
const fieldLabel = lowerFirst(this.label)
|
|
60
|
-
|
|
61
|
-
const customValidationMessages: LanguageMessages =
|
|
62
|
-
convertToLanguageMessages({
|
|
63
|
-
'number.precision': tPlugin(
|
|
64
|
-
'components.latLongField.precision',
|
|
65
|
-
'en-GB'
|
|
66
|
-
),
|
|
67
|
-
'number.unsafe': tPlugin('components.latLongField.notANumber', 'en-GB')
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
const latitudeRangeMessage = tPlugin(
|
|
71
|
-
'components.latLongField.latitudeRange',
|
|
72
|
-
'en-GB',
|
|
73
|
-
{ fieldLabel, min: latitudeMin, max: latitudeMax }
|
|
74
|
-
)
|
|
75
|
-
const longitudeRangeMessage = tPlugin(
|
|
76
|
-
'components.latLongField.longitudeRange',
|
|
77
|
-
'en-GB',
|
|
78
|
-
{ fieldLabel, min: longitudeMin, max: longitudeMax }
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
const latitudeMessages: LanguageMessages = convertToLanguageMessages({
|
|
82
|
-
...customValidationMessages,
|
|
83
|
-
'any.required': tPlugin(
|
|
84
|
-
'components.latLongField.latitudeRequired',
|
|
85
|
-
'en-GB'
|
|
86
|
-
),
|
|
87
|
-
'number.base': tPlugin('components.latLongField.latitudeBase', 'en-GB', {
|
|
88
|
-
fieldLabel
|
|
89
|
-
}),
|
|
90
|
-
'number.min': latitudeRangeMessage,
|
|
91
|
-
'number.max': latitudeRangeMessage
|
|
92
|
-
})
|
|
55
|
+
const { latitudeMin, latitudeMax, longitudeMin, longitudeMax } =
|
|
56
|
+
LatLongField.getMinMax(schema)
|
|
93
57
|
|
|
94
|
-
const longitudeMessages
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
58
|
+
const { latitudeMessages, longitudeMessages } =
|
|
59
|
+
LatLongField.buildErrorMessages(
|
|
60
|
+
this.label,
|
|
61
|
+
latitudeMin,
|
|
62
|
+
latitudeMax,
|
|
63
|
+
longitudeMin,
|
|
64
|
+
longitudeMax,
|
|
98
65
|
'en-GB'
|
|
99
|
-
)
|
|
100
|
-
'number.base': tPlugin('components.latLongField.longitudeBase', 'en-GB', {
|
|
101
|
-
fieldLabel
|
|
102
|
-
}),
|
|
103
|
-
'number.min': longitudeRangeMessage,
|
|
104
|
-
'number.max': longitudeRangeMessage
|
|
105
|
-
})
|
|
66
|
+
)
|
|
106
67
|
|
|
107
68
|
this.collection = new ComponentCollection(
|
|
108
69
|
[
|
|
@@ -159,14 +120,16 @@ export class LatLongField extends FormComponent {
|
|
|
159
120
|
|
|
160
121
|
getDisplayStringFromFormValue(
|
|
161
122
|
value: LatLongState | undefined,
|
|
162
|
-
|
|
123
|
+
translator: Translator
|
|
163
124
|
): string {
|
|
164
125
|
if (!value) {
|
|
165
126
|
return ''
|
|
166
127
|
}
|
|
167
128
|
|
|
168
|
-
|
|
169
|
-
|
|
129
|
+
const { t } = translator
|
|
130
|
+
|
|
131
|
+
// Output format: Latitude: <<entry>>\nLongitude: <<entry>>
|
|
132
|
+
return `${t('components.latLongField.latitude')}: ${value.latitude}\n${t('components.latLongField.longitude')}: ${value.longitude}`
|
|
170
133
|
}
|
|
171
134
|
|
|
172
135
|
getDisplayStringFromState(
|
|
@@ -183,8 +146,7 @@ export class LatLongField extends FormComponent {
|
|
|
183
146
|
return null
|
|
184
147
|
}
|
|
185
148
|
|
|
186
|
-
|
|
187
|
-
return `Latitude: ${value.latitude}\nLongitude: ${value.longitude}`
|
|
149
|
+
return `${value.latitude}, ${value.longitude}`
|
|
188
150
|
}
|
|
189
151
|
|
|
190
152
|
getContextValueFromState(state: FormSubmissionState) {
|
|
@@ -210,6 +172,26 @@ export class LatLongField extends FormComponent {
|
|
|
210
172
|
return LatLongField.isLatLong(value)
|
|
211
173
|
}
|
|
212
174
|
|
|
175
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
176
|
+
const def = this.def as LatLongFieldComponent
|
|
177
|
+
const translatedLabel = getTranslatedLabel(def, translator)
|
|
178
|
+
const { latitudeMin, latitudeMax, longitudeMin, longitudeMax } =
|
|
179
|
+
LatLongField.getMinMax(def.schema)
|
|
180
|
+
const { latitudeMessages, longitudeMessages } =
|
|
181
|
+
LatLongField.buildErrorMessages(
|
|
182
|
+
translatedLabel,
|
|
183
|
+
latitudeMin,
|
|
184
|
+
latitudeMax,
|
|
185
|
+
longitudeMin,
|
|
186
|
+
longitudeMax,
|
|
187
|
+
translator.language
|
|
188
|
+
)
|
|
189
|
+
return {
|
|
190
|
+
[`${this.name}__latitude`]: latitudeMessages,
|
|
191
|
+
[`${this.name}__longitude`]: longitudeMessages
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
213
195
|
/**
|
|
214
196
|
* For error preview page that shows all possible errors on a component
|
|
215
197
|
*/
|
|
@@ -273,4 +255,92 @@ export class LatLongField extends FormComponent {
|
|
|
273
255
|
NumberField.isNumber(value.longitude)
|
|
274
256
|
)
|
|
275
257
|
}
|
|
258
|
+
|
|
259
|
+
static buildErrorMessages(
|
|
260
|
+
label: string,
|
|
261
|
+
latitudeMin: number,
|
|
262
|
+
latitudeMax: number,
|
|
263
|
+
longitudeMin: number,
|
|
264
|
+
longitudeMax: number,
|
|
265
|
+
language: string
|
|
266
|
+
) {
|
|
267
|
+
const fieldLabel = lowerFirst(label)
|
|
268
|
+
|
|
269
|
+
const customValidationMessages: LanguageMessages = {
|
|
270
|
+
'number.precision': tPlugin(
|
|
271
|
+
'components.latLongField.precision',
|
|
272
|
+
language
|
|
273
|
+
),
|
|
274
|
+
'number.unsafe': tPlugin('components.latLongField.notANumber', language)
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const latitudeRangeMessage = tPlugin(
|
|
278
|
+
'components.latLongField.latitudeRange',
|
|
279
|
+
language,
|
|
280
|
+
{ fieldLabel, min: latitudeMin, max: latitudeMax }
|
|
281
|
+
)
|
|
282
|
+
const longitudeRangeMessage = tPlugin(
|
|
283
|
+
'components.latLongField.longitudeRange',
|
|
284
|
+
language,
|
|
285
|
+
{ fieldLabel, min: longitudeMin, max: longitudeMax }
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
const latitudeMessages: LanguageMessages = {
|
|
289
|
+
...customValidationMessages,
|
|
290
|
+
'any.required': tPlugin(
|
|
291
|
+
'components.latLongField.latitudeRequired',
|
|
292
|
+
language
|
|
293
|
+
),
|
|
294
|
+
'number.base': tPlugin('components.latLongField.latitudeBase', language, {
|
|
295
|
+
fieldLabel
|
|
296
|
+
}),
|
|
297
|
+
'number.min': latitudeRangeMessage,
|
|
298
|
+
'number.max': latitudeRangeMessage
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const longitudeMessages: LanguageMessages = {
|
|
302
|
+
...customValidationMessages,
|
|
303
|
+
'any.required': tPlugin(
|
|
304
|
+
'components.latLongField.longitudeRequired',
|
|
305
|
+
language
|
|
306
|
+
),
|
|
307
|
+
'number.base': tPlugin(
|
|
308
|
+
'components.latLongField.longitudeBase',
|
|
309
|
+
language,
|
|
310
|
+
{
|
|
311
|
+
fieldLabel
|
|
312
|
+
}
|
|
313
|
+
),
|
|
314
|
+
'number.min': longitudeRangeMessage,
|
|
315
|
+
'number.max': longitudeRangeMessage
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
latitudeMessages,
|
|
320
|
+
longitudeMessages
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Read schema values from def.schema with fallback defaults
|
|
325
|
+
static getMinMax(
|
|
326
|
+
schema:
|
|
327
|
+
| {
|
|
328
|
+
latitude?: {
|
|
329
|
+
min?: number
|
|
330
|
+
max?: number
|
|
331
|
+
}
|
|
332
|
+
longitude?: {
|
|
333
|
+
min?: number
|
|
334
|
+
max?: number
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
| undefined
|
|
338
|
+
) {
|
|
339
|
+
return {
|
|
340
|
+
latitudeMin: schema?.latitude?.min ?? 49.85,
|
|
341
|
+
latitudeMax: schema?.latitude?.max ?? 60.859,
|
|
342
|
+
longitudeMin: schema?.longitude?.min ?? -13.687,
|
|
343
|
+
longitudeMax: schema?.longitude?.max ?? 1.767
|
|
344
|
+
}
|
|
345
|
+
}
|
|
276
346
|
}
|
|
@@ -11,14 +11,15 @@ import {
|
|
|
11
11
|
} from './FormComponent.js'
|
|
12
12
|
import { addClassOptionIfNone } from './helpers/index.js'
|
|
13
13
|
import { type RenderContext } from './types.js'
|
|
14
|
+
import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
|
|
14
15
|
import { messageTemplate } from '../pageControllers/validationOptions.js'
|
|
16
|
+
import { type Translator } from '../types/index.js'
|
|
15
17
|
import {
|
|
16
18
|
type ErrorMessageTemplateList,
|
|
17
19
|
type FormState,
|
|
18
20
|
type FormStateValue,
|
|
19
21
|
type FormSubmissionState
|
|
20
22
|
} from '../types.js'
|
|
21
|
-
import { convertToLanguageMessages } from '../../../utils/type-utils.js'
|
|
22
23
|
|
|
23
24
|
interface LocationFieldOptions {
|
|
24
25
|
instructionText?: string
|
|
@@ -43,7 +44,9 @@ export abstract class LocationFieldBase extends FormComponent {
|
|
|
43
44
|
declare stateSchema: StringSchema
|
|
44
45
|
instructionText?: string
|
|
45
46
|
|
|
46
|
-
protected abstract getValidationConfig(
|
|
47
|
+
protected abstract getValidationConfig(
|
|
48
|
+
translator: Translator | undefined
|
|
49
|
+
): ValidationConfig
|
|
47
50
|
protected abstract getErrorTemplates(): {
|
|
48
51
|
type: string
|
|
49
52
|
template: JoiExpression
|
|
@@ -61,14 +64,14 @@ export abstract class LocationFieldBase extends FormComponent {
|
|
|
61
64
|
|
|
62
65
|
addClassOptionIfNone(locationOptions, 'govuk-input--width-10')
|
|
63
66
|
|
|
64
|
-
const config = this.getValidationConfig()
|
|
67
|
+
const config = this.getValidationConfig(undefined)
|
|
65
68
|
const requiredMessage = config.requiredMessage ?? messageTemplate.required
|
|
66
69
|
|
|
67
|
-
const messages =
|
|
70
|
+
const messages = {
|
|
68
71
|
'any.required': requiredMessage,
|
|
69
72
|
'string.empty': requiredMessage,
|
|
70
73
|
'string.pattern.base': config.patternErrorMessage
|
|
71
|
-
}
|
|
74
|
+
} as LanguageMessages
|
|
72
75
|
|
|
73
76
|
let formSchema = joi
|
|
74
77
|
.string()
|
|
@@ -131,8 +134,22 @@ export abstract class LocationFieldBase extends FormComponent {
|
|
|
131
134
|
return viewModel
|
|
132
135
|
}
|
|
133
136
|
|
|
137
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
138
|
+
const { t } = translator
|
|
139
|
+
const config = this.getValidationConfig(translator)
|
|
140
|
+
return {
|
|
141
|
+
[this.name]: {
|
|
142
|
+
'any.required':
|
|
143
|
+
config.requiredMessage ?? buildValidationMessages(t).objectRequired,
|
|
144
|
+
'string.empty':
|
|
145
|
+
config.requiredMessage ?? buildValidationMessages(t).objectRequired,
|
|
146
|
+
'string.pattern.base': config.patternErrorMessage
|
|
147
|
+
} as LanguageMessages
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
134
151
|
getAllPossibleErrors(): ErrorMessageTemplateList {
|
|
135
|
-
const config = this.getValidationConfig()
|
|
152
|
+
const config = this.getValidationConfig(undefined)
|
|
136
153
|
|
|
137
154
|
return {
|
|
138
155
|
baseErrors: [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Context, type CustomValidator } from 'joi'
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { EastingNorthingField } from './EastingNorthingField.js'
|
|
4
4
|
import { isFormValue } from './FormComponent.js'
|
|
5
5
|
import { type GeospatialField } from './GeospatialField.js'
|
|
6
6
|
import { type LatLongField } from './LatLongField.js'
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
type RenderContext,
|
|
12
12
|
type ViewModel
|
|
13
13
|
} from './types.js'
|
|
14
|
+
import { type Translator } from '../i18n/types.js'
|
|
14
15
|
import {
|
|
15
16
|
type FormPayload,
|
|
16
17
|
type FormSubmissionError,
|
|
@@ -29,25 +30,25 @@ export type LocationField =
|
|
|
29
30
|
* - "latitude must be..." -> "latitude must be..."
|
|
30
31
|
*/
|
|
31
32
|
function lowercaseMessageStart(message: string): string {
|
|
32
|
-
|
|
33
|
-
return 'enter' + message.slice(5)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Lowercase first character for any other message
|
|
33
|
+
// Lowercase first character for a message
|
|
37
34
|
return message.charAt(0).toLowerCase() + message.slice(1)
|
|
38
35
|
}
|
|
39
36
|
|
|
40
|
-
export function joinWithAnd(items: string[]): string {
|
|
37
|
+
export function joinWithAnd(items: string[], translator: Translator): string {
|
|
38
|
+
const { t } = translator
|
|
41
39
|
if (items.length === 2) {
|
|
42
|
-
return `${items[0]} and ${items[1]}`
|
|
40
|
+
return `${items[0]} ${t('common.and')} ${items[1]}`
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
const leading = items.slice(0, -1).join(', ')
|
|
46
44
|
const last = items[items.length - 1]
|
|
47
|
-
return `${leading} and ${last}`
|
|
45
|
+
return `${leading} ${t('common.and')} ${last}`
|
|
48
46
|
}
|
|
49
47
|
|
|
50
|
-
export function formatErrorList(
|
|
48
|
+
export function formatErrorList(
|
|
49
|
+
messages: string[],
|
|
50
|
+
translator: Translator
|
|
51
|
+
): string {
|
|
51
52
|
if (!messages.length) {
|
|
52
53
|
return ''
|
|
53
54
|
}
|
|
@@ -60,7 +61,7 @@ export function formatErrorList(messages: string[]): string {
|
|
|
60
61
|
index === 0 ? msg : lowercaseMessageStart(msg)
|
|
61
62
|
)
|
|
62
63
|
|
|
63
|
-
return joinWithAnd(formattedMessages)
|
|
64
|
+
return joinWithAnd(formattedMessages, translator)
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
export function mergeCssClasses(...classNames: (string | undefined)[]) {
|
|
@@ -172,7 +173,9 @@ export function getLocationFieldViewModel(
|
|
|
172
173
|
if (hasFieldErrors) {
|
|
173
174
|
viewModel.errorMessage = {
|
|
174
175
|
text:
|
|
175
|
-
fieldErrors.length === 1
|
|
176
|
+
fieldErrors.length === 1
|
|
177
|
+
? fieldErrors[0]
|
|
178
|
+
: formatErrorList(fieldErrors, context.translator)
|
|
176
179
|
}
|
|
177
180
|
}
|
|
178
181
|
|
|
@@ -187,7 +190,11 @@ export function getLocationFieldViewModel(
|
|
|
187
190
|
...viewModel,
|
|
188
191
|
fieldset,
|
|
189
192
|
items,
|
|
190
|
-
mapLayers: getMapLayers(component)
|
|
193
|
+
mapLayers: getMapLayers(component),
|
|
194
|
+
country:
|
|
195
|
+
component instanceof EastingNorthingField
|
|
196
|
+
? component.options.countries?.at(0)
|
|
197
|
+
: undefined
|
|
191
198
|
}
|
|
192
199
|
|
|
193
200
|
if (component.options.instructionText) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type MarkdownComponent } from '@defra/forms-model'
|
|
2
2
|
|
|
3
3
|
import { ComponentBase } from './ComponentBase.js'
|
|
4
4
|
import { type RenderContext } from './types.js'
|
|
@@ -28,8 +28,7 @@ export class Markdown extends ComponentBase {
|
|
|
28
28
|
|
|
29
29
|
return {
|
|
30
30
|
...viewModel,
|
|
31
|
-
content:
|
|
32
|
-
tComponent(this as unknown as ComponentDef, 'content') || content,
|
|
31
|
+
content: tComponent(this.def, 'content') || content,
|
|
33
32
|
headerStartLevel: this.headerStartLevel
|
|
34
33
|
}
|
|
35
34
|
}
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
type FormStateValue,
|
|
31
31
|
type FormSubmissionState
|
|
32
32
|
} from '../types.js'
|
|
33
|
-
import {
|
|
33
|
+
import { formatDateForLanguage } from '../../payment/helper.js'
|
|
34
34
|
|
|
35
35
|
export class MonthYearField extends FormComponent {
|
|
36
36
|
declare options: MonthYearFieldComponent['options']
|
|
@@ -48,16 +48,15 @@ export class MonthYearField extends FormComponent {
|
|
|
48
48
|
|
|
49
49
|
const isRequired = options.required !== false
|
|
50
50
|
|
|
51
|
-
const customValidationMessages
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
})
|
|
51
|
+
const customValidationMessages = {
|
|
52
|
+
'any.required': messageTemplate.objectMissing,
|
|
53
|
+
'number.base': messageTemplate.objectMissing,
|
|
54
|
+
'number.precision': messageTemplate.dateFormat,
|
|
55
|
+
'number.integer': messageTemplate.dateFormat,
|
|
56
|
+
'number.unsafe': messageTemplate.dateFormat,
|
|
57
|
+
'number.min': messageTemplate.dateFormat,
|
|
58
|
+
'number.max': messageTemplate.dateFormat
|
|
59
|
+
} as LanguageMessages
|
|
61
60
|
|
|
62
61
|
this.collection = new ComponentCollection(
|
|
63
62
|
[
|
|
@@ -105,16 +104,18 @@ export class MonthYearField extends FormComponent {
|
|
|
105
104
|
|
|
106
105
|
getDisplayStringFromFormValue(
|
|
107
106
|
value: MonthYearState | undefined,
|
|
108
|
-
|
|
107
|
+
translator: Translator
|
|
109
108
|
): string {
|
|
110
109
|
if (!value) {
|
|
111
110
|
return ''
|
|
112
111
|
}
|
|
113
112
|
|
|
114
113
|
const date = new Date()
|
|
114
|
+
// Force to first day of month in case current date was say 31st and specified month has fewer than 31 days
|
|
115
|
+
date.setDate(1)
|
|
115
116
|
date.setMonth(value.month - 1)
|
|
116
117
|
|
|
117
|
-
const monthString = date
|
|
118
|
+
const monthString = formatDateForLanguage(date, 'LLLL', translator.language)
|
|
118
119
|
return `${monthString} ${value.year}`
|
|
119
120
|
}
|
|
120
121
|
|
|
@@ -155,7 +156,7 @@ export class MonthYearField extends FormComponent {
|
|
|
155
156
|
|
|
156
157
|
getValidationMessagesOverride(translator: Translator) {
|
|
157
158
|
const { t } = translator
|
|
158
|
-
|
|
159
|
+
const messages = {
|
|
159
160
|
'any.required': buildValidationMessages(t).objectMissing,
|
|
160
161
|
'number.base': buildValidationMessages(t).objectMissing,
|
|
161
162
|
'number.precision': buildValidationMessages(t).dateFormat,
|
|
@@ -163,7 +164,11 @@ export class MonthYearField extends FormComponent {
|
|
|
163
164
|
'number.unsafe': buildValidationMessages(t).dateFormat,
|
|
164
165
|
'number.min': buildValidationMessages(t).dateFormat,
|
|
165
166
|
'number.max': buildValidationMessages(t).dateFormat
|
|
166
|
-
}
|
|
167
|
+
} as LanguageMessages
|
|
168
|
+
return {
|
|
169
|
+
[`${this.name}__month`]: messages,
|
|
170
|
+
[`${this.name}__year`]: messages
|
|
171
|
+
}
|
|
167
172
|
}
|
|
168
173
|
|
|
169
174
|
getViewModel(context: RenderContext) {
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'
|
|
2
2
|
|
|
3
|
+
import { EN_GB } from '../../../constants.js'
|
|
3
4
|
import { LocationFieldBase } from './LocationFieldBase.js'
|
|
4
5
|
import { createLowerFirstExpression } from './helpers/index.js'
|
|
5
6
|
import { t } from '../i18n/index.js'
|
|
7
|
+
import { type Translator } from '../i18n/types.js'
|
|
6
8
|
import { type ErrorMessageTemplateList } from '../types.js'
|
|
7
9
|
|
|
8
10
|
export class NationalGridFieldNumberField extends LocationFieldBase {
|
|
9
11
|
declare options: NationalGridFieldNumberFieldComponent['options']
|
|
10
12
|
|
|
11
|
-
protected getValidationConfig() {
|
|
13
|
+
protected getValidationConfig(translator: Translator | undefined) {
|
|
12
14
|
// Regex for OS national grid field references (NGFR)
|
|
13
15
|
// Validates specific valid OS grid letter combinations with:
|
|
14
16
|
// - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789
|
|
@@ -18,10 +20,14 @@ export class NationalGridFieldNumberField extends LocationFieldBase {
|
|
|
18
20
|
return {
|
|
19
21
|
pattern,
|
|
20
22
|
patternErrorMessage: createLowerFirstExpression(
|
|
21
|
-
|
|
23
|
+
translator
|
|
24
|
+
? translator.t('components.nationalGridField.pattern')
|
|
25
|
+
: t('components.nationalGridField.pattern', EN_GB)
|
|
22
26
|
),
|
|
23
27
|
requiredMessage: createLowerFirstExpression(
|
|
24
|
-
|
|
28
|
+
translator
|
|
29
|
+
? translator.t('components.nationalGridField.required')
|
|
30
|
+
: t('components.nationalGridField.required', EN_GB)
|
|
25
31
|
)
|
|
26
32
|
}
|
|
27
33
|
}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { type NumberFieldComponent } from '@defra/forms-model'
|
|
2
|
-
import joi, {
|
|
2
|
+
import joi, {
|
|
3
|
+
type CustomValidator,
|
|
4
|
+
type LanguageMessages,
|
|
5
|
+
type NumberSchema
|
|
6
|
+
} from 'joi'
|
|
3
7
|
|
|
4
8
|
import {
|
|
5
9
|
FormComponent,
|
|
6
10
|
isFormValue
|
|
7
11
|
} from './FormComponent.js'
|
|
8
12
|
import { type RenderContext } from './types.js'
|
|
13
|
+
import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
|
|
9
14
|
import { messageTemplate } from '../pageControllers/validationOptions.js'
|
|
15
|
+
import { type Translator } from '../types/index.js'
|
|
10
16
|
import {
|
|
11
17
|
type ErrorMessageTemplateList,
|
|
12
18
|
type FormState,
|
|
@@ -130,6 +136,20 @@ export class NumberField extends FormComponent {
|
|
|
130
136
|
return NumberField.isNumber(value)
|
|
131
137
|
}
|
|
132
138
|
|
|
139
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
140
|
+
const { t } = translator
|
|
141
|
+
return {
|
|
142
|
+
[this.name]: {
|
|
143
|
+
'any.required': buildValidationMessages(t).objectRequired,
|
|
144
|
+
'number.base': buildValidationMessages(t).objectMissing,
|
|
145
|
+
'number.precision': buildValidationMessages(t).numberPrecision,
|
|
146
|
+
'number.integer': buildValidationMessages(t).numberInteger,
|
|
147
|
+
'number.min': buildValidationMessages(t).numberMin,
|
|
148
|
+
'number.max': buildValidationMessages(t).numberMax
|
|
149
|
+
} as LanguageMessages
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
133
153
|
/**
|
|
134
154
|
* For error preview page that shows all possible errors on a component
|
|
135
155
|
*/
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { type OsGridRefFieldComponent } from '@defra/forms-model'
|
|
2
2
|
|
|
3
|
+
import { EN_GB } from '../../../constants.js'
|
|
3
4
|
import { LocationFieldBase } from './LocationFieldBase.js'
|
|
4
5
|
import { createLowerFirstExpression } from './helpers/index.js'
|
|
5
6
|
import { t } from '../i18n/index.js'
|
|
7
|
+
import { type Translator } from '../types/index.js'
|
|
6
8
|
import { type ErrorMessageTemplateList } from '../types.js'
|
|
7
9
|
|
|
8
10
|
export class OsGridRefField extends LocationFieldBase {
|
|
9
11
|
declare options: OsGridRefFieldComponent['options']
|
|
10
12
|
|
|
11
|
-
protected getValidationConfig() {
|
|
13
|
+
protected getValidationConfig(translator: Translator | undefined) {
|
|
12
14
|
// Regex for OS national grid references (NGR)
|
|
13
15
|
// Validates specific valid OS grid letter combinations with:
|
|
14
16
|
// - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678
|
|
@@ -21,10 +23,14 @@ export class OsGridRefField extends LocationFieldBase {
|
|
|
21
23
|
return {
|
|
22
24
|
pattern,
|
|
23
25
|
patternErrorMessage: createLowerFirstExpression(
|
|
24
|
-
|
|
26
|
+
translator
|
|
27
|
+
? translator.t('components.osGridRefField.pattern')
|
|
28
|
+
: t('components.osGridRefField.pattern', EN_GB)
|
|
25
29
|
),
|
|
26
30
|
requiredMessage: createLowerFirstExpression(
|
|
27
|
-
|
|
31
|
+
translator
|
|
32
|
+
? translator.t('components.osGridRefField.required')
|
|
33
|
+
: t('components.osGridRefField.required', EN_GB)
|
|
28
34
|
)
|
|
29
35
|
}
|
|
30
36
|
}
|
|
@@ -45,6 +45,7 @@ export class PaymentField extends FormComponent {
|
|
|
45
45
|
declare options: PaymentFieldComponent['options']
|
|
46
46
|
declare formSchema: ObjectSchema
|
|
47
47
|
declare stateSchema: ObjectSchema
|
|
48
|
+
declare def: PaymentFieldComponent
|
|
48
49
|
isAppendageStateSingleObject = true
|
|
49
50
|
|
|
50
51
|
constructor(
|
|
@@ -54,6 +55,7 @@ export class PaymentField extends FormComponent {
|
|
|
54
55
|
super(def, props)
|
|
55
56
|
|
|
56
57
|
this.options = def.options
|
|
58
|
+
this.def = def
|
|
57
59
|
|
|
58
60
|
const paymentStateSchema = joi
|
|
59
61
|
.object({
|
|
@@ -61,6 +63,7 @@ export class PaymentField extends FormComponent {
|
|
|
61
63
|
reference: joi.string().required(),
|
|
62
64
|
amount: joi.number().required(),
|
|
63
65
|
description: joi.string().required(),
|
|
66
|
+
descriptionInEng: joi.string().optional(),
|
|
64
67
|
uuid: joi.string().uuid().required(),
|
|
65
68
|
formId: joi.string().required(),
|
|
66
69
|
isLivePayment: joi.boolean().required(),
|
|
@@ -110,6 +113,8 @@ export class PaymentField extends FormComponent {
|
|
|
110
113
|
getViewModel(context: RenderContext) {
|
|
111
114
|
const { payload } = context
|
|
112
115
|
const viewModel = super.getViewModel(context)
|
|
116
|
+
const { translator } = context
|
|
117
|
+
const { tComponent } = translator
|
|
113
118
|
|
|
114
119
|
// Payload is pre-populated from state if a payment has already been made
|
|
115
120
|
const paymentState = this.isPaymentState(payload[this.name] as unknown)
|
|
@@ -124,7 +129,8 @@ export class PaymentField extends FormComponent {
|
|
|
124
129
|
return {
|
|
125
130
|
...viewModel,
|
|
126
131
|
amount: formatCurrency(amount),
|
|
127
|
-
description:
|
|
132
|
+
description:
|
|
133
|
+
tComponent(this.def, 'paymentDescription') || this.options.description,
|
|
128
134
|
paymentState
|
|
129
135
|
}
|
|
130
136
|
}
|
|
@@ -234,8 +240,9 @@ export class PaymentField extends FormComponent {
|
|
|
234
240
|
): Promise<unknown> {
|
|
235
241
|
const { options, name: componentName } = args.component
|
|
236
242
|
const { model } = args.controller
|
|
237
|
-
const language =
|
|
238
|
-
|
|
243
|
+
const { language, t, tComponent } = model.createTranslator(
|
|
244
|
+
resolveLanguage(request)
|
|
245
|
+
)
|
|
239
246
|
const state = await args.controller.getState(request)
|
|
240
247
|
const { baseUrl } = getPluginOptions(request.server)
|
|
241
248
|
const summaryUrl = `${baseUrl}/${model.basePath}/summary`
|
|
@@ -267,7 +274,8 @@ export class PaymentField extends FormComponent {
|
|
|
267
274
|
return h.redirect(summaryUrl).code(StatusCodes.SEE_OTHER)
|
|
268
275
|
}
|
|
269
276
|
|
|
270
|
-
const description =
|
|
277
|
+
const description =
|
|
278
|
+
tComponent(args.component, 'paymentDescription') || options.description
|
|
271
279
|
|
|
272
280
|
const slug = `/${model.basePath}`
|
|
273
281
|
|
|
@@ -287,7 +295,7 @@ export class PaymentField extends FormComponent {
|
|
|
287
295
|
payCallbackUrl,
|
|
288
296
|
reference,
|
|
289
297
|
isLivePayment,
|
|
290
|
-
{ formId, slug },
|
|
298
|
+
{ formId, slug, language },
|
|
291
299
|
prefilledEmail
|
|
292
300
|
)
|
|
293
301
|
|
|
@@ -308,6 +316,7 @@ export class PaymentField extends FormComponent {
|
|
|
308
316
|
reference,
|
|
309
317
|
amount: resolvedAmount,
|
|
310
318
|
description,
|
|
319
|
+
descriptionInEng: options.description,
|
|
311
320
|
paymentId: payment.paymentId,
|
|
312
321
|
componentName,
|
|
313
322
|
returnUrl: summaryUrl,
|
|
@@ -444,6 +453,7 @@ export interface PaymentSessionData {
|
|
|
444
453
|
reference: string
|
|
445
454
|
amount: number
|
|
446
455
|
description: string
|
|
456
|
+
descriptionInEng?: string
|
|
447
457
|
paymentId: string
|
|
448
458
|
componentName: string
|
|
449
459
|
returnUrl: string
|