@defra/forms-engine-plugin 5.0.0-alpha → 5.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/.public/assets-manifest.json +3 -5
  2. package/.public/javascripts/application.min.js +1 -1
  3. package/.public/javascripts/application.min.js.map +1 -1
  4. package/.public/javascripts/im-core.min.js +2 -0
  5. package/.public/javascripts/im-core.min.js.map +1 -0
  6. package/.public/javascripts/shared.min.js +1 -1
  7. package/.public/javascripts/shared.min.js.map +1 -1
  8. package/.public/javascripts/vendor/@defra.min.js +1 -1
  9. package/.public/javascripts/vendor/@defra.min.js.map +1 -1
  10. package/.public/stylesheets/application.min.css +1 -1
  11. package/.public/stylesheets/application.min.css.map +1 -1
  12. package/.server/client/javascripts/file-upload.js +5 -3
  13. package/.server/client/javascripts/file-upload.js.map +1 -1
  14. package/.server/client/javascripts/geospatial-map.js +36 -29
  15. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  16. package/.server/client/javascripts/location-map.js +16 -1
  17. package/.server/client/javascripts/location-map.js.map +1 -1
  18. package/.server/client/javascripts/map.d.ts +6 -0
  19. package/.server/client/javascripts/map.js +10 -0
  20. package/.server/client/javascripts/map.js.map +1 -1
  21. package/.server/client/javascripts/maps.d.ts +5 -0
  22. package/.server/client/javascripts/maps.js +6 -0
  23. package/.server/client/javascripts/maps.js.map +1 -0
  24. package/.server/client/javascripts/shared.d.ts +1 -3
  25. package/.server/client/javascripts/shared.js +1 -3
  26. package/.server/client/javascripts/shared.js.map +1 -1
  27. package/.server/client/javascripts/sssi-dataset.d.ts +32 -0
  28. package/.server/client/javascripts/sssi-dataset.js +99 -0
  29. package/.server/client/javascripts/sssi-dataset.js.map +1 -0
  30. package/.server/client/stylesheets/maps.scss +4 -0
  31. package/.server/client/stylesheets/shared.scss +1 -7
  32. package/.server/server/constants.d.ts +2 -0
  33. package/.server/server/constants.js +2 -0
  34. package/.server/server/constants.js.map +1 -1
  35. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  36. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  37. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  38. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +4 -1
  39. package/.server/server/plugins/engine/components/CheckboxesField.js +13 -0
  40. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  41. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  42. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  43. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  44. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  45. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  46. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  47. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  48. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  49. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  50. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  51. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  52. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  53. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +28 -2
  54. package/.server/server/plugins/engine/components/EastingNorthingField.js +93 -54
  55. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  56. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  57. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  58. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  59. package/.server/server/plugins/engine/components/FileUploadField.d.ts +12 -0
  60. package/.server/server/plugins/engine/components/FileUploadField.js +20 -2
  61. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  62. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  63. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  64. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  65. package/.server/server/plugins/engine/components/GeospatialField.d.ts +2 -0
  66. package/.server/server/plugins/engine/components/GeospatialField.js +3 -1
  67. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  69. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  70. package/.server/server/plugins/engine/components/LatLongField.d.ts +28 -2
  71. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  72. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  73. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  74. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  75. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  76. package/.server/server/plugins/engine/components/LocationFieldBase.js +18 -5
  77. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  78. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +10 -2
  79. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +22 -12
  80. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  81. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  82. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  83. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  84. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  85. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  86. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  87. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  89. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  90. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  91. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  92. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  93. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  94. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  95. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  96. package/.server/server/plugins/engine/components/OsGridRefField.js +4 -3
  97. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  98. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  99. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  100. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  101. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  103. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  104. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  105. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  106. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  108. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  109. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  110. package/.server/server/plugins/engine/components/helpers/components.js +1 -2
  111. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  112. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  113. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  114. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  115. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  116. package/.server/server/plugins/engine/components/types.js.map +1 -1
  117. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  118. package/.server/server/plugins/engine/helpers.js +44 -5
  119. package/.server/server/plugins/engine/helpers.js.map +1 -1
  120. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +3 -0
  121. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +10 -7
  122. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  123. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  124. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  125. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  126. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  127. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  128. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  129. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  130. package/.server/server/plugins/engine/i18n/form.js +35 -0
  131. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  132. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  133. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  134. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  135. package/.server/server/plugins/engine/i18n/translations/cy.json +73 -6
  136. package/.server/server/plugins/engine/i18n/translations/en-GB.json +43 -4
  137. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  138. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  139. package/.server/server/plugins/engine/index.d.ts +4 -0
  140. package/.server/server/plugins/engine/index.js +4 -0
  141. package/.server/server/plugins/engine/index.js.map +1 -1
  142. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  143. package/.server/server/plugins/engine/models/FormModel.js +9 -15
  144. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  145. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  146. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  147. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
  148. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  149. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  150. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  151. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  152. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  153. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  154. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +1 -1
  155. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +22 -9
  156. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  157. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  158. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  159. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  160. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  161. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  162. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  163. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  164. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  165. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
  166. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  167. package/.server/server/plugins/engine/pageControllers/validationOptions.js +23 -2
  168. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  169. package/.server/server/plugins/engine/types/schema.js +1 -0
  170. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  171. package/.server/server/plugins/engine/types.d.ts +1 -0
  172. package/.server/server/plugins/engine/types.js.map +1 -1
  173. package/.server/server/plugins/engine/views/components/_location-field-base.html +3 -1
  174. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  175. package/.server/server/plugins/engine/views/components/geospatialfield.html +4 -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/partials/preview-banner.html +3 -1
  180. package/.server/server/plugins/map/routes/index.js +1 -1
  181. package/.server/server/plugins/map/routes/index.js.map +1 -1
  182. package/.server/server/plugins/map/types.d.ts +1 -25
  183. package/.server/server/plugins/map/types.js +1 -16
  184. package/.server/server/plugins/map/types.js.map +1 -1
  185. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  186. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  187. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  188. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  189. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  190. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  191. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  192. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  193. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  194. package/.server/server/plugins/payment/helper.d.ts +11 -1
  195. package/.server/server/plugins/payment/helper.js +18 -2
  196. package/.server/server/plugins/payment/helper.js.map +1 -1
  197. package/.server/server/plugins/payment/helper.test.js +2 -1
  198. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  199. package/.server/server/plugins/payment/service.d.ts +2 -1
  200. package/.server/server/plugins/payment/service.js +5 -2
  201. package/.server/server/plugins/payment/service.js.map +1 -1
  202. package/.server/server/plugins/payment/service.test.js +7 -3
  203. package/.server/server/plugins/payment/service.test.js.map +1 -1
  204. package/.server/server/plugins/payment/types.d.ts +4 -0
  205. package/.server/server/plugins/payment/types.js +1 -0
  206. package/.server/server/plugins/payment/types.js.map +1 -1
  207. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  208. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  209. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  210. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  211. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  212. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  213. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  214. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  215. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  216. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  217. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  218. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  219. package/.server/server/utils/type-utils.d.ts +1 -2
  220. package/.server/server/utils/type-utils.js +0 -3
  221. package/.server/server/utils/type-utils.js.map +1 -1
  222. package/package.json +9 -3
  223. package/src/client/javascripts/file-upload.js +10 -3
  224. package/src/client/javascripts/geospatial-map.js +38 -32
  225. package/src/client/javascripts/location-map.js +17 -0
  226. package/src/client/javascripts/map.js +10 -0
  227. package/src/client/javascripts/maps.js +5 -0
  228. package/src/client/javascripts/shared.js +1 -3
  229. package/src/client/javascripts/sssi-dataset.js +104 -0
  230. package/src/client/stylesheets/maps.scss +4 -0
  231. package/src/client/stylesheets/shared.scss +1 -7
  232. package/src/server/constants.js +2 -0
  233. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  234. package/src/server/plugins/engine/components/CheckboxesField.ts +13 -1
  235. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  236. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  237. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  238. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  239. package/src/server/plugins/engine/components/EastingNorthingField.ts +154 -89
  240. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  241. package/src/server/plugins/engine/components/FileUploadField.ts +21 -2
  242. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  243. package/src/server/plugins/engine/components/GeospatialField.ts +8 -1
  244. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  245. package/src/server/plugins/engine/components/LocationFieldBase.ts +23 -6
  246. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +35 -12
  247. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  248. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  249. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  250. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  251. package/src/server/plugins/engine/components/OsGridRefField.ts +9 -3
  252. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  253. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  254. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  255. package/src/server/plugins/engine/components/helpers/components.ts +1 -2
  256. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  257. package/src/server/plugins/engine/components/types.ts +1 -0
  258. package/src/server/plugins/engine/helpers.ts +52 -5
  259. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +10 -7
  260. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  261. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  262. package/src/server/plugins/engine/i18n/form.ts +54 -0
  263. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  264. package/src/server/plugins/engine/i18n/translations/cy.json +73 -6
  265. package/src/server/plugins/engine/i18n/translations/en-GB.json +43 -4
  266. package/src/server/plugins/engine/i18n/types.ts +2 -0
  267. package/src/server/plugins/engine/index.ts +7 -0
  268. package/src/server/plugins/engine/models/FormModel.ts +9 -15
  269. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  270. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
  271. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  272. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  273. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +18 -8
  274. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  275. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  276. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  277. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
  278. package/src/server/plugins/engine/pageControllers/validationOptions.ts +27 -2
  279. package/src/server/plugins/engine/types/schema.ts +1 -0
  280. package/src/server/plugins/engine/types.ts +1 -0
  281. package/src/server/plugins/engine/views/components/_location-field-base.html +3 -1
  282. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  283. package/src/server/plugins/engine/views/components/geospatialfield.html +4 -1
  284. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  285. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  286. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  287. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  288. package/src/server/plugins/map/routes/index.js +1 -1
  289. package/src/server/plugins/map/types.js +1 -16
  290. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  291. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  292. package/src/server/plugins/payment/helper.js +22 -2
  293. package/src/server/plugins/payment/service.js +6 -2
  294. package/src/server/plugins/payment/types.js +1 -0
  295. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  296. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  297. package/src/server/plugins/postcode-lookup/types.js +6 -1
  298. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  299. package/src/server/utils/type-utils.ts +1 -11
  300. package/.public/javascripts/im-search-plugin.min.js +0 -2
  301. package/.public/javascripts/im-search-plugin.min.js.map +0 -1
  302. package/.public/javascripts/vendor/preact.min.js +0 -2
  303. package/.public/javascripts/vendor/preact.min.js.map +0 -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()
@@ -131,8 +134,22 @@ export abstract class LocationFieldBase extends FormComponent {
131
134
  return viewModel
132
135
  }
133
136
 
137
+ getValidationMessagesOverride(translator: Translator) {
138
+ const { t } = translator
139
+ const config = this.getValidationConfig(translator)
140
+ return {
141
+ [this.name]: {
142
+ 'any.required':
143
+ config.requiredMessage ?? buildValidationMessages(t).objectRequired,
144
+ 'string.empty':
145
+ config.requiredMessage ?? buildValidationMessages(t).objectRequired,
146
+ 'string.pattern.base': config.patternErrorMessage
147
+ } as LanguageMessages
148
+ }
149
+ }
150
+
134
151
  getAllPossibleErrors(): ErrorMessageTemplateList {
135
- const config = this.getValidationConfig()
152
+ const config = this.getValidationConfig(undefined)
136
153
 
137
154
  return {
138
155
  baseErrors: [
@@ -2,13 +2,16 @@ import { type Context, type CustomValidator } from 'joi'
2
2
 
3
3
  import { type EastingNorthingField } from './EastingNorthingField.js'
4
4
  import { isFormValue } from './FormComponent.js'
5
+ import { type GeospatialField } from './GeospatialField.js'
5
6
  import { type LatLongField } from './LatLongField.js'
7
+ import { type OsGridRefField } from './OsGridRefField.js'
6
8
  import {
7
9
  type DateInputItem,
8
10
  type Label,
9
11
  type RenderContext,
10
12
  type ViewModel
11
13
  } from './types.js'
14
+ import { type Translator } from '../i18n/types.js'
12
15
  import {
13
16
  type FormPayload,
14
17
  type FormSubmissionError,
@@ -27,25 +30,25 @@ export type LocationField =
27
30
  * - "latitude must be..." -> "latitude must be..."
28
31
  */
29
32
  function lowercaseMessageStart(message: string): string {
30
- if (message.startsWith('Enter ')) {
31
- return 'enter' + message.slice(5)
32
- }
33
-
34
- // Lowercase first character for any other message
33
+ // Lowercase first character for a message
35
34
  return message.charAt(0).toLowerCase() + message.slice(1)
36
35
  }
37
36
 
38
- export function joinWithAnd(items: string[]): string {
37
+ export function joinWithAnd(items: string[], translator: Translator): string {
38
+ const { t } = translator
39
39
  if (items.length === 2) {
40
- return `${items[0]} and ${items[1]}`
40
+ return `${items[0]} ${t('common.and')} ${items[1]}`
41
41
  }
42
42
 
43
43
  const leading = items.slice(0, -1).join(', ')
44
44
  const last = items[items.length - 1]
45
- return `${leading} and ${last}`
45
+ return `${leading} ${t('common.and')} ${last}`
46
46
  }
47
47
 
48
- export function formatErrorList(messages: string[]): string {
48
+ export function formatErrorList(
49
+ messages: string[],
50
+ translator: Translator
51
+ ): string {
49
52
  if (!messages.length) {
50
53
  return ''
51
54
  }
@@ -58,7 +61,7 @@ export function formatErrorList(messages: string[]): string {
58
61
  index === 0 ? msg : lowercaseMessageStart(msg)
59
62
  )
60
63
 
61
- return joinWithAnd(formattedMessages)
64
+ return joinWithAnd(formattedMessages, translator)
62
65
  }
63
66
 
64
67
  export function mergeCssClasses(...classNames: (string | undefined)[]) {
@@ -87,6 +90,23 @@ export function deduplicateErrorsByHref(
87
90
  )
88
91
  }
89
92
 
93
+ export function getMapLayers(
94
+ component:
95
+ | GeospatialField
96
+ | OsGridRefField
97
+ | LatLongField
98
+ | EastingNorthingField
99
+ ) {
100
+ const { mapLayers } = component.options
101
+ const layers = []
102
+
103
+ if (mapLayers?.sssi) {
104
+ layers.push('sssi')
105
+ }
106
+
107
+ return layers.join(',')
108
+ }
109
+
90
110
  export function getLocationFieldViewModel(
91
111
  component: LocationField,
92
112
  viewModel: ViewModel & {
@@ -153,7 +173,9 @@ export function getLocationFieldViewModel(
153
173
  if (hasFieldErrors) {
154
174
  viewModel.errorMessage = {
155
175
  text:
156
- fieldErrors.length === 1 ? fieldErrors[0] : formatErrorList(fieldErrors)
176
+ fieldErrors.length === 1
177
+ ? fieldErrors[0]
178
+ : formatErrorList(fieldErrors, context.translator)
157
179
  }
158
180
  }
159
181
 
@@ -167,7 +189,8 @@ export function getLocationFieldViewModel(
167
189
  const result = {
168
190
  ...viewModel,
169
191
  fieldset,
170
- items
192
+ items,
193
+ mapLayers: getMapLayers(component)
171
194
  }
172
195
 
173
196
  if (component.options.instructionText) {
@@ -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,16 @@
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'
4
5
  import { createLowerFirstExpression } from './helpers/index.js'
5
6
  import { t } from '../i18n/index.js'
7
+ import { type Translator } from '../types/index.js'
6
8
  import { type ErrorMessageTemplateList } from '../types.js'
7
9
 
8
10
  export class OsGridRefField extends LocationFieldBase {
9
11
  declare options: OsGridRefFieldComponent['options']
10
12
 
11
- protected getValidationConfig() {
13
+ protected getValidationConfig(translator: Translator | undefined) {
12
14
  // Regex for OS national grid references (NGR)
13
15
  // Validates specific valid OS grid letter combinations with:
14
16
  // - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678
@@ -21,10 +23,14 @@ export class OsGridRefField extends LocationFieldBase {
21
23
  return {
22
24
  pattern,
23
25
  patternErrorMessage: createLowerFirstExpression(
24
- t('components.osGridRefField.pattern', 'en-GB')
26
+ translator
27
+ ? translator.t('components.osGridRefField.pattern')
28
+ : t('components.osGridRefField.pattern', EN_GB)
25
29
  ),
26
30
  requiredMessage: createLowerFirstExpression(
27
- t('components.osGridRefField.required', 'en-GB')
31
+ translator
32
+ ? translator.t('components.osGridRefField.required')
33
+ : t('components.osGridRefField.required', EN_GB)
28
34
  )
29
35
  }
30
36
  }