@defra/forms-engine-plugin 5.0.0-alpha.1 → 5.0.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/.public/javascripts/application.min.js +1 -1
  2. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  3. package/.public/javascripts/application.min.js.map +1 -1
  4. package/.public/javascripts/shared.min.js +1 -1
  5. package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/shared.min.js.map +1 -1
  7. package/.public/stylesheets/application.min.css.map +1 -1
  8. package/.server/client/javascripts/file-upload.js +6 -3
  9. package/.server/client/javascripts/file-upload.js.map +1 -1
  10. package/.server/client/javascripts/geospatial-map.js +10 -31
  11. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  12. package/.server/client/javascripts/govuk.js +2 -1
  13. package/.server/client/javascripts/govuk.js.map +1 -1
  14. package/.server/client/javascripts/location-map.js +11 -2
  15. package/.server/client/javascripts/location-map.js.map +1 -1
  16. package/.server/client/javascripts/map.d.ts +6 -0
  17. package/.server/client/javascripts/map.js +37 -0
  18. package/.server/client/javascripts/map.js.map +1 -1
  19. package/.server/client/javascripts/maps.d.ts +5 -0
  20. package/.server/client/javascripts/maps.js +6 -0
  21. package/.server/client/javascripts/maps.js.map +1 -0
  22. package/.server/client/javascripts/shared.d.ts +1 -3
  23. package/.server/client/javascripts/shared.js +1 -3
  24. package/.server/client/javascripts/shared.js.map +1 -1
  25. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  26. package/.server/client/javascripts/sssi-dataset.js +37 -39
  27. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  28. package/.server/client/stylesheets/maps.scss +4 -0
  29. package/.server/client/stylesheets/shared.scss +1 -5
  30. package/.server/server/constants.d.ts +2 -0
  31. package/.server/server/constants.js +2 -0
  32. package/.server/server/constants.js.map +1 -1
  33. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  34. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  35. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  36. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +4 -1
  37. package/.server/server/plugins/engine/components/CheckboxesField.js +13 -0
  38. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  39. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  40. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  41. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  42. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  43. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  44. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  45. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  46. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  48. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  49. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  50. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  51. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +29 -2
  52. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  53. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  54. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  55. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  56. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/FileUploadField.d.ts +12 -0
  58. package/.server/server/plugins/engine/components/FileUploadField.js +23 -3
  59. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  61. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  62. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  63. package/.server/server/plugins/engine/components/GeospatialField.d.ts +1 -0
  64. package/.server/server/plugins/engine/components/GeospatialField.js +1 -1
  65. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  66. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  67. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  68. package/.server/server/plugins/engine/components/LatLongField.d.ts +28 -2
  69. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  70. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  71. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  72. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  73. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  74. package/.server/server/plugins/engine/components/LocationFieldBase.js +18 -5
  75. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  76. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +8 -3
  77. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +13 -12
  78. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  79. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  80. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  81. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  82. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  83. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  84. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  85. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  86. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  87. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  88. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  89. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  90. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  91. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  92. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  93. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  94. package/.server/server/plugins/engine/components/OsGridRefField.js +4 -3
  95. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  96. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  97. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  98. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  99. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  100. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  101. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  103. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  104. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  105. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  106. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  107. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  108. package/.server/server/plugins/engine/components/helpers/components.js +1 -2
  109. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  110. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +3 -1
  111. package/.server/server/plugins/engine/components/helpers/geospatial.js +32 -0
  112. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  113. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  114. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  115. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  116. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  117. package/.server/server/plugins/engine/components/types.js.map +1 -1
  118. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  119. package/.server/server/plugins/engine/helpers.js +44 -5
  120. package/.server/server/plugins/engine/helpers.js.map +1 -1
  121. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +3 -0
  122. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +10 -7
  123. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  124. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  125. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  126. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  127. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  128. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  129. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  130. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  131. package/.server/server/plugins/engine/i18n/form.js +35 -0
  132. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  133. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  134. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  135. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  136. package/.server/server/plugins/engine/i18n/translations/cy.json +85 -8
  137. package/.server/server/plugins/engine/i18n/translations/en-GB.json +55 -6
  138. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  139. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  140. package/.server/server/plugins/engine/index.d.ts +4 -0
  141. package/.server/server/plugins/engine/index.js +4 -0
  142. package/.server/server/plugins/engine/index.js.map +1 -1
  143. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  144. package/.server/server/plugins/engine/models/FormModel.js +9 -15
  145. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  146. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  147. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  148. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
  149. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  150. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  151. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  152. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  153. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  154. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  155. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  156. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  157. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  158. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  159. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  160. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  161. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  162. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  163. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  164. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  165. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  166. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
  167. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  168. package/.server/server/plugins/engine/pageControllers/validationOptions.js +23 -2
  169. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  170. package/.server/server/plugins/engine/types/schema.js +1 -0
  171. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  172. package/.server/server/plugins/engine/types.d.ts +5 -0
  173. package/.server/server/plugins/engine/types.js.map +1 -1
  174. package/.server/server/plugins/engine/views/components/_location-field-base.html +2 -1
  175. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  176. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  177. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  178. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  179. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  180. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  181. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  182. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  183. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  184. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  185. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  186. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  187. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  188. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  189. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  190. package/.server/server/plugins/payment/helper.d.ts +11 -1
  191. package/.server/server/plugins/payment/helper.js +18 -2
  192. package/.server/server/plugins/payment/helper.js.map +1 -1
  193. package/.server/server/plugins/payment/helper.test.js +2 -1
  194. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  195. package/.server/server/plugins/payment/service.d.ts +2 -1
  196. package/.server/server/plugins/payment/service.js +5 -2
  197. package/.server/server/plugins/payment/service.js.map +1 -1
  198. package/.server/server/plugins/payment/service.test.js +7 -3
  199. package/.server/server/plugins/payment/service.test.js.map +1 -1
  200. package/.server/server/plugins/payment/types.d.ts +4 -0
  201. package/.server/server/plugins/payment/types.js +1 -0
  202. package/.server/server/plugins/payment/types.js.map +1 -1
  203. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  204. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  205. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  206. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  207. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  208. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  209. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  210. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  211. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  212. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  213. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  214. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  215. package/.server/server/utils/type-utils.d.ts +1 -2
  216. package/.server/server/utils/type-utils.js +0 -3
  217. package/.server/server/utils/type-utils.js.map +1 -1
  218. package/.server/server/utils/utils.d.ts +6 -0
  219. package/.server/server/utils/utils.js +18 -1
  220. package/.server/server/utils/utils.js.map +1 -1
  221. package/.server/server/utils/utils.test.js +21 -1
  222. package/.server/server/utils/utils.test.js.map +1 -1
  223. package/package.json +9 -2
  224. package/src/client/javascripts/file-upload.js +11 -3
  225. package/src/client/javascripts/geospatial-map.js +7 -34
  226. package/src/client/javascripts/govuk.js +2 -0
  227. package/src/client/javascripts/location-map.js +9 -1
  228. package/src/client/javascripts/map.js +42 -0
  229. package/src/client/javascripts/maps.js +5 -0
  230. package/src/client/javascripts/shared.js +1 -3
  231. package/src/client/javascripts/sssi-dataset.js +39 -41
  232. package/src/client/stylesheets/maps.scss +4 -0
  233. package/src/client/stylesheets/shared.scss +1 -5
  234. package/src/server/constants.js +2 -0
  235. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  236. package/src/server/plugins/engine/components/CheckboxesField.ts +13 -1
  237. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  238. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  239. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  240. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  241. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  242. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  243. package/src/server/plugins/engine/components/FileUploadField.ts +24 -3
  244. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  245. package/src/server/plugins/engine/components/GeospatialField.ts +6 -1
  246. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  247. package/src/server/plugins/engine/components/LocationFieldBase.ts +23 -6
  248. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +20 -13
  249. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  250. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  251. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  252. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  253. package/src/server/plugins/engine/components/OsGridRefField.ts +9 -3
  254. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  255. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  256. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  257. package/src/server/plugins/engine/components/helpers/components.ts +1 -2
  258. package/src/server/plugins/engine/components/helpers/geospatial.ts +53 -0
  259. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  260. package/src/server/plugins/engine/components/types.ts +1 -0
  261. package/src/server/plugins/engine/helpers.ts +52 -5
  262. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +10 -7
  263. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  264. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  265. package/src/server/plugins/engine/i18n/form.ts +54 -0
  266. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  267. package/src/server/plugins/engine/i18n/translations/cy.json +85 -8
  268. package/src/server/plugins/engine/i18n/translations/en-GB.json +55 -6
  269. package/src/server/plugins/engine/i18n/types.ts +2 -0
  270. package/src/server/plugins/engine/index.ts +7 -0
  271. package/src/server/plugins/engine/models/FormModel.ts +9 -15
  272. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  273. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
  274. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  275. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  276. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  277. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  278. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  279. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  280. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
  281. package/src/server/plugins/engine/pageControllers/validationOptions.ts +27 -2
  282. package/src/server/plugins/engine/types/schema.ts +1 -0
  283. package/src/server/plugins/engine/types.ts +5 -0
  284. package/src/server/plugins/engine/views/components/_location-field-base.html +2 -1
  285. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  286. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  287. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  288. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  289. package/src/server/plugins/engine/views/file-upload.html +1 -1
  290. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  291. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  292. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  293. package/src/server/plugins/payment/helper.js +22 -2
  294. package/src/server/plugins/payment/service.js +6 -2
  295. package/src/server/plugins/payment/types.js +1 -0
  296. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  297. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  298. package/src/server/plugins/postcode-lookup/types.js +6 -1
  299. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  300. package/src/server/utils/type-utils.ts +1 -11
  301. package/src/server/utils/utils.js +19 -1
@@ -1,5 +1,5 @@
1
1
  import { type DeclarationFieldComponent, type Item } from '@defra/forms-model';
2
- import { type ArraySchema, type BooleanSchema, type LanguageMessages, type StringSchema } from 'joi';
2
+ import joi, { type ArraySchema, type BooleanSchema, 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
5
  import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
@@ -17,7 +17,9 @@ export declare class DeclarationField extends FormComponent {
17
17
  getStateFromValidForm(payload: FormPayload): FormState;
18
18
  getContextValueFromFormValue(value: FormValue | FormPayload): boolean;
19
19
  getFormValue(value?: FormStateValue | FormState): (string | number | boolean)[] | undefined;
20
- getValidationMessagesOverride(translator: Translator): LanguageMessages;
20
+ getValidationMessagesOverride(translator: Translator): {
21
+ [x: string]: joi.LanguageMessages;
22
+ };
21
23
  getDisplayStringFromFormValue(value: FormValue | FormPayload, translator: Translator): string;
22
24
  getViewModel(context: RenderContext): {
23
25
  hint: {
@@ -70,6 +72,7 @@ export declare class DeclarationField extends FormComponent {
70
72
  upload?: {
71
73
  count: number;
72
74
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
75
+ uploadingLabel?: string;
73
76
  };
74
77
  };
75
78
  isValue(value?: FormStateValue | FormState): value is Item['value'][];
@@ -70,9 +70,11 @@ export class DeclarationField extends FormComponent {
70
70
  } = buildValidationMessages(translator.t);
71
71
  const msg = declarationRequired;
72
72
  return {
73
- 'any.required': msg,
74
- 'any.unknown': msg,
75
- 'array.includesRequiredUnknowns': msg
73
+ [this.name]: {
74
+ 'any.required': msg,
75
+ 'any.unknown': msg,
76
+ 'array.includesRequiredUnknowns': msg
77
+ }
76
78
  };
77
79
  }
78
80
  getDisplayStringFromFormValue(value, translator) {
@@ -93,7 +95,7 @@ export class DeclarationField extends FormComponent {
93
95
  hint,
94
96
  declarationConfirmationLabel = t('components.declarationField.defaultLabel')
95
97
  } = this;
96
- const content = tComponent(this, 'content');
98
+ const content = tComponent(this.def, 'content');
97
99
  const viewModel = super.getViewModel(context);
98
100
  let {
99
101
  fieldset,
@@ -1 +1 @@
1
- {"version":3,"file":"DeclarationField.js","names":["ComponentType","hasFormComponents","isFormType","joi","FormComponent","isFormValue","buildValidationMessages","messageTemplate","DeclarationField","headerStartLevel","constructor","def","props","options","content","checkboxSchema","string","valid","required","formSchema","array","items","strip","label","single","messages","declarationRequired","stateSchema","boolean","cast","declarationConfirmationLabel","formComponents","page","pageDef","components","numOfQuestionsOnPage","filter","q","type","length","hasGuidance","some","comp","idx","Markdown","getFormValueFromState","state","name","getFormDataFromState","getStateFromValidForm","payload","payloadValue","value","isValue","every","v","getContextValueFromFormValue","getFormValue","undefined","getValidationMessagesOverride","translator","t","msg","getDisplayStringFromFormValue","getViewModel","context","tComponent","hint","viewModel","fieldset","legend","text","classes","isChecked","Array","isArray","x","checked","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isBool"],"sources":["../../../../../src/server/plugins/engine/components/DeclarationField.ts"],"sourcesContent":["import {\n ComponentType,\n hasFormComponents,\n isFormType,\n type ComponentDef,\n type DeclarationFieldComponent,\n type Item\n} from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\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 { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionState,\n type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport class DeclarationField extends FormComponent {\n declare options: DeclarationFieldComponent['options']\n\n declare declarationConfirmationLabel: string | undefined\n\n declare formSchema: ArraySchema<StringSchema[]>\n declare stateSchema: BooleanSchema\n declare content: string\n headerStartLevel: number\n\n constructor(\n def: DeclarationFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, content } = def\n\n let checkboxSchema = joi.string().valid('true')\n\n if (options.required !== false) {\n checkboxSchema = checkboxSchema.required()\n }\n\n const formSchema = joi\n .array()\n .items(checkboxSchema, joi.string().valid('unchecked').strip())\n .label(this.label)\n .single()\n .messages({\n 'any.required': messageTemplate.declarationRequired as string,\n 'any.unknown': messageTemplate.declarationRequired as string,\n 'array.includesRequiredUnknowns':\n messageTemplate.declarationRequired as string\n }) as ArraySchema<StringSchema[]>\n\n this.formSchema = formSchema\n this.stateSchema = joi.boolean().cast('string').label(this.label).required()\n\n this.options = options\n this.content = content\n // Store only the form-authored label (if provided). If absent, getViewModel\n // resolves the default via t() at render time so the correct language is used.\n this.declarationConfirmationLabel = options.declarationConfirmationLabel\n const formComponents = hasFormComponents(props.page?.pageDef)\n ? props.page.pageDef.components\n : []\n const numOfQuestionsOnPage = formComponents.filter((q) =>\n isFormType(q.type)\n ).length\n const hasGuidance = formComponents.some(\n (comp, idx) => comp.type === ComponentType.Markdown && idx === 0\n )\n this.headerStartLevel = numOfQuestionsOnPage < 2 && !hasGuidance ? 2 : 3\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return state[name] === true ? 'true' : 'false'\n }\n\n getFormDataFromState(state: FormSubmissionState): FormPayload {\n const { name } = this\n return { [name]: state[name] === true ? 'true' : 'false' }\n }\n\n getStateFromValidForm(payload: FormPayload): FormState {\n const { name } = this\n const payloadValue = payload[name]\n const value =\n this.isValue(payloadValue) &&\n payloadValue.length > 0 &&\n payloadValue.every((v) => {\n return v === 'true'\n })\n\n return { [name]: value }\n }\n\n getContextValueFromFormValue(value: FormValue | FormPayload): boolean {\n return value === 'true'\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { declarationRequired } = buildValidationMessages(translator.t)\n const msg = declarationRequired as unknown as string\n return {\n 'any.required': msg,\n 'any.unknown': msg,\n 'array.includesRequiredUnknowns': msg\n } as unknown as LanguageMessages\n }\n\n getDisplayStringFromFormValue(\n value: FormValue | FormPayload,\n translator: Translator\n ): string {\n const { t } = translator\n return value === 'true'\n ? (this.declarationConfirmationLabel ??\n t('components.declarationField.defaultLabel'))\n : t('components.declarationField.notProvided')\n }\n\n getViewModel(context: RenderContext) {\n const { payload } = context\n const { t, tComponent } = context.translator\n\n const {\n hint,\n declarationConfirmationLabel = t(\n 'components.declarationField.defaultLabel'\n )\n } = this\n const content = tComponent(this as unknown as ComponentDef, 'content')\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const payloadValue = payload[this.name]\n const isChecked =\n payloadValue === 'true' ||\n payloadValue === true ||\n (Array.isArray(payloadValue) && payloadValue.some((x) => x === 'true'))\n\n return {\n ...viewModel,\n hint: hint ? { text: hint } : undefined,\n fieldset,\n content,\n items: [\n {\n text: declarationConfirmationLabel,\n value: 'true',\n checked: isChecked\n }\n ],\n headerStartLevel: this.headerStartLevel\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\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(isFormValue)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return DeclarationField.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.declarationRequired }\n ],\n advancedSettingsErrors: []\n }\n }\n\n static isBool(value?: FormStateValue | FormState): value is boolean {\n return isFormValue(value) && typeof value === 'boolean'\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DeclarationField.js","names":["ComponentType","hasFormComponents","isFormType","joi","FormComponent","isFormValue","buildValidationMessages","messageTemplate","DeclarationField","headerStartLevel","constructor","def","props","options","content","checkboxSchema","string","valid","required","formSchema","array","items","strip","label","single","messages","declarationRequired","stateSchema","boolean","cast","declarationConfirmationLabel","formComponents","page","pageDef","components","numOfQuestionsOnPage","filter","q","type","length","hasGuidance","some","comp","idx","Markdown","getFormValueFromState","state","name","getFormDataFromState","getStateFromValidForm","payload","payloadValue","value","isValue","every","v","getContextValueFromFormValue","getFormValue","undefined","getValidationMessagesOverride","translator","t","msg","getDisplayStringFromFormValue","getViewModel","context","tComponent","hint","viewModel","fieldset","legend","text","classes","isChecked","Array","isArray","x","checked","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isBool"],"sources":["../../../../../src/server/plugins/engine/components/DeclarationField.ts"],"sourcesContent":["import {\n ComponentType,\n hasFormComponents,\n isFormType,\n type DeclarationFieldComponent,\n type Item\n} from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\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 { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionState,\n type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport class DeclarationField extends FormComponent {\n declare options: DeclarationFieldComponent['options']\n\n declare declarationConfirmationLabel: string | undefined\n\n declare formSchema: ArraySchema<StringSchema[]>\n declare stateSchema: BooleanSchema\n declare content: string\n headerStartLevel: number\n\n constructor(\n def: DeclarationFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, content } = def\n\n let checkboxSchema = joi.string().valid('true')\n\n if (options.required !== false) {\n checkboxSchema = checkboxSchema.required()\n }\n\n const formSchema = joi\n .array()\n .items(checkboxSchema, joi.string().valid('unchecked').strip())\n .label(this.label)\n .single()\n .messages({\n 'any.required': messageTemplate.declarationRequired as string,\n 'any.unknown': messageTemplate.declarationRequired as string,\n 'array.includesRequiredUnknowns':\n messageTemplate.declarationRequired as string\n }) as ArraySchema<StringSchema[]>\n\n this.formSchema = formSchema\n this.stateSchema = joi.boolean().cast('string').label(this.label).required()\n\n this.options = options\n this.content = content\n // Store only the form-authored label (if provided). If absent, getViewModel\n // resolves the default via t() at render time so the correct language is used.\n this.declarationConfirmationLabel = options.declarationConfirmationLabel\n const formComponents = hasFormComponents(props.page?.pageDef)\n ? props.page.pageDef.components\n : []\n const numOfQuestionsOnPage = formComponents.filter((q) =>\n isFormType(q.type)\n ).length\n const hasGuidance = formComponents.some(\n (comp, idx) => comp.type === ComponentType.Markdown && idx === 0\n )\n this.headerStartLevel = numOfQuestionsOnPage < 2 && !hasGuidance ? 2 : 3\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return state[name] === true ? 'true' : 'false'\n }\n\n getFormDataFromState(state: FormSubmissionState): FormPayload {\n const { name } = this\n return { [name]: state[name] === true ? 'true' : 'false' }\n }\n\n getStateFromValidForm(payload: FormPayload): FormState {\n const { name } = this\n const payloadValue = payload[name]\n const value =\n this.isValue(payloadValue) &&\n payloadValue.length > 0 &&\n payloadValue.every((v) => {\n return v === 'true'\n })\n\n return { [name]: value }\n }\n\n getContextValueFromFormValue(value: FormValue | FormPayload): boolean {\n return value === 'true'\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { declarationRequired } = buildValidationMessages(translator.t)\n const msg = declarationRequired as unknown as string\n return {\n [this.name]: {\n 'any.required': msg,\n 'any.unknown': msg,\n 'array.includesRequiredUnknowns': msg\n } as unknown as LanguageMessages\n }\n }\n\n getDisplayStringFromFormValue(\n value: FormValue | FormPayload,\n translator: Translator\n ): string {\n const { t } = translator\n return value === 'true'\n ? (this.declarationConfirmationLabel ??\n t('components.declarationField.defaultLabel'))\n : t('components.declarationField.notProvided')\n }\n\n getViewModel(context: RenderContext) {\n const { payload } = context\n const { t, tComponent } = context.translator\n\n const {\n hint,\n declarationConfirmationLabel = t(\n 'components.declarationField.defaultLabel'\n )\n } = this\n const content = tComponent(this.def, 'content')\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const payloadValue = payload[this.name]\n const isChecked =\n payloadValue === 'true' ||\n payloadValue === true ||\n (Array.isArray(payloadValue) && payloadValue.some((x) => x === 'true'))\n\n return {\n ...viewModel,\n hint: hint ? { text: hint } : undefined,\n fieldset,\n content,\n items: [\n {\n text: declarationConfirmationLabel,\n value: 'true',\n checked: isChecked\n }\n ],\n headerStartLevel: this.headerStartLevel\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\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(isFormValue)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return DeclarationField.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.declarationRequired }\n ],\n advancedSettingsErrors: []\n }\n }\n\n static isBool(value?: FormStateValue | FormState): value is boolean {\n return isFormValue(value) && typeof value === 'boolean'\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -49,6 +49,7 @@ export declare class Details extends ComponentBase {
49
49
  upload?: {
50
50
  count: number;
51
51
  summaryList: import("../types.js").SummaryList;
52
+ uploadingLabel?: string;
52
53
  };
53
54
  };
54
55
  }
@@ -1,5 +1,5 @@
1
1
  import { type EastingNorthingFieldComponent } 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 EastingNorthingState, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
@@ -12,7 +12,7 @@ export declare class EastingNorthingField extends FormComponent {
12
12
  collection: ComponentCollection;
13
13
  constructor(def: EastingNorthingFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
14
14
  getFormValueFromState(state: FormSubmissionState): EastingNorthingState | undefined;
15
- getDisplayStringFromFormValue(value: EastingNorthingState | undefined, _translator: Translator): string;
15
+ getDisplayStringFromFormValue(value: EastingNorthingState | undefined, translator: Translator): string;
16
16
  getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
17
17
  getContextValueFromFormValue(value: EastingNorthingState | undefined): string | null;
18
18
  getContextValueFromState(state: FormSubmissionState): string | null;
@@ -23,6 +23,7 @@ export declare class EastingNorthingField extends FormComponent {
23
23
  };
24
24
  items: import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
25
25
  mapLayers: string;
26
+ country: import("@defra/forms-model").GeospatialFieldOptionsCountry | undefined;
26
27
  label: import("../../../../server/plugins/engine/components/types.js").Label;
27
28
  type?: string;
28
29
  id: string;
@@ -62,6 +63,7 @@ export declare class EastingNorthingField extends FormComponent {
62
63
  upload?: {
63
64
  count: number;
64
65
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
66
+ uploadingLabel?: string;
65
67
  };
66
68
  } | {
67
69
  instructionText: string;
@@ -71,6 +73,7 @@ export declare class EastingNorthingField extends FormComponent {
71
73
  };
72
74
  items: import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
73
75
  mapLayers: string;
76
+ country: import("@defra/forms-model").GeospatialFieldOptionsCountry | undefined;
74
77
  label: import("../../../../server/plugins/engine/components/types.js").Label;
75
78
  type?: string;
76
79
  id: string;
@@ -110,10 +113,15 @@ export declare class EastingNorthingField extends FormComponent {
110
113
  upload?: {
111
114
  count: number;
112
115
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
116
+ uploadingLabel?: string;
113
117
  };
114
118
  };
119
+ getErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
115
120
  getViewErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
116
121
  isState(value?: FormStateValue | FormState): value is EastingNorthingState;
122
+ getValidationMessagesOverride(translator: Translator): {
123
+ [x: string]: LanguageMessages;
124
+ };
117
125
  /**
118
126
  * For error preview page that shows all possible errors on a component
119
127
  */
@@ -123,4 +131,23 @@ export declare class EastingNorthingField extends FormComponent {
123
131
  */
124
132
  static getAllPossibleErrors(): ErrorMessageTemplateList;
125
133
  static isEastingNorthing(value?: FormStateValue | FormState): value is EastingNorthingState;
134
+ static buildErrorMessages(label: string, eastingMin: number, eastingMax: number, northingMin: number, northingMax: number, language: string): {
135
+ eastingValidationMessages: LanguageMessages;
136
+ northingValidationMessages: LanguageMessages;
137
+ };
138
+ static getMinMax(schema: {
139
+ easting?: {
140
+ min?: number;
141
+ max?: number;
142
+ };
143
+ northing?: {
144
+ min?: number;
145
+ max?: number;
146
+ };
147
+ } | undefined): {
148
+ eastingMin: number;
149
+ eastingMax: number;
150
+ northingMin: number;
151
+ northingMax: number;
152
+ };
126
153
  }
@@ -4,11 +4,10 @@ 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 { getEastingNorthingCountryValidator } from "./helpers/geospatial.js";
8
+ import { createLowerFirstExpression, getTranslatedLabel } from "./helpers/index.js";
8
9
  import { t as tPlugin } from "../i18n/index.js";
9
10
  import { messageTemplate } from "../pageControllers/validationOptions.js";
10
- import { convertToLanguageMessages } from "../../../utils/type-utils.js";
11
-
12
11
  // British National Grid coordinate limits
13
12
  const DEFAULT_EASTING_MIN = 0;
14
13
  const DEFAULT_EASTING_MAX = 700000;
@@ -23,51 +22,16 @@ export class EastingNorthingField extends FormComponent {
23
22
  schema
24
23
  } = def;
25
24
  const isRequired = options.required !== false;
26
- const eastingMin = schema?.easting?.min ?? DEFAULT_EASTING_MIN;
27
- const eastingMax = schema?.easting?.max ?? DEFAULT_EASTING_MAX;
28
- const northingMin = schema?.northing?.min ?? DEFAULT_NORTHING_MIN;
29
- const northingMax = schema?.northing?.max ?? DEFAULT_NORTHING_MAX;
30
- const fieldLabel = lowerFirst(this.label);
31
- const eastingDigitsMessage = tPlugin('components.eastingNorthingField.eastingDigits', 'en-GB', {
32
- fieldLabel
33
- });
34
- const northingDigitsMessage = tPlugin('components.eastingNorthingField.northingDigits', 'en-GB', {
35
- fieldLabel
36
- });
37
- const customValidationMessages = convertToLanguageMessages({
38
- 'any.required': tPlugin('components.eastingNorthingField.eastingRequired', 'en-GB'),
39
- 'number.base': tPlugin('components.eastingNorthingField.eastingRequired', 'en-GB'),
40
- 'number.min': tPlugin('components.eastingNorthingField.eastingRange', 'en-GB', {
41
- fieldLabel,
42
- min: eastingMin,
43
- max: eastingMax
44
- }),
45
- 'number.max': tPlugin('components.eastingNorthingField.eastingRange', 'en-GB', {
46
- fieldLabel,
47
- min: eastingMin,
48
- max: eastingMax
49
- }),
50
- 'number.precision': eastingDigitsMessage,
51
- 'number.integer': eastingDigitsMessage,
52
- 'number.unsafe': eastingDigitsMessage
53
- });
54
- const northingValidationMessages = convertToLanguageMessages({
55
- 'any.required': tPlugin('components.eastingNorthingField.northingRequired', 'en-GB'),
56
- 'number.base': tPlugin('components.eastingNorthingField.northingRequired', 'en-GB'),
57
- 'number.min': tPlugin('components.eastingNorthingField.northingRange', 'en-GB', {
58
- fieldLabel,
59
- min: northingMin,
60
- max: northingMax
61
- }),
62
- 'number.max': tPlugin('components.eastingNorthingField.northingRange', 'en-GB', {
63
- fieldLabel,
64
- min: northingMin,
65
- max: northingMax
66
- }),
67
- 'number.precision': northingDigitsMessage,
68
- 'number.integer': northingDigitsMessage,
69
- 'number.unsafe': northingDigitsMessage
70
- });
25
+ const {
26
+ eastingMin,
27
+ eastingMax,
28
+ northingMin,
29
+ northingMax
30
+ } = EastingNorthingField.getMinMax(schema);
31
+ const {
32
+ eastingValidationMessages,
33
+ northingValidationMessages
34
+ } = EastingNorthingField.buildErrorMessages(this.label, eastingMin, eastingMax, northingMin, northingMax, 'en-GB');
71
35
  this.collection = new ComponentCollection([{
72
36
  type: ComponentType.NumberField,
73
37
  name: `${name}__easting`,
@@ -81,7 +45,7 @@ export class EastingNorthingField extends FormComponent {
81
45
  required: isRequired,
82
46
  optionalText: true,
83
47
  classes: 'govuk-input--width-10',
84
- customValidationMessages
48
+ customValidationMessages: eastingValidationMessages
85
49
  }
86
50
  }, {
87
51
  type: ComponentType.NumberField,
@@ -105,6 +69,11 @@ export class EastingNorthingField extends FormComponent {
105
69
  peers: [`${name}__easting`, `${name}__northing`]
106
70
  });
107
71
  this.options = options;
72
+ const country = options.countries?.at(0);
73
+ if (country) {
74
+ this.collection.formSchema = this.collection.formSchema.custom(getEastingNorthingCountryValidator(this, country));
75
+ this.collection.stateSchema = this.collection.stateSchema.custom(getEastingNorthingCountryValidator(this, country));
76
+ }
108
77
  this.formSchema = this.collection.formSchema;
109
78
  this.stateSchema = this.collection.stateSchema;
110
79
  }
@@ -112,13 +81,14 @@ export class EastingNorthingField extends FormComponent {
112
81
  const value = super.getFormValueFromState(state);
113
82
  return EastingNorthingField.isEastingNorthing(value) ? value : undefined;
114
83
  }
115
- getDisplayStringFromFormValue(value, _translator) {
84
+ getDisplayStringFromFormValue(value, translator) {
116
85
  if (!value) {
117
86
  return '';
118
87
  }
119
-
120
- // CYA page format: <<eastingvalue, northingvalue>>
121
- return `${value.easting}, ${value.northing}`;
88
+ const {
89
+ t
90
+ } = translator;
91
+ return `${t('components.eastingNorthingField.easting')}: ${value.easting}\n${t('components.eastingNorthingField.northing')}: ${value.northing}`;
122
92
  }
123
93
  getDisplayStringFromState(state, translator) {
124
94
  const value = this.getFormValueFromState(state);
@@ -128,7 +98,7 @@ export class EastingNorthingField extends FormComponent {
128
98
  if (!value) {
129
99
  return null;
130
100
  }
131
- return `Easting: ${value.easting}\nNorthing: ${value.northing}`;
101
+ return `${value.easting}, ${value.northing}`;
132
102
  }
133
103
  getContextValueFromState(state) {
134
104
  const value = this.getFormValueFromState(state);
@@ -138,6 +108,17 @@ export class EastingNorthingField extends FormComponent {
138
108
  const viewModel = super.getViewModel(context);
139
109
  return getLocationFieldViewModel(this, viewModel, context);
140
110
  }
111
+ getErrors(translator, errors) {
112
+ const fieldErrors = super.getErrors(translator, errors);
113
+ fieldErrors?.forEach(err => {
114
+ if (err.context?.country) {
115
+ err.text = translator.t('components.eastingNorthingField.wrongCountry', {
116
+ country: err.context.country
117
+ });
118
+ }
119
+ });
120
+ return fieldErrors;
121
+ }
141
122
  getViewErrors(translator, errors) {
142
123
  const allErrors = this.getErrors(translator, errors);
143
124
  return deduplicateErrorsByHref(allErrors);
@@ -145,6 +126,24 @@ export class EastingNorthingField extends FormComponent {
145
126
  isState(value) {
146
127
  return EastingNorthingField.isEastingNorthing(value);
147
128
  }
129
+ getValidationMessagesOverride(translator) {
130
+ const def = this.def;
131
+ const translatedLabel = getTranslatedLabel(def, translator);
132
+ const {
133
+ eastingMin,
134
+ eastingMax,
135
+ northingMin,
136
+ northingMax
137
+ } = EastingNorthingField.getMinMax(def.schema);
138
+ const {
139
+ eastingValidationMessages,
140
+ northingValidationMessages
141
+ } = EastingNorthingField.buildErrorMessages(translatedLabel, eastingMin, eastingMax, northingMin, northingMax, translator.language);
142
+ return {
143
+ [`${this.name}__easting`]: eastingValidationMessages,
144
+ [`${this.name}__northing`]: northingValidationMessages
145
+ };
146
+ }
148
147
 
149
148
  /**
150
149
  * For error preview page that shows all possible errors on a component
@@ -186,5 +185,62 @@ export class EastingNorthingField extends FormComponent {
186
185
  static isEastingNorthing(value) {
187
186
  return isFormState(value) && NumberField.isNumber(value.easting) && NumberField.isNumber(value.northing);
188
187
  }
188
+ static buildErrorMessages(label, eastingMin, eastingMax, northingMin, northingMax, language) {
189
+ const fieldLabel = lowerFirst(label);
190
+ const eastingDigitsMessage = tPlugin('components.eastingNorthingField.eastingDigits', language, {
191
+ fieldLabel
192
+ });
193
+ const northingDigitsMessage = tPlugin('components.eastingNorthingField.northingDigits', language, {
194
+ fieldLabel
195
+ });
196
+ const eastingValidationMessages = {
197
+ 'any.required': tPlugin('components.eastingNorthingField.eastingRequired', language),
198
+ 'number.base': tPlugin('components.eastingNorthingField.eastingRequired', language),
199
+ 'number.min': tPlugin('components.eastingNorthingField.eastingRange', language, {
200
+ fieldLabel,
201
+ min: eastingMin,
202
+ max: eastingMax
203
+ }),
204
+ 'number.max': tPlugin('components.eastingNorthingField.eastingRange', language, {
205
+ fieldLabel,
206
+ min: eastingMin,
207
+ max: eastingMax
208
+ }),
209
+ 'number.precision': eastingDigitsMessage,
210
+ 'number.integer': eastingDigitsMessage,
211
+ 'number.unsafe': eastingDigitsMessage
212
+ };
213
+ const northingValidationMessages = {
214
+ 'any.required': tPlugin('components.eastingNorthingField.northingRequired', language),
215
+ 'number.base': tPlugin('components.eastingNorthingField.northingRequired', language),
216
+ 'number.min': tPlugin('components.eastingNorthingField.northingRange', language, {
217
+ fieldLabel,
218
+ min: northingMin,
219
+ max: northingMax
220
+ }),
221
+ 'number.max': tPlugin('components.eastingNorthingField.northingRange', language, {
222
+ fieldLabel,
223
+ min: northingMin,
224
+ max: northingMax
225
+ }),
226
+ 'number.precision': northingDigitsMessage,
227
+ 'number.integer': northingDigitsMessage,
228
+ 'number.unsafe': northingDigitsMessage
229
+ };
230
+ return {
231
+ eastingValidationMessages,
232
+ northingValidationMessages
233
+ };
234
+ }
235
+
236
+ // Read schema values from def.schema with fallback defaults
237
+ static getMinMax(schema) {
238
+ return {
239
+ eastingMin: schema?.easting?.min ?? DEFAULT_EASTING_MIN,
240
+ eastingMax: schema?.easting?.max ?? DEFAULT_EASTING_MAX,
241
+ northingMin: schema?.northing?.min ?? DEFAULT_NORTHING_MIN,
242
+ northingMax: schema?.northing?.max ?? DEFAULT_NORTHING_MAX
243
+ };
244
+ }
189
245
  }
190
246
  //# sourceMappingURL=EastingNorthingField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EastingNorthingField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","createLowerFirstExpression","t","tPlugin","messageTemplate","convertToLanguageMessages","DEFAULT_EASTING_MIN","DEFAULT_EASTING_MAX","DEFAULT_NORTHING_MIN","DEFAULT_NORTHING_MAX","EastingNorthingField","constructor","def","props","name","options","schema","isRequired","required","eastingMin","easting","min","eastingMax","max","northingMin","northing","northingMax","fieldLabel","label","eastingDigitsMessage","northingDigitsMessage","customValidationMessages","northingValidationMessages","collection","type","title","precision","optionalText","classes","parent","peers","formSchema","stateSchema","getFormValueFromState","state","value","isEastingNorthing","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/EastingNorthingField.ts"],"sourcesContent":["import {\n ComponentType,\n type EastingNorthingFieldComponent\n} 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 EastingNorthingState,\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// British National Grid coordinate limits\nconst DEFAULT_EASTING_MIN = 0\nconst DEFAULT_EASTING_MAX = 700000\nconst DEFAULT_NORTHING_MIN = 0\nconst DEFAULT_NORTHING_MAX = 1300000\n\nexport class EastingNorthingField extends FormComponent {\n declare options: EastingNorthingFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: EastingNorthingFieldComponent,\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 eastingMin = schema?.easting?.min ?? DEFAULT_EASTING_MIN\n const eastingMax = schema?.easting?.max ?? DEFAULT_EASTING_MAX\n const northingMin = schema?.northing?.min ?? DEFAULT_NORTHING_MIN\n const northingMax = schema?.northing?.max ?? DEFAULT_NORTHING_MAX\n\n const fieldLabel = lowerFirst(this.label)\n\n const eastingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.eastingDigits',\n 'en-GB',\n { fieldLabel }\n )\n const northingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.northingDigits',\n 'en-GB',\n { fieldLabel }\n )\n\n const customValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'any.required': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n 'en-GB'\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n 'en-GB'\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n 'en-GB',\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n 'en-GB',\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.precision': eastingDigitsMessage,\n 'number.integer': eastingDigitsMessage,\n 'number.unsafe': eastingDigitsMessage\n })\n\n const northingValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'any.required': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n 'en-GB'\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n 'en-GB'\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.northingRange',\n 'en-GB',\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.northingRange',\n 'en-GB',\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.precision': northingDigitsMessage,\n 'number.integer': northingDigitsMessage,\n 'number.unsafe': northingDigitsMessage\n })\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__easting`,\n title: 'components.eastingNorthingField.easting',\n schema: {\n min: eastingMin,\n max: eastingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__northing`,\n title: 'components.eastingNorthingField.northing',\n schema: {\n min: northingMin,\n max: northingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: northingValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n peers: [`${name}__easting`, `${name}__northing`]\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 EastingNorthingField.isEastingNorthing(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: EastingNorthingState | undefined,\n _translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n // CYA page format: <<eastingvalue, northingvalue>>\n return `${value.easting}, ${value.northing}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: EastingNorthingState | undefined\n ): string | null {\n if (!value) {\n return null\n }\n\n return `Easting: ${value.easting}\\nNorthing: ${value.northing}`\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 EastingNorthingField.isEastingNorthing(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EastingNorthingField.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: 'eastingFormat',\n template: createLowerFirstExpression(\n 'Easting for {{lowerFirst(#title)}} must be between 1 and 6 digits'\n )\n },\n {\n type: 'northingFormat',\n template: createLowerFirstExpression(\n 'Northing for {{lowerFirst(#title)}} must be between 1 and 7 digits'\n )\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'eastingMin',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'eastingMax',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'northingMin',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n },\n {\n type: 'northingMax',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n }\n ]\n }\n }\n\n static isEastingNorthing(\n value?: FormStateValue | FormState\n ): value is EastingNorthingState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.easting) &&\n NumberField.isNumber(value.northing)\n )\n }\n}\n"],"mappings":"AAAA,SACEA,aAAa,QAER,oBAAoB;AAE3B,OAAOC,UAAU,MAAM,sBAAsB;AAE7C,SAASC,mBAAmB;AAC5B,SACEC,aAAa,EACbC,WAAW;AAEb,SACEC,uBAAuB,EACvBC,yBAAyB;AAE3B,SAASC,WAAW;AACpB,SAASC,0BAA0B;AAKnC,SAASC,CAAC,IAAIC,OAAO;AAErB,SAASC,eAAe;AASxB,SAASC,yBAAyB;;AAElC;AACA,MAAMC,mBAAmB,GAAG,CAAC;AAC7B,MAAMC,mBAAmB,GAAG,MAAM;AAClC,MAAMC,oBAAoB,GAAG,CAAC;AAC9B,MAAMC,oBAAoB,GAAG,OAAO;AAEpC,OAAO,MAAMC,oBAAoB,SAASd,aAAa,CAAC;EAMtDe,WAAWA,CACTC,GAAkC,EAClCC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC,IAAI;MAAEC,OAAO;MAAEC;IAAO,CAAC,GAAGJ,GAAG;IAErC,MAAMK,UAAU,GAAGF,OAAO,CAACG,QAAQ,KAAK,KAAK;IAE7C,MAAMC,UAAU,GAAGH,MAAM,EAAEI,OAAO,EAAEC,GAAG,IAAIf,mBAAmB;IAC9D,MAAMgB,UAAU,GAAGN,MAAM,EAAEI,OAAO,EAAEG,GAAG,IAAIhB,mBAAmB;IAC9D,MAAMiB,WAAW,GAAGR,MAAM,EAAES,QAAQ,EAAEJ,GAAG,IAAIb,oBAAoB;IACjE,MAAMkB,WAAW,GAAGV,MAAM,EAAES,QAAQ,EAAEF,GAAG,IAAId,oBAAoB;IAEjE,MAAMkB,UAAU,GAAGjC,UAAU,CAAC,IAAI,CAACkC,KAAK,CAAC;IAEzC,MAAMC,oBAAoB,GAAG1B,OAAO,CAClC,+CAA+C,EAC/C,OAAO,EACP;MAAEwB;IAAW,CACf,CAAC;IACD,MAAMG,qBAAqB,GAAG3B,OAAO,CACnC,gDAAgD,EAChD,OAAO,EACP;MAAEwB;IAAW,CACf,CAAC;IAED,MAAMI,wBAA0C,GAC9C1B,yBAAyB,CAAC;MACxB,cAAc,EAAEF,OAAO,CACrB,iDAAiD,EACjD,OACF,CAAC;MACD,aAAa,EAAEA,OAAO,CACpB,iDAAiD,EACjD,OACF,CAAC;MACD,YAAY,EAAEA,OAAO,CACnB,8CAA8C,EAC9C,OAAO,EACP;QACEwB,UAAU;QACVN,GAAG,EAAEF,UAAU;QACfI,GAAG,EAAED;MACP,CACF,CAAC;MACD,YAAY,EAAEnB,OAAO,CACnB,8CAA8C,EAC9C,OAAO,EACP;QACEwB,UAAU;QACVN,GAAG,EAAEF,UAAU;QACfI,GAAG,EAAED;MACP,CACF,CAAC;MACD,kBAAkB,EAAEO,oBAAoB;MACxC,gBAAgB,EAAEA,oBAAoB;MACtC,eAAe,EAAEA;IACnB,CAAC,CAAC;IAEJ,MAAMG,0BAA4C,GAChD3B,yBAAyB,CAAC;MACxB,cAAc,EAAEF,OAAO,CACrB,kDAAkD,EAClD,OACF,CAAC;MACD,aAAa,EAAEA,OAAO,CACpB,kDAAkD,EAClD,OACF,CAAC;MACD,YAAY,EAAEA,OAAO,CACnB,+CAA+C,EAC/C,OAAO,EACP;QACEwB,UAAU;QACVN,GAAG,EAAEG,WAAW;QAChBD,GAAG,EAAEG;MACP,CACF,CAAC;MACD,YAAY,EAAEvB,OAAO,CACnB,+CAA+C,EAC/C,OAAO,EACP;QACEwB,UAAU;QACVN,GAAG,EAAEG,WAAW;QAChBD,GAAG,EAAEG;MACP,CACF,CAAC;MACD,kBAAkB,EAAEI,qBAAqB;MACzC,gBAAgB,EAAEA,qBAAqB;MACvC,eAAe,EAAEA;IACnB,CAAC,CAAC;IAEJ,IAAI,CAACG,UAAU,GAAG,IAAItC,mBAAmB,CACvC,CACE;MACEuC,IAAI,EAAEzC,aAAa,CAACO,WAAW;MAC/Bc,IAAI,EAAE,GAAGA,IAAI,WAAW;MACxBqB,KAAK,EAAE,yCAAyC;MAChDnB,MAAM,EAAE;QACNK,GAAG,EAAEF,UAAU;QACfI,GAAG,EAAED,UAAU;QACfc,SAAS,EAAE;MACb,CAAC;MACDrB,OAAO,EAAE;QACPG,QAAQ,EAAED,UAAU;QACpBoB,YAAY,EAAE,IAAI;QAClBC,OAAO,EAAE,uBAAuB;QAChCP;MACF;IACF,CAAC,EACD;MACEG,IAAI,EAAEzC,aAAa,CAACO,WAAW;MAC/Bc,IAAI,EAAE,GAAGA,IAAI,YAAY;MACzBqB,KAAK,EAAE,0CAA0C;MACjDnB,MAAM,EAAE;QACNK,GAAG,EAAEG,WAAW;QAChBD,GAAG,EAAEG,WAAW;QAChBU,SAAS,EAAE;MACb,CAAC;MACDrB,OAAO,EAAE;QACPG,QAAQ,EAAED,UAAU;QACpBoB,YAAY,EAAE,IAAI;QAClBC,OAAO,EAAE,uBAAuB;QAChCP,wBAAwB,EAAEC;MAC5B;IACF,CAAC,CACF,EACD;MAAE,GAAGnB,KAAK;MAAE0B,MAAM,EAAE;IAAK,CAAC,EAC1B;MACEC,KAAK,EAAE,CAAC,GAAG1B,IAAI,WAAW,EAAE,GAAGA,IAAI,YAAY;IACjD,CACF,CAAC;IAED,IAAI,CAACC,OAAO,GAAGA,OAAO;IACtB,IAAI,CAAC0B,UAAU,GAAG,IAAI,CAACR,UAAU,CAACQ,UAAU;IAC5C,IAAI,CAACC,WAAW,GAAG,IAAI,CAACT,UAAU,CAACS,WAAW;EAChD;EAEAC,qBAAqBA,CAACC,KAA0B,EAAE;IAChD,MAAMC,KAAK,GAAG,KAAK,CAACF,qBAAqB,CAACC,KAAK,CAAC;IAChD,OAAOlC,oBAAoB,CAACoC,iBAAiB,CAACD,KAAK,CAAC,GAAGA,KAAK,GAAGE,SAAS;EAC1E;EAEAC,6BAA6BA,CAC3BH,KAAuC,EACvCI,WAAuB,EACf;IACR,IAAI,CAACJ,KAAK,EAAE;MACV,OAAO,EAAE;IACX;;IAEA;IACA,OAAO,GAAGA,KAAK,CAACzB,OAAO,KAAKyB,KAAK,CAACpB,QAAQ,EAAE;EAC9C;EAEAyB,yBAAyBA,CACvBN,KAA0B,EAC1BO,UAAsB,EACtB;IACA,MAAMN,KAAK,GAAG,IAAI,CAACF,qBAAqB,CAACC,KAAK,CAAC;IAE/C,OAAO,IAAI,CAACI,6BAA6B,CAACH,KAAK,EAAEM,UAAU,CAAC;EAC9D;EAEAC,4BAA4BA,CAC1BP,KAAuC,EACxB;IACf,IAAI,CAACA,KAAK,EAAE;MACV,OAAO,IAAI;IACb;IAEA,OAAO,YAAYA,KAAK,CAACzB,OAAO,eAAeyB,KAAK,CAACpB,QAAQ,EAAE;EACjE;EAEA4B,wBAAwBA,CAACT,KAA0B,EAAE;IACnD,MAAMC,KAAK,GAAG,IAAI,CAACF,qBAAqB,CAACC,KAAK,CAAC;IAE/C,OAAO,IAAI,CAACQ,4BAA4B,CAACP,KAAK,CAAC;EACjD;EAEAS,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAMC,SAAS,GAAG,KAAK,CAACF,YAAY,CAACC,OAAO,CAAC;IAC7C,OAAOxD,yBAAyB,CAAC,IAAI,EAAEyD,SAAS,EAAED,OAAO,CAAC;EAC5D;EAEAE,aAAaA,CACXN,UAAsB,EACtBO,MAA8B,EACK;IACnC,MAAMC,SAAS,GAAG,IAAI,CAACC,SAAS,CAACT,UAAU,EAAEO,MAAM,CAAC;IACpD,OAAO5D,uBAAuB,CAAC6D,SAAS,CAAC;EAC3C;EAEAE,OAAOA,CAAChB,KAAkC,EAAE;IAC1C,OAAOnC,oBAAoB,CAACoC,iBAAiB,CAACD,KAAK,CAAC;EACtD;;EAEA;AACF;AACA;EACEiB,oBAAoBA,CAAA,EAA6B;IAC/C,OAAOpD,oBAAoB,CAACoD,oBAAoB,CAAC,CAAC;EACpD;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QAAE7B,IAAI,EAAE,UAAU;QAAE8B,QAAQ,EAAE5D,eAAe,CAACc;MAAS,CAAC,EACxD;QACEgB,IAAI,EAAE,eAAe;QACrB8B,QAAQ,EAAE/D,0BAA0B,CAClC,mEACF;MACF,CAAC,EACD;QACEiC,IAAI,EAAE,gBAAgB;QACtB8B,QAAQ,EAAE/D,0BAA0B,CAClC,oEACF;MACF,CAAC,CACF;MACDgE,sBAAsB,EAAE,CACtB;QACE/B,IAAI,EAAE,YAAY;QAClB8B,QAAQ,EAAE/D,0BAA0B,CAClC,sDAAsDK,mBAAmB,QAAQC,mBAAmB,EACtG;MACF,CAAC,EACD;QACE2B,IAAI,EAAE,YAAY;QAClB8B,QAAQ,EAAE/D,0BAA0B,CAClC,sDAAsDK,mBAAmB,QAAQC,mBAAmB,EACtG;MACF,CAAC,EACD;QACE2B,IAAI,EAAE,aAAa;QACnB8B,QAAQ,EAAE/D,0BAA0B,CAClC,uDAAuDO,oBAAoB,QAAQC,oBAAoB,EACzG;MACF,CAAC,EACD;QACEyB,IAAI,EAAE,aAAa;QACnB8B,QAAQ,EAAE/D,0BAA0B,CAClC,uDAAuDO,oBAAoB,QAAQC,oBAAoB,EACzG;MACF,CAAC;IAEL,CAAC;EACH;EAEA,OAAOqC,iBAAiBA,CACtBD,KAAkC,EACH;IAC/B,OACEhD,WAAW,CAACgD,KAAK,CAAC,IAClB7C,WAAW,CAACkE,QAAQ,CAACrB,KAAK,CAACzB,OAAO,CAAC,IACnCpB,WAAW,CAACkE,QAAQ,CAACrB,KAAK,CAACpB,QAAQ,CAAC;EAExC;AACF","ignoreList":[]}
1
+ {"version":3,"file":"EastingNorthingField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","getEastingNorthingCountryValidator","createLowerFirstExpression","getTranslatedLabel","t","tPlugin","messageTemplate","DEFAULT_EASTING_MIN","DEFAULT_EASTING_MAX","DEFAULT_NORTHING_MIN","DEFAULT_NORTHING_MAX","EastingNorthingField","constructor","def","props","name","options","schema","isRequired","required","eastingMin","eastingMax","northingMin","northingMax","getMinMax","eastingValidationMessages","northingValidationMessages","buildErrorMessages","label","collection","type","title","min","max","precision","optionalText","classes","customValidationMessages","parent","peers","country","countries","at","formSchema","custom","stateSchema","getFormValueFromState","state","value","isEastingNorthing","undefined","getDisplayStringFromFormValue","translator","easting","northing","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getViewModel","context","viewModel","getErrors","errors","fieldErrors","forEach","err","text","getViewErrors","allErrors","isState","getValidationMessagesOverride","translatedLabel","language","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isNumber","fieldLabel","eastingDigitsMessage","northingDigitsMessage"],"sources":["../../../../../src/server/plugins/engine/components/EastingNorthingField.ts"],"sourcesContent":["import {\n ComponentType,\n type EastingNorthingFieldComponent\n} 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 { getEastingNorthingCountryValidator } from '~/src/server/plugins/engine/components/helpers/geospatial.js'\nimport {\n createLowerFirstExpression,\n getTranslatedLabel\n} from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n type EastingNorthingState,\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// British National Grid coordinate limits\nconst DEFAULT_EASTING_MIN = 0\nconst DEFAULT_EASTING_MAX = 700000\nconst DEFAULT_NORTHING_MIN = 0\nconst DEFAULT_NORTHING_MAX = 1300000\n\nexport class EastingNorthingField extends FormComponent {\n declare options: EastingNorthingFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: EastingNorthingFieldComponent,\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 { eastingMin, eastingMax, northingMin, northingMax } =\n EastingNorthingField.getMinMax(schema)\n\n const { eastingValidationMessages, northingValidationMessages } =\n EastingNorthingField.buildErrorMessages(\n this.label,\n eastingMin,\n eastingMax,\n northingMin,\n northingMax,\n 'en-GB'\n )\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__easting`,\n title: 'components.eastingNorthingField.easting',\n schema: {\n min: eastingMin,\n max: eastingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: eastingValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__northing`,\n title: 'components.eastingNorthingField.northing',\n schema: {\n min: northingMin,\n max: northingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: northingValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n peers: [`${name}__easting`, `${name}__northing`]\n }\n )\n\n this.options = options\n\n const country = options.countries?.at(0)\n\n if (country) {\n this.collection.formSchema = this.collection.formSchema.custom(\n getEastingNorthingCountryValidator(this, country)\n )\n this.collection.stateSchema = this.collection.stateSchema.custom(\n getEastingNorthingCountryValidator(this, country)\n )\n }\n\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 EastingNorthingField.isEastingNorthing(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: EastingNorthingState | undefined,\n translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const { t } = translator\n\n return `${t('components.eastingNorthingField.easting')}: ${value.easting}\\n${t('components.eastingNorthingField.northing')}: ${value.northing}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: EastingNorthingState | undefined\n ): string | null {\n if (!value) {\n return null\n }\n\n return `${value.easting}, ${value.northing}`\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 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.context?.country) {\n err.text = translator.t(\n 'components.eastingNorthingField.wrongCountry',\n { 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 const allErrors = this.getErrors(translator, errors)\n return deduplicateErrorsByHref(allErrors)\n }\n\n isState(value?: FormStateValue | FormState) {\n return EastingNorthingField.isEastingNorthing(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const def = this.def as EastingNorthingFieldComponent\n const translatedLabel = getTranslatedLabel(def, translator)\n const { eastingMin, eastingMax, northingMin, northingMax } =\n EastingNorthingField.getMinMax(def.schema)\n const { eastingValidationMessages, northingValidationMessages } =\n EastingNorthingField.buildErrorMessages(\n translatedLabel,\n eastingMin,\n eastingMax,\n northingMin,\n northingMax,\n translator.language\n )\n return {\n [`${this.name}__easting`]: eastingValidationMessages,\n [`${this.name}__northing`]: northingValidationMessages\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EastingNorthingField.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: 'eastingFormat',\n template: createLowerFirstExpression(\n 'Easting for {{lowerFirst(#title)}} must be between 1 and 6 digits'\n )\n },\n {\n type: 'northingFormat',\n template: createLowerFirstExpression(\n 'Northing for {{lowerFirst(#title)}} must be between 1 and 7 digits'\n )\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'eastingMin',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'eastingMax',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'northingMin',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n },\n {\n type: 'northingMax',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n }\n ]\n }\n }\n\n static isEastingNorthing(\n value?: FormStateValue | FormState\n ): value is EastingNorthingState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.easting) &&\n NumberField.isNumber(value.northing)\n )\n }\n\n static buildErrorMessages(\n label: string,\n eastingMin: number,\n eastingMax: number,\n northingMin: number,\n northingMax: number,\n language: string\n ) {\n const fieldLabel = lowerFirst(label)\n\n const eastingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.eastingDigits',\n language,\n { fieldLabel }\n )\n const northingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.northingDigits',\n language,\n { fieldLabel }\n )\n\n const eastingValidationMessages: LanguageMessages = {\n 'any.required': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n language\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n language,\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n language,\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.precision': eastingDigitsMessage,\n 'number.integer': eastingDigitsMessage,\n 'number.unsafe': eastingDigitsMessage\n }\n\n const northingValidationMessages: LanguageMessages = {\n 'any.required': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n language\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.northingRange',\n language,\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.northingRange',\n language,\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.precision': northingDigitsMessage,\n 'number.integer': northingDigitsMessage,\n 'number.unsafe': northingDigitsMessage\n }\n return {\n eastingValidationMessages,\n northingValidationMessages\n }\n }\n\n // Read schema values from def.schema with fallback defaults\n static getMinMax(\n schema:\n | {\n easting?: {\n min?: number\n max?: number\n }\n northing?: {\n min?: number\n max?: number\n }\n }\n | undefined\n ) {\n return {\n eastingMin: schema?.easting?.min ?? DEFAULT_EASTING_MIN,\n eastingMax: schema?.easting?.max ?? DEFAULT_EASTING_MAX,\n northingMin: schema?.northing?.min ?? DEFAULT_NORTHING_MIN,\n northingMax: schema?.northing?.max ?? DEFAULT_NORTHING_MAX\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -30,7 +30,9 @@ export declare class EmailAddressField extends FormComponent {
30
30
  attributes: {
31
31
  autocomplete?: string;
32
32
  maxlength?: number;
33
- multiple?: string;
33
+ multiple? /**
34
+ * Static version of getAllPossibleErrors that doesn't require a component instance.
35
+ */: string;
34
36
  accept?: string;
35
37
  inputmode?: string;
36
38
  };
@@ -52,6 +54,7 @@ export declare class EmailAddressField extends FormComponent {
52
54
  upload?: {
53
55
  count: number;
54
56
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
57
+ uploadingLabel?: string;
55
58
  };
56
59
  };
57
60
  /**
@@ -17,7 +17,8 @@ export class EmailAddressField extends FormComponent {
17
17
  formSchema = formSchema.messages({
18
18
  'any.required': message,
19
19
  'string.empty': message,
20
- 'string.email': message
20
+ 'string.email': message,
21
+ 'string.unicode': message
21
22
  });
22
23
  } else if (options.customValidationMessages) {
23
24
  formSchema = formSchema.messages(options.customValidationMessages);
@@ -1 +1 @@
1
- {"version":3,"file":"EmailAddressField.js","names":["preventUnicodeInEmail","joi","FormComponent","messageTemplate","EmailAddressField","constructor","def","props","options","formSchema","string","trim","email","custom","value","helpers","label","required","allow","customValidationMessage","message","messages","customValidationMessages","default","stateSchema","getViewModel","context","viewModel","attributes","autocomplete","type","getAllPossibleErrors","baseErrors","template","format","unicode","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/EmailAddressField.ts"],"sourcesContent":["import {\n preventUnicodeInEmail,\n type EmailAddressFieldComponent\n} from '@defra/forms-model'\nimport joi, { type CustomHelpers } from 'joi'\n\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class EmailAddressField extends FormComponent {\n declare options: EmailAddressFieldComponent['options']\n\n constructor(\n def: EmailAddressFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options } = def\n\n let formSchema = joi\n .string()\n .trim()\n .email()\n .custom((value, helpers: CustomHelpers<string>) =>\n preventUnicodeInEmail(value, helpers)\n )\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'string.empty': message,\n 'string.email': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n const { attributes } = viewModel\n\n attributes.autocomplete = 'email'\n\n return {\n ...viewModel,\n type: 'email'\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EmailAddressField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n { type: 'format', template: messageTemplate.format },\n { type: 'unicode', template: messageTemplate.unicode }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAAA,SACEA,qBAAqB,QAEhB,oBAAoB;AAC3B,OAAOC,GAAG,MAA8B,KAAK;AAE7C,SAASC,aAAa;AAEtB,SAASC,eAAe;AAGxB,OAAO,MAAMC,iBAAiB,SAASF,aAAa,CAAC;EAGnDG,WAAWA,CACTC,GAA+B,EAC/BC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC;IAAQ,CAAC,GAAGF,GAAG;IAEvB,IAAIG,UAAU,GAAGR,GAAG,CACjBS,MAAM,CAAC,CAAC,CACRC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,CAAC,CACPC,MAAM,CAAC,CAACC,KAAK,EAAEC,OAA8B,KAC5Cf,qBAAqB,CAACc,KAAK,EAAEC,OAAO,CACtC,CAAC,CACAC,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC,CACjBC,QAAQ,CAAC,CAAC;IAEb,IAAIT,OAAO,CAACS,QAAQ,KAAK,KAAK,EAAE;MAC9BR,UAAU,GAAGA,UAAU,CAACS,KAAK,CAAC,EAAE,CAAC;IACnC;IAEA,IAAIV,OAAO,CAACW,uBAAuB,EAAE;MACnC,MAAMC,OAAO,GAAGZ,OAAO,CAACW,uBAAuB;MAE/CV,UAAU,GAAGA,UAAU,CAACY,QAAQ,CAAC;QAC/B,cAAc,EAAED,OAAO;QACvB,cAAc,EAAEA,OAAO;QACvB,cAAc,EAAEA;MAClB,CAAC,CAAC;IACJ,CAAC,MAAM,IAAIZ,OAAO,CAACc,wBAAwB,EAAE;MAC3Cb,UAAU,GAAGA,UAAU,CAACY,QAAQ,CAACb,OAAO,CAACc,wBAAwB,CAAC;IACpE;IAEA,IAAI,CAACb,UAAU,GAAGA,UAAU,CAACc,OAAO,CAAC,EAAE,CAAC;IACxC,IAAI,CAACC,WAAW,GAAGf,UAAU,CAACc,OAAO,CAAC,IAAI,CAAC,CAACL,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,CAACV,OAAO,GAAGA,OAAO;EACxB;EAEAiB,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAMC,SAAS,GAAG,KAAK,CAACF,YAAY,CAACC,OAAO,CAAC;IAC7C,MAAM;MAAEE;IAAW,CAAC,GAAGD,SAAS;IAEhCC,UAAU,CAACC,YAAY,GAAG,OAAO;IAEjC,OAAO;MACL,GAAGF,SAAS;MACZG,IAAI,EAAE;IACR,CAAC;EACH;;EAEA;AACF;AACA;EACEC,oBAAoBA,CAAA,EAA6B;IAC/C,OAAO3B,iBAAiB,CAAC2B,oBAAoB,CAAC,CAAC;EACjD;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QAAEF,IAAI,EAAE,UAAU;QAAEG,QAAQ,EAAE9B,eAAe,CAACc;MAAS,CAAC,EACxD;QAAEa,IAAI,EAAE,QAAQ;QAAEG,QAAQ,EAAE9B,eAAe,CAAC+B;MAAO,CAAC,EACpD;QAAEJ,IAAI,EAAE,SAAS;QAAEG,QAAQ,EAAE9B,eAAe,CAACgC;MAAQ,CAAC,CACvD;MACDC,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"EmailAddressField.js","names":["preventUnicodeInEmail","joi","FormComponent","messageTemplate","EmailAddressField","constructor","def","props","options","formSchema","string","trim","email","custom","value","helpers","label","required","allow","customValidationMessage","message","messages","customValidationMessages","default","stateSchema","getViewModel","context","viewModel","attributes","autocomplete","type","getAllPossibleErrors","baseErrors","template","format","unicode","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/EmailAddressField.ts"],"sourcesContent":["import {\n preventUnicodeInEmail,\n type EmailAddressFieldComponent\n} from '@defra/forms-model'\nimport joi, { type CustomHelpers } from 'joi'\n\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class EmailAddressField extends FormComponent {\n declare options: EmailAddressFieldComponent['options']\n\n constructor(\n def: EmailAddressFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options } = def\n\n let formSchema = joi\n .string()\n .trim()\n .email()\n .custom((value, helpers: CustomHelpers<string>) =>\n preventUnicodeInEmail(value, helpers)\n )\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'string.empty': message,\n 'string.email': message,\n 'string.unicode': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n const { attributes } = viewModel\n\n attributes.autocomplete = 'email'\n\n return {\n ...viewModel,\n type: 'email'\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EmailAddressField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n { type: 'format', template: messageTemplate.format },\n { type: 'unicode', template: messageTemplate.unicode }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAAA,SACEA,qBAAqB,QAEhB,oBAAoB;AAC3B,OAAOC,GAAG,MAA8B,KAAK;AAE7C,SAASC,aAAa;AAEtB,SAASC,eAAe;AAGxB,OAAO,MAAMC,iBAAiB,SAASF,aAAa,CAAC;EAGnDG,WAAWA,CACTC,GAA+B,EAC/BC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC;IAAQ,CAAC,GAAGF,GAAG;IAEvB,IAAIG,UAAU,GAAGR,GAAG,CACjBS,MAAM,CAAC,CAAC,CACRC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,CAAC,CACPC,MAAM,CAAC,CAACC,KAAK,EAAEC,OAA8B,KAC5Cf,qBAAqB,CAACc,KAAK,EAAEC,OAAO,CACtC,CAAC,CACAC,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC,CACjBC,QAAQ,CAAC,CAAC;IAEb,IAAIT,OAAO,CAACS,QAAQ,KAAK,KAAK,EAAE;MAC9BR,UAAU,GAAGA,UAAU,CAACS,KAAK,CAAC,EAAE,CAAC;IACnC;IAEA,IAAIV,OAAO,CAACW,uBAAuB,EAAE;MACnC,MAAMC,OAAO,GAAGZ,OAAO,CAACW,uBAAuB;MAE/CV,UAAU,GAAGA,UAAU,CAACY,QAAQ,CAAC;QAC/B,cAAc,EAAED,OAAO;QACvB,cAAc,EAAEA,OAAO;QACvB,cAAc,EAAEA,OAAO;QACvB,gBAAgB,EAAEA;MACpB,CAAC,CAAC;IACJ,CAAC,MAAM,IAAIZ,OAAO,CAACc,wBAAwB,EAAE;MAC3Cb,UAAU,GAAGA,UAAU,CAACY,QAAQ,CAACb,OAAO,CAACc,wBAAwB,CAAC;IACpE;IAEA,IAAI,CAACb,UAAU,GAAGA,UAAU,CAACc,OAAO,CAAC,EAAE,CAAC;IACxC,IAAI,CAACC,WAAW,GAAGf,UAAU,CAACc,OAAO,CAAC,IAAI,CAAC,CAACL,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,CAACV,OAAO,GAAGA,OAAO;EACxB;EAEAiB,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAMC,SAAS,GAAG,KAAK,CAACF,YAAY,CAACC,OAAO,CAAC;IAC7C,MAAM;MAAEE;IAAW,CAAC,GAAGD,SAAS;IAEhCC,UAAU,CAACC,YAAY,GAAG,OAAO;IAEjC,OAAO;MACL,GAAGF,SAAS;MACZG,IAAI,EAAE;IACR,CAAC;EACH;;EAEA;AACF;AACA;EACEC,oBAAoBA,CAAA,EAA6B;IAC/C,OAAO3B,iBAAiB,CAAC2B,oBAAoB,CAAC,CAAC;EACjD;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QAAEF,IAAI,EAAE,UAAU;QAAEG,QAAQ,EAAE9B,eAAe,CAACc;MAAS,CAAC,EACxD;QAAEa,IAAI,EAAE,QAAQ;QAAEG,QAAQ,EAAE9B,eAAe,CAAC+B;MAAO,CAAC,EACpD;QAAEJ,IAAI,EAAE,SAAS;QAAEG,QAAQ,EAAE9B,eAAe,CAACgC;MAAQ,CAAC,CACvD;MACDC,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
@@ -78,6 +78,13 @@ export declare class FileUploadField extends FormComponent {
78
78
  components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
79
79
  };
80
80
  isValue(value?: FormStateValue | FormState): value is UploadState;
81
+ getValidationMessagesOverride(translator: Translator): {
82
+ [x: string]: {
83
+ 'array.min': string;
84
+ 'array.max': string;
85
+ 'array.length': string;
86
+ };
87
+ };
81
88
  /**
82
89
  * For error preview page that shows all possible errors on a component
83
90
  */
@@ -87,4 +94,9 @@ export declare class FileUploadField extends FormComponent {
87
94
  * Static version of getAllPossibleErrors that doesn't require a component instance.
88
95
  */
89
96
  static getAllPossibleErrors(): ErrorMessageTemplateList;
97
+ static buildErrorMessages(language: string): {
98
+ 'array.min': string;
99
+ 'array.max': string;
100
+ 'array.length': string;
101
+ };
90
102
  }