@defra/forms-engine-plugin 5.0.0-alpha.2 → 5.0.0-alpha.21

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 (346) 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.d.ts +153 -5
  11. package/.server/client/javascripts/geospatial-map.js +157 -77
  12. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  13. package/.server/client/javascripts/govuk.js +2 -1
  14. package/.server/client/javascripts/govuk.js.map +1 -1
  15. package/.server/client/javascripts/location-map.d.ts +44 -0
  16. package/.server/client/javascripts/location-map.js +54 -5
  17. package/.server/client/javascripts/location-map.js.map +1 -1
  18. package/.server/client/javascripts/map-constants.d.ts +3 -0
  19. package/.server/client/javascripts/map-constants.js +4 -0
  20. package/.server/client/javascripts/map-constants.js.map +1 -0
  21. package/.server/client/javascripts/map.d.ts +10 -0
  22. package/.server/client/javascripts/map.js +42 -0
  23. package/.server/client/javascripts/map.js.map +1 -1
  24. package/.server/client/javascripts/maps.d.ts +5 -0
  25. package/.server/client/javascripts/maps.js +6 -0
  26. package/.server/client/javascripts/maps.js.map +1 -0
  27. package/.server/client/javascripts/shared.d.ts +1 -4
  28. package/.server/client/javascripts/shared.js +1 -4
  29. package/.server/client/javascripts/shared.js.map +1 -1
  30. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  31. package/.server/client/javascripts/sssi-dataset.js +37 -39
  32. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  33. package/.server/client/stylesheets/maps.scss +4 -0
  34. package/.server/client/stylesheets/shared.scss +1 -5
  35. package/.server/server/constants.d.ts +2 -0
  36. package/.server/server/constants.js +2 -0
  37. package/.server/server/constants.js.map +1 -1
  38. package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
  39. package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
  40. package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
  41. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  42. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  43. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  44. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +21 -0
  45. package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
  46. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  48. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  49. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  50. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  51. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  52. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  53. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  54. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  55. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  56. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  57. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  58. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  59. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
  60. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  61. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  62. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  63. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  64. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  65. package/.server/server/plugins/engine/components/FileUploadField.d.ts +21 -0
  66. package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
  67. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  69. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  70. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  71. package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
  72. package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
  73. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  74. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  75. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  76. package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
  77. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  78. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  79. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  80. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  81. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  82. package/.server/server/plugins/engine/components/LocationFieldBase.js +25 -6
  83. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  84. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
  85. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
  86. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  87. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  89. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  90. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  91. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  92. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  93. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  94. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  95. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  96. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  97. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  98. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  99. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  100. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  101. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
  102. package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
  103. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  104. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  105. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  106. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  108. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  109. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  110. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  111. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  112. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  113. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  114. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  115. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  116. package/.server/server/plugins/engine/components/helpers/components.js +3 -3
  117. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  118. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
  119. package/.server/server/plugins/engine/components/helpers/geospatial.js +56 -15
  120. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  121. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  122. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  123. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  124. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  125. package/.server/server/plugins/engine/components/types.js.map +1 -1
  126. package/.server/server/plugins/engine/errors.d.ts +49 -0
  127. package/.server/server/plugins/engine/errors.js +75 -0
  128. package/.server/server/plugins/engine/errors.js.map +1 -0
  129. package/.server/server/plugins/engine/form-availability.d.ts +3 -2
  130. package/.server/server/plugins/engine/form-availability.js +3 -2
  131. package/.server/server/plugins/engine/form-availability.js.map +1 -1
  132. package/.server/server/plugins/engine/form-context.js +2 -2
  133. package/.server/server/plugins/engine/form-context.js.map +1 -1
  134. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  135. package/.server/server/plugins/engine/helpers.js +44 -5
  136. package/.server/server/plugins/engine/helpers.js.map +1 -1
  137. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
  138. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
  139. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  140. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  141. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  142. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  143. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  144. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  145. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  146. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  147. package/.server/server/plugins/engine/i18n/form.js +35 -0
  148. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  149. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  150. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  151. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  152. package/.server/server/plugins/engine/i18n/translations/cy.json +192 -9
  153. package/.server/server/plugins/engine/i18n/translations/en-GB.json +125 -7
  154. package/.server/server/plugins/engine/i18n/types.d.ts +3 -0
  155. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  156. package/.server/server/plugins/engine/index.d.ts +4 -0
  157. package/.server/server/plugins/engine/index.js +4 -0
  158. package/.server/server/plugins/engine/index.js.map +1 -1
  159. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  160. package/.server/server/plugins/engine/models/FormModel.js +35 -23
  161. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  162. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  163. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  164. package/.server/server/plugins/engine/models/types.d.ts +28 -1
  165. package/.server/server/plugins/engine/models/types.js.map +1 -1
  166. package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
  167. package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
  168. package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
  169. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
  170. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  171. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  172. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  173. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  174. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  175. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  176. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  177. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  178. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  179. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  180. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  181. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  182. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  183. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  184. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  185. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  186. package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
  187. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
  188. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
  189. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
  190. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  191. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
  192. package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
  193. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  194. package/.server/server/plugins/engine/types/enums.d.ts +3 -3
  195. package/.server/server/plugins/engine/types/enums.js +5 -4
  196. package/.server/server/plugins/engine/types/enums.js.map +1 -1
  197. package/.server/server/plugins/engine/types/schema.js +10 -3
  198. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  199. package/.server/server/plugins/engine/types.d.ts +18 -2
  200. package/.server/server/plugins/engine/types.js.map +1 -1
  201. package/.server/server/plugins/engine/unavailable-response.js +5 -2
  202. package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
  203. package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
  204. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  205. package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
  206. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  207. package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
  208. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  209. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  210. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  211. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  212. package/.server/server/plugins/engine/views/unavailable.html +14 -11
  213. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  214. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  215. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  216. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  217. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  218. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  219. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  220. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  221. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  222. package/.server/server/plugins/payment/helper.d.ts +11 -1
  223. package/.server/server/plugins/payment/helper.js +18 -2
  224. package/.server/server/plugins/payment/helper.js.map +1 -1
  225. package/.server/server/plugins/payment/helper.test.js +2 -1
  226. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  227. package/.server/server/plugins/payment/service.d.ts +2 -1
  228. package/.server/server/plugins/payment/service.js +5 -2
  229. package/.server/server/plugins/payment/service.js.map +1 -1
  230. package/.server/server/plugins/payment/service.test.js +7 -3
  231. package/.server/server/plugins/payment/service.test.js.map +1 -1
  232. package/.server/server/plugins/payment/types.d.ts +4 -0
  233. package/.server/server/plugins/payment/types.js +1 -0
  234. package/.server/server/plugins/payment/types.js.map +1 -1
  235. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  236. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  237. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  238. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  239. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  240. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  241. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  242. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  243. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  244. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  245. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  246. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  247. package/.server/server/utils/type-utils.d.ts +1 -2
  248. package/.server/server/utils/type-utils.js +0 -3
  249. package/.server/server/utils/type-utils.js.map +1 -1
  250. package/.server/server/utils/utils.d.ts +6 -0
  251. package/.server/server/utils/utils.js +18 -1
  252. package/.server/server/utils/utils.js.map +1 -1
  253. package/.server/server/utils/utils.test.js +21 -1
  254. package/.server/server/utils/utils.test.js.map +1 -1
  255. package/package.json +20 -5
  256. package/src/client/javascripts/file-upload.js +11 -3
  257. package/src/client/javascripts/geospatial-map.js +176 -81
  258. package/src/client/javascripts/govuk.js +2 -0
  259. package/src/client/javascripts/location-map.js +60 -4
  260. package/src/client/javascripts/map-constants.js +3 -0
  261. package/src/client/javascripts/map.js +47 -0
  262. package/src/client/javascripts/maps.js +5 -0
  263. package/src/client/javascripts/shared.js +1 -4
  264. package/src/client/javascripts/sssi-dataset.js +39 -41
  265. package/src/client/stylesheets/maps.scss +4 -0
  266. package/src/client/stylesheets/shared.scss +1 -5
  267. package/src/server/constants.js +2 -0
  268. package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
  269. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  270. package/src/server/plugins/engine/components/CheckboxesField.ts +38 -5
  271. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  272. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  273. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  274. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  275. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  276. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  277. package/src/server/plugins/engine/components/FileUploadField.ts +44 -3
  278. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  279. package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
  280. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  281. package/src/server/plugins/engine/components/LocationFieldBase.ts +30 -7
  282. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
  283. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  284. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  285. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  286. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  287. package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
  288. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  289. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  290. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  291. package/src/server/plugins/engine/components/helpers/components.ts +3 -3
  292. package/src/server/plugins/engine/components/helpers/geospatial.ts +84 -21
  293. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  294. package/src/server/plugins/engine/components/types.ts +1 -0
  295. package/src/server/plugins/engine/errors.ts +78 -0
  296. package/src/server/plugins/engine/form-availability.ts +8 -2
  297. package/src/server/plugins/engine/form-context.ts +4 -2
  298. package/src/server/plugins/engine/helpers.ts +52 -5
  299. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
  300. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  301. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  302. package/src/server/plugins/engine/i18n/form.ts +54 -0
  303. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  304. package/src/server/plugins/engine/i18n/translations/cy.json +192 -9
  305. package/src/server/plugins/engine/i18n/translations/en-GB.json +125 -7
  306. package/src/server/plugins/engine/i18n/types.ts +3 -0
  307. package/src/server/plugins/engine/index.ts +7 -0
  308. package/src/server/plugins/engine/models/FormModel.ts +46 -23
  309. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  310. package/src/server/plugins/engine/models/types.ts +31 -0
  311. package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
  312. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
  313. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  314. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  315. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  316. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  317. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  318. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  319. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
  320. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
  321. package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
  322. package/src/server/plugins/engine/types/enums.ts +4 -3
  323. package/src/server/plugins/engine/types/schema.ts +17 -4
  324. package/src/server/plugins/engine/types.ts +19 -1
  325. package/src/server/plugins/engine/unavailable-response.ts +6 -2
  326. package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
  327. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  328. package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
  329. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  330. package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
  331. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  332. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  333. package/src/server/plugins/engine/views/file-upload.html +1 -1
  334. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  335. package/src/server/plugins/engine/views/unavailable.html +14 -11
  336. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  337. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  338. package/src/server/plugins/payment/helper.js +22 -2
  339. package/src/server/plugins/payment/service.js +6 -2
  340. package/src/server/plugins/payment/types.js +1 -0
  341. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  342. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  343. package/src/server/plugins/postcode-lookup/types.js +6 -1
  344. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  345. package/src/server/utils/type-utils.ts +1 -11
  346. package/src/server/utils/utils.js +19 -1
@@ -12,7 +12,10 @@ import {
12
12
  getLocationFieldViewModel
13
13
  } from './LocationFieldHelpers.js'
14
14
  import { NumberField } from './NumberField.js'
15
- import { createLowerFirstExpression } from './helpers/index.js'
15
+ import {
16
+ createLowerFirstExpression,
17
+ getTranslatedLabel
18
+ } from './helpers/index.js'
16
19
  import {
17
20
  type LatLongState,
18
21
  type RenderContext
@@ -28,7 +31,6 @@ import {
28
31
  type FormSubmissionError,
29
32
  type FormSubmissionState
30
33
  } from '../types.js'
31
- import { convertToLanguageMessages } from '../../../utils/type-utils.js'
32
34
 
33
35
  // Precision constants
34
36
  // UK latitude/longitude requires high precision for accurate location (within ~11mm)
@@ -50,59 +52,18 @@ export class LatLongField extends FormComponent {
50
52
 
51
53
  const isRequired = options.required !== false
52
54
 
53
- // Read schema values from def.schema with fallback defaults
54
- const latitudeMin = schema?.latitude?.min ?? 49.85
55
- const latitudeMax = schema?.latitude?.max ?? 60.859
56
- const longitudeMin = schema?.longitude?.min ?? -13.687
57
- const longitudeMax = schema?.longitude?.max ?? 1.767
58
-
59
- const fieldLabel = lowerFirst(this.label)
60
-
61
- const customValidationMessages: LanguageMessages =
62
- convertToLanguageMessages({
63
- 'number.precision': tPlugin(
64
- 'components.latLongField.precision',
65
- 'en-GB'
66
- ),
67
- 'number.unsafe': tPlugin('components.latLongField.notANumber', 'en-GB')
68
- })
69
-
70
- const latitudeRangeMessage = tPlugin(
71
- 'components.latLongField.latitudeRange',
72
- 'en-GB',
73
- { fieldLabel, min: latitudeMin, max: latitudeMax }
74
- )
75
- const longitudeRangeMessage = tPlugin(
76
- 'components.latLongField.longitudeRange',
77
- 'en-GB',
78
- { fieldLabel, min: longitudeMin, max: longitudeMax }
79
- )
80
-
81
- const latitudeMessages: LanguageMessages = convertToLanguageMessages({
82
- ...customValidationMessages,
83
- 'any.required': tPlugin(
84
- 'components.latLongField.latitudeRequired',
85
- 'en-GB'
86
- ),
87
- 'number.base': tPlugin('components.latLongField.latitudeBase', 'en-GB', {
88
- fieldLabel
89
- }),
90
- 'number.min': latitudeRangeMessage,
91
- 'number.max': latitudeRangeMessage
92
- })
55
+ const { latitudeMin, latitudeMax, longitudeMin, longitudeMax } =
56
+ LatLongField.getMinMax(schema)
93
57
 
94
- const longitudeMessages: LanguageMessages = convertToLanguageMessages({
95
- ...customValidationMessages,
96
- 'any.required': tPlugin(
97
- 'components.latLongField.longitudeRequired',
58
+ const { latitudeMessages, longitudeMessages } =
59
+ LatLongField.buildErrorMessages(
60
+ this.label,
61
+ latitudeMin,
62
+ latitudeMax,
63
+ longitudeMin,
64
+ longitudeMax,
98
65
  'en-GB'
99
- ),
100
- 'number.base': tPlugin('components.latLongField.longitudeBase', 'en-GB', {
101
- fieldLabel
102
- }),
103
- 'number.min': longitudeRangeMessage,
104
- 'number.max': longitudeRangeMessage
105
- })
66
+ )
106
67
 
107
68
  this.collection = new ComponentCollection(
108
69
  [
@@ -159,14 +120,16 @@ export class LatLongField extends FormComponent {
159
120
 
160
121
  getDisplayStringFromFormValue(
161
122
  value: LatLongState | undefined,
162
- _translator: Translator
123
+ translator: Translator
163
124
  ): string {
164
125
  if (!value) {
165
126
  return ''
166
127
  }
167
128
 
168
- // CYA page format: <<latvalue, langvalue>>
169
- return `${value.latitude}, ${value.longitude}`
129
+ const { t } = translator
130
+
131
+ // Output format: Latitude: <<entry>>\nLongitude: <<entry>>
132
+ return `${t('components.latLongField.latitude')}: ${value.latitude}\n${t('components.latLongField.longitude')}: ${value.longitude}`
170
133
  }
171
134
 
172
135
  getDisplayStringFromState(
@@ -183,8 +146,7 @@ export class LatLongField extends FormComponent {
183
146
  return null
184
147
  }
185
148
 
186
- // Output format: Latitude: <<entry>>\nLongitude: <<entry>>
187
- return `Latitude: ${value.latitude}\nLongitude: ${value.longitude}`
149
+ return `${value.latitude}, ${value.longitude}`
188
150
  }
189
151
 
190
152
  getContextValueFromState(state: FormSubmissionState) {
@@ -210,6 +172,26 @@ export class LatLongField extends FormComponent {
210
172
  return LatLongField.isLatLong(value)
211
173
  }
212
174
 
175
+ getValidationMessagesOverride(translator: Translator) {
176
+ const def = this.def as LatLongFieldComponent
177
+ const translatedLabel = getTranslatedLabel(def, translator)
178
+ const { latitudeMin, latitudeMax, longitudeMin, longitudeMax } =
179
+ LatLongField.getMinMax(def.schema)
180
+ const { latitudeMessages, longitudeMessages } =
181
+ LatLongField.buildErrorMessages(
182
+ translatedLabel,
183
+ latitudeMin,
184
+ latitudeMax,
185
+ longitudeMin,
186
+ longitudeMax,
187
+ translator.language
188
+ )
189
+ return {
190
+ [`${this.name}__latitude`]: latitudeMessages,
191
+ [`${this.name}__longitude`]: longitudeMessages
192
+ }
193
+ }
194
+
213
195
  /**
214
196
  * For error preview page that shows all possible errors on a component
215
197
  */
@@ -273,4 +255,92 @@ export class LatLongField extends FormComponent {
273
255
  NumberField.isNumber(value.longitude)
274
256
  )
275
257
  }
258
+
259
+ static buildErrorMessages(
260
+ label: string,
261
+ latitudeMin: number,
262
+ latitudeMax: number,
263
+ longitudeMin: number,
264
+ longitudeMax: number,
265
+ language: string
266
+ ) {
267
+ const fieldLabel = lowerFirst(label)
268
+
269
+ const customValidationMessages: LanguageMessages = {
270
+ 'number.precision': tPlugin(
271
+ 'components.latLongField.precision',
272
+ language
273
+ ),
274
+ 'number.unsafe': tPlugin('components.latLongField.notANumber', language)
275
+ }
276
+
277
+ const latitudeRangeMessage = tPlugin(
278
+ 'components.latLongField.latitudeRange',
279
+ language,
280
+ { fieldLabel, min: latitudeMin, max: latitudeMax }
281
+ )
282
+ const longitudeRangeMessage = tPlugin(
283
+ 'components.latLongField.longitudeRange',
284
+ language,
285
+ { fieldLabel, min: longitudeMin, max: longitudeMax }
286
+ )
287
+
288
+ const latitudeMessages: LanguageMessages = {
289
+ ...customValidationMessages,
290
+ 'any.required': tPlugin(
291
+ 'components.latLongField.latitudeRequired',
292
+ language
293
+ ),
294
+ 'number.base': tPlugin('components.latLongField.latitudeBase', language, {
295
+ fieldLabel
296
+ }),
297
+ 'number.min': latitudeRangeMessage,
298
+ 'number.max': latitudeRangeMessage
299
+ }
300
+
301
+ const longitudeMessages: LanguageMessages = {
302
+ ...customValidationMessages,
303
+ 'any.required': tPlugin(
304
+ 'components.latLongField.longitudeRequired',
305
+ language
306
+ ),
307
+ 'number.base': tPlugin(
308
+ 'components.latLongField.longitudeBase',
309
+ language,
310
+ {
311
+ fieldLabel
312
+ }
313
+ ),
314
+ 'number.min': longitudeRangeMessage,
315
+ 'number.max': longitudeRangeMessage
316
+ }
317
+
318
+ return {
319
+ latitudeMessages,
320
+ longitudeMessages
321
+ }
322
+ }
323
+
324
+ // Read schema values from def.schema with fallback defaults
325
+ static getMinMax(
326
+ schema:
327
+ | {
328
+ latitude?: {
329
+ min?: number
330
+ max?: number
331
+ }
332
+ longitude?: {
333
+ min?: number
334
+ max?: number
335
+ }
336
+ }
337
+ | undefined
338
+ ) {
339
+ return {
340
+ latitudeMin: schema?.latitude?.min ?? 49.85,
341
+ latitudeMax: schema?.latitude?.max ?? 60.859,
342
+ longitudeMin: schema?.longitude?.min ?? -13.687,
343
+ longitudeMax: schema?.longitude?.max ?? 1.767
344
+ }
345
+ }
276
346
  }
@@ -11,14 +11,15 @@ import {
11
11
  } from './FormComponent.js'
12
12
  import { addClassOptionIfNone } from './helpers/index.js'
13
13
  import { type RenderContext } from './types.js'
14
+ import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
14
15
  import { messageTemplate } from '../pageControllers/validationOptions.js'
16
+ import { type Translator } from '../types/index.js'
15
17
  import {
16
18
  type ErrorMessageTemplateList,
17
19
  type FormState,
18
20
  type FormStateValue,
19
21
  type FormSubmissionState
20
22
  } from '../types.js'
21
- import { convertToLanguageMessages } from '../../../utils/type-utils.js'
22
23
 
23
24
  interface LocationFieldOptions {
24
25
  instructionText?: string
@@ -43,7 +44,9 @@ export abstract class LocationFieldBase extends FormComponent {
43
44
  declare stateSchema: StringSchema
44
45
  instructionText?: string
45
46
 
46
- protected abstract getValidationConfig(): ValidationConfig
47
+ protected abstract getValidationConfig(
48
+ translator: Translator | undefined
49
+ ): ValidationConfig
47
50
  protected abstract getErrorTemplates(): {
48
51
  type: string
49
52
  template: JoiExpression
@@ -61,14 +64,14 @@ export abstract class LocationFieldBase extends FormComponent {
61
64
 
62
65
  addClassOptionIfNone(locationOptions, 'govuk-input--width-10')
63
66
 
64
- const config = this.getValidationConfig()
67
+ const config = this.getValidationConfig(undefined)
65
68
  const requiredMessage = config.requiredMessage ?? messageTemplate.required
66
69
 
67
- const messages = convertToLanguageMessages({
70
+ const messages = {
68
71
  'any.required': requiredMessage,
69
72
  'string.empty': requiredMessage,
70
73
  'string.pattern.base': config.patternErrorMessage
71
- })
74
+ } as LanguageMessages
72
75
 
73
76
  let formSchema = joi
74
77
  .string()
@@ -121,18 +124,38 @@ export abstract class LocationFieldBase extends FormComponent {
121
124
  getViewModel(context: RenderContext) {
122
125
  const viewModel = super.getViewModel(context)
123
126
 
127
+ Object.assign(viewModel, {
128
+ lang: context.translator.language
129
+ })
130
+
124
131
  if (this.instructionText) {
132
+ const { tComponent } = context.translator
125
133
  return {
126
134
  ...viewModel,
127
- instructionText: this.instructionText
135
+ instructionText:
136
+ tComponent(this.def, 'instructionText') || this.instructionText
128
137
  }
129
138
  }
130
139
 
131
140
  return viewModel
132
141
  }
133
142
 
143
+ getValidationMessagesOverride(translator: Translator) {
144
+ const { t } = translator
145
+ const config = this.getValidationConfig(translator)
146
+ return {
147
+ [this.name]: {
148
+ 'any.required':
149
+ config.requiredMessage ?? buildValidationMessages(t).objectRequired,
150
+ 'string.empty':
151
+ config.requiredMessage ?? buildValidationMessages(t).objectRequired,
152
+ 'string.pattern.base': config.patternErrorMessage
153
+ } as LanguageMessages
154
+ }
155
+ }
156
+
134
157
  getAllPossibleErrors(): ErrorMessageTemplateList {
135
- const config = this.getValidationConfig()
158
+ const config = this.getValidationConfig(undefined)
136
159
 
137
160
  return {
138
161
  baseErrors: [
@@ -1,6 +1,6 @@
1
1
  import { type Context, type CustomValidator } from 'joi'
2
2
 
3
- import { type EastingNorthingField } from './EastingNorthingField.js'
3
+ import { EastingNorthingField } from './EastingNorthingField.js'
4
4
  import { isFormValue } from './FormComponent.js'
5
5
  import { type GeospatialField } from './GeospatialField.js'
6
6
  import { type LatLongField } from './LatLongField.js'
@@ -11,6 +11,7 @@ import {
11
11
  type RenderContext,
12
12
  type ViewModel
13
13
  } from './types.js'
14
+ import { type Translator } from '../i18n/types.js'
14
15
  import {
15
16
  type FormPayload,
16
17
  type FormSubmissionError,
@@ -29,25 +30,25 @@ export type LocationField =
29
30
  * - "latitude must be..." -> "latitude must be..."
30
31
  */
31
32
  function lowercaseMessageStart(message: string): string {
32
- if (message.startsWith('Enter ')) {
33
- return 'enter' + message.slice(5)
34
- }
35
-
36
- // Lowercase first character for any other message
33
+ // Lowercase first character for a message
37
34
  return message.charAt(0).toLowerCase() + message.slice(1)
38
35
  }
39
36
 
40
- export function joinWithAnd(items: string[]): string {
37
+ export function joinWithAnd(items: string[], translator: Translator): string {
38
+ const { t } = translator
41
39
  if (items.length === 2) {
42
- return `${items[0]} and ${items[1]}`
40
+ return `${items[0]} ${t('common.and')} ${items[1]}`
43
41
  }
44
42
 
45
43
  const leading = items.slice(0, -1).join(', ')
46
44
  const last = items[items.length - 1]
47
- return `${leading} and ${last}`
45
+ return `${leading} ${t('common.and')} ${last}`
48
46
  }
49
47
 
50
- export function formatErrorList(messages: string[]): string {
48
+ export function formatErrorList(
49
+ messages: string[],
50
+ translator: Translator
51
+ ): string {
51
52
  if (!messages.length) {
52
53
  return ''
53
54
  }
@@ -60,7 +61,7 @@ export function formatErrorList(messages: string[]): string {
60
61
  index === 0 ? msg : lowercaseMessageStart(msg)
61
62
  )
62
63
 
63
- return joinWithAnd(formattedMessages)
64
+ return joinWithAnd(formattedMessages, translator)
64
65
  }
65
66
 
66
67
  export function mergeCssClasses(...classNames: (string | undefined)[]) {
@@ -172,7 +173,9 @@ export function getLocationFieldViewModel(
172
173
  if (hasFieldErrors) {
173
174
  viewModel.errorMessage = {
174
175
  text:
175
- fieldErrors.length === 1 ? fieldErrors[0] : formatErrorList(fieldErrors)
176
+ fieldErrors.length === 1
177
+ ? fieldErrors[0]
178
+ : formatErrorList(fieldErrors, context.translator)
176
179
  }
177
180
  }
178
181
 
@@ -187,13 +190,24 @@ export function getLocationFieldViewModel(
187
190
  ...viewModel,
188
191
  fieldset,
189
192
  items,
190
- mapLayers: getMapLayers(component)
193
+ mapLayers: getMapLayers(component),
194
+ country:
195
+ component instanceof EastingNorthingField
196
+ ? component.options.countries?.at(0)
197
+ : undefined,
198
+ lang: context.translator.language
191
199
  }
192
200
 
193
201
  if (component.options.instructionText) {
202
+ const { t, tComponent } = context.translator
203
+
194
204
  return {
195
205
  ...result,
196
- instructionText: component.options.instructionText
206
+ instructionSummary: t('components.locationFieldBase.howToFind'),
207
+ instructionText:
208
+ tComponent(component.def, 'instructionText') ||
209
+ component.options.instructionText,
210
+ t
197
211
  }
198
212
  }
199
213
 
@@ -1,4 +1,4 @@
1
- import { type ComponentDef, type MarkdownComponent } from '@defra/forms-model'
1
+ import { type MarkdownComponent } from '@defra/forms-model'
2
2
 
3
3
  import { ComponentBase } from './ComponentBase.js'
4
4
  import { type RenderContext } from './types.js'
@@ -28,8 +28,7 @@ export class Markdown extends ComponentBase {
28
28
 
29
29
  return {
30
30
  ...viewModel,
31
- content:
32
- tComponent(this as unknown as ComponentDef, 'content') || content,
31
+ content: tComponent(this.def, 'content') || content,
33
32
  headerStartLevel: this.headerStartLevel
34
33
  }
35
34
  }
@@ -30,7 +30,7 @@ import {
30
30
  type FormStateValue,
31
31
  type FormSubmissionState
32
32
  } from '../types.js'
33
- import { convertToLanguageMessages } from '../../../utils/type-utils.js'
33
+ import { formatDateForLanguage } from '../../payment/helper.js'
34
34
 
35
35
  export class MonthYearField extends FormComponent {
36
36
  declare options: MonthYearFieldComponent['options']
@@ -48,16 +48,15 @@ export class MonthYearField extends FormComponent {
48
48
 
49
49
  const isRequired = options.required !== false
50
50
 
51
- const customValidationMessages: LanguageMessages =
52
- convertToLanguageMessages({
53
- 'any.required': messageTemplate.objectMissing,
54
- 'number.base': messageTemplate.objectMissing,
55
- 'number.precision': messageTemplate.dateFormat,
56
- 'number.integer': messageTemplate.dateFormat,
57
- 'number.unsafe': messageTemplate.dateFormat,
58
- 'number.min': messageTemplate.dateFormat,
59
- 'number.max': messageTemplate.dateFormat
60
- })
51
+ const customValidationMessages = {
52
+ 'any.required': messageTemplate.objectMissing,
53
+ 'number.base': messageTemplate.objectMissing,
54
+ 'number.precision': messageTemplate.dateFormat,
55
+ 'number.integer': messageTemplate.dateFormat,
56
+ 'number.unsafe': messageTemplate.dateFormat,
57
+ 'number.min': messageTemplate.dateFormat,
58
+ 'number.max': messageTemplate.dateFormat
59
+ } as LanguageMessages
61
60
 
62
61
  this.collection = new ComponentCollection(
63
62
  [
@@ -105,16 +104,18 @@ export class MonthYearField extends FormComponent {
105
104
 
106
105
  getDisplayStringFromFormValue(
107
106
  value: MonthYearState | undefined,
108
- _translator: Translator
107
+ translator: Translator
109
108
  ): string {
110
109
  if (!value) {
111
110
  return ''
112
111
  }
113
112
 
114
113
  const date = new Date()
114
+ // Force to first day of month in case current date was say 31st and specified month has fewer than 31 days
115
+ date.setDate(1)
115
116
  date.setMonth(value.month - 1)
116
117
 
117
- const monthString = date.toLocaleString('default', { month: 'long' })
118
+ const monthString = formatDateForLanguage(date, 'LLLL', translator.language)
118
119
  return `${monthString} ${value.year}`
119
120
  }
120
121
 
@@ -155,7 +156,7 @@ export class MonthYearField extends FormComponent {
155
156
 
156
157
  getValidationMessagesOverride(translator: Translator) {
157
158
  const { t } = translator
158
- return convertToLanguageMessages({
159
+ const messages = {
159
160
  'any.required': buildValidationMessages(t).objectMissing,
160
161
  'number.base': buildValidationMessages(t).objectMissing,
161
162
  'number.precision': buildValidationMessages(t).dateFormat,
@@ -163,7 +164,11 @@ export class MonthYearField extends FormComponent {
163
164
  'number.unsafe': buildValidationMessages(t).dateFormat,
164
165
  'number.min': buildValidationMessages(t).dateFormat,
165
166
  'number.max': buildValidationMessages(t).dateFormat
166
- })
167
+ } as LanguageMessages
168
+ return {
169
+ [`${this.name}__month`]: messages,
170
+ [`${this.name}__year`]: messages
171
+ }
167
172
  }
168
173
 
169
174
  getViewModel(context: RenderContext) {
@@ -1,14 +1,16 @@
1
1
  import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'
2
2
 
3
+ import { EN_GB } from '../../../constants.js'
3
4
  import { LocationFieldBase } from './LocationFieldBase.js'
4
5
  import { createLowerFirstExpression } from './helpers/index.js'
5
6
  import { t } from '../i18n/index.js'
7
+ import { type Translator } from '../i18n/types.js'
6
8
  import { type ErrorMessageTemplateList } from '../types.js'
7
9
 
8
10
  export class NationalGridFieldNumberField extends LocationFieldBase {
9
11
  declare options: NationalGridFieldNumberFieldComponent['options']
10
12
 
11
- protected getValidationConfig() {
13
+ protected getValidationConfig(translator: Translator | undefined) {
12
14
  // Regex for OS national grid field references (NGFR)
13
15
  // Validates specific valid OS grid letter combinations with:
14
16
  // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789
@@ -18,10 +20,14 @@ export class NationalGridFieldNumberField extends LocationFieldBase {
18
20
  return {
19
21
  pattern,
20
22
  patternErrorMessage: createLowerFirstExpression(
21
- t('components.nationalGridField.pattern', 'en-GB')
23
+ translator
24
+ ? translator.t('components.nationalGridField.pattern')
25
+ : t('components.nationalGridField.pattern', EN_GB)
22
26
  ),
23
27
  requiredMessage: createLowerFirstExpression(
24
- t('components.nationalGridField.required', 'en-GB')
28
+ translator
29
+ ? translator.t('components.nationalGridField.required')
30
+ : t('components.nationalGridField.required', EN_GB)
25
31
  )
26
32
  }
27
33
  }
@@ -1,12 +1,18 @@
1
1
  import { type NumberFieldComponent } from '@defra/forms-model'
2
- import joi, { type CustomValidator, type NumberSchema } from 'joi'
2
+ import joi, {
3
+ type CustomValidator,
4
+ type LanguageMessages,
5
+ type NumberSchema
6
+ } from 'joi'
3
7
 
4
8
  import {
5
9
  FormComponent,
6
10
  isFormValue
7
11
  } from './FormComponent.js'
8
12
  import { type RenderContext } from './types.js'
13
+ import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
9
14
  import { messageTemplate } from '../pageControllers/validationOptions.js'
15
+ import { type Translator } from '../types/index.js'
10
16
  import {
11
17
  type ErrorMessageTemplateList,
12
18
  type FormState,
@@ -130,6 +136,20 @@ export class NumberField extends FormComponent {
130
136
  return NumberField.isNumber(value)
131
137
  }
132
138
 
139
+ getValidationMessagesOverride(translator: Translator) {
140
+ const { t } = translator
141
+ return {
142
+ [this.name]: {
143
+ 'any.required': buildValidationMessages(t).objectRequired,
144
+ 'number.base': buildValidationMessages(t).objectMissing,
145
+ 'number.precision': buildValidationMessages(t).numberPrecision,
146
+ 'number.integer': buildValidationMessages(t).numberInteger,
147
+ 'number.min': buildValidationMessages(t).numberMin,
148
+ 'number.max': buildValidationMessages(t).numberMax
149
+ } as LanguageMessages
150
+ }
151
+ }
152
+
133
153
  /**
134
154
  * For error preview page that shows all possible errors on a component
135
155
  */
@@ -1,14 +1,29 @@
1
1
  import { type OsGridRefFieldComponent } from '@defra/forms-model'
2
2
 
3
+ import { EN_GB } from '../../../constants.js'
3
4
  import { LocationFieldBase } from './LocationFieldBase.js'
5
+ import { getMapLayers } from './LocationFieldHelpers.js'
4
6
  import { createLowerFirstExpression } from './helpers/index.js'
7
+ import { type RenderContext } from './types.js'
5
8
  import { t } from '../i18n/index.js'
9
+ import { type Translator } from '../types/index.js'
6
10
  import { type ErrorMessageTemplateList } from '../types.js'
7
11
 
8
12
  export class OsGridRefField extends LocationFieldBase {
9
13
  declare options: OsGridRefFieldComponent['options']
10
14
 
11
- protected getValidationConfig() {
15
+ getViewModel(context: RenderContext) {
16
+ const viewModel = super.getViewModel(context)
17
+
18
+ Object.assign(viewModel, {
19
+ lang: context.translator.language,
20
+ mapLayers: getMapLayers(this)
21
+ })
22
+
23
+ return viewModel
24
+ }
25
+
26
+ protected getValidationConfig(translator: Translator | undefined) {
12
27
  // Regex for OS national grid references (NGR)
13
28
  // Validates specific valid OS grid letter combinations with:
14
29
  // - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678
@@ -21,10 +36,14 @@ export class OsGridRefField extends LocationFieldBase {
21
36
  return {
22
37
  pattern,
23
38
  patternErrorMessage: createLowerFirstExpression(
24
- t('components.osGridRefField.pattern', 'en-GB')
39
+ translator
40
+ ? translator.t('components.osGridRefField.pattern')
41
+ : t('components.osGridRefField.pattern', EN_GB)
25
42
  ),
26
43
  requiredMessage: createLowerFirstExpression(
27
- t('components.osGridRefField.required', 'en-GB')
44
+ translator
45
+ ? translator.t('components.osGridRefField.required')
46
+ : t('components.osGridRefField.required', EN_GB)
28
47
  )
29
48
  }
30
49
  }