@defra/forms-engine-plugin 5.0.0-alpha.1 → 5.0.0-alpha.10
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.map +1 -1
- package/.public/javascripts/shared.min.js +1 -1
- 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 +5 -3
- package/.server/client/javascripts/file-upload.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.js +31 -26
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/location-map.js +9 -1
- package/.server/client/javascripts/location-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 +26 -2
- package/.server/server/plugins/engine/components/EastingNorthingField.js +93 -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 +20 -2
- 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 +26 -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 +5 -2
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +10 -11
- 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/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 +73 -6
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +43 -4
- 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 +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +22 -9
- 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 +1 -0
- package/.server/server/plugins/engine/types.js.map +1 -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/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/package.json +8 -2
- package/src/client/javascripts/file-upload.js +10 -3
- package/src/client/javascripts/geospatial-map.js +32 -30
- package/src/client/javascripts/location-map.js +7 -1
- 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 +154 -89
- package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
- package/src/server/plugins/engine/components/FileUploadField.ts +21 -2
- 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 +14 -11
- 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/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 +73 -6
- package/src/server/plugins/engine/i18n/translations/en-GB.json +43 -4
- 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 +18 -8
- 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 +1 -0
- 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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormComponent.js","names":["ComponentBase","FormComponent","type","hint","label","summaryLabel","isFormComponent","isAppendageStateSingleObject","constructor","def","props","getLabel","getSummaryLabel","errorDescription","shortDescription","title","keys","collection","name","fields","map","getFormDataFromState","state","getFormValue","getFormValueFromState","value","isValue","undefined","getStateFromValidForm","payload","getErrors","_translator","errors","list","filter","error","path","includes","length","getFirstError","translator","getViewErrors","firstError","getValidationMessagesOverride","getViewModel","isForceAccess","_isForceAccess","options","viewModel","t","tComponent","isRequired","required","hideOptional","optionalText","resolvedTitle","optionalTag","text","componentErrors","componentError","errorMessage","id","getDisplayStringFromFormValue","toString","getDisplayStringFromState","getContextValueFromFormValue","isState","values","Object","isFormValue","Array","isArray","getContextValueFromState","isFormState","getAllPossibleErrors","baseErrors","advancedSettingsErrors","onSubmit","_request","_metadata","_context","Promise","resolve","isRepeatState","every","isRepeatValue","itemId","isUploadState","isUploadValue","isGeospatialState","isGeospatialValue","uploadId"],"sources":["../../../../../src/server/plugins/engine/components/FormComponent.ts"],"sourcesContent":["import {\n type ComponentDef,\n type FormComponentsDef,\n type FormMetadata,\n type Item\n} from '@defra/forms-model'\nimport { type LanguageMessages } from 'joi'\n\nimport { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport {\n type FormContext,\n type FormRequestPayload\n} from '~/src/server/plugins/engine/types/index.js'\nimport {\n type ErrorMessageTemplateList,\n type Feature,\n type FileState,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState,\n type FormValue,\n type GeospatialState,\n type RepeatItemState,\n type RepeatListState,\n type UploadState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class FormComponent extends ComponentBase {\n type: FormComponentsDef['type']\n hint: FormComponentsDef['hint']\n label: string\n summaryLabel: string\n\n isFormComponent = true\n isAppendageStateSingleObject = false\n\n constructor(\n def: FormComponentsDef,\n props: ConstructorParameters<typeof ComponentBase>[1]\n ) {\n super(def, props)\n\n const { hint, type } = def\n\n this.type = type\n this.hint = hint\n\n this.label = this.getLabel(def)\n this.summaryLabel = this.getSummaryLabel(def)\n }\n\n getLabel(def: FormComponentsDef) {\n if ('errorDescription' in def && def.errorDescription) {\n return def.errorDescription\n }\n\n return this.getSummaryLabel(def)\n }\n\n getSummaryLabel(def: FormComponentsDef) {\n if ('shortDescription' in def && def.shortDescription) {\n return def.shortDescription\n }\n\n return def.title\n }\n\n get keys() {\n const { collection, name } = this\n\n if (collection) {\n const { fields } = collection\n return [name, ...fields.map(({ name }) => name)]\n }\n\n return [name]\n }\n\n getFormDataFromState(state: FormSubmissionState): FormPayload {\n const { collection, name } = this\n\n if (collection) {\n return collection.getFormDataFromState(state)\n }\n\n return {\n [name]: this.getFormValue(state[name])\n }\n }\n\n getFormValueFromState(state: FormSubmissionState): FormValue | FormPayload {\n const { collection, name } = this\n\n if (collection) {\n return collection.getFormValueFromState(state)\n }\n\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getStateFromValidForm(payload: FormPayload): FormState {\n const { collection, name } = this\n\n if (collection) {\n return collection.getStateFromValidForm(payload)\n }\n\n return {\n [name]: this.getFormValue(payload[name]) ?? null\n }\n }\n\n getErrors(\n _translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const { name } = this\n\n // Filter component and child errors only\n const list = errors?.filter(\n (error) =>\n error.name === name ||\n error.path.includes(name) ||\n this.keys.includes(error.name)\n )\n\n if (!list?.length) {\n return\n }\n\n return list\n }\n\n getFirstError(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError | undefined {\n return this.getErrors(translator, errors)?.[0]\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const firstError = this.getFirstError(translator, errors)\n return firstError && [firstError]\n }\n\n /**\n * Override in composite fields to return translated Joi message overrides for\n * their sub-fields, applied at validation time so schema-level English messages\n * are replaced with the correct language. Return null to skip message patching.\n */\n getValidationMessagesOverride(\n _translator: Translator\n ): LanguageMessages | null {\n return null\n }\n\n getViewModel({\n payload,\n errors,\n translator,\n isForceAccess: _isForceAccess = false\n }: RenderContext) {\n const { hint, name, options = {}, title, viewModel } = this\n\n const { t, tComponent } = translator\n\n const isRequired = !('required' in options) || options.required !== false\n const hideOptional = 'optionalText' in options && options.optionalText\n\n const resolvedTitle =\n tComponent(this as unknown as ComponentDef, 'title') || title\n const optionalTag =\n !isRequired && !hideOptional ? ` ${t('common.optional')}` : ''\n const label = `${resolvedTitle}${optionalTag}`\n\n if (hint) {\n viewModel.hint = {\n text: tComponent(this as unknown as ComponentDef, 'hint') || hint\n }\n }\n\n // Filter component errors only\n const componentErrors = this.getErrors(translator, errors)\n const componentError = this.getFirstError(translator, componentErrors)\n\n if (componentErrors) {\n viewModel.errors = componentErrors\n }\n\n if (componentError) {\n viewModel.errorMessage = {\n text: componentError.text\n }\n }\n\n return {\n ...viewModel,\n label: {\n text: label\n },\n id: name,\n name,\n value: payload[name]\n }\n }\n\n getDisplayStringFromFormValue(\n value: FormValue | FormPayload,\n _translator: Translator\n ): string {\n // Map selected values to text\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return this.isValue(value) ? value.toString() : ''\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ): string {\n const value = this.getFormValueFromState(state)\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: FormValue | FormPayload\n ): Item['value'] | Item['value'][] | null {\n // Filter object field values\n if (this.isState(value)) {\n const values = Object.values(value).filter(isFormValue)\n return values.length ? values : null\n }\n\n // Filter array field values\n if (this.isValue(value) && Array.isArray(value)) {\n return value.filter(isFormValue)\n }\n\n return this.isValue(value) ? value : null\n }\n\n getContextValueFromState(\n state: FormSubmissionState\n ): Item['value'] | Item['value'][] | null {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n isValue(\n value?: FormStateValue | FormState\n ): value is NonNullable<FormStateValue> {\n return isFormValue(value)\n }\n\n isState(value?: FormStateValue | FormState): value is FormState {\n return isFormState(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return FormComponent.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 advancedSettingsErrors: []\n }\n }\n\n onSubmit(\n _request: FormRequestPayload,\n _metadata: FormMetadata,\n _context: FormContext\n ): Promise<void> {\n return Promise.resolve()\n }\n}\n\n/**\n * Check for form value\n */\nexport function isFormValue(\n value?: unknown\n): value is string | number | boolean {\n return (\n (typeof value === 'string' && value.length > 0) ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n )\n}\n\n/**\n * Check for form state with nested values\n */\nexport function isFormState(value?: unknown): value is FormState {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n\n // Skip empty objects\n return !!Object.values(value).length\n}\n\n/**\n * Check for repeat list state\n */\nexport function isRepeatState(value?: unknown): value is RepeatListState {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isRepeatValue)\n}\n\n/**\n * Check for repeat list value\n */\nexport function isRepeatValue(value?: unknown): value is RepeatItemState {\n return isFormState(value) && typeof value.itemId === 'string'\n}\n\n/**\n * Check for upload state\n */\nexport function isUploadState(value?: unknown): value is UploadState {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isUploadValue)\n}\n\n/**\n * Check for geospatial state\n */\nexport function isGeospatialState(value?: unknown): value is GeospatialState {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isGeospatialValue)\n}\n\n/**\n * Check for upload state value\n */\nexport function isUploadValue(value?: unknown): value is FileState {\n return isFormState(value) && typeof value.uploadId === 'string'\n}\n\n/**\n * Check for geospatial state value\n */\nexport function isGeospatialValue(value?: unknown): value is Feature {\n return (\n isFormState(value) &&\n typeof value.type === 'string' &&\n value.type === 'Feature'\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FormComponent.js","names":["ComponentBase","FormComponent","type","hint","label","summaryLabel","isFormComponent","isAppendageStateSingleObject","constructor","def","props","getLabel","getSummaryLabel","errorDescription","shortDescription","title","keys","collection","name","fields","map","getFormDataFromState","state","getFormValue","getFormValueFromState","value","isValue","undefined","getStateFromValidForm","payload","getErrors","_translator","errors","list","filter","error","path","includes","length","getFirstError","translator","getViewErrors","firstError","getValidationMessagesOverride","getViewModel","isForceAccess","_isForceAccess","options","viewModel","t","tComponent","isRequired","required","hideOptional","optionalText","resolvedTitle","optionalTag","text","componentErrors","componentError","errorMessage","id","getDisplayStringFromFormValue","toString","getDisplayStringFromState","getContextValueFromFormValue","isState","values","Object","isFormValue","Array","isArray","getContextValueFromState","isFormState","getAllPossibleErrors","baseErrors","advancedSettingsErrors","onSubmit","_request","_metadata","_context","Promise","resolve","isRepeatState","every","isRepeatValue","itemId","isUploadState","isUploadValue","isGeospatialState","isGeospatialValue","uploadId"],"sources":["../../../../../src/server/plugins/engine/components/FormComponent.ts"],"sourcesContent":["import {\n type FormComponentsDef,\n type FormMetadata,\n type Item\n} from '@defra/forms-model'\nimport { type LanguageMessages } from 'joi'\n\nimport { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport {\n type FormContext,\n type FormRequestPayload\n} from '~/src/server/plugins/engine/types/index.js'\nimport {\n type ErrorMessageTemplateList,\n type Feature,\n type FileState,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState,\n type FormValue,\n type GeospatialState,\n type RepeatItemState,\n type RepeatListState,\n type UploadState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class FormComponent extends ComponentBase {\n type: FormComponentsDef['type']\n hint: FormComponentsDef['hint']\n label: string\n summaryLabel: string\n\n isFormComponent = true\n isAppendageStateSingleObject = false\n\n constructor(\n def: FormComponentsDef,\n props: ConstructorParameters<typeof ComponentBase>[1]\n ) {\n super(def, props)\n\n const { hint, type } = def\n\n this.type = type\n this.hint = hint\n\n this.label = this.getLabel(def)\n this.summaryLabel = this.getSummaryLabel(def)\n }\n\n getLabel(def: FormComponentsDef) {\n if ('errorDescription' in def && def.errorDescription) {\n return def.errorDescription\n }\n\n return this.getSummaryLabel(def)\n }\n\n getSummaryLabel(def: FormComponentsDef) {\n if ('shortDescription' in def && def.shortDescription) {\n return def.shortDescription\n }\n\n return def.title\n }\n\n get keys() {\n const { collection, name } = this\n\n if (collection) {\n const { fields } = collection\n return [name, ...fields.map(({ name }) => name)]\n }\n\n return [name]\n }\n\n getFormDataFromState(state: FormSubmissionState): FormPayload {\n const { collection, name } = this\n\n if (collection) {\n return collection.getFormDataFromState(state)\n }\n\n return {\n [name]: this.getFormValue(state[name])\n }\n }\n\n getFormValueFromState(state: FormSubmissionState): FormValue | FormPayload {\n const { collection, name } = this\n\n if (collection) {\n return collection.getFormValueFromState(state)\n }\n\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getStateFromValidForm(payload: FormPayload): FormState {\n const { collection, name } = this\n\n if (collection) {\n return collection.getStateFromValidForm(payload)\n }\n\n return {\n [name]: this.getFormValue(payload[name]) ?? null\n }\n }\n\n getErrors(\n _translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const { name } = this\n\n // Filter component and child errors only\n const list = errors?.filter(\n (error) =>\n error.name === name ||\n error.path.includes(name) ||\n this.keys.includes(error.name)\n )\n\n if (!list?.length) {\n return\n }\n\n return list\n }\n\n getFirstError(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError | undefined {\n return this.getErrors(translator, errors)?.[0]\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const firstError = this.getFirstError(translator, errors)\n return firstError && [firstError]\n }\n\n /**\n * Override in composite fields to return translated Joi message overrides for\n * their sub-fields, applied at validation time so schema-level English messages\n * are replaced with the correct language. Return null to skip message patching.\n * The return object may contain message overrides at component-level, or sub-field-level.\n * This would allow different error message overrides per field within a collection e.g.\n * for EastingNothingField\n */\n getValidationMessagesOverride(\n _translator: Translator\n ): Record<string, LanguageMessages> | null {\n return null\n }\n\n getViewModel({\n payload,\n errors,\n translator,\n isForceAccess: _isForceAccess = false\n }: RenderContext) {\n const { hint, name, options = {}, title, viewModel } = this\n\n const { t, tComponent } = translator\n\n const isRequired = !('required' in options) || options.required !== false\n const hideOptional = 'optionalText' in options && options.optionalText\n\n const resolvedTitle = tComponent(this.def, 'title') || title\n const optionalTag =\n !isRequired && !hideOptional ? ` ${t('common.optional')}` : ''\n const label = `${resolvedTitle}${optionalTag}`\n\n if (hint) {\n viewModel.hint = {\n text: tComponent(this.def, 'hint') || hint\n }\n }\n\n // Filter component errors only\n const componentErrors = this.getErrors(translator, errors)\n const componentError = this.getFirstError(translator, componentErrors)\n\n if (componentErrors) {\n viewModel.errors = componentErrors\n }\n\n if (componentError) {\n viewModel.errorMessage = {\n text: componentError.text\n }\n }\n\n return {\n ...viewModel,\n label: {\n text: label\n },\n id: name,\n name,\n value: payload[name]\n }\n }\n\n getDisplayStringFromFormValue(\n value: FormValue | FormPayload,\n _translator: Translator\n ): string {\n // Map selected values to text\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return this.isValue(value) ? value.toString() : ''\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ): string {\n const value = this.getFormValueFromState(state)\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: FormValue | FormPayload\n ): Item['value'] | Item['value'][] | null {\n // Filter object field values\n if (this.isState(value)) {\n const values = Object.values(value).filter(isFormValue)\n return values.length ? values : null\n }\n\n // Filter array field values\n if (this.isValue(value) && Array.isArray(value)) {\n return value.filter(isFormValue)\n }\n\n return this.isValue(value) ? value : null\n }\n\n getContextValueFromState(\n state: FormSubmissionState\n ): Item['value'] | Item['value'][] | null {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n isValue(\n value?: FormStateValue | FormState\n ): value is NonNullable<FormStateValue> {\n return isFormValue(value)\n }\n\n isState(value?: FormStateValue | FormState): value is FormState {\n return isFormState(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return FormComponent.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 advancedSettingsErrors: []\n }\n }\n\n onSubmit(\n _request: FormRequestPayload,\n _metadata: FormMetadata,\n _context: FormContext\n ): Promise<void> {\n return Promise.resolve()\n }\n}\n\n/**\n * Check for form value\n */\nexport function isFormValue(\n value?: unknown\n): value is string | number | boolean {\n return (\n (typeof value === 'string' && value.length > 0) ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n )\n}\n\n/**\n * Check for form state with nested values\n */\nexport function isFormState(value?: unknown): value is FormState {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n\n // Skip empty objects\n return !!Object.values(value).length\n}\n\n/**\n * Check for repeat list state\n */\nexport function isRepeatState(value?: unknown): value is RepeatListState {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isRepeatValue)\n}\n\n/**\n * Check for repeat list value\n */\nexport function isRepeatValue(value?: unknown): value is RepeatItemState {\n return isFormState(value) && typeof value.itemId === 'string'\n}\n\n/**\n * Check for upload state\n */\nexport function isUploadState(value?: unknown): value is UploadState {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isUploadValue)\n}\n\n/**\n * Check for geospatial state\n */\nexport function isGeospatialState(value?: unknown): value is GeospatialState {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isGeospatialValue)\n}\n\n/**\n * Check for upload state value\n */\nexport function isUploadValue(value?: unknown): value is FileState {\n return isFormState(value) && typeof value.uploadId === 'string'\n}\n\n/**\n * Check for geospatial state value\n */\nexport function isGeospatialValue(value?: unknown): value is Feature {\n return (\n isFormState(value) &&\n typeof value.type === 'string' &&\n value.type === 'Feature'\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -66,6 +66,7 @@ export declare class GeospatialField extends FormComponent {
|
|
|
66
66
|
upload?: {
|
|
67
67
|
count: number;
|
|
68
68
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
69
|
+
uploadingLabel?: string;
|
|
69
70
|
};
|
|
70
71
|
};
|
|
71
72
|
getErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
@@ -73,7 +73,7 @@ export class GeospatialField extends FormComponent {
|
|
|
73
73
|
err.href = `#description_${err.path[1]}`;
|
|
74
74
|
err.text = translator.t('components.geospatialField.validation.wrongCountry', {
|
|
75
75
|
count: Number(err.path[1]) + 1,
|
|
76
|
-
country: err.context.country
|
|
76
|
+
country: translator.t(`common.${err.context.country.toLowerCase()}`)
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
79
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeospatialField.js","names":["FormComponent","isGeospatialState","getMapLayers","getGeospatialSchema","messageTemplate","GeospatialField","constructor","def","props","options","formSchema","label","messages","featuresMin","featuresMax","featuresLength","stateSchema","default","required","allow","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getDisplayStringFromFormValue","features","translator","length","t","count","getDisplayStringFromState","getContextValueFromFormValue","map","id","getContextValueFromState","getViewModel","context","viewModel","JSON","stringify","country","countries","at","geometryTypes","mapLayers","getErrors","errors","fieldErrors","forEach","err","href","path","text","Number","getViewErrors","getAllPossibleErrors","staticErrors","advancedSettingsErrors","baseErrors","type","template","selectRequired","format"],"sources":["../../../../../src/server/plugins/engine/components/GeospatialField.ts"],"sourcesContent":["import { type GeospatialFieldComponent } from '@defra/forms-model'\nimport { type ArraySchema } from 'joi'\n\nimport { type ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\nimport {\n FormComponent,\n isGeospatialState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { getMapLayers } from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'\nimport { getGeospatialSchema } from '~/src/server/plugins/engine/components/helpers/geospatial.js'\nimport { type RenderContext } 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 FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState,\n type GeospatialState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class GeospatialField extends FormComponent {\n declare options: GeospatialFieldComponent['options']\n declare formSchema: ArraySchema<GeospatialState>\n declare stateSchema: ArraySchema<GeospatialState>\n\n constructor(\n def: GeospatialFieldComponent,\n props: ConstructorParameters<typeof ComponentBase>[1]\n ) {\n super(def, props)\n\n const { options } = def\n\n const formSchema = getGeospatialSchema(def).label(this.label).messages({\n 'array.min': messageTemplate.featuresMin,\n 'array.max': messageTemplate.featuresMax,\n 'array.length': messageTemplate.featuresLength\n })\n\n this.formSchema = formSchema\n this.stateSchema = formSchema.default(null)\n\n if (options.required === false) {\n this.stateSchema = this.stateSchema.allow(null)\n }\n\n this.options = options\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 getDisplayStringFromFormValue(\n features: GeospatialState | undefined,\n translator: Translator\n ): string {\n if (!features?.length) {\n return ''\n }\n\n return translator.t('components.geospatialField.added', {\n count: features.length\n })\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const features = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(features, translator)\n }\n\n getContextValueFromFormValue(\n features: GeospatialState | undefined\n ): string[] | null {\n return features?.map(({ id }) => id) ?? null\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const features = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(features)\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n const value =\n typeof viewModel.value === 'string'\n ? viewModel.value\n : JSON.stringify(viewModel.value, null, 2)\n\n return {\n ...viewModel,\n country: this.options.countries?.at(0),\n geometryTypes: this.options.geometryTypes,\n mapLayers: getMapLayers(this),\n value\n }\n }\n\n getErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const fieldErrors = super.getErrors(translator, errors)\n\n fieldErrors?.forEach((err) => {\n if (err.name === 'description') {\n err.href = `#description_${err.path[1]}`\n err.text = translator.t(\n 'components.geospatialField.validation.descriptionRequired',\n { count: Number(err.path[1]) + 1 }\n )\n } else if (typeof err.name === 'number' && err.context?.country) {\n err.href = `#description_${err.path[1]}`\n err.text = translator.t(\n 'components.geospatialField.validation.wrongCountry',\n { count: Number(err.path[1]) + 1, country: err.context.country }\n )\n }\n })\n\n return fieldErrors\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n return this.getErrors(translator, errors)\n }\n\n isValue(value?: FormStateValue | FormState): value is GeospatialState {\n return isGeospatialState(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n const staticErrors = GeospatialField.getAllPossibleErrors()\n return {\n ...staticErrors,\n advancedSettingsErrors: [...staticErrors.advancedSettingsErrors]\n }\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.selectRequired },\n {\n type: 'array.min',\n template: '{{#title}} must contain at least 1 items'\n },\n { type: 'object.invalidjson', template: messageTemplate.format }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"GeospatialField.js","names":["FormComponent","isGeospatialState","getMapLayers","getGeospatialSchema","messageTemplate","GeospatialField","constructor","def","props","options","formSchema","label","messages","featuresMin","featuresMax","featuresLength","stateSchema","default","required","allow","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getDisplayStringFromFormValue","features","translator","length","t","count","getDisplayStringFromState","getContextValueFromFormValue","map","id","getContextValueFromState","getViewModel","context","viewModel","JSON","stringify","country","countries","at","geometryTypes","mapLayers","getErrors","errors","fieldErrors","forEach","err","href","path","text","Number","toLowerCase","getViewErrors","getAllPossibleErrors","staticErrors","advancedSettingsErrors","baseErrors","type","template","selectRequired","format"],"sources":["../../../../../src/server/plugins/engine/components/GeospatialField.ts"],"sourcesContent":["import { type GeospatialFieldComponent } from '@defra/forms-model'\nimport { type ArraySchema } from 'joi'\n\nimport { type ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\nimport {\n FormComponent,\n isGeospatialState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { getMapLayers } from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'\nimport { getGeospatialSchema } from '~/src/server/plugins/engine/components/helpers/geospatial.js'\nimport { type RenderContext } 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 FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState,\n type GeospatialState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class GeospatialField extends FormComponent {\n declare options: GeospatialFieldComponent['options']\n declare formSchema: ArraySchema<GeospatialState>\n declare stateSchema: ArraySchema<GeospatialState>\n\n constructor(\n def: GeospatialFieldComponent,\n props: ConstructorParameters<typeof ComponentBase>[1]\n ) {\n super(def, props)\n\n const { options } = def\n\n const formSchema = getGeospatialSchema(def).label(this.label).messages({\n 'array.min': messageTemplate.featuresMin,\n 'array.max': messageTemplate.featuresMax,\n 'array.length': messageTemplate.featuresLength\n })\n\n this.formSchema = formSchema\n this.stateSchema = formSchema.default(null)\n\n if (options.required === false) {\n this.stateSchema = this.stateSchema.allow(null)\n }\n\n this.options = options\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 getDisplayStringFromFormValue(\n features: GeospatialState | undefined,\n translator: Translator\n ): string {\n if (!features?.length) {\n return ''\n }\n\n return translator.t('components.geospatialField.added', {\n count: features.length\n })\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const features = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(features, translator)\n }\n\n getContextValueFromFormValue(\n features: GeospatialState | undefined\n ): string[] | null {\n return features?.map(({ id }) => id) ?? null\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const features = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(features)\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n const value =\n typeof viewModel.value === 'string'\n ? viewModel.value\n : JSON.stringify(viewModel.value, null, 2)\n\n return {\n ...viewModel,\n country: this.options.countries?.at(0),\n geometryTypes: this.options.geometryTypes,\n mapLayers: getMapLayers(this),\n value\n }\n }\n\n getErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const fieldErrors = super.getErrors(translator, errors)\n\n fieldErrors?.forEach((err) => {\n if (err.name === 'description') {\n err.href = `#description_${err.path[1]}`\n err.text = translator.t(\n 'components.geospatialField.validation.descriptionRequired',\n { count: Number(err.path[1]) + 1 }\n )\n } else if (typeof err.name === 'number' && err.context?.country) {\n err.href = `#description_${err.path[1]}`\n err.text = translator.t(\n 'components.geospatialField.validation.wrongCountry',\n {\n count: Number(err.path[1]) + 1,\n country: translator.t(\n `common.${(err.context.country as string).toLowerCase()}`\n )\n }\n )\n }\n })\n\n return fieldErrors\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n return this.getErrors(translator, errors)\n }\n\n isValue(value?: FormStateValue | FormState): value is GeospatialState {\n return isGeospatialState(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n const staticErrors = GeospatialField.getAllPossibleErrors()\n return {\n ...staticErrors,\n advancedSettingsErrors: [...staticErrors.advancedSettingsErrors]\n }\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.selectRequired },\n {\n type: 'array.min',\n template: '{{#title}} must contain at least 1 items'\n },\n { type: 'object.invalidjson', template: messageTemplate.format }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type LatLongFieldComponent } from '@defra/forms-model';
|
|
2
|
-
import { type ObjectSchema } from 'joi';
|
|
2
|
+
import { 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
5
|
import { type LatLongState, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
@@ -12,7 +12,7 @@ export declare class LatLongField extends FormComponent {
|
|
|
12
12
|
collection: ComponentCollection;
|
|
13
13
|
constructor(def: LatLongFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
14
14
|
getFormValueFromState(state: FormSubmissionState): LatLongState | undefined;
|
|
15
|
-
getDisplayStringFromFormValue(value: LatLongState | undefined,
|
|
15
|
+
getDisplayStringFromFormValue(value: LatLongState | undefined, translator: Translator): string;
|
|
16
16
|
getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
|
|
17
17
|
getContextValueFromFormValue(value: LatLongState | undefined): string | null;
|
|
18
18
|
getContextValueFromState(state: FormSubmissionState): string | null;
|
|
@@ -62,6 +62,7 @@ export declare class LatLongField extends FormComponent {
|
|
|
62
62
|
upload?: {
|
|
63
63
|
count: number;
|
|
64
64
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
65
|
+
uploadingLabel?: string;
|
|
65
66
|
};
|
|
66
67
|
} | {
|
|
67
68
|
instructionText: string;
|
|
@@ -110,10 +111,14 @@ export declare class LatLongField extends FormComponent {
|
|
|
110
111
|
upload?: {
|
|
111
112
|
count: number;
|
|
112
113
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
114
|
+
uploadingLabel?: string;
|
|
113
115
|
};
|
|
114
116
|
};
|
|
115
117
|
getViewErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
116
118
|
isState(value?: FormStateValue | FormState): value is LatLongState;
|
|
119
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
120
|
+
[x: string]: LanguageMessages;
|
|
121
|
+
};
|
|
117
122
|
/**
|
|
118
123
|
* For error preview page that shows all possible errors on a component
|
|
119
124
|
*/
|
|
@@ -123,4 +128,23 @@ export declare class LatLongField extends FormComponent {
|
|
|
123
128
|
*/
|
|
124
129
|
static getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
125
130
|
static isLatLong(value?: FormStateValue | FormState): value is LatLongState;
|
|
131
|
+
static buildErrorMessages(label: string, latitudeMin: number, latitudeMax: number, longitudeMin: number, longitudeMax: number, language: string): {
|
|
132
|
+
latitudeMessages: LanguageMessages;
|
|
133
|
+
longitudeMessages: LanguageMessages;
|
|
134
|
+
};
|
|
135
|
+
static getMinMax(schema: {
|
|
136
|
+
latitude?: {
|
|
137
|
+
min?: number;
|
|
138
|
+
max?: number;
|
|
139
|
+
};
|
|
140
|
+
longitude?: {
|
|
141
|
+
min?: number;
|
|
142
|
+
max?: number;
|
|
143
|
+
};
|
|
144
|
+
} | undefined): {
|
|
145
|
+
latitudeMin: number;
|
|
146
|
+
latitudeMax: number;
|
|
147
|
+
longitudeMin: number;
|
|
148
|
+
longitudeMax: number;
|
|
149
|
+
};
|
|
126
150
|
}
|
|
@@ -4,11 +4,9 @@ import { ComponentCollection } from "./ComponentCollection.js";
|
|
|
4
4
|
import { FormComponent, isFormState } from "./FormComponent.js";
|
|
5
5
|
import { deduplicateErrorsByHref, getLocationFieldViewModel } from "./LocationFieldHelpers.js";
|
|
6
6
|
import { NumberField } from "./NumberField.js";
|
|
7
|
-
import { createLowerFirstExpression } from "./helpers/index.js";
|
|
7
|
+
import { createLowerFirstExpression, getTranslatedLabel } from "./helpers/index.js";
|
|
8
8
|
import { t as tPlugin } from "../i18n/index.js";
|
|
9
9
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
10
|
-
import { convertToLanguageMessages } from "../../../utils/type-utils.js";
|
|
11
|
-
|
|
12
10
|
// Precision constants
|
|
13
11
|
// UK latitude/longitude requires high precision for accurate location (within ~11mm)
|
|
14
12
|
const DECIMAL_PRECISION = 7; // 7 decimal places
|
|
@@ -22,45 +20,16 @@ export class LatLongField extends FormComponent {
|
|
|
22
20
|
schema
|
|
23
21
|
} = def;
|
|
24
22
|
const isRequired = options.required !== false;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
});
|
|
36
|
-
const latitudeRangeMessage = tPlugin('components.latLongField.latitudeRange', 'en-GB', {
|
|
37
|
-
fieldLabel,
|
|
38
|
-
min: latitudeMin,
|
|
39
|
-
max: latitudeMax
|
|
40
|
-
});
|
|
41
|
-
const longitudeRangeMessage = tPlugin('components.latLongField.longitudeRange', 'en-GB', {
|
|
42
|
-
fieldLabel,
|
|
43
|
-
min: longitudeMin,
|
|
44
|
-
max: longitudeMax
|
|
45
|
-
});
|
|
46
|
-
const latitudeMessages = convertToLanguageMessages({
|
|
47
|
-
...customValidationMessages,
|
|
48
|
-
'any.required': tPlugin('components.latLongField.latitudeRequired', 'en-GB'),
|
|
49
|
-
'number.base': tPlugin('components.latLongField.latitudeBase', 'en-GB', {
|
|
50
|
-
fieldLabel
|
|
51
|
-
}),
|
|
52
|
-
'number.min': latitudeRangeMessage,
|
|
53
|
-
'number.max': latitudeRangeMessage
|
|
54
|
-
});
|
|
55
|
-
const longitudeMessages = convertToLanguageMessages({
|
|
56
|
-
...customValidationMessages,
|
|
57
|
-
'any.required': tPlugin('components.latLongField.longitudeRequired', 'en-GB'),
|
|
58
|
-
'number.base': tPlugin('components.latLongField.longitudeBase', 'en-GB', {
|
|
59
|
-
fieldLabel
|
|
60
|
-
}),
|
|
61
|
-
'number.min': longitudeRangeMessage,
|
|
62
|
-
'number.max': longitudeRangeMessage
|
|
63
|
-
});
|
|
23
|
+
const {
|
|
24
|
+
latitudeMin,
|
|
25
|
+
latitudeMax,
|
|
26
|
+
longitudeMin,
|
|
27
|
+
longitudeMax
|
|
28
|
+
} = LatLongField.getMinMax(schema);
|
|
29
|
+
const {
|
|
30
|
+
latitudeMessages,
|
|
31
|
+
longitudeMessages
|
|
32
|
+
} = LatLongField.buildErrorMessages(this.label, latitudeMin, latitudeMax, longitudeMin, longitudeMax, 'en-GB');
|
|
64
33
|
this.collection = new ComponentCollection([{
|
|
65
34
|
type: ComponentType.NumberField,
|
|
66
35
|
name: `${name}__latitude`,
|
|
@@ -107,13 +76,16 @@ export class LatLongField extends FormComponent {
|
|
|
107
76
|
const value = super.getFormValueFromState(state);
|
|
108
77
|
return LatLongField.isLatLong(value) ? value : undefined;
|
|
109
78
|
}
|
|
110
|
-
getDisplayStringFromFormValue(value,
|
|
79
|
+
getDisplayStringFromFormValue(value, translator) {
|
|
111
80
|
if (!value) {
|
|
112
81
|
return '';
|
|
113
82
|
}
|
|
83
|
+
const {
|
|
84
|
+
t
|
|
85
|
+
} = translator;
|
|
114
86
|
|
|
115
|
-
//
|
|
116
|
-
return `${value.latitude}
|
|
87
|
+
// Output format: Latitude: <<entry>>\nLongitude: <<entry>>
|
|
88
|
+
return `${t('components.latLongField.latitude')}: ${value.latitude}\n${t('components.latLongField.longitude')}: ${value.longitude}`;
|
|
117
89
|
}
|
|
118
90
|
getDisplayStringFromState(state, translator) {
|
|
119
91
|
const value = this.getFormValueFromState(state);
|
|
@@ -123,9 +95,7 @@ export class LatLongField extends FormComponent {
|
|
|
123
95
|
if (!value) {
|
|
124
96
|
return null;
|
|
125
97
|
}
|
|
126
|
-
|
|
127
|
-
// Output format: Latitude: <<entry>>\nLongitude: <<entry>>
|
|
128
|
-
return `Latitude: ${value.latitude}\nLongitude: ${value.longitude}`;
|
|
98
|
+
return `${value.latitude}, ${value.longitude}`;
|
|
129
99
|
}
|
|
130
100
|
getContextValueFromState(state) {
|
|
131
101
|
const value = this.getFormValueFromState(state);
|
|
@@ -142,6 +112,24 @@ export class LatLongField extends FormComponent {
|
|
|
142
112
|
isState(value) {
|
|
143
113
|
return LatLongField.isLatLong(value);
|
|
144
114
|
}
|
|
115
|
+
getValidationMessagesOverride(translator) {
|
|
116
|
+
const def = this.def;
|
|
117
|
+
const translatedLabel = getTranslatedLabel(def, translator);
|
|
118
|
+
const {
|
|
119
|
+
latitudeMin,
|
|
120
|
+
latitudeMax,
|
|
121
|
+
longitudeMin,
|
|
122
|
+
longitudeMax
|
|
123
|
+
} = LatLongField.getMinMax(def.schema);
|
|
124
|
+
const {
|
|
125
|
+
latitudeMessages,
|
|
126
|
+
longitudeMessages
|
|
127
|
+
} = LatLongField.buildErrorMessages(translatedLabel, latitudeMin, latitudeMax, longitudeMin, longitudeMax, translator.language);
|
|
128
|
+
return {
|
|
129
|
+
[`${this.name}__latitude`]: latitudeMessages,
|
|
130
|
+
[`${this.name}__longitude`]: longitudeMessages
|
|
131
|
+
};
|
|
132
|
+
}
|
|
145
133
|
|
|
146
134
|
/**
|
|
147
135
|
* For error preview page that shows all possible errors on a component
|
|
@@ -183,5 +171,54 @@ export class LatLongField extends FormComponent {
|
|
|
183
171
|
static isLatLong(value) {
|
|
184
172
|
return isFormState(value) && NumberField.isNumber(value.latitude) && NumberField.isNumber(value.longitude);
|
|
185
173
|
}
|
|
174
|
+
static buildErrorMessages(label, latitudeMin, latitudeMax, longitudeMin, longitudeMax, language) {
|
|
175
|
+
const fieldLabel = lowerFirst(label);
|
|
176
|
+
const customValidationMessages = {
|
|
177
|
+
'number.precision': tPlugin('components.latLongField.precision', language),
|
|
178
|
+
'number.unsafe': tPlugin('components.latLongField.notANumber', language)
|
|
179
|
+
};
|
|
180
|
+
const latitudeRangeMessage = tPlugin('components.latLongField.latitudeRange', language, {
|
|
181
|
+
fieldLabel,
|
|
182
|
+
min: latitudeMin,
|
|
183
|
+
max: latitudeMax
|
|
184
|
+
});
|
|
185
|
+
const longitudeRangeMessage = tPlugin('components.latLongField.longitudeRange', language, {
|
|
186
|
+
fieldLabel,
|
|
187
|
+
min: longitudeMin,
|
|
188
|
+
max: longitudeMax
|
|
189
|
+
});
|
|
190
|
+
const latitudeMessages = {
|
|
191
|
+
...customValidationMessages,
|
|
192
|
+
'any.required': tPlugin('components.latLongField.latitudeRequired', language),
|
|
193
|
+
'number.base': tPlugin('components.latLongField.latitudeBase', language, {
|
|
194
|
+
fieldLabel
|
|
195
|
+
}),
|
|
196
|
+
'number.min': latitudeRangeMessage,
|
|
197
|
+
'number.max': latitudeRangeMessage
|
|
198
|
+
};
|
|
199
|
+
const longitudeMessages = {
|
|
200
|
+
...customValidationMessages,
|
|
201
|
+
'any.required': tPlugin('components.latLongField.longitudeRequired', language),
|
|
202
|
+
'number.base': tPlugin('components.latLongField.longitudeBase', language, {
|
|
203
|
+
fieldLabel
|
|
204
|
+
}),
|
|
205
|
+
'number.min': longitudeRangeMessage,
|
|
206
|
+
'number.max': longitudeRangeMessage
|
|
207
|
+
};
|
|
208
|
+
return {
|
|
209
|
+
latitudeMessages,
|
|
210
|
+
longitudeMessages
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Read schema values from def.schema with fallback defaults
|
|
215
|
+
static getMinMax(schema) {
|
|
216
|
+
return {
|
|
217
|
+
latitudeMin: schema?.latitude?.min ?? 49.85,
|
|
218
|
+
latitudeMax: schema?.latitude?.max ?? 60.859,
|
|
219
|
+
longitudeMin: schema?.longitude?.min ?? -13.687,
|
|
220
|
+
longitudeMax: schema?.longitude?.max ?? 1.767
|
|
221
|
+
};
|
|
222
|
+
}
|
|
186
223
|
}
|
|
187
224
|
//# sourceMappingURL=LatLongField.js.map
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"LatLongField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","createLowerFirstExpression","getTranslatedLabel","t","tPlugin","messageTemplate","DECIMAL_PRECISION","LatLongField","constructor","def","props","name","options","schema","isRequired","required","latitudeMin","latitudeMax","longitudeMin","longitudeMax","getMinMax","latitudeMessages","longitudeMessages","buildErrorMessages","label","collection","type","title","min","max","precision","optionalText","classes","suffix","customValidationMessages","parent","peers","formSchema","stateSchema","getFormValueFromState","state","value","isLatLong","undefined","getDisplayStringFromFormValue","translator","latitude","longitude","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getViewModel","context","viewModel","getViewErrors","errors","allErrors","getErrors","isState","getValidationMessagesOverride","translatedLabel","language","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isNumber","fieldLabel","latitudeRangeMessage","longitudeRangeMessage"],"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 {\n createLowerFirstExpression,\n getTranslatedLabel\n} 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'\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 const { latitudeMin, latitudeMax, longitudeMin, longitudeMax } =\n LatLongField.getMinMax(schema)\n\n const { latitudeMessages, longitudeMessages } =\n LatLongField.buildErrorMessages(\n this.label,\n latitudeMin,\n latitudeMax,\n longitudeMin,\n longitudeMax,\n 'en-GB'\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 const { t } = translator\n\n // Output format: Latitude: <<entry>>\\nLongitude: <<entry>>\n return `${t('components.latLongField.latitude')}: ${value.latitude}\\n${t('components.latLongField.longitude')}: ${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 return `${value.latitude}, ${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 getValidationMessagesOverride(translator: Translator) {\n const def = this.def as LatLongFieldComponent\n const translatedLabel = getTranslatedLabel(def, translator)\n const { latitudeMin, latitudeMax, longitudeMin, longitudeMax } =\n LatLongField.getMinMax(def.schema)\n const { latitudeMessages, longitudeMessages } =\n LatLongField.buildErrorMessages(\n translatedLabel,\n latitudeMin,\n latitudeMax,\n longitudeMin,\n longitudeMax,\n translator.language\n )\n return {\n [`${this.name}__latitude`]: latitudeMessages,\n [`${this.name}__longitude`]: longitudeMessages\n }\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 static buildErrorMessages(\n label: string,\n latitudeMin: number,\n latitudeMax: number,\n longitudeMin: number,\n longitudeMax: number,\n language: string\n ) {\n const fieldLabel = lowerFirst(label)\n\n const customValidationMessages: LanguageMessages = {\n 'number.precision': tPlugin(\n 'components.latLongField.precision',\n language\n ),\n 'number.unsafe': tPlugin('components.latLongField.notANumber', language)\n }\n\n const latitudeRangeMessage = tPlugin(\n 'components.latLongField.latitudeRange',\n language,\n { fieldLabel, min: latitudeMin, max: latitudeMax }\n )\n const longitudeRangeMessage = tPlugin(\n 'components.latLongField.longitudeRange',\n language,\n { fieldLabel, min: longitudeMin, max: longitudeMax }\n )\n\n const latitudeMessages: LanguageMessages = {\n ...customValidationMessages,\n 'any.required': tPlugin(\n 'components.latLongField.latitudeRequired',\n language\n ),\n 'number.base': tPlugin('components.latLongField.latitudeBase', language, {\n fieldLabel\n }),\n 'number.min': latitudeRangeMessage,\n 'number.max': latitudeRangeMessage\n }\n\n const longitudeMessages: LanguageMessages = {\n ...customValidationMessages,\n 'any.required': tPlugin(\n 'components.latLongField.longitudeRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.latLongField.longitudeBase',\n language,\n {\n fieldLabel\n }\n ),\n 'number.min': longitudeRangeMessage,\n 'number.max': longitudeRangeMessage\n }\n\n return {\n latitudeMessages,\n longitudeMessages\n }\n }\n\n // Read schema values from def.schema with fallback defaults\n static getMinMax(\n schema:\n | {\n latitude?: {\n min?: number\n max?: number\n }\n longitude?: {\n min?: number\n max?: number\n }\n }\n | undefined\n ) {\n return {\n latitudeMin: schema?.latitude?.min ?? 49.85,\n latitudeMax: schema?.latitude?.max ?? 60.859,\n longitudeMin: schema?.longitude?.min ?? -13.687,\n longitudeMax: schema?.longitude?.max ?? 1.767\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type FormComponentsDef } from '@defra/forms-model';
|
|
2
|
-
import { type JoiExpression, type LanguageMessages, type StringSchema } from 'joi';
|
|
2
|
+
import joi, { type JoiExpression, type LanguageMessages, type StringSchema } from 'joi';
|
|
3
3
|
import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
|
|
4
4
|
import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
|
|
5
|
+
import { type Translator } from '../../../../server/plugins/engine/types/index.js';
|
|
5
6
|
import { type ErrorMessageTemplateList, type FormState, type FormStateValue, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
|
|
6
7
|
interface LocationFieldOptions {
|
|
7
8
|
instructionText?: string;
|
|
@@ -23,7 +24,7 @@ export declare abstract class LocationFieldBase extends FormComponent {
|
|
|
23
24
|
formSchema: StringSchema;
|
|
24
25
|
stateSchema: StringSchema;
|
|
25
26
|
instructionText?: string;
|
|
26
|
-
protected abstract getValidationConfig(): ValidationConfig;
|
|
27
|
+
protected abstract getValidationConfig(translator: Translator | undefined): ValidationConfig;
|
|
27
28
|
protected abstract getErrorTemplates(): {
|
|
28
29
|
type: string;
|
|
29
30
|
template: JoiExpression;
|
|
@@ -79,6 +80,7 @@ export declare abstract class LocationFieldBase extends FormComponent {
|
|
|
79
80
|
upload?: {
|
|
80
81
|
count: number;
|
|
81
82
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
83
|
+
uploadingLabel?: string;
|
|
82
84
|
};
|
|
83
85
|
} | {
|
|
84
86
|
instructionText: string;
|
|
@@ -128,8 +130,12 @@ export declare abstract class LocationFieldBase extends FormComponent {
|
|
|
128
130
|
upload?: {
|
|
129
131
|
count: number;
|
|
130
132
|
summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
|
|
133
|
+
uploadingLabel?: string;
|
|
131
134
|
};
|
|
132
135
|
};
|
|
136
|
+
getValidationMessagesOverride(translator: Translator): {
|
|
137
|
+
[x: string]: joi.LanguageMessages;
|
|
138
|
+
};
|
|
133
139
|
getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
134
140
|
static isText(value?: FormStateValue | FormState): value is string;
|
|
135
141
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import joi from 'joi';
|
|
2
2
|
import { FormComponent, isFormValue } from "./FormComponent.js";
|
|
3
3
|
import { addClassOptionIfNone } from "./helpers/index.js";
|
|
4
|
+
import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
|
|
4
5
|
import { messageTemplate } from "../pageControllers/validationOptions.js";
|
|
5
|
-
import { convertToLanguageMessages } from "../../../utils/type-utils.js";
|
|
6
6
|
/**
|
|
7
7
|
* Abstract base class for location-based field components
|
|
8
8
|
*/
|
|
@@ -16,13 +16,13 @@ export class LocationFieldBase extends FormComponent {
|
|
|
16
16
|
const locationOptions = options;
|
|
17
17
|
this.instructionText = locationOptions.instructionText;
|
|
18
18
|
addClassOptionIfNone(locationOptions, 'govuk-input--width-10');
|
|
19
|
-
const config = this.getValidationConfig();
|
|
19
|
+
const config = this.getValidationConfig(undefined);
|
|
20
20
|
const requiredMessage = config.requiredMessage ?? messageTemplate.required;
|
|
21
|
-
const messages =
|
|
21
|
+
const messages = {
|
|
22
22
|
'any.required': requiredMessage,
|
|
23
23
|
'string.empty': requiredMessage,
|
|
24
24
|
'string.pattern.base': config.patternErrorMessage
|
|
25
|
-
}
|
|
25
|
+
};
|
|
26
26
|
let formSchema = joi.string().trim().label(this.label).required().pattern(config.pattern).messages(messages);
|
|
27
27
|
if (locationOptions.required === false) {
|
|
28
28
|
formSchema = formSchema.allow('');
|
|
@@ -64,8 +64,21 @@ export class LocationFieldBase extends FormComponent {
|
|
|
64
64
|
}
|
|
65
65
|
return viewModel;
|
|
66
66
|
}
|
|
67
|
+
getValidationMessagesOverride(translator) {
|
|
68
|
+
const {
|
|
69
|
+
t
|
|
70
|
+
} = translator;
|
|
71
|
+
const config = this.getValidationConfig(translator);
|
|
72
|
+
return {
|
|
73
|
+
[this.name]: {
|
|
74
|
+
'any.required': config.requiredMessage ?? buildValidationMessages(t).objectRequired,
|
|
75
|
+
'string.empty': config.requiredMessage ?? buildValidationMessages(t).objectRequired,
|
|
76
|
+
'string.pattern.base': config.patternErrorMessage
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
67
80
|
getAllPossibleErrors() {
|
|
68
|
-
const config = this.getValidationConfig();
|
|
81
|
+
const config = this.getValidationConfig(undefined);
|
|
69
82
|
return {
|
|
70
83
|
baseErrors: [{
|
|
71
84
|
type: 'required',
|