@defra/forms-engine-plugin 4.22.0 → 5.0.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.server/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
- package/.server/server/forms/simple-form.yaml +106 -3
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +11 -11
- package/.server/server/plugins/engine/components/AutocompleteField.js +2 -2
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +3 -2
- package/.server/server/plugins/engine/components/CheckboxesField.js +4 -9
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -7
- package/.server/server/plugins/engine/components/ComponentCollection.js +106 -51
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +8 -6
- package/.server/server/plugins/engine/components/DatePartsField.js +27 -9
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +13 -11
- package/.server/server/plugins/engine/components/DeclarationField.js +31 -9
- package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +6 -5
- package/.server/server/plugins/engine/components/EastingNorthingField.js +42 -22
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +11 -14
- package/.server/server/plugins/engine/components/EmailAddressField.js +2 -2
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +14 -12
- package/.server/server/plugins/engine/components/FileUploadField.js +22 -12
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +21 -12
- package/.server/server/plugins/engine/components/FormComponent.js +33 -14
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +14 -12
- package/.server/server/plugins/engine/components/GeospatialField.js +19 -13
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/LatLongField.d.ts +6 -5
- package/.server/server/plugins/engine/components/LatLongField.js +32 -20
- package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +7 -6
- package/.server/server/plugins/engine/components/ListFormComponent.js +19 -7
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +17 -16
- package/.server/server/plugins/engine/components/LocationFieldBase.js +2 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +3 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +2 -2
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.d.ts +8 -7
- package/.server/server/plugins/engine/components/Markdown.js +5 -2
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +9 -7
- package/.server/server/plugins/engine/components/MonthYearField.js +26 -8
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +10 -9
- package/.server/server/plugins/engine/components/MultilineTextField.js +2 -2
- package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +14 -6
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/NumberField.d.ts +10 -9
- package/.server/server/plugins/engine/components/NumberField.js +2 -2
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
- package/.server/server/plugins/engine/components/OsGridRefField.js +14 -6
- package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -10
- package/.server/server/plugins/engine/components/PaymentField.js +21 -8
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +11 -11
- package/.server/server/plugins/engine/components/SelectField.js +2 -2
- package/.server/server/plugins/engine/components/SelectField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +4 -4
- package/.server/server/plugins/engine/components/SelectionControlField.js +2 -2
- package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -1
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +10 -9
- package/.server/server/plugins/engine/components/TelephoneNumberField.js +2 -2
- package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +12 -10
- package/.server/server/plugins/engine/components/UkAddressField.js +29 -17
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -0
- package/.server/server/plugins/engine/components/YesNoField.js +9 -0
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.d.ts +3 -2
- package/.server/server/plugins/engine/components/helpers/components.js +11 -8
- package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
- package/.server/server/plugins/engine/components/types.d.ts +8 -1
- package/.server/server/plugins/engine/components/types.js.map +1 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js +8 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
- package/.server/server/plugins/engine/form-context.d.ts +1 -0
- package/.server/server/plugins/engine/form-context.js +4 -2
- package/.server/server/plugins/engine/form-context.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +1 -1
- package/.server/server/plugins/engine/helpers.js +8 -13
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +39 -0
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +50 -0
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +5 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.js +18 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -0
- package/.server/server/plugins/engine/i18n/createTranslator.d.ts +9 -0
- package/.server/server/plugins/engine/i18n/createTranslator.js +51 -0
- package/.server/server/plugins/engine/i18n/createTranslator.js.map +1 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +5 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +57 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -0
- package/.server/server/plugins/engine/i18n/index.d.ts +18 -0
- package/.server/server/plugins/engine/i18n/index.js +71 -0
- package/.server/server/plugins/engine/i18n/index.js.map +1 -0
- package/.server/server/plugins/engine/i18n/translations/cy.json +271 -0
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +271 -0
- package/.server/server/plugins/engine/i18n/types.d.ts +41 -0
- package/.server/server/plugins/engine/i18n/types.js +2 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -0
- package/.server/server/plugins/engine/index.js +3 -2
- package/.server/server/plugins/engine/index.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +9 -1
- package/.server/server/plugins/engine/models/FormModel.js +44 -18
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +5 -2
- package/.server/server/plugins/engine/models/SummaryViewModel.js +44 -18
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
- package/.server/server/plugins/engine/options.js +2 -1
- package/.server/server/plugins/engine/options.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +4 -0
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v1.js +7 -6
- package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +2 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +6 -3
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/PageController.d.ts +3 -1
- package/.server/server/plugins/engine/pageControllers/PageController.js +11 -1
- package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +4 -2
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +52 -21
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +3 -2
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +63 -26
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +3 -1
- package/.server/server/plugins/engine/pageControllers/StartPageController.js +2 -2
- package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js +12 -2
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +4 -3
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +45 -28
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.d.ts +2 -0
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js +24 -0
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/errors.js +3 -2
- package/.server/server/plugins/engine/pageControllers/errors.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +3 -2
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js +4 -4
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +7 -3
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +34 -33
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/plugin.js +2 -0
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/routes/index.js +4 -1
- package/.server/server/plugins/engine/routes/index.js.map +1 -1
- package/.server/server/plugins/engine/routes/questions.js +5 -2
- package/.server/server/plugins/engine/routes/questions.js.map +1 -1
- package/.server/server/plugins/engine/types/index.d.ts +1 -0
- package/.server/server/plugins/engine/types/index.js.map +1 -1
- package/.server/server/plugins/engine/types/schema.js +1 -0
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +12 -1
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/views/components/_location-field-base.html +1 -1
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +3 -3
- package/.server/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
- package/.server/server/plugins/engine/views/components/osgridreffield.html +1 -1
- package/.server/server/plugins/engine/views/components/paymentfield.html +8 -8
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +4 -4
- package/.server/server/plugins/engine/views/confirmation.html +4 -4
- package/.server/server/plugins/engine/views/exit.html +4 -4
- package/.server/server/plugins/engine/views/file-upload.html +3 -3
- package/.server/server/plugins/engine/views/index.html +3 -3
- package/.server/server/plugins/engine/views/item-delete.html +1 -1
- package/.server/server/plugins/engine/views/partials/form.html +3 -3
- package/.server/server/plugins/engine/views/partials/preview-banner.html +4 -4
- package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
- package/.server/server/plugins/engine/views/repeat-list-summary.html +4 -4
- package/.server/server/plugins/engine/views/summary.html +14 -7
- package/.server/server/plugins/nunjucks/enviroment.test.js +10 -0
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
- package/.server/server/plugins/nunjucks/environment.d.ts +8 -0
- package/.server/server/plugins/nunjucks/environment.js +13 -0
- package/.server/server/plugins/nunjucks/environment.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/answer.js +9 -1
- package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/answer.test.js +13 -2
- package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +24 -19
- package/.server/server/plugins/postcode-lookup/models/index.js +83 -76
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.js +7 -13
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/types.d.ts +1 -0
- package/.server/server/plugins/postcode-lookup/types.js +1 -0
- package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/.server/server/types.d.ts +2 -1
- package/.server/server/types.js.map +1 -1
- package/.server/server/utils/utils.d.ts +5 -0
- package/.server/server/utils/utils.js +16 -0
- package/.server/server/utils/utils.js.map +1 -1
- package/.server/typings/hapi/index.d.js.map +1 -1
- package/package.json +3 -2
- package/src/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
- package/src/server/forms/simple-form.yaml +106 -3
- package/src/server/plugins/engine/components/AutocompleteField.ts +3 -6
- package/src/server/plugins/engine/components/CheckboxesField.ts +12 -11
- package/src/server/plugins/engine/components/ComponentCollection.ts +143 -61
- package/src/server/plugins/engine/components/DatePartsField.ts +33 -11
- package/src/server/plugins/engine/components/DeclarationField.ts +37 -14
- package/src/server/plugins/engine/components/EastingNorthingField.ts +83 -22
- package/src/server/plugins/engine/components/EmailAddressField.ts +4 -7
- package/src/server/plugins/engine/components/FileUploadField.ts +28 -22
- package/src/server/plugins/engine/components/FormComponent.ts +49 -12
- package/src/server/plugins/engine/components/GeospatialField.ts +36 -21
- package/src/server/plugins/engine/components/LatLongField.ts +52 -21
- package/src/server/plugins/engine/components/ListFormComponent.ts +26 -10
- package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -8
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +3 -3
- package/src/server/plugins/engine/components/Markdown.ts +7 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +32 -10
- package/src/server/plugins/engine/components/MultilineTextField.ts +5 -8
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +25 -11
- package/src/server/plugins/engine/components/NumberField.ts +3 -4
- package/src/server/plugins/engine/components/OsGridRefField.ts +25 -9
- package/src/server/plugins/engine/components/PaymentField.ts +22 -12
- package/src/server/plugins/engine/components/SelectField.ts +3 -6
- package/src/server/plugins/engine/components/SelectionControlField.ts +7 -8
- package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -7
- package/src/server/plugins/engine/components/UkAddressField.ts +33 -18
- package/src/server/plugins/engine/components/YesNoField.ts +10 -0
- package/src/server/plugins/engine/components/helpers/components.ts +13 -6
- package/src/server/plugins/engine/components/types.ts +9 -0
- package/src/server/plugins/engine/configureEnginePlugin.ts +12 -1
- package/src/server/plugins/engine/form-context.ts +8 -2
- package/src/server/plugins/engine/helpers.ts +10 -18
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +69 -0
- package/src/server/plugins/engine/i18n/createFormTranslator.ts +33 -0
- package/src/server/plugins/engine/i18n/createTranslator.ts +61 -0
- package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +61 -0
- package/src/server/plugins/engine/i18n/index.ts +80 -0
- package/src/server/plugins/engine/i18n/translations/cy.json +271 -0
- package/src/server/plugins/engine/i18n/translations/en-GB.json +271 -0
- package/src/server/plugins/engine/i18n/types.ts +62 -0
- package/src/server/plugins/engine/index.ts +4 -2
- package/src/server/plugins/engine/models/FormModel.ts +59 -23
- package/src/server/plugins/engine/models/SummaryViewModel.ts +68 -25
- package/src/server/plugins/engine/options.js +2 -1
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +5 -0
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -3
- package/src/server/plugins/engine/outputFormatters/machine/v1.ts +9 -8
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +7 -3
- package/src/server/plugins/engine/pageControllers/PageController.ts +12 -1
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +53 -21
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +66 -29
- package/src/server/plugins/engine/pageControllers/StartPageController.ts +7 -2
- package/src/server/plugins/engine/pageControllers/StatusPageController.ts +10 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +53 -24
- package/src/server/plugins/engine/pageControllers/__stubs__/translator.ts +28 -0
- package/src/server/plugins/engine/pageControllers/errors.ts +4 -2
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +11 -4
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +43 -53
- package/src/server/plugins/engine/plugin.ts +2 -0
- package/src/server/plugins/engine/routes/index.ts +9 -1
- package/src/server/plugins/engine/routes/questions.ts +5 -1
- package/src/server/plugins/engine/types/index.ts +5 -0
- package/src/server/plugins/engine/types/schema.ts +1 -0
- package/src/server/plugins/engine/types.ts +10 -0
- package/src/server/plugins/engine/views/components/_location-field-base.html +1 -1
- package/src/server/plugins/engine/views/components/fileuploadfield.html +3 -3
- package/src/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
- package/src/server/plugins/engine/views/components/osgridreffield.html +1 -1
- package/src/server/plugins/engine/views/components/paymentfield.html +8 -8
- package/src/server/plugins/engine/views/components/ukaddressfield.html +4 -4
- package/src/server/plugins/engine/views/confirmation.html +4 -4
- package/src/server/plugins/engine/views/exit.html +4 -4
- package/src/server/plugins/engine/views/file-upload.html +3 -3
- package/src/server/plugins/engine/views/index.html +3 -3
- package/src/server/plugins/engine/views/item-delete.html +1 -1
- package/src/server/plugins/engine/views/partials/form.html +3 -3
- package/src/server/plugins/engine/views/partials/preview-banner.html +4 -4
- package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
- package/src/server/plugins/engine/views/repeat-list-summary.html +4 -4
- package/src/server/plugins/engine/views/summary.html +14 -7
- package/src/server/plugins/nunjucks/environment.js +14 -0
- package/src/server/plugins/nunjucks/filters/answer.js +12 -1
- package/src/server/plugins/postcode-lookup/models/index.js +144 -87
- package/src/server/plugins/postcode-lookup/routes/index.js +13 -16
- package/src/server/plugins/postcode-lookup/types.js +1 -0
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/src/server/types.ts +2 -0
- package/src/server/utils/utils.js +14 -0
- package/src/typings/hapi/index.d.ts +1 -0
- package/.server/server/plugins/engine/components/constants.d.ts +0 -1
- package/.server/server/plugins/engine/components/constants.js +0 -2
- package/.server/server/plugins/engine/components/constants.js.map +0 -1
- package/src/server/plugins/engine/components/constants.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LatLongField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","createLowerFirstExpression","messageTemplate","convertToLanguageMessages","DECIMAL_PRECISION","LatLongField","constructor","def","props","name","options","schema","isRequired","required","latitudeMin","latitude","min","latitudeMax","max","longitudeMin","longitude","longitudeMax","latitudeRequired","longitudeRequired","customValidationMessages","latitudeRangeMessage","label","longitudeRangeMessage","latitudeMessages","longitudeMessages","collection","type","title","precision","optionalText","classes","suffix","parent","peers","formSchema","stateSchema","getFormValueFromState","state","value","isLatLong","undefined","getDisplayStringFromFormValue","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getViewModel","payload","errors","viewModel","getViewErrors","allErrors","getErrors","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isNumber"],"sources":["../../../../../src/server/plugins/engine/components/LatLongField.ts"],"sourcesContent":["import { ComponentType, type LatLongFieldComponent } from '@defra/forms-model'\nimport { type LanguageMessages, type ObjectSchema } from 'joi'\nimport lowerFirst from 'lodash/lowerFirst.js'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n deduplicateErrorsByHref,\n getLocationFieldViewModel\n} from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { type LatLongState } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { convertToLanguageMessages } from '~/src/server/utils/type-utils.js'\n\n// Precision constants\n// UK latitude/longitude requires high precision for accurate location (within ~11mm)\nconst DECIMAL_PRECISION = 7 // 7 decimal places\n\nexport class LatLongField extends FormComponent {\n declare options: LatLongFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: LatLongFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options, schema } = def\n\n const isRequired = options.required !== false\n\n // Read schema values from def.schema with fallback defaults\n const latitudeMin = schema?.latitude?.min ?? 49.85\n const latitudeMax = schema?.latitude?.max ?? 60.859\n const longitudeMin = schema?.longitude?.min ?? -13.687\n const longitudeMax = schema?.longitude?.max ?? 1.767\n\n const latitudeRequired = 'Enter latitude'\n const longitudeRequired = 'Enter longitude'\n\n const customValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'number.precision':\n '{{#label}} must have no more than 7 decimal places',\n 'number.unsafe': '{{#label}} must be a valid number'\n })\n\n const latitudeRangeMessage = `Latitude for ${lowerFirst(this.label)} must be between ${latitudeMin} and ${latitudeMax}`\n const longitudeRangeMessage = `Longitude for ${lowerFirst(this.label)} must be between ${longitudeMin} and ${longitudeMax}`\n\n const latitudeMessages: LanguageMessages = convertToLanguageMessages({\n ...customValidationMessages,\n 'any.required': latitudeRequired,\n 'number.base': `Enter a valid latitude for ${lowerFirst(this.label)} like 51.519450`,\n 'number.min': latitudeRangeMessage,\n 'number.max': latitudeRangeMessage\n })\n\n const longitudeMessages: LanguageMessages = convertToLanguageMessages({\n ...customValidationMessages,\n 'any.required': longitudeRequired,\n 'number.base': `Enter a valid longitude for ${lowerFirst(this.label)} like -0.127758`,\n 'number.min': longitudeRangeMessage,\n 'number.max': longitudeRangeMessage\n })\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__latitude`,\n title: 'Latitude',\n schema: {\n min: latitudeMin,\n max: latitudeMax,\n precision: DECIMAL_PRECISION\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n suffix: '°',\n customValidationMessages: latitudeMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__longitude`,\n title: 'Longitude',\n schema: {\n min: longitudeMin,\n max: longitudeMax,\n precision: DECIMAL_PRECISION\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n suffix: '°',\n customValidationMessages: longitudeMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n peers: [`${name}__latitude`, `${name}__longitude`]\n }\n )\n\n this.options = options\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return LatLongField.isLatLong(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(value: LatLongState | undefined): string {\n if (!value) {\n return ''\n }\n\n // CYA page format: <<latvalue, langvalue>>\n return `${value.latitude}, ${value.longitude}`\n }\n\n getDisplayStringFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value)\n }\n\n getContextValueFromFormValue(value: LatLongState | undefined): string | null {\n if (!value) {\n return null\n }\n\n // Output format: Latitude: <<entry>>\\nLongitude: <<entry>>\n return `Latitude: ${value.latitude}\\nLongitude: ${value.longitude}`\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getViewModel(payload: FormPayload, errors?: FormSubmissionError[]) {\n const viewModel = super.getViewModel(payload, errors)\n return getLocationFieldViewModel(this, viewModel, payload, errors)\n }\n\n getViewErrors(\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const allErrors = this.getErrors(errors)\n return deduplicateErrorsByHref(allErrors)\n }\n\n isState(value?: FormStateValue | FormState) {\n return LatLongField.isLatLong(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return LatLongField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n {\n type: 'latitudeFormat',\n template: createLowerFirstExpression(\n 'Enter a valid latitude for {{lowerFirst(#title)}} like 51.519450'\n )\n },\n {\n type: 'longitudeFormat',\n template: createLowerFirstExpression(\n 'Enter a valid longitude for {{lowerFirst(#title)}} like -0.127758'\n )\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'latitudeMin',\n template: createLowerFirstExpression(\n 'Latitude for {{lowerFirst(#title)}} must be between 49 and 60'\n )\n },\n {\n type: 'latitudeMax',\n template: createLowerFirstExpression(\n 'Latitude for {{lowerFirst(#title)}} must be between 49 and 60'\n )\n },\n {\n type: 'longitudeMin',\n template: createLowerFirstExpression(\n 'Longitude for {{lowerFirst(#title)}} must be between -9 and 2'\n )\n },\n {\n type: 'longitudeMax',\n template: createLowerFirstExpression(\n 'Longitude for {{lowerFirst(#title)}} must be between -9 and 2'\n )\n }\n ]\n }\n }\n\n static isLatLong(value?: FormStateValue | FormState): value is LatLongState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.latitude) &&\n NumberField.isNumber(value.longitude)\n )\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"LatLongField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","createLowerFirstExpression","t","tPlugin","messageTemplate","convertToLanguageMessages","DECIMAL_PRECISION","LatLongField","constructor","def","props","name","options","schema","isRequired","required","latitudeMin","latitude","min","latitudeMax","max","longitudeMin","longitude","longitudeMax","fieldLabel","label","customValidationMessages","latitudeRangeMessage","longitudeRangeMessage","latitudeMessages","longitudeMessages","collection","type","title","precision","optionalText","classes","suffix","parent","peers","formSchema","stateSchema","getFormValueFromState","state","value","isLatLong","undefined","getDisplayStringFromFormValue","_translator","getDisplayStringFromState","translator","getContextValueFromFormValue","getContextValueFromState","getViewModel","context","viewModel","getViewErrors","errors","allErrors","getErrors","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isNumber"],"sources":["../../../../../src/server/plugins/engine/components/LatLongField.ts"],"sourcesContent":["import { ComponentType, type LatLongFieldComponent } from '@defra/forms-model'\nimport { type LanguageMessages, type ObjectSchema } from 'joi'\nimport lowerFirst from 'lodash/lowerFirst.js'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n deduplicateErrorsByHref,\n getLocationFieldViewModel\n} from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n type LatLongState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { convertToLanguageMessages } from '~/src/server/utils/type-utils.js'\n\n// Precision constants\n// UK latitude/longitude requires high precision for accurate location (within ~11mm)\nconst DECIMAL_PRECISION = 7 // 7 decimal places\n\nexport class LatLongField extends FormComponent {\n declare options: LatLongFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: LatLongFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options, schema } = def\n\n const isRequired = options.required !== false\n\n // Read schema values from def.schema with fallback defaults\n const latitudeMin = schema?.latitude?.min ?? 49.85\n const latitudeMax = schema?.latitude?.max ?? 60.859\n const longitudeMin = schema?.longitude?.min ?? -13.687\n const longitudeMax = schema?.longitude?.max ?? 1.767\n\n const fieldLabel = lowerFirst(this.label)\n\n const customValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'number.precision': tPlugin(\n 'components.latLongField.precision',\n 'en-GB'\n ),\n 'number.unsafe': tPlugin('components.latLongField.notANumber', 'en-GB')\n })\n\n const latitudeRangeMessage = tPlugin(\n 'components.latLongField.latitudeRange',\n 'en-GB',\n { fieldLabel, min: latitudeMin, max: latitudeMax }\n )\n const longitudeRangeMessage = tPlugin(\n 'components.latLongField.longitudeRange',\n 'en-GB',\n { fieldLabel, min: longitudeMin, max: longitudeMax }\n )\n\n const latitudeMessages: LanguageMessages = convertToLanguageMessages({\n ...customValidationMessages,\n 'any.required': tPlugin(\n 'components.latLongField.latitudeRequired',\n 'en-GB'\n ),\n 'number.base': tPlugin('components.latLongField.latitudeBase', 'en-GB', {\n fieldLabel\n }),\n 'number.min': latitudeRangeMessage,\n 'number.max': latitudeRangeMessage\n })\n\n const longitudeMessages: LanguageMessages = convertToLanguageMessages({\n ...customValidationMessages,\n 'any.required': tPlugin(\n 'components.latLongField.longitudeRequired',\n 'en-GB'\n ),\n 'number.base': tPlugin('components.latLongField.longitudeBase', 'en-GB', {\n fieldLabel\n }),\n 'number.min': longitudeRangeMessage,\n 'number.max': longitudeRangeMessage\n })\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__latitude`,\n title: 'components.latLongField.latitude',\n schema: {\n min: latitudeMin,\n max: latitudeMax,\n precision: DECIMAL_PRECISION\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n suffix: '°',\n customValidationMessages: latitudeMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__longitude`,\n title: 'components.latLongField.longitude',\n schema: {\n min: longitudeMin,\n max: longitudeMax,\n precision: DECIMAL_PRECISION\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n suffix: '°',\n customValidationMessages: longitudeMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n peers: [`${name}__latitude`, `${name}__longitude`]\n }\n )\n\n this.options = options\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return LatLongField.isLatLong(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: LatLongState | undefined,\n _translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n // CYA page format: <<latvalue, langvalue>>\n return `${value.latitude}, ${value.longitude}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(value: LatLongState | undefined): string | null {\n if (!value) {\n return null\n }\n\n // Output format: Latitude: <<entry>>\\nLongitude: <<entry>>\n return `Latitude: ${value.latitude}\\nLongitude: ${value.longitude}`\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n return getLocationFieldViewModel(this, viewModel, context)\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const allErrors = this.getErrors(translator, errors)\n return deduplicateErrorsByHref(allErrors)\n }\n\n isState(value?: FormStateValue | FormState) {\n return LatLongField.isLatLong(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return LatLongField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n {\n type: 'latitudeFormat',\n template: createLowerFirstExpression(\n 'Enter a valid latitude for {{lowerFirst(#title)}} like 51.519450'\n )\n },\n {\n type: 'longitudeFormat',\n template: createLowerFirstExpression(\n 'Enter a valid longitude for {{lowerFirst(#title)}} like -0.127758'\n )\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'latitudeMin',\n template: createLowerFirstExpression(\n 'Latitude for {{lowerFirst(#title)}} must be between 49 and 60'\n )\n },\n {\n type: 'latitudeMax',\n template: createLowerFirstExpression(\n 'Latitude for {{lowerFirst(#title)}} must be between 49 and 60'\n )\n },\n {\n type: 'longitudeMin',\n template: createLowerFirstExpression(\n 'Longitude for {{lowerFirst(#title)}} must be between -9 and 2'\n )\n },\n {\n type: 'longitudeMax',\n template: createLowerFirstExpression(\n 'Longitude for {{lowerFirst(#title)}} must be between -9 and 2'\n )\n }\n ]\n }\n }\n\n static isLatLong(value?: FormStateValue | FormState): value is LatLongState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.latitude) &&\n NumberField.isNumber(value.longitude)\n )\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type Item, type List, type ListComponentsDef, type SelectionComponentsDef, type YesNoFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { type ArraySchema, type BooleanSchema, type NumberSchema, type StringSchema } from 'joi';
|
|
3
3
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
4
|
-
import { type ListItem } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
-
import { type
|
|
4
|
+
import { type ListItem, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
6
|
+
import { type ErrorMessageTemplateList, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
|
|
6
7
|
export declare class ListFormComponent extends FormComponent {
|
|
7
8
|
options: Extract<SelectionComponentsDef, {
|
|
8
9
|
options: object;
|
|
@@ -15,9 +16,9 @@ export declare class ListFormComponent extends FormComponent {
|
|
|
15
16
|
get values(): Item['value'][];
|
|
16
17
|
constructor(def: SelectionComponentsDef | (YesNoFieldComponent & Pick<ListComponentsDef, 'list'>), props: ConstructorParameters<typeof FormComponent>[1]);
|
|
17
18
|
getFormValueFromState(state: FormSubmissionState): Item['value'] | Item['value'][] | undefined;
|
|
18
|
-
getDisplayStringFromFormValue(value: string | number | boolean | Item['value'][] | undefined): string;
|
|
19
|
-
getDisplayStringFromState(state: FormSubmissionState): string;
|
|
20
|
-
getViewModel(
|
|
19
|
+
getDisplayStringFromFormValue(value: string | number | boolean | Item['value'][] | undefined, translator: Translator): string;
|
|
20
|
+
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
21
|
+
getViewModel(context: RenderContext): {
|
|
21
22
|
items: ListItem[];
|
|
22
23
|
label: {
|
|
23
24
|
text: string;
|
|
@@ -34,7 +35,7 @@ export declare class ListFormComponent extends FormComponent {
|
|
|
34
35
|
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
35
36
|
classes?: string;
|
|
36
37
|
condition?: string;
|
|
37
|
-
errors?: FormSubmissionError[];
|
|
38
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
38
39
|
errorMessage?: {
|
|
39
40
|
text: string;
|
|
40
41
|
};
|
|
@@ -44,34 +44,46 @@ export class ListFormComponent extends FormComponent {
|
|
|
44
44
|
const selected = items.filter(item => values.includes(item.value));
|
|
45
45
|
return selected.at(0)?.value;
|
|
46
46
|
}
|
|
47
|
-
getDisplayStringFromFormValue(value) {
|
|
47
|
+
getDisplayStringFromFormValue(value, translator) {
|
|
48
48
|
const {
|
|
49
49
|
items
|
|
50
50
|
} = this;
|
|
51
51
|
const values = [value ?? []].flat();
|
|
52
|
-
return items.filter(item => values.includes(item.value)).map(item => item.text).join(', ');
|
|
52
|
+
return items.filter(item => values.includes(item.value)).map(item => translator.tListItem(item, 'text') || item.text).join(', ');
|
|
53
53
|
}
|
|
54
|
-
getDisplayStringFromState(state) {
|
|
54
|
+
getDisplayStringFromState(state, translator) {
|
|
55
55
|
// Allow for array values via subclass
|
|
56
56
|
const value = this.getFormValueFromState(state);
|
|
57
|
-
return this.getDisplayStringFromFormValue(value);
|
|
57
|
+
return this.getDisplayStringFromFormValue(value, translator);
|
|
58
58
|
}
|
|
59
|
-
getViewModel(
|
|
59
|
+
getViewModel(context) {
|
|
60
60
|
const {
|
|
61
61
|
items: listItems
|
|
62
62
|
} = this;
|
|
63
|
-
const viewModel = super.getViewModel(
|
|
63
|
+
const viewModel = super.getViewModel(context);
|
|
64
64
|
const {
|
|
65
65
|
value
|
|
66
66
|
} = viewModel;
|
|
67
67
|
|
|
68
68
|
// Support multiple values for checkboxes
|
|
69
69
|
const values = this.isValue(value) ? [value].flat() : [];
|
|
70
|
+
const {
|
|
71
|
+
tListItem
|
|
72
|
+
} = context.translator;
|
|
70
73
|
const items = listItems.map(item => {
|
|
71
74
|
const selected = values.includes(item.value);
|
|
75
|
+
const resolvedText = tListItem(item, 'text') || item.text;
|
|
76
|
+
const resolvedHint = tListItem(item, 'hint') || item.hint?.text;
|
|
77
|
+
const hintAttr = resolvedHint ? {
|
|
78
|
+
hint: {
|
|
79
|
+
text: resolvedHint
|
|
80
|
+
}
|
|
81
|
+
} : {};
|
|
72
82
|
const itemModel = {
|
|
73
83
|
...item,
|
|
74
|
-
|
|
84
|
+
text: resolvedText,
|
|
85
|
+
selected,
|
|
86
|
+
...hintAttr
|
|
75
87
|
};
|
|
76
88
|
if ('id' in itemModel) {
|
|
77
89
|
delete itemModel.id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListFormComponent.js","names":["joi","FormComponent","messageTemplate","ListFormComponent","list","listType","items","values","map","value","constructor","def","props","options","model","getList","type","formSchema","valid","label","required","customValidationMessages","messages","stateSchema","default","allow","getFormValueFromState","state","name","isValue","flat","selected","filter","item","includes","at","getDisplayStringFromFormValue","text","join","getDisplayStringFromState","getViewModel","
|
|
1
|
+
{"version":3,"file":"ListFormComponent.js","names":["joi","FormComponent","messageTemplate","ListFormComponent","list","listType","items","values","map","value","constructor","def","props","options","model","getList","type","formSchema","valid","label","required","customValidationMessages","messages","stateSchema","default","allow","getFormValueFromState","state","name","isValue","flat","selected","filter","item","includes","at","getDisplayStringFromFormValue","translator","tListItem","text","join","getDisplayStringFromState","getViewModel","context","listItems","viewModel","resolvedText","resolvedHint","hint","hintAttr","itemModel","id","description","getAllPossibleErrors","baseErrors","template","selectRequired","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/ListFormComponent.ts"],"sourcesContent":["import {\n type Item,\n type List,\n type ListComponentsDef,\n type SelectionComponentsDef,\n type YesNoFieldComponent\n} from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\n type NumberSchema,\n type StringSchema\n} from 'joi'\n\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n type ListItem,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class ListFormComponent extends FormComponent {\n declare options: Extract<\n SelectionComponentsDef,\n { options: object }\n >['options']\n\n declare formSchema:\n | ArraySchema<string>\n | ArraySchema<number>\n | BooleanSchema<string>\n | NumberSchema<string>\n | NumberSchema\n | StringSchema\n\n declare stateSchema:\n | ArraySchema<string>\n | ArraySchema<number>\n | BooleanSchema<string>\n | NumberSchema<string>\n | NumberSchema\n | StringSchema\n\n list?: List\n listType: List['type'] = 'string'\n\n get items(): Item[] {\n return this.list?.items ?? []\n }\n\n get values(): Item['value'][] {\n return this.items.map(({ value }) => value)\n }\n\n constructor(\n def:\n | SelectionComponentsDef // Allow for Yes/No field custom list\n | (YesNoFieldComponent & Pick<ListComponentsDef, 'list'>),\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options } = def\n const { model } = props\n\n if ('list' in def) {\n this.list = model.getList(def.list)\n this.listType = this.list?.type ?? 'string'\n }\n\n let formSchema = joi[this.listType]()\n .valid(...this.values)\n .label(this.label)\n .required()\n\n if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getFormValueFromState(\n state: FormSubmissionState\n ): Item['value'] | Item['value'][] | undefined {\n const { name, items } = this\n\n const value = state[name]\n\n // Allow for array values via subclass\n const values = this.isValue(value) ? [value].flat() : []\n const selected = items.filter((item) => values.includes(item.value))\n\n return selected.at(0)?.value\n }\n\n getDisplayStringFromFormValue(\n value: string | number | boolean | Item['value'][] | undefined,\n translator: Translator\n ): string {\n const { items } = this\n\n const values = [value ?? []].flat()\n\n return items\n .filter((item) => values.includes(item.value))\n .map((item) => translator.tListItem(item, 'text') || item.text)\n .join(', ')\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n // Allow for array values via subclass\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getViewModel(context: RenderContext) {\n const { items: listItems } = this\n\n const viewModel = super.getViewModel(context)\n const { value } = viewModel\n\n // Support multiple values for checkboxes\n const values = this.isValue(value) ? [value].flat() : []\n\n const { tListItem } = context.translator\n\n const items = listItems.map((item) => {\n const selected = values.includes(item.value)\n const resolvedText = tListItem(item, 'text') || item.text\n const resolvedHint = tListItem(item, 'hint') || item.hint?.text\n const hintAttr = resolvedHint ? { hint: { text: resolvedHint } } : {}\n const itemModel: ListItem = {\n ...item,\n text: resolvedText,\n selected,\n ...hintAttr\n }\n\n if ('id' in itemModel) {\n delete itemModel.id\n }\n\n if (item.description) {\n itemModel.hint = {\n text: item.description\n }\n }\n\n return itemModel\n })\n\n return {\n ...viewModel,\n items\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return ListFormComponent.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'selectRequired', template: messageTemplate.selectRequired }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type FormComponentsDef } from '@defra/forms-model';
|
|
2
2
|
import { type JoiExpression, type LanguageMessages, type StringSchema } from 'joi';
|
|
3
3
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
4
|
-
import { type
|
|
4
|
+
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type ErrorMessageTemplateList, type FormState, type FormStateValue, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
|
|
5
6
|
interface LocationFieldOptions {
|
|
6
7
|
instructionText?: string;
|
|
7
8
|
required?: boolean;
|
|
@@ -31,7 +32,7 @@ export declare abstract class LocationFieldBase extends FormComponent {
|
|
|
31
32
|
getFormValueFromState(state: FormSubmissionState): string | undefined;
|
|
32
33
|
getFormValue(value?: FormStateValue | FormState): string | undefined;
|
|
33
34
|
isValue(value?: FormStateValue | FormState): value is string;
|
|
34
|
-
getViewModel(
|
|
35
|
+
getViewModel(context: RenderContext): {
|
|
35
36
|
label: {
|
|
36
37
|
text: string;
|
|
37
38
|
};
|
|
@@ -43,11 +44,11 @@ export declare abstract class LocationFieldBase extends FormComponent {
|
|
|
43
44
|
id?: string;
|
|
44
45
|
text: string;
|
|
45
46
|
};
|
|
46
|
-
prefix?: import("
|
|
47
|
-
suffix?: import("
|
|
47
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
48
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
48
49
|
classes?: string;
|
|
49
50
|
condition?: string;
|
|
50
|
-
errors?: FormSubmissionError[];
|
|
51
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
51
52
|
errorMessage?: {
|
|
52
53
|
text: string;
|
|
53
54
|
};
|
|
@@ -60,21 +61,21 @@ export declare abstract class LocationFieldBase extends FormComponent {
|
|
|
60
61
|
accept?: string;
|
|
61
62
|
inputmode?: string;
|
|
62
63
|
};
|
|
63
|
-
content?: import("
|
|
64
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
64
65
|
maxlength?: number;
|
|
65
66
|
maxwords?: number;
|
|
66
67
|
rows?: number;
|
|
67
|
-
items?: import("
|
|
68
|
+
items?: import("../../../../server/plugins/engine/components/types.js").ListItem[] | import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
68
69
|
fieldset?: {
|
|
69
70
|
attributes?: string | Record<string, string>;
|
|
70
|
-
legend?: import("
|
|
71
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
71
72
|
};
|
|
72
73
|
formGroup?: {
|
|
73
74
|
classes?: string;
|
|
74
75
|
attributes?: string | Record<string, string>;
|
|
75
76
|
};
|
|
76
77
|
showFieldsetError?: boolean;
|
|
77
|
-
components?: import("
|
|
78
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
78
79
|
upload?: {
|
|
79
80
|
count: number;
|
|
80
81
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
@@ -92,11 +93,11 @@ export declare abstract class LocationFieldBase extends FormComponent {
|
|
|
92
93
|
id?: string;
|
|
93
94
|
text: string;
|
|
94
95
|
};
|
|
95
|
-
prefix?: import("
|
|
96
|
-
suffix?: import("
|
|
96
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
97
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
97
98
|
classes?: string;
|
|
98
99
|
condition?: string;
|
|
99
|
-
errors?: FormSubmissionError[];
|
|
100
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
100
101
|
errorMessage?: {
|
|
101
102
|
text: string;
|
|
102
103
|
};
|
|
@@ -109,21 +110,21 @@ export declare abstract class LocationFieldBase extends FormComponent {
|
|
|
109
110
|
accept?: string;
|
|
110
111
|
inputmode?: string;
|
|
111
112
|
};
|
|
112
|
-
content?: import("
|
|
113
|
+
content?: import("../../../../server/plugins/engine/components/types.js").Content | import("../../../../server/plugins/engine/components/types.js").Content[] | string;
|
|
113
114
|
maxlength?: number;
|
|
114
115
|
maxwords?: number;
|
|
115
116
|
rows?: number;
|
|
116
|
-
items?: import("
|
|
117
|
+
items?: import("../../../../server/plugins/engine/components/types.js").ListItem[] | import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
117
118
|
fieldset?: {
|
|
118
119
|
attributes?: string | Record<string, string>;
|
|
119
|
-
legend?: import("
|
|
120
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
120
121
|
};
|
|
121
122
|
formGroup?: {
|
|
122
123
|
classes?: string;
|
|
123
124
|
attributes?: string | Record<string, string>;
|
|
124
125
|
};
|
|
125
126
|
showFieldsetError?: boolean;
|
|
126
|
-
components?: import("
|
|
127
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
127
128
|
upload?: {
|
|
128
129
|
count: number;
|
|
129
130
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
@@ -54,8 +54,8 @@ export class LocationFieldBase extends FormComponent {
|
|
|
54
54
|
isValue(value) {
|
|
55
55
|
return LocationFieldBase.isText(value);
|
|
56
56
|
}
|
|
57
|
-
getViewModel(
|
|
58
|
-
const viewModel = super.getViewModel(
|
|
57
|
+
getViewModel(context) {
|
|
58
|
+
const viewModel = super.getViewModel(context);
|
|
59
59
|
if (this.instructionText) {
|
|
60
60
|
return {
|
|
61
61
|
...viewModel,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocationFieldBase.js","names":["joi","FormComponent","isFormValue","addClassOptionIfNone","messageTemplate","convertToLanguageMessages","LocationFieldBase","instructionText","constructor","def","props","options","locationOptions","config","getValidationConfig","requiredMessage","required","messages","patternErrorMessage","formSchema","string","trim","label","pattern","allow","customValidationMessage","message","messageKeys","reduce","acc","key","customValidationMessages","default","stateSchema","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","isText","getViewModel","
|
|
1
|
+
{"version":3,"file":"LocationFieldBase.js","names":["joi","FormComponent","isFormValue","addClassOptionIfNone","messageTemplate","convertToLanguageMessages","LocationFieldBase","instructionText","constructor","def","props","options","locationOptions","config","getValidationConfig","requiredMessage","required","messages","patternErrorMessage","formSchema","string","trim","label","pattern","allow","customValidationMessage","message","messageKeys","reduce","acc","key","customValidationMessages","default","stateSchema","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","isText","getViewModel","context","viewModel","getAllPossibleErrors","baseErrors","type","template","getErrorTemplates","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/LocationFieldBase.ts"],"sourcesContent":["import { type FormComponentsDef } from '@defra/forms-model'\nimport joi, {\n type JoiExpression,\n type LanguageMessages,\n type StringSchema\n} from 'joi'\n\nimport {\n FormComponent,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { addClassOptionIfNone } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { convertToLanguageMessages } from '~/src/server/utils/type-utils.js'\n\ninterface LocationFieldOptions {\n instructionText?: string\n required?: boolean\n customValidationMessage?: string\n customValidationMessages?: LanguageMessages\n classes?: string\n}\n\ninterface ValidationConfig {\n pattern: RegExp\n patternErrorMessage: JoiExpression\n requiredMessage?: JoiExpression\n}\n\n/**\n * Abstract base class for location-based field components\n */\nexport abstract class LocationFieldBase extends FormComponent {\n declare options: LocationFieldOptions\n declare formSchema: StringSchema\n declare stateSchema: StringSchema\n instructionText?: string\n\n protected abstract getValidationConfig(): ValidationConfig\n protected abstract getErrorTemplates(): {\n type: string\n template: JoiExpression\n }[]\n\n constructor(\n def: FormComponentsDef,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options } = def\n const locationOptions = options as LocationFieldOptions\n this.instructionText = locationOptions.instructionText\n\n addClassOptionIfNone(locationOptions, 'govuk-input--width-10')\n\n const config = this.getValidationConfig()\n const requiredMessage = config.requiredMessage ?? messageTemplate.required\n\n const messages = convertToLanguageMessages({\n 'any.required': requiredMessage,\n 'string.empty': requiredMessage,\n 'string.pattern.base': config.patternErrorMessage\n })\n\n let formSchema = joi\n .string()\n .trim()\n .label(this.label)\n .required()\n .pattern(config.pattern)\n .messages(messages)\n\n if (locationOptions.required === false) {\n formSchema = formSchema.allow('')\n }\n\n if (locationOptions.customValidationMessage) {\n const message = locationOptions.customValidationMessage\n const messageKeys = [\n 'any.required',\n 'string.empty',\n 'string.pattern.base'\n ]\n\n const messages = messageKeys.reduce<LanguageMessages>((acc, key) => {\n acc[key] = message\n return acc\n }, {})\n\n formSchema = formSchema.messages(messages)\n } else if (locationOptions.customValidationMessages) {\n formSchema = formSchema.messages(locationOptions.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = locationOptions\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n isValue(value?: FormStateValue | FormState): value is string {\n return LocationFieldBase.isText(value)\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n\n if (this.instructionText) {\n return {\n ...viewModel,\n instructionText: this.instructionText\n }\n }\n\n return viewModel\n }\n\n getAllPossibleErrors(): ErrorMessageTemplateList {\n const config = this.getValidationConfig()\n\n return {\n baseErrors: [\n {\n type: 'required',\n template: config.requiredMessage ?? messageTemplate.required\n },\n ...this.getErrorTemplates()\n ],\n advancedSettingsErrors: []\n }\n }\n\n static isText(value?: FormStateValue | FormState): value is string {\n return isFormValue(value) && typeof value === 'string'\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type CustomValidator } from 'joi';
|
|
2
2
|
import { type EastingNorthingField } from '../../../../server/plugins/engine/components/EastingNorthingField.js';
|
|
3
3
|
import { type LatLongField } from '../../../../server/plugins/engine/components/LatLongField.js';
|
|
4
|
-
import { type DateInputItem, type Label, type ViewModel } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
-
import { type
|
|
4
|
+
import { type DateInputItem, type Label, type RenderContext, type ViewModel } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type FormSubmissionError, type FormValue } from '../../../../server/plugins/engine/types.js';
|
|
6
6
|
export type LocationField = InstanceType<typeof EastingNorthingField> | InstanceType<typeof LatLongField>;
|
|
7
7
|
export declare function joinWithAnd(items: string[]): string;
|
|
8
8
|
export declare function formatErrorList(messages: string[]): string;
|
|
@@ -13,7 +13,7 @@ export declare function getLocationFieldViewModel(component: LocationField, view
|
|
|
13
13
|
id: string;
|
|
14
14
|
name: string;
|
|
15
15
|
value: FormValue;
|
|
16
|
-
},
|
|
16
|
+
}, context: RenderContext): {
|
|
17
17
|
fieldset: {
|
|
18
18
|
attributes?: string | Record<string, string>;
|
|
19
19
|
legend?: Label;
|
|
@@ -45,7 +45,7 @@ export function deduplicateErrorsByHref(errors) {
|
|
|
45
45
|
}
|
|
46
46
|
return errors.filter((error, index, self) => index === self.findIndex(err => err.href === error.href));
|
|
47
47
|
}
|
|
48
|
-
export function getLocationFieldViewModel(component, viewModel,
|
|
48
|
+
export function getLocationFieldViewModel(component, viewModel, context) {
|
|
49
49
|
const {
|
|
50
50
|
collection
|
|
51
51
|
} = component;
|
|
@@ -53,7 +53,7 @@ export function getLocationFieldViewModel(component, viewModel, payload, errors)
|
|
|
53
53
|
fieldset: existingFieldset,
|
|
54
54
|
label
|
|
55
55
|
} = viewModel;
|
|
56
|
-
const subViewModels = collection.getViewModel(
|
|
56
|
+
const subViewModels = collection.getViewModel(context);
|
|
57
57
|
const fieldErrors = [];
|
|
58
58
|
subViewModels.forEach(({
|
|
59
59
|
model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocationFieldHelpers.js","names":["isFormValue","lowercaseMessageStart","message","startsWith","slice","charAt","toLowerCase","joinWithAnd","items","length","leading","join","last","formatErrorList","messages","formattedMessages","map","msg","index","mergeCssClasses","classNames","tokens","flatMap","name","split","token","trim","filter","Boolean","undefined","Array","from","Set","deduplicateErrorsByHref","errors","error","self","findIndex","err","href","getLocationFieldViewModel","component","viewModel","payload","collection","fieldset","existingFieldset","label","subViewModels","getViewModel","fieldErrors","forEach","model","errorMessage","text","push","hasFieldErrors","type","value","classes","prefix","suffix","toString","baseItem","id","showFieldsetError","legend","result","options","instructionText","createLocationFieldValidator","helpers","values","getFormValueFromState","getStateFromValidForm","context","missing","keys","key","isState","required"],"sources":["../../../../../src/server/plugins/engine/components/LocationFieldHelpers.ts"],"sourcesContent":["import { type Context, type CustomValidator } from 'joi'\n\nimport { type EastingNorthingField } from '~/src/server/plugins/engine/components/EastingNorthingField.js'\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type LatLongField } from '~/src/server/plugins/engine/components/LatLongField.js'\nimport {\n type DateInputItem,\n type Label,\n type ViewModel\n} from '~/src/server/plugins/engine/components/types.js'\nimport {\n type FormPayload,\n type FormSubmissionError,\n type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport type LocationField =\n | InstanceType<typeof EastingNorthingField>\n | InstanceType<typeof LatLongField>\n\n/**\n * Lowercases the start of a message for concatenation.\n * Handles patterns like:\n * - \"Enter latitude\" -> \"enter latitude\"\n * - \"Enter a valid latitude...\" -> \"enter a valid latitude...\"\n * - \"latitude must be...\" -> \"latitude must be...\"\n */\nfunction lowercaseMessageStart(message: string): string {\n if (message.startsWith('Enter ')) {\n return 'enter' + message.slice(5)\n }\n\n // Lowercase first character for any other message\n return message.charAt(0).toLowerCase() + message.slice(1)\n}\n\nexport function joinWithAnd(items: string[]): string {\n if (items.length === 2) {\n return `${items[0]} and ${items[1]}`\n }\n\n const leading = items.slice(0, -1).join(', ')\n const last = items[items.length - 1]\n return `${leading} and ${last}`\n}\n\nexport function formatErrorList(messages: string[]): string {\n if (!messages.length) {\n return ''\n }\n\n if (messages.length === 1) {\n return messages[0]\n }\n\n const formattedMessages = messages.map((msg, index) =>\n index === 0 ? msg : lowercaseMessageStart(msg)\n )\n\n return joinWithAnd(formattedMessages)\n}\n\nexport function mergeCssClasses(...classNames: (string | undefined)[]) {\n const tokens = classNames\n .flatMap((name) => name?.split(/\\s+/) ?? [])\n .map((token) => token.trim())\n .filter(Boolean)\n\n if (!tokens.length) {\n return undefined\n }\n\n return Array.from(new Set(tokens)).join(' ')\n}\n\nexport function deduplicateErrorsByHref(\n errors?: FormSubmissionError[]\n): FormSubmissionError[] | undefined {\n if (!errors?.length) {\n return undefined\n }\n\n return errors.filter(\n (error, index, self) =>\n index === self.findIndex((err) => err.href === error.href)\n )\n}\n\nexport function getLocationFieldViewModel(\n component: LocationField,\n viewModel: ViewModel & {\n label: Label\n id: string\n name: string\n value: FormValue\n },\n payload: FormPayload,\n errors?: FormSubmissionError[]\n) {\n const { collection } = component\n const { fieldset: existingFieldset, label } = viewModel\n\n const subViewModels = collection.getViewModel(payload, errors)\n\n const fieldErrors: string[] = []\n subViewModels.forEach(({ model }) => {\n if (model.errorMessage?.text) {\n fieldErrors.push(model.errorMessage.text)\n }\n })\n\n const hasFieldErrors = fieldErrors.length > 0\n\n const items: DateInputItem[] = subViewModels.map(\n ({ model }): DateInputItem => {\n let { label, type, value, classes, prefix, suffix, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text\n }\n\n if (!isFormValue(value)) {\n value = undefined\n }\n\n const baseItem: DateInputItem = {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes: mergeCssClasses(\n classes,\n hasFieldErrors ? 'govuk-input--error' : undefined\n ),\n prefix,\n suffix\n }\n\n if (!hasFieldErrors && errorMessage) {\n baseItem.errorMessage = errorMessage\n }\n\n return baseItem\n }\n )\n\n const showFieldsetError =\n hasFieldErrors || Boolean(viewModel.errorMessage?.text)\n\n viewModel.showFieldsetError = showFieldsetError\n\n if (hasFieldErrors) {\n viewModel.errorMessage = {\n text:\n fieldErrors.length === 1 ? fieldErrors[0] : formatErrorList(fieldErrors)\n }\n }\n\n const fieldset = existingFieldset ?? {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const result = {\n ...viewModel,\n fieldset,\n items\n }\n\n if (component.options.instructionText) {\n return {\n ...result,\n instructionText: component.options.instructionText\n }\n }\n\n return result\n}\n\n/**\n * Validator factory for location-based fields.\n * This creates a validator that ensures all required fields are present.\n */\nexport function createLocationFieldValidator(\n component: LocationField\n): CustomValidator {\n return (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n return payload\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"LocationFieldHelpers.js","names":["isFormValue","lowercaseMessageStart","message","startsWith","slice","charAt","toLowerCase","joinWithAnd","items","length","leading","join","last","formatErrorList","messages","formattedMessages","map","msg","index","mergeCssClasses","classNames","tokens","flatMap","name","split","token","trim","filter","Boolean","undefined","Array","from","Set","deduplicateErrorsByHref","errors","error","self","findIndex","err","href","getLocationFieldViewModel","component","viewModel","context","collection","fieldset","existingFieldset","label","subViewModels","getViewModel","fieldErrors","forEach","model","errorMessage","text","push","hasFieldErrors","type","value","classes","prefix","suffix","toString","baseItem","id","showFieldsetError","legend","result","options","instructionText","createLocationFieldValidator","payload","helpers","values","getFormValueFromState","getStateFromValidForm","missing","keys","key","isState","required"],"sources":["../../../../../src/server/plugins/engine/components/LocationFieldHelpers.ts"],"sourcesContent":["import { type Context, type CustomValidator } from 'joi'\n\nimport { type EastingNorthingField } from '~/src/server/plugins/engine/components/EastingNorthingField.js'\nimport { isFormValue } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type LatLongField } from '~/src/server/plugins/engine/components/LatLongField.js'\nimport {\n type DateInputItem,\n type Label,\n type RenderContext,\n type ViewModel\n} from '~/src/server/plugins/engine/components/types.js'\nimport {\n type FormPayload,\n type FormSubmissionError,\n type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport type LocationField =\n | InstanceType<typeof EastingNorthingField>\n | InstanceType<typeof LatLongField>\n\n/**\n * Lowercases the start of a message for concatenation.\n * Handles patterns like:\n * - \"Enter latitude\" -> \"enter latitude\"\n * - \"Enter a valid latitude...\" -> \"enter a valid latitude...\"\n * - \"latitude must be...\" -> \"latitude must be...\"\n */\nfunction lowercaseMessageStart(message: string): string {\n if (message.startsWith('Enter ')) {\n return 'enter' + message.slice(5)\n }\n\n // Lowercase first character for any other message\n return message.charAt(0).toLowerCase() + message.slice(1)\n}\n\nexport function joinWithAnd(items: string[]): string {\n if (items.length === 2) {\n return `${items[0]} and ${items[1]}`\n }\n\n const leading = items.slice(0, -1).join(', ')\n const last = items[items.length - 1]\n return `${leading} and ${last}`\n}\n\nexport function formatErrorList(messages: string[]): string {\n if (!messages.length) {\n return ''\n }\n\n if (messages.length === 1) {\n return messages[0]\n }\n\n const formattedMessages = messages.map((msg, index) =>\n index === 0 ? msg : lowercaseMessageStart(msg)\n )\n\n return joinWithAnd(formattedMessages)\n}\n\nexport function mergeCssClasses(...classNames: (string | undefined)[]) {\n const tokens = classNames\n .flatMap((name) => name?.split(/\\s+/) ?? [])\n .map((token) => token.trim())\n .filter(Boolean)\n\n if (!tokens.length) {\n return undefined\n }\n\n return Array.from(new Set(tokens)).join(' ')\n}\n\nexport function deduplicateErrorsByHref(\n errors?: FormSubmissionError[]\n): FormSubmissionError[] | undefined {\n if (!errors?.length) {\n return undefined\n }\n\n return errors.filter(\n (error, index, self) =>\n index === self.findIndex((err) => err.href === error.href)\n )\n}\n\nexport function getLocationFieldViewModel(\n component: LocationField,\n viewModel: ViewModel & {\n label: Label\n id: string\n name: string\n value: FormValue\n },\n context: RenderContext\n) {\n const { collection } = component\n const { fieldset: existingFieldset, label } = viewModel\n\n const subViewModels = collection.getViewModel(context)\n\n const fieldErrors: string[] = []\n subViewModels.forEach(({ model }) => {\n if (model.errorMessage?.text) {\n fieldErrors.push(model.errorMessage.text)\n }\n })\n\n const hasFieldErrors = fieldErrors.length > 0\n\n const items: DateInputItem[] = subViewModels.map(\n ({ model }): DateInputItem => {\n let { label, type, value, classes, prefix, suffix, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text\n }\n\n if (!isFormValue(value)) {\n value = undefined\n }\n\n const baseItem: DateInputItem = {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes: mergeCssClasses(\n classes,\n hasFieldErrors ? 'govuk-input--error' : undefined\n ),\n prefix,\n suffix\n }\n\n if (!hasFieldErrors && errorMessage) {\n baseItem.errorMessage = errorMessage\n }\n\n return baseItem\n }\n )\n\n const showFieldsetError =\n hasFieldErrors || Boolean(viewModel.errorMessage?.text)\n\n viewModel.showFieldsetError = showFieldsetError\n\n if (hasFieldErrors) {\n viewModel.errorMessage = {\n text:\n fieldErrors.length === 1 ? fieldErrors[0] : formatErrorList(fieldErrors)\n }\n }\n\n const fieldset = existingFieldset ?? {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const result = {\n ...viewModel,\n fieldset,\n items\n }\n\n if (component.options.instructionText) {\n return {\n ...result,\n instructionText: component.options.instructionText\n }\n }\n\n return result\n}\n\n/**\n * Validator factory for location-based fields.\n * This creates a validator that ensures all required fields are present.\n */\nexport function createLocationFieldValidator(\n component: LocationField\n): CustomValidator {\n return (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n return payload\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { type MarkdownComponent } from '@defra/forms-model';
|
|
2
2
|
import { ComponentBase } from '../../../../server/plugins/engine/components/ComponentBase.js';
|
|
3
|
+
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
3
4
|
export declare class Markdown extends ComponentBase {
|
|
4
5
|
options: MarkdownComponent['options'];
|
|
5
6
|
content: MarkdownComponent['content'];
|
|
6
7
|
headerStartLevel: number;
|
|
7
8
|
constructor(def: MarkdownComponent, props: ConstructorParameters<typeof ComponentBase>[1]);
|
|
8
|
-
getViewModel(): {
|
|
9
|
+
getViewModel(context: RenderContext): {
|
|
9
10
|
content: string;
|
|
10
11
|
headerStartLevel: number;
|
|
11
|
-
label?: import("
|
|
12
|
+
label?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
12
13
|
type?: string;
|
|
13
14
|
id?: string;
|
|
14
15
|
name?: string;
|
|
@@ -17,8 +18,8 @@ export declare class Markdown extends ComponentBase {
|
|
|
17
18
|
id?: string;
|
|
18
19
|
text: string;
|
|
19
20
|
};
|
|
20
|
-
prefix?: import("
|
|
21
|
-
suffix?: import("
|
|
21
|
+
prefix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
22
|
+
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
22
23
|
classes?: string;
|
|
23
24
|
condition?: string;
|
|
24
25
|
errors?: import("../types.js").FormSubmissionError[];
|
|
@@ -37,17 +38,17 @@ export declare class Markdown extends ComponentBase {
|
|
|
37
38
|
maxlength?: number;
|
|
38
39
|
maxwords?: number;
|
|
39
40
|
rows?: number;
|
|
40
|
-
items?: import("
|
|
41
|
+
items?: import("../../../../server/plugins/engine/components/types.js").ListItem[] | import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
|
|
41
42
|
fieldset?: {
|
|
42
43
|
attributes?: string | Record<string, string>;
|
|
43
|
-
legend?: import("
|
|
44
|
+
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
44
45
|
};
|
|
45
46
|
formGroup?: {
|
|
46
47
|
classes?: string;
|
|
47
48
|
attributes?: string | Record<string, string>;
|
|
48
49
|
};
|
|
49
50
|
showFieldsetError?: boolean;
|
|
50
|
-
components?: import("
|
|
51
|
+
components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
51
52
|
upload?: {
|
|
52
53
|
count: number;
|
|
53
54
|
summaryList: import("../types.js").SummaryList;
|
|
@@ -12,14 +12,17 @@ export class Markdown extends ComponentBase {
|
|
|
12
12
|
this.options = options;
|
|
13
13
|
this.headerStartLevel = 2;
|
|
14
14
|
}
|
|
15
|
-
getViewModel() {
|
|
15
|
+
getViewModel(context) {
|
|
16
16
|
const {
|
|
17
17
|
content,
|
|
18
18
|
viewModel
|
|
19
19
|
} = this;
|
|
20
|
+
const {
|
|
21
|
+
tComponent
|
|
22
|
+
} = context.translator;
|
|
20
23
|
return {
|
|
21
24
|
...viewModel,
|
|
22
|
-
content,
|
|
25
|
+
content: tComponent(this, 'content') || content,
|
|
23
26
|
headerStartLevel: this.headerStartLevel
|
|
24
27
|
};
|
|
25
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markdown.js","names":["ComponentBase","Markdown","content","headerStartLevel","constructor","def","props","options","getViewModel","viewModel"],"sources":["../../../../../src/server/plugins/engine/components/Markdown.ts"],"sourcesContent":["import { type MarkdownComponent } from '@defra/forms-model'\n\nimport { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\n\nexport class Markdown extends ComponentBase {\n declare options: MarkdownComponent['options']\n content: MarkdownComponent['content']\n headerStartLevel: number\n\n constructor(\n def: MarkdownComponent,\n props: ConstructorParameters<typeof ComponentBase>[1]\n ) {\n super(def, props)\n\n const { content, options } = def\n\n this.content = content\n this.options = options\n this.headerStartLevel = 2\n }\n\n getViewModel() {\n const { content, viewModel } = this\n\n return {\n ...viewModel,\n content,\n headerStartLevel: this.headerStartLevel\n }\n }\n}\n"],"mappings":"AAEA,SAASA,aAAa;
|
|
1
|
+
{"version":3,"file":"Markdown.js","names":["ComponentBase","Markdown","content","headerStartLevel","constructor","def","props","options","getViewModel","context","viewModel","tComponent","translator"],"sources":["../../../../../src/server/plugins/engine/components/Markdown.ts"],"sourcesContent":["import { type ComponentDef, type MarkdownComponent } from '@defra/forms-model'\n\nimport { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\n\nexport class Markdown extends ComponentBase {\n declare options: MarkdownComponent['options']\n content: MarkdownComponent['content']\n headerStartLevel: number\n\n constructor(\n def: MarkdownComponent,\n props: ConstructorParameters<typeof ComponentBase>[1]\n ) {\n super(def, props)\n\n const { content, options } = def\n\n this.content = content\n this.options = options\n this.headerStartLevel = 2\n }\n\n getViewModel(context: RenderContext) {\n const { content, viewModel } = this\n\n const { tComponent } = context.translator\n\n return {\n ...viewModel,\n content:\n tComponent(this as unknown as ComponentDef, 'content') || content,\n headerStartLevel: this.headerStartLevel\n }\n }\n}\n"],"mappings":"AAEA,SAASA,aAAa;AAGtB,OAAO,MAAMC,QAAQ,SAASD,aAAa,CAAC;EAE1CE,OAAO;EACPC,gBAAgB;EAEhBC,WAAWA,CACTC,GAAsB,EACtBC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEJ,OAAO;MAAEK;IAAQ,CAAC,GAAGF,GAAG;IAEhC,IAAI,CAACH,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACK,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACJ,gBAAgB,GAAG,CAAC;EAC3B;EAEAK,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAM;MAAEP,OAAO;MAAEQ;IAAU,CAAC,GAAG,IAAI;IAEnC,MAAM;MAAEC;IAAW,CAAC,GAAGF,OAAO,CAACG,UAAU;IAEzC,OAAO;MACL,GAAGF,SAAS;MACZR,OAAO,EACLS,UAAU,CAAC,IAAI,EAA6B,SAAS,CAAC,IAAIT,OAAO;MACnEC,gBAAgB,EAAE,IAAI,CAACA;IACzB,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type MonthYearFieldComponent } from '@defra/forms-model';
|
|
2
|
-
import { type CustomValidator, type ObjectSchema } from 'joi';
|
|
2
|
+
import { type CustomValidator, type LanguageMessages, type ObjectSchema } from 'joi';
|
|
3
3
|
import { ComponentCollection } from '../../../../server/plugins/engine/components/ComponentCollection.js';
|
|
4
4
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
5
|
-
import { type DateInputItem, type MonthYearState } from '../../../../server/plugins/engine/components/types.js';
|
|
6
|
-
import { type
|
|
5
|
+
import { type DateInputItem, type MonthYearState, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
6
|
+
import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
7
|
+
import { type ErrorMessageTemplateList, type FormPayload, type FormState, type FormStateValue, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
|
|
7
8
|
export declare class MonthYearField extends FormComponent {
|
|
8
9
|
options: MonthYearFieldComponent['options'];
|
|
9
10
|
formSchema: ObjectSchema<FormPayload>;
|
|
@@ -11,11 +12,12 @@ export declare class MonthYearField extends FormComponent {
|
|
|
11
12
|
collection: ComponentCollection;
|
|
12
13
|
constructor(def: MonthYearFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
13
14
|
getFormValueFromState(state: FormSubmissionState): MonthYearState | undefined;
|
|
14
|
-
getDisplayStringFromFormValue(value: MonthYearState | undefined): string;
|
|
15
|
-
getDisplayStringFromState(state: FormSubmissionState): string;
|
|
15
|
+
getDisplayStringFromFormValue(value: MonthYearState | undefined, _translator: Translator): string;
|
|
16
|
+
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
16
17
|
getContextValueFromFormValue(value: MonthYearState | undefined): string | null;
|
|
17
18
|
getContextValueFromState(state: FormSubmissionState): string | null;
|
|
18
|
-
|
|
19
|
+
getValidationMessagesOverride(translator: Translator): LanguageMessages;
|
|
20
|
+
getViewModel(context: RenderContext): {
|
|
19
21
|
fieldset: {
|
|
20
22
|
attributes?: string | Record<string, string>;
|
|
21
23
|
legend?: import("../../../../server/plugins/engine/components/types.js").Label;
|
|
@@ -36,7 +38,7 @@ export declare class MonthYearField extends FormComponent {
|
|
|
36
38
|
suffix?: import("../../../../server/plugins/engine/components/types.js").ComponentText;
|
|
37
39
|
classes?: string;
|
|
38
40
|
condition?: string;
|
|
39
|
-
errors?: FormSubmissionError[];
|
|
41
|
+
errors?: import("../../../../server/plugins/engine/types.js").FormSubmissionError[];
|
|
40
42
|
errorMessage?: {
|
|
41
43
|
text: string;
|
|
42
44
|
};
|