@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
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
type Field,
|
|
16
16
|
type Guidance
|
|
17
17
|
} from './helpers/components.js'
|
|
18
|
+
import { getTranslatedLabel } from './helpers/index.js'
|
|
18
19
|
import {
|
|
19
20
|
type ComponentViewModel,
|
|
20
21
|
type RenderContext
|
|
@@ -302,26 +303,28 @@ export class ComponentCollection {
|
|
|
302
303
|
for (const subField of field.collection.fields) {
|
|
303
304
|
const translatedSubLabel = t(subField.title) || subField.label
|
|
304
305
|
let patchedSchema = subField.formSchema.label(translatedSubLabel)
|
|
305
|
-
|
|
306
|
-
|
|
306
|
+
const subFieldMessages = messagesOverride
|
|
307
|
+
? messagesOverride[subField.name]
|
|
308
|
+
: undefined
|
|
309
|
+
if (subFieldMessages) {
|
|
310
|
+
patchedSchema = patchedSchema.messages(subFieldMessages)
|
|
307
311
|
}
|
|
308
312
|
labelOverrides[subField.name] = patchedSchema
|
|
309
313
|
}
|
|
310
314
|
} else {
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
field as unknown as ComponentDef,
|
|
314
|
-
'shortDescription'
|
|
315
|
-
) ||
|
|
316
|
-
translator.tComponent(field as unknown as ComponentDef, 'title')
|
|
315
|
+
const fieldDef = field.def
|
|
316
|
+
const translatedLabel = getTranslatedLabel(fieldDef, translator)
|
|
317
317
|
const messagesOverride =
|
|
318
318
|
field.getValidationMessagesOverride(translator)
|
|
319
319
|
let patchedSchema = field.formSchema
|
|
320
320
|
if (translatedLabel && translatedLabel !== field.label) {
|
|
321
321
|
patchedSchema = patchedSchema.label(translatedLabel)
|
|
322
322
|
}
|
|
323
|
-
|
|
324
|
-
|
|
323
|
+
const fieldMessages = messagesOverride
|
|
324
|
+
? messagesOverride[field.name]
|
|
325
|
+
: undefined
|
|
326
|
+
if (fieldMessages) {
|
|
327
|
+
patchedSchema = patchedSchema.messages(fieldMessages)
|
|
325
328
|
}
|
|
326
329
|
if (patchedSchema !== field.formSchema) {
|
|
327
330
|
labelOverrides[field.name] = patchedSchema
|
|
@@ -340,10 +343,12 @@ export class ComponentCollection {
|
|
|
340
343
|
})
|
|
341
344
|
|
|
342
345
|
const details = result.error?.details
|
|
346
|
+
const language = translator?.language
|
|
343
347
|
|
|
344
348
|
return {
|
|
345
349
|
value: (result.value ?? {}) as typeof value,
|
|
346
|
-
errors:
|
|
350
|
+
errors:
|
|
351
|
+
this.page?.getErrors(details, language) ?? getErrors(language, details)
|
|
347
352
|
}
|
|
348
353
|
}
|
|
349
354
|
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { ComponentType, type DatePartsFieldComponent } from '@defra/forms-model'
|
|
2
2
|
import { add, format, isValid, parse, startOfToday, sub } from 'date-fns'
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
type Context,
|
|
5
|
+
type CustomValidator,
|
|
6
|
+
type LanguageMessages,
|
|
7
|
+
type ObjectSchema
|
|
8
|
+
} from 'joi'
|
|
4
9
|
|
|
5
10
|
import { ComponentCollection } from './ComponentCollection.js'
|
|
6
11
|
import {
|
|
@@ -25,7 +30,7 @@ import {
|
|
|
25
30
|
type FormStateValue,
|
|
26
31
|
type FormSubmissionState
|
|
27
32
|
} from '../types.js'
|
|
28
|
-
import {
|
|
33
|
+
import { formatDateForLanguage } from '../../payment/helper.js'
|
|
29
34
|
|
|
30
35
|
export class DatePartsField extends FormComponent {
|
|
31
36
|
declare options: DatePartsFieldComponent['options']
|
|
@@ -43,7 +48,7 @@ export class DatePartsField extends FormComponent {
|
|
|
43
48
|
|
|
44
49
|
const isRequired = options.required !== false
|
|
45
50
|
|
|
46
|
-
const customValidationMessages =
|
|
51
|
+
const customValidationMessages = {
|
|
47
52
|
'any.required': messageTemplate.objectMissing,
|
|
48
53
|
'number.base': messageTemplate.objectMissing,
|
|
49
54
|
'number.precision': messageTemplate.dateFormat,
|
|
@@ -51,7 +56,7 @@ export class DatePartsField extends FormComponent {
|
|
|
51
56
|
'number.unsafe': messageTemplate.dateFormat,
|
|
52
57
|
'number.min': messageTemplate.dateFormat,
|
|
53
58
|
'number.max': messageTemplate.dateFormat
|
|
54
|
-
}
|
|
59
|
+
} as LanguageMessages
|
|
55
60
|
|
|
56
61
|
this.collection = new ComponentCollection(
|
|
57
62
|
[
|
|
@@ -111,15 +116,16 @@ export class DatePartsField extends FormComponent {
|
|
|
111
116
|
|
|
112
117
|
getDisplayStringFromFormValue(
|
|
113
118
|
formValue: DatePartsState | undefined,
|
|
114
|
-
|
|
119
|
+
translator: Translator
|
|
115
120
|
) {
|
|
116
121
|
if (!formValue) {
|
|
117
122
|
return ''
|
|
118
123
|
}
|
|
119
124
|
|
|
120
|
-
return
|
|
125
|
+
return formatDateForLanguage(
|
|
121
126
|
`${formValue.year}-${formValue.month}-${formValue.day}`,
|
|
122
|
-
'd MMMM yyyy'
|
|
127
|
+
'd MMMM yyyy',
|
|
128
|
+
translator.language
|
|
123
129
|
)
|
|
124
130
|
}
|
|
125
131
|
|
|
@@ -158,7 +164,7 @@ export class DatePartsField extends FormComponent {
|
|
|
158
164
|
|
|
159
165
|
getValidationMessagesOverride(translator: Translator) {
|
|
160
166
|
const { t } = translator
|
|
161
|
-
|
|
167
|
+
const messages = {
|
|
162
168
|
'any.required': buildValidationMessages(t).objectMissing,
|
|
163
169
|
'number.base': buildValidationMessages(t).objectMissing,
|
|
164
170
|
'number.precision': buildValidationMessages(t).dateFormat,
|
|
@@ -166,7 +172,12 @@ export class DatePartsField extends FormComponent {
|
|
|
166
172
|
'number.unsafe': buildValidationMessages(t).dateFormat,
|
|
167
173
|
'number.min': buildValidationMessages(t).dateFormat,
|
|
168
174
|
'number.max': buildValidationMessages(t).dateFormat
|
|
169
|
-
}
|
|
175
|
+
} as LanguageMessages
|
|
176
|
+
return {
|
|
177
|
+
[`${this.name}__day`]: messages,
|
|
178
|
+
[`${this.name}__month`]: messages,
|
|
179
|
+
[`${this.name}__year`]: messages
|
|
180
|
+
}
|
|
170
181
|
}
|
|
171
182
|
|
|
172
183
|
getViewModel(context: RenderContext) {
|
|
@@ -2,7 +2,6 @@ import {
|
|
|
2
2
|
ComponentType,
|
|
3
3
|
hasFormComponents,
|
|
4
4
|
isFormType,
|
|
5
|
-
type ComponentDef,
|
|
6
5
|
type DeclarationFieldComponent,
|
|
7
6
|
type Item
|
|
8
7
|
} from '@defra/forms-model'
|
|
@@ -121,10 +120,12 @@ export class DeclarationField extends FormComponent {
|
|
|
121
120
|
const { declarationRequired } = buildValidationMessages(translator.t)
|
|
122
121
|
const msg = declarationRequired as unknown as string
|
|
123
122
|
return {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
[this.name]: {
|
|
124
|
+
'any.required': msg,
|
|
125
|
+
'any.unknown': msg,
|
|
126
|
+
'array.includesRequiredUnknowns': msg
|
|
127
|
+
} as unknown as LanguageMessages
|
|
128
|
+
}
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
getDisplayStringFromFormValue(
|
|
@@ -148,7 +149,7 @@ export class DeclarationField extends FormComponent {
|
|
|
148
149
|
'components.declarationField.defaultLabel'
|
|
149
150
|
)
|
|
150
151
|
} = this
|
|
151
|
-
const content = tComponent(this
|
|
152
|
+
const content = tComponent(this.def, 'content')
|
|
152
153
|
|
|
153
154
|
const viewModel = super.getViewModel(context)
|
|
154
155
|
let { fieldset, label } = viewModel
|
|
@@ -15,7 +15,11 @@ import {
|
|
|
15
15
|
getLocationFieldViewModel
|
|
16
16
|
} from './LocationFieldHelpers.js'
|
|
17
17
|
import { NumberField } from './NumberField.js'
|
|
18
|
-
import {
|
|
18
|
+
import { getEastingNorthingCountryValidator } from './helpers/geospatial.js'
|
|
19
|
+
import {
|
|
20
|
+
createLowerFirstExpression,
|
|
21
|
+
getTranslatedLabel
|
|
22
|
+
} from './helpers/index.js'
|
|
19
23
|
import {
|
|
20
24
|
type EastingNorthingState,
|
|
21
25
|
type RenderContext
|
|
@@ -31,7 +35,6 @@ import {
|
|
|
31
35
|
type FormSubmissionError,
|
|
32
36
|
type FormSubmissionState
|
|
33
37
|
} from '../types.js'
|
|
34
|
-
import { convertToLanguageMessages } from '../../../utils/type-utils.js'
|
|
35
38
|
|
|
36
39
|
// British National Grid coordinate limits
|
|
37
40
|
const DEFAULT_EASTING_MIN = 0
|
|
@@ -55,89 +58,18 @@ export class EastingNorthingField extends FormComponent {
|
|
|
55
58
|
|
|
56
59
|
const isRequired = options.required !== false
|
|
57
60
|
|
|
58
|
-
const eastingMin
|
|
59
|
-
|
|
60
|
-
const northingMin = schema?.northing?.min ?? DEFAULT_NORTHING_MIN
|
|
61
|
-
const northingMax = schema?.northing?.max ?? DEFAULT_NORTHING_MAX
|
|
62
|
-
|
|
63
|
-
const fieldLabel = lowerFirst(this.label)
|
|
61
|
+
const { eastingMin, eastingMax, northingMin, northingMax } =
|
|
62
|
+
EastingNorthingField.getMinMax(schema)
|
|
64
63
|
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
const customValidationMessages: LanguageMessages =
|
|
77
|
-
convertToLanguageMessages({
|
|
78
|
-
'any.required': tPlugin(
|
|
79
|
-
'components.eastingNorthingField.eastingRequired',
|
|
80
|
-
'en-GB'
|
|
81
|
-
),
|
|
82
|
-
'number.base': tPlugin(
|
|
83
|
-
'components.eastingNorthingField.eastingRequired',
|
|
84
|
-
'en-GB'
|
|
85
|
-
),
|
|
86
|
-
'number.min': tPlugin(
|
|
87
|
-
'components.eastingNorthingField.eastingRange',
|
|
88
|
-
'en-GB',
|
|
89
|
-
{
|
|
90
|
-
fieldLabel,
|
|
91
|
-
min: eastingMin,
|
|
92
|
-
max: eastingMax
|
|
93
|
-
}
|
|
94
|
-
),
|
|
95
|
-
'number.max': tPlugin(
|
|
96
|
-
'components.eastingNorthingField.eastingRange',
|
|
97
|
-
'en-GB',
|
|
98
|
-
{
|
|
99
|
-
fieldLabel,
|
|
100
|
-
min: eastingMin,
|
|
101
|
-
max: eastingMax
|
|
102
|
-
}
|
|
103
|
-
),
|
|
104
|
-
'number.precision': eastingDigitsMessage,
|
|
105
|
-
'number.integer': eastingDigitsMessage,
|
|
106
|
-
'number.unsafe': eastingDigitsMessage
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
const northingValidationMessages: LanguageMessages =
|
|
110
|
-
convertToLanguageMessages({
|
|
111
|
-
'any.required': tPlugin(
|
|
112
|
-
'components.eastingNorthingField.northingRequired',
|
|
113
|
-
'en-GB'
|
|
114
|
-
),
|
|
115
|
-
'number.base': tPlugin(
|
|
116
|
-
'components.eastingNorthingField.northingRequired',
|
|
117
|
-
'en-GB'
|
|
118
|
-
),
|
|
119
|
-
'number.min': tPlugin(
|
|
120
|
-
'components.eastingNorthingField.northingRange',
|
|
121
|
-
'en-GB',
|
|
122
|
-
{
|
|
123
|
-
fieldLabel,
|
|
124
|
-
min: northingMin,
|
|
125
|
-
max: northingMax
|
|
126
|
-
}
|
|
127
|
-
),
|
|
128
|
-
'number.max': tPlugin(
|
|
129
|
-
'components.eastingNorthingField.northingRange',
|
|
130
|
-
'en-GB',
|
|
131
|
-
{
|
|
132
|
-
fieldLabel,
|
|
133
|
-
min: northingMin,
|
|
134
|
-
max: northingMax
|
|
135
|
-
}
|
|
136
|
-
),
|
|
137
|
-
'number.precision': northingDigitsMessage,
|
|
138
|
-
'number.integer': northingDigitsMessage,
|
|
139
|
-
'number.unsafe': northingDigitsMessage
|
|
140
|
-
})
|
|
64
|
+
const { eastingValidationMessages, northingValidationMessages } =
|
|
65
|
+
EastingNorthingField.buildErrorMessages(
|
|
66
|
+
this.label,
|
|
67
|
+
eastingMin,
|
|
68
|
+
eastingMax,
|
|
69
|
+
northingMin,
|
|
70
|
+
northingMax,
|
|
71
|
+
'en-GB'
|
|
72
|
+
)
|
|
141
73
|
|
|
142
74
|
this.collection = new ComponentCollection(
|
|
143
75
|
[
|
|
@@ -154,7 +86,7 @@ export class EastingNorthingField extends FormComponent {
|
|
|
154
86
|
required: isRequired,
|
|
155
87
|
optionalText: true,
|
|
156
88
|
classes: 'govuk-input--width-10',
|
|
157
|
-
customValidationMessages
|
|
89
|
+
customValidationMessages: eastingValidationMessages
|
|
158
90
|
}
|
|
159
91
|
},
|
|
160
92
|
{
|
|
@@ -181,6 +113,18 @@ export class EastingNorthingField extends FormComponent {
|
|
|
181
113
|
)
|
|
182
114
|
|
|
183
115
|
this.options = options
|
|
116
|
+
|
|
117
|
+
const country = options.countries?.at(0)
|
|
118
|
+
|
|
119
|
+
if (country) {
|
|
120
|
+
this.collection.formSchema = this.collection.formSchema.custom(
|
|
121
|
+
getEastingNorthingCountryValidator(this, country)
|
|
122
|
+
)
|
|
123
|
+
this.collection.stateSchema = this.collection.stateSchema.custom(
|
|
124
|
+
getEastingNorthingCountryValidator(this, country)
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
|
|
184
128
|
this.formSchema = this.collection.formSchema
|
|
185
129
|
this.stateSchema = this.collection.stateSchema
|
|
186
130
|
}
|
|
@@ -192,14 +136,15 @@ export class EastingNorthingField extends FormComponent {
|
|
|
192
136
|
|
|
193
137
|
getDisplayStringFromFormValue(
|
|
194
138
|
value: EastingNorthingState | undefined,
|
|
195
|
-
|
|
139
|
+
translator: Translator
|
|
196
140
|
): string {
|
|
197
141
|
if (!value) {
|
|
198
142
|
return ''
|
|
199
143
|
}
|
|
200
144
|
|
|
201
|
-
|
|
202
|
-
|
|
145
|
+
const { t } = translator
|
|
146
|
+
|
|
147
|
+
return `${t('components.eastingNorthingField.easting')}: ${value.easting}\n${t('components.eastingNorthingField.northing')}: ${value.northing}`
|
|
203
148
|
}
|
|
204
149
|
|
|
205
150
|
getDisplayStringFromState(
|
|
@@ -218,7 +163,7 @@ export class EastingNorthingField extends FormComponent {
|
|
|
218
163
|
return null
|
|
219
164
|
}
|
|
220
165
|
|
|
221
|
-
return
|
|
166
|
+
return `${value.easting}, ${value.northing}`
|
|
222
167
|
}
|
|
223
168
|
|
|
224
169
|
getContextValueFromState(state: FormSubmissionState) {
|
|
@@ -232,6 +177,24 @@ export class EastingNorthingField extends FormComponent {
|
|
|
232
177
|
return getLocationFieldViewModel(this, viewModel, context)
|
|
233
178
|
}
|
|
234
179
|
|
|
180
|
+
getErrors(
|
|
181
|
+
translator: Translator,
|
|
182
|
+
errors?: FormSubmissionError[]
|
|
183
|
+
): FormSubmissionError[] | undefined {
|
|
184
|
+
const fieldErrors = super.getErrors(translator, errors)
|
|
185
|
+
|
|
186
|
+
fieldErrors?.forEach((err) => {
|
|
187
|
+
if (err.context?.country) {
|
|
188
|
+
err.text = translator.t(
|
|
189
|
+
'components.eastingNorthingField.wrongCountry',
|
|
190
|
+
{ country: err.context.country }
|
|
191
|
+
)
|
|
192
|
+
}
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
return fieldErrors
|
|
196
|
+
}
|
|
197
|
+
|
|
235
198
|
getViewErrors(
|
|
236
199
|
translator: Translator,
|
|
237
200
|
errors?: FormSubmissionError[]
|
|
@@ -244,6 +207,26 @@ export class EastingNorthingField extends FormComponent {
|
|
|
244
207
|
return EastingNorthingField.isEastingNorthing(value)
|
|
245
208
|
}
|
|
246
209
|
|
|
210
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
211
|
+
const def = this.def as EastingNorthingFieldComponent
|
|
212
|
+
const translatedLabel = getTranslatedLabel(def, translator)
|
|
213
|
+
const { eastingMin, eastingMax, northingMin, northingMax } =
|
|
214
|
+
EastingNorthingField.getMinMax(def.schema)
|
|
215
|
+
const { eastingValidationMessages, northingValidationMessages } =
|
|
216
|
+
EastingNorthingField.buildErrorMessages(
|
|
217
|
+
translatedLabel,
|
|
218
|
+
eastingMin,
|
|
219
|
+
eastingMax,
|
|
220
|
+
northingMin,
|
|
221
|
+
northingMax,
|
|
222
|
+
translator.language
|
|
223
|
+
)
|
|
224
|
+
return {
|
|
225
|
+
[`${this.name}__easting`]: eastingValidationMessages,
|
|
226
|
+
[`${this.name}__northing`]: northingValidationMessages
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
247
230
|
/**
|
|
248
231
|
* For error preview page that shows all possible errors on a component
|
|
249
232
|
*/
|
|
@@ -309,4 +292,117 @@ export class EastingNorthingField extends FormComponent {
|
|
|
309
292
|
NumberField.isNumber(value.northing)
|
|
310
293
|
)
|
|
311
294
|
}
|
|
295
|
+
|
|
296
|
+
static buildErrorMessages(
|
|
297
|
+
label: string,
|
|
298
|
+
eastingMin: number,
|
|
299
|
+
eastingMax: number,
|
|
300
|
+
northingMin: number,
|
|
301
|
+
northingMax: number,
|
|
302
|
+
language: string
|
|
303
|
+
) {
|
|
304
|
+
const fieldLabel = lowerFirst(label)
|
|
305
|
+
|
|
306
|
+
const eastingDigitsMessage = tPlugin(
|
|
307
|
+
'components.eastingNorthingField.eastingDigits',
|
|
308
|
+
language,
|
|
309
|
+
{ fieldLabel }
|
|
310
|
+
)
|
|
311
|
+
const northingDigitsMessage = tPlugin(
|
|
312
|
+
'components.eastingNorthingField.northingDigits',
|
|
313
|
+
language,
|
|
314
|
+
{ fieldLabel }
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
const eastingValidationMessages: LanguageMessages = {
|
|
318
|
+
'any.required': tPlugin(
|
|
319
|
+
'components.eastingNorthingField.eastingRequired',
|
|
320
|
+
language
|
|
321
|
+
),
|
|
322
|
+
'number.base': tPlugin(
|
|
323
|
+
'components.eastingNorthingField.eastingRequired',
|
|
324
|
+
language
|
|
325
|
+
),
|
|
326
|
+
'number.min': tPlugin(
|
|
327
|
+
'components.eastingNorthingField.eastingRange',
|
|
328
|
+
language,
|
|
329
|
+
{
|
|
330
|
+
fieldLabel,
|
|
331
|
+
min: eastingMin,
|
|
332
|
+
max: eastingMax
|
|
333
|
+
}
|
|
334
|
+
),
|
|
335
|
+
'number.max': tPlugin(
|
|
336
|
+
'components.eastingNorthingField.eastingRange',
|
|
337
|
+
language,
|
|
338
|
+
{
|
|
339
|
+
fieldLabel,
|
|
340
|
+
min: eastingMin,
|
|
341
|
+
max: eastingMax
|
|
342
|
+
}
|
|
343
|
+
),
|
|
344
|
+
'number.precision': eastingDigitsMessage,
|
|
345
|
+
'number.integer': eastingDigitsMessage,
|
|
346
|
+
'number.unsafe': eastingDigitsMessage
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const northingValidationMessages: LanguageMessages = {
|
|
350
|
+
'any.required': tPlugin(
|
|
351
|
+
'components.eastingNorthingField.northingRequired',
|
|
352
|
+
language
|
|
353
|
+
),
|
|
354
|
+
'number.base': tPlugin(
|
|
355
|
+
'components.eastingNorthingField.northingRequired',
|
|
356
|
+
language
|
|
357
|
+
),
|
|
358
|
+
'number.min': tPlugin(
|
|
359
|
+
'components.eastingNorthingField.northingRange',
|
|
360
|
+
language,
|
|
361
|
+
{
|
|
362
|
+
fieldLabel,
|
|
363
|
+
min: northingMin,
|
|
364
|
+
max: northingMax
|
|
365
|
+
}
|
|
366
|
+
),
|
|
367
|
+
'number.max': tPlugin(
|
|
368
|
+
'components.eastingNorthingField.northingRange',
|
|
369
|
+
language,
|
|
370
|
+
{
|
|
371
|
+
fieldLabel,
|
|
372
|
+
min: northingMin,
|
|
373
|
+
max: northingMax
|
|
374
|
+
}
|
|
375
|
+
),
|
|
376
|
+
'number.precision': northingDigitsMessage,
|
|
377
|
+
'number.integer': northingDigitsMessage,
|
|
378
|
+
'number.unsafe': northingDigitsMessage
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
eastingValidationMessages,
|
|
382
|
+
northingValidationMessages
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Read schema values from def.schema with fallback defaults
|
|
387
|
+
static getMinMax(
|
|
388
|
+
schema:
|
|
389
|
+
| {
|
|
390
|
+
easting?: {
|
|
391
|
+
min?: number
|
|
392
|
+
max?: number
|
|
393
|
+
}
|
|
394
|
+
northing?: {
|
|
395
|
+
min?: number
|
|
396
|
+
max?: number
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
| undefined
|
|
400
|
+
) {
|
|
401
|
+
return {
|
|
402
|
+
eastingMin: schema?.easting?.min ?? DEFAULT_EASTING_MIN,
|
|
403
|
+
eastingMax: schema?.easting?.max ?? DEFAULT_EASTING_MAX,
|
|
404
|
+
northingMin: schema?.northing?.min ?? DEFAULT_NORTHING_MIN,
|
|
405
|
+
northingMax: schema?.northing?.max ?? DEFAULT_NORTHING_MAX
|
|
406
|
+
}
|
|
407
|
+
}
|
|
312
408
|
}
|
|
@@ -40,7 +40,8 @@ export class EmailAddressField extends FormComponent {
|
|
|
40
40
|
formSchema = formSchema.messages({
|
|
41
41
|
'any.required': message,
|
|
42
42
|
'string.empty': message,
|
|
43
|
-
'string.email': message
|
|
43
|
+
'string.email': message,
|
|
44
|
+
'string.unicode': message
|
|
44
45
|
})
|
|
45
46
|
} else if (options.customValidationMessages) {
|
|
46
47
|
formSchema = formSchema.messages(options.customValidationMessages)
|
|
@@ -5,11 +5,13 @@ import {
|
|
|
5
5
|
import Boom from '@hapi/boom'
|
|
6
6
|
import joi, { type ArraySchema } from 'joi'
|
|
7
7
|
|
|
8
|
+
import { EN_GB } from '../../../constants.js'
|
|
8
9
|
import {
|
|
9
10
|
FormComponent,
|
|
10
11
|
isUploadState
|
|
11
12
|
} from './FormComponent.js'
|
|
12
13
|
import { type RenderContext } from './types.js'
|
|
14
|
+
import { t as tPlugin } from '../i18n/index.js'
|
|
13
15
|
import { type Translator } from '../i18n/types.js'
|
|
14
16
|
import { InvalidComponentStateError } from '../pageControllers/errors.js'
|
|
15
17
|
import { messageTemplate } from '../pageControllers/validationOptions.js'
|
|
@@ -50,7 +52,9 @@ export const tempFileSchema = fileSchema.append({
|
|
|
50
52
|
.string()
|
|
51
53
|
.valid(FileStatus.complete, FileStatus.rejected, FileStatus.pending)
|
|
52
54
|
.required(),
|
|
53
|
-
errorMessage: joi.string().optional()
|
|
55
|
+
errorMessage: joi.string().optional(),
|
|
56
|
+
errorCode: joi.string().optional(),
|
|
57
|
+
errorParams: joi.any().optional()
|
|
54
58
|
})
|
|
55
59
|
|
|
56
60
|
export const formFileSchema = fileSchema.append({
|
|
@@ -142,6 +146,8 @@ export class FileUploadField extends FormComponent {
|
|
|
142
146
|
formSchema = formSchema.length(schema.length)
|
|
143
147
|
}
|
|
144
148
|
|
|
149
|
+
formSchema = formSchema.messages(FileUploadField.buildErrorMessages(EN_GB))
|
|
150
|
+
|
|
145
151
|
this.formSchema = formSchema.items(formItemSchema)
|
|
146
152
|
this.stateSchema = formSchema
|
|
147
153
|
.items(formItemSchema)
|
|
@@ -169,7 +175,7 @@ export class FileUploadField extends FormComponent {
|
|
|
169
175
|
return ''
|
|
170
176
|
}
|
|
171
177
|
|
|
172
|
-
return translator.t('
|
|
178
|
+
return translator.t('pages.summary.fileUpload', {
|
|
173
179
|
count: files.length
|
|
174
180
|
})
|
|
175
181
|
}
|
|
@@ -244,7 +250,7 @@ export class FileUploadField extends FormComponent {
|
|
|
244
250
|
|
|
245
251
|
items.push({
|
|
246
252
|
href,
|
|
247
|
-
text: '
|
|
253
|
+
text: t('pages.fileUpload.remove'),
|
|
248
254
|
classes: 'govuk-link--no-visited-state',
|
|
249
255
|
attributes: { id: `${id}__${index}` },
|
|
250
256
|
visuallyHiddenText: file.filename
|
|
@@ -300,6 +306,13 @@ export class FileUploadField extends FormComponent {
|
|
|
300
306
|
return isUploadState(value)
|
|
301
307
|
}
|
|
302
308
|
|
|
309
|
+
getValidationMessagesOverride(translator: Translator) {
|
|
310
|
+
const { language } = translator
|
|
311
|
+
return {
|
|
312
|
+
[this.name]: FileUploadField.buildErrorMessages(language)
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
303
316
|
/**
|
|
304
317
|
* For error preview page that shows all possible errors on a component
|
|
305
318
|
*/
|
|
@@ -403,4 +416,12 @@ export class FileUploadField extends FormComponent {
|
|
|
403
416
|
]
|
|
404
417
|
}
|
|
405
418
|
}
|
|
419
|
+
|
|
420
|
+
static buildErrorMessages(language: string) {
|
|
421
|
+
return {
|
|
422
|
+
'array.min': tPlugin('validation.filesMin', language),
|
|
423
|
+
'array.max': tPlugin('validation.filesMax', language),
|
|
424
|
+
'array.length': tPlugin('validation.filesLength', language)
|
|
425
|
+
}
|
|
426
|
+
}
|
|
406
427
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
type ComponentDef,
|
|
3
2
|
type FormComponentsDef,
|
|
4
3
|
type FormMetadata,
|
|
5
4
|
type Item
|
|
@@ -158,10 +157,13 @@ export class FormComponent extends ComponentBase {
|
|
|
158
157
|
* Override in composite fields to return translated Joi message overrides for
|
|
159
158
|
* their sub-fields, applied at validation time so schema-level English messages
|
|
160
159
|
* are replaced with the correct language. Return null to skip message patching.
|
|
160
|
+
* The return object may contain message overrides at component-level, or sub-field-level.
|
|
161
|
+
* This would allow different error message overrides per field within a collection e.g.
|
|
162
|
+
* for EastingNothingField
|
|
161
163
|
*/
|
|
162
164
|
getValidationMessagesOverride(
|
|
163
165
|
_translator: Translator
|
|
164
|
-
): LanguageMessages | null {
|
|
166
|
+
): Record<string, LanguageMessages> | null {
|
|
165
167
|
return null
|
|
166
168
|
}
|
|
167
169
|
|
|
@@ -178,15 +180,14 @@ export class FormComponent extends ComponentBase {
|
|
|
178
180
|
const isRequired = !('required' in options) || options.required !== false
|
|
179
181
|
const hideOptional = 'optionalText' in options && options.optionalText
|
|
180
182
|
|
|
181
|
-
const resolvedTitle =
|
|
182
|
-
tComponent(this as unknown as ComponentDef, 'title') || title
|
|
183
|
+
const resolvedTitle = tComponent(this.def, 'title') || title
|
|
183
184
|
const optionalTag =
|
|
184
185
|
!isRequired && !hideOptional ? ` ${t('common.optional')}` : ''
|
|
185
186
|
const label = `${resolvedTitle}${optionalTag}`
|
|
186
187
|
|
|
187
188
|
if (hint) {
|
|
188
189
|
viewModel.hint = {
|
|
189
|
-
text: tComponent(this
|
|
190
|
+
text: tComponent(this.def, 'hint') || hint
|
|
190
191
|
}
|
|
191
192
|
}
|
|
192
193
|
|
|
@@ -125,7 +125,12 @@ export class GeospatialField extends FormComponent {
|
|
|
125
125
|
err.href = `#description_${err.path[1]}`
|
|
126
126
|
err.text = translator.t(
|
|
127
127
|
'components.geospatialField.validation.wrongCountry',
|
|
128
|
-
{
|
|
128
|
+
{
|
|
129
|
+
count: Number(err.path[1]) + 1,
|
|
130
|
+
country: translator.t(
|
|
131
|
+
`common.${(err.context.country as string).toLowerCase()}`
|
|
132
|
+
)
|
|
133
|
+
}
|
|
129
134
|
)
|
|
130
135
|
}
|
|
131
136
|
})
|