@defra/forms-engine-plugin 5.0.0-alpha.3 → 5.0.0-alpha.31

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 (406) hide show
  1. package/.public/37c964ca545c240f010a.mjs +2 -0
  2. package/.public/37c964ca545c240f010a.mjs.LICENSE.txt +4 -0
  3. package/.public/assets-manifest.json +3 -0
  4. package/.public/javascripts/application.min.js +1 -1
  5. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/application.min.js.map +1 -1
  7. package/.public/javascripts/shared.min.js +1 -1
  8. package/.public/javascripts/shared.min.js.LICENSE.txt +9 -0
  9. package/.public/javascripts/shared.min.js.map +1 -1
  10. package/.public/javascripts/vendor/@defra.min.js +1 -1
  11. package/.public/javascripts/vendor/@defra.min.js.map +1 -1
  12. package/.public/javascripts/vendor/maplibre-gl.min.js +1 -1
  13. package/.public/javascripts/vendor/maplibre-gl.min.js.LICENSE.txt +3 -3
  14. package/.public/javascripts/vendor/maplibre-gl.min.js.map +1 -1
  15. package/.public/stylesheets/application.min.css +1 -1
  16. package/.public/stylesheets/application.min.css.map +1 -1
  17. package/.server/client/javascripts/file-upload.js +6 -3
  18. package/.server/client/javascripts/file-upload.js.map +1 -1
  19. package/.server/client/javascripts/geospatial-map.d.ts +159 -5
  20. package/.server/client/javascripts/geospatial-map.js +161 -81
  21. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  22. package/.server/client/javascripts/geospatial-map.test.js +152 -0
  23. package/.server/client/javascripts/geospatial-map.test.js.map +1 -0
  24. package/.server/client/javascripts/govuk.js +2 -1
  25. package/.server/client/javascripts/govuk.js.map +1 -1
  26. package/.server/client/javascripts/location-map.d.ts +44 -0
  27. package/.server/client/javascripts/location-map.js +55 -6
  28. package/.server/client/javascripts/location-map.js.map +1 -1
  29. package/.server/client/javascripts/map-constants.d.ts +3 -0
  30. package/.server/client/javascripts/map-constants.js +4 -0
  31. package/.server/client/javascripts/map-constants.js.map +1 -0
  32. package/.server/client/javascripts/map.d.ts +17 -4
  33. package/.server/client/javascripts/map.js +59 -6
  34. package/.server/client/javascripts/map.js.map +1 -1
  35. package/.server/client/javascripts/maps.d.ts +5 -0
  36. package/.server/client/javascripts/maps.js +6 -0
  37. package/.server/client/javascripts/maps.js.map +1 -0
  38. package/.server/client/javascripts/shared.d.ts +1 -4
  39. package/.server/client/javascripts/shared.js +1 -4
  40. package/.server/client/javascripts/shared.js.map +1 -1
  41. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  42. package/.server/client/javascripts/sssi-dataset.js +37 -39
  43. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  44. package/.server/client/stylesheets/maps.scss +4 -0
  45. package/.server/client/stylesheets/shared.scss +1 -5
  46. package/.server/server/constants.d.ts +2 -0
  47. package/.server/server/constants.js +2 -0
  48. package/.server/server/constants.js.map +1 -1
  49. package/.server/server/forms/components.json +8 -0
  50. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
  51. package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
  52. package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
  53. package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
  54. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +8 -3
  55. package/.server/server/plugins/engine/components/AutocompleteField.js +17 -0
  56. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +23 -2
  58. package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
  59. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/ComponentBase.d.ts +2 -1
  61. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  62. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  63. package/.server/server/plugins/engine/components/ComponentCollection.js +12 -7
  64. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  65. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  66. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  67. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/DeclarationField.d.ts +6 -3
  69. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  70. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  71. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  72. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
  73. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  74. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  75. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  76. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  77. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  78. package/.server/server/plugins/engine/components/FileUploadField.d.ts +23 -2
  79. package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
  80. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  81. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  82. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  83. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  84. package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
  85. package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
  86. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  87. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  89. package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
  90. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  91. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  92. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  93. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +3 -2
  94. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
  95. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  96. package/.server/server/plugins/engine/components/LocationFieldBase.js +31 -7
  97. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  98. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
  99. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
  100. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  101. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  103. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  104. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  105. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  106. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  108. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  109. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  110. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  111. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  112. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  113. package/.server/server/plugins/engine/components/NumberField.js +22 -0
  114. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  115. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
  116. package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
  117. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  118. package/.server/server/plugins/engine/components/PaymentField.d.ts +2 -0
  119. package/.server/server/plugins/engine/components/PaymentField.js +9 -5
  120. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  121. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  122. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  123. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  124. package/.server/server/plugins/engine/components/TrackingField.d.ts +21 -0
  125. package/.server/server/plugins/engine/components/TrackingField.js +46 -0
  126. package/.server/server/plugins/engine/components/TrackingField.js.map +1 -0
  127. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  128. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  129. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  130. package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -2
  131. package/.server/server/plugins/engine/components/YesNoField.js +22 -8
  132. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  133. package/.server/server/plugins/engine/components/helpers/components.d.ts +1 -1
  134. package/.server/server/plugins/engine/components/helpers/components.js +6 -3
  135. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  136. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
  137. package/.server/server/plugins/engine/components/helpers/geospatial.js +58 -17
  138. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  139. package/.server/server/plugins/engine/components/helpers/index.d.ts +21 -1
  140. package/.server/server/plugins/engine/components/helpers/index.js +45 -1
  141. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  142. package/.server/server/plugins/engine/components/index.d.ts +1 -0
  143. package/.server/server/plugins/engine/components/index.js +1 -0
  144. package/.server/server/plugins/engine/components/index.js.map +1 -1
  145. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  146. package/.server/server/plugins/engine/components/types.js.map +1 -1
  147. package/.server/server/plugins/engine/errors.d.ts +49 -0
  148. package/.server/server/plugins/engine/errors.js +75 -0
  149. package/.server/server/plugins/engine/errors.js.map +1 -0
  150. package/.server/server/plugins/engine/form-availability.d.ts +3 -2
  151. package/.server/server/plugins/engine/form-availability.js +3 -2
  152. package/.server/server/plugins/engine/form-availability.js.map +1 -1
  153. package/.server/server/plugins/engine/form-context.js +2 -2
  154. package/.server/server/plugins/engine/form-context.js.map +1 -1
  155. package/.server/server/plugins/engine/helpers.d.ts +23 -2
  156. package/.server/server/plugins/engine/helpers.js +44 -5
  157. package/.server/server/plugins/engine/helpers.js.map +1 -1
  158. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
  159. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
  160. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  161. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  162. package/.server/server/plugins/engine/i18n/createFormTranslator.js +27 -5
  163. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  164. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  165. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  166. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  167. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  168. package/.server/server/plugins/engine/i18n/form.js +35 -0
  169. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  170. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  171. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  172. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  173. package/.server/server/plugins/engine/i18n/translations/cy.json +176 -7
  174. package/.server/server/plugins/engine/i18n/translations/en-GB.json +110 -6
  175. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  176. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  177. package/.server/server/plugins/engine/index.d.ts +4 -0
  178. package/.server/server/plugins/engine/index.js +4 -0
  179. package/.server/server/plugins/engine/index.js.map +1 -1
  180. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  181. package/.server/server/plugins/engine/models/FormModel.js +35 -23
  182. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  183. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  184. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  185. package/.server/server/plugins/engine/models/types.d.ts +28 -1
  186. package/.server/server/plugins/engine/models/types.js.map +1 -1
  187. package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
  188. package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
  189. package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
  190. package/.server/server/plugins/engine/options.js +2 -1
  191. package/.server/server/plugins/engine/options.js.map +1 -1
  192. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
  193. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  194. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  195. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  196. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  197. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  198. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  199. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  200. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  201. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  202. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  203. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +2 -2
  204. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  205. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  206. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  207. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  208. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  209. package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
  210. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
  211. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
  212. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
  213. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  214. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
  215. package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
  216. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  217. package/.server/server/plugins/engine/plugin.js +3 -0
  218. package/.server/server/plugins/engine/plugin.js.map +1 -1
  219. package/.server/server/plugins/engine/referenceNumbers.d.ts +1 -0
  220. package/.server/server/plugins/engine/referenceNumbers.js +1 -0
  221. package/.server/server/plugins/engine/referenceNumbers.js.map +1 -1
  222. package/.server/server/plugins/engine/routes/index.js +9 -4
  223. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  224. package/.server/server/plugins/engine/types/enums.d.ts +3 -3
  225. package/.server/server/plugins/engine/types/enums.js +5 -4
  226. package/.server/server/plugins/engine/types/enums.js.map +1 -1
  227. package/.server/server/plugins/engine/types/schema.js +15 -4
  228. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  229. package/.server/server/plugins/engine/types.d.ts +24 -2
  230. package/.server/server/plugins/engine/types.js.map +1 -1
  231. package/.server/server/plugins/engine/unavailable-response.js +5 -2
  232. package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
  233. package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
  234. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  235. package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
  236. package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
  237. package/.server/server/plugins/engine/views/components/trackingfield.html +3 -0
  238. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  239. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  240. package/.server/server/plugins/engine/views/summary.html +1 -0
  241. package/.server/server/plugins/engine/views/unavailable.html +14 -11
  242. package/.server/server/plugins/map/routes/index.d.ts +4 -0
  243. package/.server/server/plugins/map/routes/index.js +12 -4
  244. package/.server/server/plugins/map/routes/index.js.map +1 -1
  245. package/.server/server/plugins/map/routes/index.test.js +7 -0
  246. package/.server/server/plugins/map/routes/index.test.js.map +1 -0
  247. package/.server/server/plugins/map/routes/vts/README.md +38 -0
  248. package/.server/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
  249. package/.server/server/plugins/map/routes/vts/countries.geojson +10 -39283
  250. package/.server/server/plugins/map/types.d.ts +24 -2
  251. package/.server/server/plugins/map/types.js +9 -2
  252. package/.server/server/plugins/map/types.js.map +1 -1
  253. package/.server/server/plugins/nunjucks/enviroment.test.js +11 -4
  254. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
  255. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  256. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  257. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  258. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  259. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  260. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  261. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  262. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  263. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  264. package/.server/server/plugins/payment/helper.d.ts +11 -1
  265. package/.server/server/plugins/payment/helper.js +18 -2
  266. package/.server/server/plugins/payment/helper.js.map +1 -1
  267. package/.server/server/plugins/payment/helper.test.js +2 -1
  268. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  269. package/.server/server/plugins/payment/service.d.ts +2 -1
  270. package/.server/server/plugins/payment/service.js +5 -2
  271. package/.server/server/plugins/payment/service.js.map +1 -1
  272. package/.server/server/plugins/payment/service.test.js +7 -3
  273. package/.server/server/plugins/payment/service.test.js.map +1 -1
  274. package/.server/server/plugins/payment/types.d.ts +4 -0
  275. package/.server/server/plugins/payment/types.js +1 -0
  276. package/.server/server/plugins/payment/types.js.map +1 -1
  277. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  278. package/.server/server/plugins/postcode-lookup/models/index.js +103 -36
  279. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  280. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  281. package/.server/server/plugins/postcode-lookup/routes/index.js +64 -18
  282. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  283. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  284. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  285. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  286. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  287. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  288. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  289. package/.server/server/utils/type-utils.d.ts +1 -2
  290. package/.server/server/utils/type-utils.js +0 -3
  291. package/.server/server/utils/type-utils.js.map +1 -1
  292. package/.server/server/utils/utils.d.ts +6 -0
  293. package/.server/server/utils/utils.js +18 -1
  294. package/.server/server/utils/utils.js.map +1 -1
  295. package/.server/server/utils/utils.test.js +21 -1
  296. package/.server/server/utils/utils.test.js.map +1 -1
  297. package/.server/typings/geodesy/index.d.js +2 -0
  298. package/.server/typings/geodesy/index.d.js.map +1 -0
  299. package/.server/typings/hapi/index.d.js.map +1 -1
  300. package/package.json +24 -9
  301. package/src/client/javascripts/file-upload.js +11 -3
  302. package/src/client/javascripts/geospatial-map.js +181 -86
  303. package/src/client/javascripts/govuk.js +2 -0
  304. package/src/client/javascripts/location-map.js +62 -6
  305. package/src/client/javascripts/map-constants.js +3 -0
  306. package/src/client/javascripts/map.js +66 -9
  307. package/src/client/javascripts/maps.js +5 -0
  308. package/src/client/javascripts/shared.js +1 -4
  309. package/src/client/javascripts/sssi-dataset.js +39 -41
  310. package/src/client/stylesheets/maps.scss +4 -0
  311. package/src/client/stylesheets/shared.scss +1 -5
  312. package/src/server/constants.js +2 -0
  313. package/src/server/forms/components.json +8 -0
  314. package/src/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
  315. package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
  316. package/src/server/plugins/engine/components/AutocompleteField.ts +20 -0
  317. package/src/server/plugins/engine/components/CheckboxesField.ts +41 -8
  318. package/src/server/plugins/engine/components/ComponentBase.ts +6 -4
  319. package/src/server/plugins/engine/components/ComponentCollection.ts +17 -15
  320. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  321. package/src/server/plugins/engine/components/DeclarationField.ts +10 -10
  322. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  323. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  324. package/src/server/plugins/engine/components/FileUploadField.ts +46 -5
  325. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  326. package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
  327. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  328. package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
  329. package/src/server/plugins/engine/components/LocationFieldBase.ts +41 -8
  330. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
  331. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  332. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  333. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  334. package/src/server/plugins/engine/components/NumberField.ts +24 -0
  335. package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
  336. package/src/server/plugins/engine/components/PaymentField.ts +9 -4
  337. package/src/server/plugins/engine/components/TrackingField.ts +64 -0
  338. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  339. package/src/server/plugins/engine/components/YesNoField.ts +27 -9
  340. package/src/server/plugins/engine/components/helpers/components.ts +8 -3
  341. package/src/server/plugins/engine/components/helpers/geospatial.ts +87 -24
  342. package/src/server/plugins/engine/components/helpers/index.ts +64 -1
  343. package/src/server/plugins/engine/components/index.ts +1 -0
  344. package/src/server/plugins/engine/components/types.ts +1 -0
  345. package/src/server/plugins/engine/errors.ts +78 -0
  346. package/src/server/plugins/engine/form-availability.ts +8 -2
  347. package/src/server/plugins/engine/form-context.ts +4 -2
  348. package/src/server/plugins/engine/helpers.ts +52 -5
  349. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
  350. package/src/server/plugins/engine/i18n/createFormTranslator.ts +43 -12
  351. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  352. package/src/server/plugins/engine/i18n/form.ts +54 -0
  353. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  354. package/src/server/plugins/engine/i18n/translations/cy.json +176 -7
  355. package/src/server/plugins/engine/i18n/translations/en-GB.json +110 -6
  356. package/src/server/plugins/engine/i18n/types.ts +2 -0
  357. package/src/server/plugins/engine/index.ts +7 -0
  358. package/src/server/plugins/engine/models/FormModel.ts +46 -23
  359. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  360. package/src/server/plugins/engine/models/types.ts +31 -0
  361. package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
  362. package/src/server/plugins/engine/options.js +2 -1
  363. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
  364. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  365. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  366. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  367. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +2 -2
  368. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  369. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  370. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
  371. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
  372. package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
  373. package/src/server/plugins/engine/plugin.ts +6 -0
  374. package/src/server/plugins/engine/referenceNumbers.ts +2 -0
  375. package/src/server/plugins/engine/routes/index.ts +9 -3
  376. package/src/server/plugins/engine/types/enums.ts +4 -3
  377. package/src/server/plugins/engine/types/schema.ts +22 -5
  378. package/src/server/plugins/engine/types.ts +28 -1
  379. package/src/server/plugins/engine/unavailable-response.ts +6 -2
  380. package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
  381. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  382. package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
  383. package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
  384. package/src/server/plugins/engine/views/components/trackingfield.html +3 -0
  385. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  386. package/src/server/plugins/engine/views/file-upload.html +1 -1
  387. package/src/server/plugins/engine/views/summary.html +1 -0
  388. package/src/server/plugins/engine/views/unavailable.html +14 -11
  389. package/src/server/plugins/map/routes/index.js +29 -4
  390. package/src/server/plugins/map/routes/vts/README.md +38 -0
  391. package/src/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
  392. package/src/server/plugins/map/routes/vts/countries.geojson +10 -39283
  393. package/src/server/plugins/map/types.js +9 -2
  394. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  395. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  396. package/src/server/plugins/payment/helper.js +22 -2
  397. package/src/server/plugins/payment/service.js +6 -2
  398. package/src/server/plugins/payment/types.js +1 -0
  399. package/src/server/plugins/postcode-lookup/models/index.js +91 -46
  400. package/src/server/plugins/postcode-lookup/routes/index.js +96 -24
  401. package/src/server/plugins/postcode-lookup/types.js +6 -1
  402. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  403. package/src/server/utils/type-utils.ts +1 -11
  404. package/src/server/utils/utils.js +19 -1
  405. package/src/typings/geodesy/index.d.ts +18 -0
  406. package/src/typings/hapi/index.d.ts +2 -0
@@ -11,7 +11,6 @@ import createSearchPlugin from '@defra/interactive-map/plugins/search'
11
11
  // @ts-expect-error - no types
12
12
  import maplibreProvider from '@defra/interactive-map/providers/maplibre'
13
13
  import { centroid } from '@turf/centroid'
14
- // @ts-expect-error - no types
15
14
  import OsGridRef, { LatLon } from 'geodesy/osgridref.js'
16
15
 
17
16
  import { processGeospatial } from './geospatial-map.js'
@@ -123,10 +122,15 @@ export function getCentroidGridRef(feature) {
123
122
  }
124
123
  }
125
124
 
126
- /** @type {InteractiveMapInitConfig} */
127
- export const defaultConfig = {
128
- zoom: '6',
129
- center: [DEFAULT_LONG, DEFAULT_LAT]
125
+ /**
126
+ * Get the default config for a map
127
+ * @returns {InteractiveMapInitConfig}
128
+ */
129
+ export const getDefaultConfig = () => {
130
+ return {
131
+ zoom: '6',
132
+ center: [DEFAULT_LONG, DEFAULT_LAT]
133
+ }
130
134
  }
131
135
 
132
136
  export const EVENTS = {
@@ -167,6 +171,7 @@ export function initMaps(config = {}) {
167
171
  const {
168
172
  assetPath = '/assets',
169
173
  apiPath = '/form/api',
174
+ workerPath = '/assets/interactive-map/maplibre-gl-worker.mjs',
170
175
  data = defaultData
171
176
  } = config
172
177
  const locations = document.querySelectorAll('.app-location-field')
@@ -198,11 +203,15 @@ export function initMaps(config = {}) {
198
203
  }
199
204
 
200
205
  locations.forEach((location, index) => {
201
- processLocation({ assetPath, apiPath, data }, location, index)
206
+ processLocation({ assetPath, apiPath, workerPath, data }, location, index)
202
207
  })
203
208
 
204
209
  geospatials.forEach((geospatial, index) => {
205
- processGeospatial({ assetPath, apiPath, data }, geospatial, index)
210
+ processGeospatial(
211
+ { assetPath, apiPath, workerPath, data },
212
+ geospatial,
213
+ index
214
+ )
206
215
  })
207
216
  }
208
217
 
@@ -259,7 +268,7 @@ export function makeTileRequestTransformer(apiPath) {
259
268
  * @param {MapsEnvironmentConfig} mapsConfig - the map environment params
260
269
  */
261
270
  export function createMap(mapId, initConfig, mapsConfig) {
262
- const { assetPath, apiPath, data = defaultData } = mapsConfig
271
+ const { assetPath, apiPath, workerPath, data = defaultData } = mapsConfig
263
272
  const logoAltText = 'Ordnance survey logo'
264
273
  const interactPlugin = createInteractPlugin({
265
274
  markerColor: { outdoor: '#ff0000', dark: '#00ff00' },
@@ -271,7 +280,7 @@ export function createMap(mapId, initConfig, mapsConfig) {
271
280
  const map = new InteractiveMap(mapId, {
272
281
  enableFullscreen: true,
273
282
  autoColorScheme: false,
274
- mapProvider: maplibreProvider(),
283
+ mapProvider: maplibreProvider({ workerUrl: workerPath }),
275
284
  behaviour: 'inline',
276
285
  minZoom: 6,
277
286
  maxZoom: 18,
@@ -367,6 +376,48 @@ export function getMapLayers(layers) {
367
376
  return trimmed ? trimmed.split(',') : []
368
377
  }
369
378
 
379
+ /**
380
+ * Adds the country layers to a datasets array
381
+ * @param {string} apiPath
382
+ * @param {string} [country]
383
+ */
384
+ export function getMapCountryLayers(apiPath, country) {
385
+ /** @type {any[]} */
386
+ const datasets = []
387
+
388
+ if (country) {
389
+ // Add the country bounds to the datasets array to show the valid area on the map
390
+ // and provide feedback to the user when they add features outside of the bounds.
391
+ datasets.push(
392
+ {
393
+ id: 'invalid-area',
394
+ label: 'Invalid areas',
395
+ geojson: `${apiPath}/maps/countries.geojson?omit=${country}`,
396
+ showInKey: false,
397
+ showInMenu: false,
398
+ style: {
399
+ stroke: 'gray',
400
+ strokeWidth: 1,
401
+ fill: 'rgba(211,211,211,0.8)'
402
+ }
403
+ },
404
+ {
405
+ id: 'valid-area',
406
+ label: 'Valid areas',
407
+ geojson: `${apiPath}/maps/countries.geojson?only=${country}`,
408
+ showInKey: false,
409
+ showInMenu: false,
410
+ style: {
411
+ stroke: 'rgba(0,112,60,1)',
412
+ strokeWidth: 1
413
+ }
414
+ }
415
+ )
416
+ }
417
+
418
+ return datasets
419
+ }
420
+
370
421
  /**
371
422
  * @typedef {object} InteractiveMap - an instance of a InteractiveMap
372
423
  * @property {Function} on - register callback listeners to map events
@@ -407,6 +458,7 @@ export function getMapLayers(layers) {
407
458
  * @typedef {object} MapsEnvironmentConfig
408
459
  * @property {string} assetPath - the root asset path
409
460
  * @property {string} apiPath - the root API path
461
+ * @property {string} workerPath - the maplibre worker path
410
462
  * @property {TileData} data - the tile data config
411
463
  */
412
464
 
@@ -418,3 +470,8 @@ export function getMapLayers(layers) {
418
470
  /**
419
471
  * @import { Feature } from '../../server/plugins/engine/types.js'
420
472
  */
473
+
474
+ /**
475
+ * Supported language codes
476
+ * @typedef {('en-GB'|'cy')} LanguageCode
477
+ */
@@ -0,0 +1,5 @@
1
+ export { initMaps } from './map.js'
2
+ export * as map from './map.js'
3
+ export * as locationMap from './location-map.js'
4
+ export * as geospatialMap from './geospatial-map.js'
5
+ export * as sssiDataset from './sssi-dataset.js'
@@ -3,10 +3,7 @@ import { initDebounceClick as initDebounceClickImp } from './debounce-click.js'
3
3
  import { initFileUpload as initFileUploadImp } from './file-upload.js'
4
4
  import { initAllGovuk as initAllGovukImp } from './govuk.js'
5
5
  import { initPreviewCloseLink as initPreviewCloseLinkImp } from './preview-close-link.js'
6
- export { initMaps } from './map.js'
7
- export * as map from './map.js'
8
- export * as geospatialMap from './geospatial-map.js'
9
- export * as sssiDataset from './sssi-dataset.js'
6
+ export * from './maps.js'
10
7
 
11
8
  export const initAllGovuk = initAllGovukImp
12
9
  export const initAllAutocomplete = initAllAutocompleteImp
@@ -49,49 +49,47 @@ export function sssiScotlandRequestTransformer(url, { bbox }) {
49
49
  }
50
50
  }
51
51
 
52
- export default {
53
- datasets: [
54
- {
55
- id: 'sssi-england',
56
- label: 'Sites of Special Scientific Interest',
57
- dynamicGeoJSON: {
58
- url: englandWFS,
59
- idProperty: 'ref_code',
60
- transformRequest: sssiEnglandRequestTransformer
61
- },
62
- minZoom,
63
- style,
64
- showInKey: true,
65
- showInMenu: false
52
+ export default [
53
+ {
54
+ id: 'sssi-england',
55
+ label: 'Sites of Special Scientific Interest',
56
+ dynamicGeoJSON: {
57
+ url: englandWFS,
58
+ idProperty: 'ref_code',
59
+ transformRequest: sssiEnglandRequestTransformer
66
60
  },
67
- {
68
- id: 'sssi-wales',
69
- label: 'SSSI Wales',
70
- dynamicGeoJSON: {
71
- url: walesWFS,
72
- idProperty: 'id',
73
- transformRequest: sssiWalesRequestTransformer
74
- },
75
- minZoom,
76
- style,
77
- showInKey: false,
78
- showInMenu: false
61
+ minZoom,
62
+ style,
63
+ showInKey: true,
64
+ showInMenu: false
65
+ },
66
+ {
67
+ id: 'sssi-wales',
68
+ label: 'SSSI Wales',
69
+ dynamicGeoJSON: {
70
+ url: walesWFS,
71
+ idProperty: 'id',
72
+ transformRequest: sssiWalesRequestTransformer
79
73
  },
80
- {
81
- id: 'sssi-scotland',
82
- label: 'SSSI Scotland',
83
- dynamicGeoJSON: {
84
- url: scotlandWFS,
85
- idProperty: 'OBJECTID',
86
- transformRequest: sssiScotlandRequestTransformer
87
- },
88
- minZoom,
89
- style,
90
- showInKey: false,
91
- showInMenu: false
92
- }
93
- ]
94
- }
74
+ minZoom,
75
+ style,
76
+ showInKey: false,
77
+ showInMenu: false
78
+ },
79
+ {
80
+ id: 'sssi-scotland',
81
+ label: 'SSSI Scotland',
82
+ dynamicGeoJSON: {
83
+ url: scotlandWFS,
84
+ idProperty: 'OBJECTID',
85
+ transformRequest: sssiScotlandRequestTransformer
86
+ },
87
+ minZoom,
88
+ style,
89
+ showInKey: false,
90
+ showInMenu: false
91
+ }
92
+ ]
95
93
 
96
94
  /**
97
95
  * @typedef {object} TransformRequestOptions
@@ -0,0 +1,4 @@
1
+ @use "@defra/interactive-map/css" as core;
2
+ @use "@defra/interactive-map/plugins/map-styles/css" as mapStyles;
3
+ @use "@defra/interactive-map/plugins/search/css" as search;
4
+ @use "@defra/interactive-map/plugins/scale-bar/css" as scaleBar;
@@ -3,11 +3,7 @@
3
3
  @use "prose";
4
4
  @use "summary-list";
5
5
  @use "location-fields";
6
-
7
- @use "@defra/interactive-map/css" as core;
8
- @use "@defra/interactive-map/plugins/map-styles/css" as mapStyles;
9
- @use "@defra/interactive-map/plugins/search/css" as search;
10
- @use "@defra/interactive-map/plugins/scale-bar/css" as scaleBar;
6
+ @use "maps";
11
7
 
12
8
  // Use default GDS Transport font for autocomplete
13
9
  .autocomplete__hint,
@@ -5,3 +5,5 @@ export const EXTERNAL_STATE_PAYLOAD = 'EXTERNAL_STATE_PAYLOAD'
5
5
  export const EXTERNAL_STATE_APPENDAGE = 'EXTERNAL_STATE_APPENDAGE'
6
6
  export const COMPONENT_STATE_ERROR = 'COMPONENT_STATE_ERROR'
7
7
  export const PAYMENT_EXPIRED_NOTIFICATION = 'PAYMENT_EXPIRED_NOTIFICATION'
8
+ export const EN_GB = 'en-GB' // English language
9
+ export const CY = 'cy' // Welsh language
@@ -6,6 +6,14 @@
6
6
  "path": "/all-components",
7
7
  "title": "All Components",
8
8
  "components": [
9
+ {
10
+ "type": "TrackingField",
11
+ "name": "trackingField",
12
+ "title": "Tracking field",
13
+ "hint": "Help text",
14
+ "options": {},
15
+ "schema": {}
16
+ },
9
17
  {
10
18
  "type": "TextField",
11
19
  "name": "textField",
@@ -5,6 +5,10 @@ pages:
5
5
  - path: '/whats-your-name'
6
6
  title: What's your name?
7
7
  components:
8
+ - type: TrackingField
9
+ name: hasSeenNamePage
10
+ title: Tracks if the user has seen the name page
11
+ options: {}
8
12
  - type: TextField
9
13
  name: textField
10
14
  title: Name
@@ -0,0 +1,155 @@
1
+ import {
2
+ ComponentType,
3
+ ConditionType,
4
+ ControllerType,
5
+ Engine,
6
+ OperatorName,
7
+ SchemaVersion,
8
+ type FormDefinition,
9
+ type PageQuestion
10
+ } from '@defra/forms-model'
11
+
12
+ const YES_NO_COMPONENT_ID = 'a7c0242f-2a31-45b2-8c71-ff2ac7f53288'
13
+ const USER_TYPE_LIST_ID = '4fa26e9c-07cf-47cd-a9dd-5cec0dd3f544'
14
+ const EXISTING_USER_ITEM_ID = '55fe0067-d011-4d33-886c-e1aa266637c3'
15
+
16
+ /**
17
+ * A minimal, schema-valid V2 definition: one YesNo question page and a
18
+ * summary page. Each call returns a fresh object, so tests can mutate their
19
+ * copy freely without affecting each other.
20
+ */
21
+ export function buildDefinition(): FormDefinition {
22
+ return {
23
+ name: 'Stub definition',
24
+ engine: Engine.V2,
25
+ schema: SchemaVersion.V2,
26
+ startPage: '/summary',
27
+ pages: [
28
+ {
29
+ id: '449c053b-9201-4312-9a75-187afc6ba48b',
30
+ path: '/licence',
31
+ title: 'Licence',
32
+ components: [
33
+ {
34
+ id: YES_NO_COMPONENT_ID,
35
+ name: 'xVrYaJ',
36
+ type: ComponentType.YesNoField,
37
+ title: 'Do you have a licence?',
38
+ shortDescription: 'Licence',
39
+ options: { required: true }
40
+ }
41
+ ],
42
+ next: []
43
+ },
44
+ {
45
+ id: '449c053b-9201-4312-9a75-187afc6ba48c',
46
+ path: '/summary',
47
+ title: 'Summary',
48
+ controller: ControllerType.Summary,
49
+ components: []
50
+ }
51
+ ],
52
+ lists: [],
53
+ sections: [],
54
+ conditions: []
55
+ }
56
+ }
57
+
58
+ /**
59
+ * A definition that passes schema validation but cannot be used by the
60
+ * engine: a ListItemRef condition points at the YesNoField (boolean), so the
61
+ * condition expression builder produces an unparseable expression. Distilled
62
+ * from a real production incident.
63
+ */
64
+ export function buildBrokenConditionDefinition(): FormDefinition {
65
+ const definition = buildDefinition()
66
+
67
+ definition.name = 'Broken condition fixture'
68
+
69
+ const questionPage = definition.pages[0] as PageQuestion
70
+ // A YesNoField cannot legitimately carry a custom list — that is the
71
+ // corruption this fixture models — so the TS component types (rightly)
72
+ // have no `list` property here and a cast is required.
73
+ ;(questionPage.components[0] as { list?: string }).list = USER_TYPE_LIST_ID
74
+ definition.lists = [
75
+ {
76
+ id: USER_TYPE_LIST_ID,
77
+ name: 'XtfRYR',
78
+ title: 'User type list',
79
+ type: 'string',
80
+ items: [
81
+ {
82
+ id: EXISTING_USER_ITEM_ID,
83
+ text: 'existing user',
84
+ value: 'existing user'
85
+ },
86
+ {
87
+ id: '2277c7e5-7fef-46c6-993b-d294116d6d6b',
88
+ text: 'new user',
89
+ value: 'new user'
90
+ }
91
+ ]
92
+ }
93
+ ]
94
+ definition.conditions = [
95
+ {
96
+ id: '3f9d3a35-6dee-4706-806c-3f776129f631',
97
+ displayName: 'Existing user',
98
+ items: [
99
+ {
100
+ id: '7d7f58ee-c860-4d24-8a13-de5cb9af53d8',
101
+ componentId: YES_NO_COMPONENT_ID,
102
+ operator: OperatorName.Is,
103
+ type: ConditionType.ListItemRef,
104
+ value: {
105
+ listId: USER_TYPE_LIST_ID,
106
+ itemId: [EXISTING_USER_ITEM_ID]
107
+ }
108
+ }
109
+ ]
110
+ }
111
+ ]
112
+
113
+ return definition
114
+ }
115
+
116
+ /**
117
+ * A schema-valid definition whose first page names a controller that is
118
+ * neither built in nor registered by the host application.
119
+ */
120
+ export function buildUnknownControllerDefinition(): FormDefinition {
121
+ const definition = buildDefinition()
122
+
123
+ definition.name = 'Unknown controller fixture'
124
+ definition.pages[0].controller =
125
+ 'NoSuchPageController' as unknown as ControllerType
126
+
127
+ return definition
128
+ }
129
+
130
+ /**
131
+ * Schema-valid (component types are free strings in the schema), but the
132
+ * question uses a type the engine has no component class for.
133
+ */
134
+ export function buildUnknownComponentDefinition(): FormDefinition {
135
+ const definition = buildDefinition()
136
+
137
+ definition.name = 'Unknown component fixture'
138
+ const questionPage = definition.pages[0] as PageQuestion
139
+ questionPage.components[0].type = 'MyUnknownField' as unknown as ComponentType
140
+
141
+ return definition
142
+ }
143
+
144
+ /**
145
+ * A definition that fails schema validation: the question page appears
146
+ * twice, violating the pages uniqueness rule.
147
+ */
148
+ export function buildSchemaInvalidDefinition(): FormDefinition {
149
+ const definition = buildDefinition()
150
+
151
+ definition.name = 'Schema invalid fixture'
152
+ definition.pages.push(buildDefinition().pages[0])
153
+
154
+ return definition
155
+ }
@@ -1,8 +1,11 @@
1
1
  import { type AutocompleteFieldComponent } from '@defra/forms-model'
2
2
 
3
3
  import { SelectField } from './SelectField.js'
4
+ import { withCustomValidationOverrides } from './helpers/index.js'
4
5
  import { type RenderContext } from './types.js'
6
+ import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
5
7
  import { messageTemplate } from '../pageControllers/validationOptions.js'
8
+ import { type Translator } from '../types/index.js'
6
9
 
7
10
  export class AutocompleteField extends SelectField {
8
11
  declare options: AutocompleteFieldComponent['options']
@@ -45,4 +48,21 @@ export class AutocompleteField extends SelectField {
45
48
  formGroup
46
49
  }
47
50
  }
51
+
52
+ getValidationMessagesOverride(translator: Translator) {
53
+ const { customValidationMessages } = this.options
54
+ const { t } = translator
55
+ const defaults = {
56
+ 'any.required': buildValidationMessages(t).objectRequired,
57
+ 'any.only': buildValidationMessages(t).objectRequired
58
+ }
59
+
60
+ return {
61
+ [this.name]: withCustomValidationOverrides(
62
+ defaults,
63
+ undefined,
64
+ customValidationMessages
65
+ )
66
+ }
67
+ }
48
68
  }
@@ -1,8 +1,10 @@
1
1
  import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'
2
2
  import joi, { type ArraySchema } from 'joi'
3
3
 
4
+ import { EN_GB } from '../../../constants.js'
4
5
  import { isFormValue } from './FormComponent.js'
5
6
  import { SelectionControlField } from './SelectionControlField.js'
7
+ import { t as tPlugin } from '../i18n/index.js'
6
8
  import { type Translator } from '../i18n/types.js'
7
9
  import { type FormModel } from '../models/FormModel.js'
8
10
  import { type QuestionPageController } from '../pageControllers/QuestionPageController.js'
@@ -17,8 +19,9 @@ import {
17
19
  export class CheckboxesField extends SelectionControlField {
18
20
  declare options: CheckboxesFieldComponent['options']
19
21
  declare schema: CheckboxesFieldComponent['schema']
20
- declare formSchema: ArraySchema<string> | ArraySchema<number>
21
- declare stateSchema: ArraySchema<string> | ArraySchema<number>
22
+ declare formSchema: ArraySchema<string[]> | ArraySchema<number[]>
23
+ declare stateSchema: ArraySchema<string[]> | ArraySchema<number[]>
24
+ declare limits: { min?: number; max?: number; length?: number }
22
25
 
23
26
  constructor(
24
27
  def: CheckboxesFieldComponent,
@@ -30,7 +33,7 @@ export class CheckboxesField extends SelectionControlField {
30
33
  const { options, schema } = def
31
34
 
32
35
  let formSchema =
33
- type === 'string' ? joi.array<string>() : joi.array<number>()
36
+ type === 'string' ? joi.array<string[]>() : joi.array<number[]>()
34
37
 
35
38
  const itemsSchema = joi[type]()
36
39
  .valid(...this.values)
@@ -41,11 +44,8 @@ export class CheckboxesField extends SelectionControlField {
41
44
  .single()
42
45
  .label(this.label)
43
46
  .required()
44
- .messages({
45
- 'array.min': messageTemplate.arrayMin,
46
- 'array.max': messageTemplate.arrayMax,
47
- 'array.length': messageTemplate.arrayLength
48
- })
47
+
48
+ const limits: { min?: number; max?: number; length?: number } = {}
49
49
 
50
50
  if (options.required === false) {
51
51
  formSchema = formSchema.optional()
@@ -53,16 +53,25 @@ export class CheckboxesField extends SelectionControlField {
53
53
 
54
54
  if (typeof schema?.length === 'number') {
55
55
  formSchema = formSchema.length(schema.length)
56
+ limits.length = schema.length
56
57
  } else {
57
58
  if (typeof schema?.min === 'number') {
58
59
  formSchema = formSchema.min(schema.min)
60
+ limits.min = schema.min
59
61
  }
60
62
 
61
63
  if (typeof schema?.max === 'number') {
62
64
  formSchema = formSchema.max(schema.max)
65
+ limits.max = schema.max
63
66
  }
64
67
  }
65
68
 
69
+ this.limits = limits
70
+
71
+ formSchema = formSchema.messages(
72
+ CheckboxesField.buildErrorMessages(EN_GB, limits)
73
+ )
74
+
66
75
  this.formSchema = formSchema.default([])
67
76
  this.stateSchema = formSchema.default(null).allow(null)
68
77
  this.options = options
@@ -133,6 +142,13 @@ export class CheckboxesField extends SelectionControlField {
133
142
  return this.getContextValueFromFormValue(values)
134
143
  }
135
144
 
145
+ getValidationMessagesOverride(translator: Translator) {
146
+ const { language } = translator
147
+ return {
148
+ [this.name]: CheckboxesField.buildErrorMessages(language, this.limits)
149
+ }
150
+ }
151
+
136
152
  /**
137
153
  * For error preview page that shows all possible errors on a component
138
154
  */
@@ -169,4 +185,21 @@ export class CheckboxesField extends SelectionControlField {
169
185
 
170
186
  return value.every(isFormValue)
171
187
  }
188
+
189
+ static buildErrorMessages(
190
+ language: string,
191
+ limits: { min?: number; max?: number; length?: number } = {}
192
+ ) {
193
+ return {
194
+ 'array.min': tPlugin('validation.arrayMin', language, {
195
+ count: limits.min ?? 1
196
+ }),
197
+ 'array.max': tPlugin('validation.arrayMax', language, {
198
+ count: limits.max ?? 1
199
+ }),
200
+ 'array.length': tPlugin('validation.arrayLength', language, {
201
+ count: limits.length ?? 1
202
+ })
203
+ }
204
+ }
172
205
  }
@@ -28,6 +28,7 @@ export class ComponentBase {
28
28
 
29
29
  isFormComponent = false
30
30
  model: FormModel
31
+ def: ComponentDef
31
32
 
32
33
  /** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
33
34
  formSchema: ComponentSchema = joi.string()
@@ -45,6 +46,7 @@ export class ComponentBase {
45
46
  this.type = def.type
46
47
  this.name = def.name
47
48
  this.title = def.title
49
+ this.def = def
48
50
 
49
51
  if ('schema' in def) {
50
52
  this.schema = def.schema
@@ -87,10 +89,10 @@ export class ComponentBase {
87
89
  }
88
90
 
89
91
  export type ComponentSchema =
90
- | ArraySchema<string>
91
- | ArraySchema<number>
92
- | ArraySchema<boolean>
93
- | ArraySchema<object>
92
+ | ArraySchema<string[]>
93
+ | ArraySchema<number[]>
94
+ | ArraySchema<boolean[]>
95
+ | ArraySchema<object[]>
94
96
  | BooleanSchema<string>
95
97
  | BooleanSchema
96
98
  | DateSchema