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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/.public/javascripts/application.min.js +1 -1
  2. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  3. package/.public/javascripts/application.min.js.map +1 -1
  4. package/.public/javascripts/shared.min.js +1 -1
  5. package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/shared.min.js.map +1 -1
  7. package/.public/stylesheets/application.min.css.map +1 -1
  8. package/.server/client/javascripts/file-upload.js +6 -3
  9. package/.server/client/javascripts/file-upload.js.map +1 -1
  10. package/.server/client/javascripts/geospatial-map.js +10 -31
  11. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  12. package/.server/client/javascripts/govuk.js +2 -1
  13. package/.server/client/javascripts/govuk.js.map +1 -1
  14. package/.server/client/javascripts/location-map.js +11 -2
  15. package/.server/client/javascripts/location-map.js.map +1 -1
  16. package/.server/client/javascripts/map.d.ts +6 -0
  17. package/.server/client/javascripts/map.js +37 -0
  18. package/.server/client/javascripts/map.js.map +1 -1
  19. package/.server/client/javascripts/maps.d.ts +5 -0
  20. package/.server/client/javascripts/maps.js +6 -0
  21. package/.server/client/javascripts/maps.js.map +1 -0
  22. package/.server/client/javascripts/shared.d.ts +1 -3
  23. package/.server/client/javascripts/shared.js +1 -3
  24. package/.server/client/javascripts/shared.js.map +1 -1
  25. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  26. package/.server/client/javascripts/sssi-dataset.js +37 -39
  27. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  28. package/.server/client/stylesheets/maps.scss +4 -0
  29. package/.server/client/stylesheets/shared.scss +1 -5
  30. package/.server/server/constants.d.ts +2 -0
  31. package/.server/server/constants.js +2 -0
  32. package/.server/server/constants.js.map +1 -1
  33. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  34. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  35. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  36. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +4 -1
  37. package/.server/server/plugins/engine/components/CheckboxesField.js +13 -0
  38. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  39. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  40. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  41. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  42. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  43. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  44. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  45. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  46. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  48. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  49. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  50. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  51. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +29 -2
  52. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  53. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  54. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  55. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  56. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/FileUploadField.d.ts +12 -0
  58. package/.server/server/plugins/engine/components/FileUploadField.js +23 -3
  59. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  61. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  62. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  63. package/.server/server/plugins/engine/components/GeospatialField.d.ts +1 -0
  64. package/.server/server/plugins/engine/components/GeospatialField.js +1 -1
  65. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  66. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  67. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  68. package/.server/server/plugins/engine/components/LatLongField.d.ts +28 -2
  69. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  70. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  71. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  72. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  73. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  74. package/.server/server/plugins/engine/components/LocationFieldBase.js +18 -5
  75. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  76. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +8 -3
  77. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +13 -12
  78. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  79. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  80. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  81. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  82. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  83. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  84. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  85. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  86. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  87. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  88. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  89. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  90. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  91. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  92. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  93. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  94. package/.server/server/plugins/engine/components/OsGridRefField.js +4 -3
  95. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  96. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  97. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  98. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  99. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  100. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  101. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  103. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  104. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  105. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  106. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  107. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  108. package/.server/server/plugins/engine/components/helpers/components.js +1 -2
  109. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  110. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +3 -1
  111. package/.server/server/plugins/engine/components/helpers/geospatial.js +32 -0
  112. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  113. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  114. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  115. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  116. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  117. package/.server/server/plugins/engine/components/types.js.map +1 -1
  118. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  119. package/.server/server/plugins/engine/helpers.js +44 -5
  120. package/.server/server/plugins/engine/helpers.js.map +1 -1
  121. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +3 -0
  122. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +10 -7
  123. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  124. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  125. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  126. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  127. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  128. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  129. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  130. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  131. package/.server/server/plugins/engine/i18n/form.js +35 -0
  132. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  133. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  134. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  135. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  136. package/.server/server/plugins/engine/i18n/translations/cy.json +85 -8
  137. package/.server/server/plugins/engine/i18n/translations/en-GB.json +55 -6
  138. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  139. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  140. package/.server/server/plugins/engine/index.d.ts +4 -0
  141. package/.server/server/plugins/engine/index.js +4 -0
  142. package/.server/server/plugins/engine/index.js.map +1 -1
  143. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  144. package/.server/server/plugins/engine/models/FormModel.js +9 -15
  145. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  146. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  147. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  148. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
  149. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  150. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  151. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  152. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  153. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  154. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  155. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  156. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  157. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  158. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  159. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  160. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  161. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  162. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  163. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  164. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  165. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  166. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
  167. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  168. package/.server/server/plugins/engine/pageControllers/validationOptions.js +23 -2
  169. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  170. package/.server/server/plugins/engine/types/schema.js +1 -0
  171. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  172. package/.server/server/plugins/engine/types.d.ts +5 -0
  173. package/.server/server/plugins/engine/types.js.map +1 -1
  174. package/.server/server/plugins/engine/views/components/_location-field-base.html +2 -1
  175. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  176. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  177. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  178. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  179. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  180. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  181. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  182. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  183. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  184. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  185. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  186. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  187. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  188. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  189. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  190. package/.server/server/plugins/payment/helper.d.ts +11 -1
  191. package/.server/server/plugins/payment/helper.js +18 -2
  192. package/.server/server/plugins/payment/helper.js.map +1 -1
  193. package/.server/server/plugins/payment/helper.test.js +2 -1
  194. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  195. package/.server/server/plugins/payment/service.d.ts +2 -1
  196. package/.server/server/plugins/payment/service.js +5 -2
  197. package/.server/server/plugins/payment/service.js.map +1 -1
  198. package/.server/server/plugins/payment/service.test.js +7 -3
  199. package/.server/server/plugins/payment/service.test.js.map +1 -1
  200. package/.server/server/plugins/payment/types.d.ts +4 -0
  201. package/.server/server/plugins/payment/types.js +1 -0
  202. package/.server/server/plugins/payment/types.js.map +1 -1
  203. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  204. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  205. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  206. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  207. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  208. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  209. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  210. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  211. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  212. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  213. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  214. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  215. package/.server/server/utils/type-utils.d.ts +1 -2
  216. package/.server/server/utils/type-utils.js +0 -3
  217. package/.server/server/utils/type-utils.js.map +1 -1
  218. package/.server/server/utils/utils.d.ts +6 -0
  219. package/.server/server/utils/utils.js +18 -1
  220. package/.server/server/utils/utils.js.map +1 -1
  221. package/.server/server/utils/utils.test.js +21 -1
  222. package/.server/server/utils/utils.test.js.map +1 -1
  223. package/package.json +9 -2
  224. package/src/client/javascripts/file-upload.js +11 -3
  225. package/src/client/javascripts/geospatial-map.js +7 -34
  226. package/src/client/javascripts/govuk.js +2 -0
  227. package/src/client/javascripts/location-map.js +9 -1
  228. package/src/client/javascripts/map.js +42 -0
  229. package/src/client/javascripts/maps.js +5 -0
  230. package/src/client/javascripts/shared.js +1 -3
  231. package/src/client/javascripts/sssi-dataset.js +39 -41
  232. package/src/client/stylesheets/maps.scss +4 -0
  233. package/src/client/stylesheets/shared.scss +1 -5
  234. package/src/server/constants.js +2 -0
  235. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  236. package/src/server/plugins/engine/components/CheckboxesField.ts +13 -1
  237. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  238. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  239. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  240. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  241. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  242. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  243. package/src/server/plugins/engine/components/FileUploadField.ts +24 -3
  244. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  245. package/src/server/plugins/engine/components/GeospatialField.ts +6 -1
  246. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  247. package/src/server/plugins/engine/components/LocationFieldBase.ts +23 -6
  248. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +20 -13
  249. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  250. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  251. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  252. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  253. package/src/server/plugins/engine/components/OsGridRefField.ts +9 -3
  254. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  255. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  256. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  257. package/src/server/plugins/engine/components/helpers/components.ts +1 -2
  258. package/src/server/plugins/engine/components/helpers/geospatial.ts +53 -0
  259. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  260. package/src/server/plugins/engine/components/types.ts +1 -0
  261. package/src/server/plugins/engine/helpers.ts +52 -5
  262. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +10 -7
  263. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  264. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  265. package/src/server/plugins/engine/i18n/form.ts +54 -0
  266. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  267. package/src/server/plugins/engine/i18n/translations/cy.json +85 -8
  268. package/src/server/plugins/engine/i18n/translations/en-GB.json +55 -6
  269. package/src/server/plugins/engine/i18n/types.ts +2 -0
  270. package/src/server/plugins/engine/index.ts +7 -0
  271. package/src/server/plugins/engine/models/FormModel.ts +9 -15
  272. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  273. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
  274. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  275. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  276. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  277. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  278. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  279. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  280. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
  281. package/src/server/plugins/engine/pageControllers/validationOptions.ts +27 -2
  282. package/src/server/plugins/engine/types/schema.ts +1 -0
  283. package/src/server/plugins/engine/types.ts +5 -0
  284. package/src/server/plugins/engine/views/components/_location-field-base.html +2 -1
  285. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  286. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  287. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  288. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  289. package/src/server/plugins/engine/views/file-upload.html +1 -1
  290. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  291. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  292. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  293. package/src/server/plugins/payment/helper.js +22 -2
  294. package/src/server/plugins/payment/service.js +6 -2
  295. package/src/server/plugins/payment/types.js +1 -0
  296. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  297. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  298. package/src/server/plugins/postcode-lookup/types.js +6 -1
  299. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  300. package/src/server/utils/type-utils.ts +1 -11
  301. package/src/server/utils/utils.js +19 -1
@@ -33,7 +33,7 @@
33
33
  <!-- Postcode lookup select -->
34
34
  <!-- Postcode lookup details display -->
35
35
  {%- set detailsHtml -%}
36
- <strong>{{ details.postcodeQuery }}</strong>{% if details.buildingNameQuery %} and <strong>{{ details.buildingNameQuery }}</strong>{% endif %}
36
+ <strong>{{ details.postcodeQuery }}</strong>{% if details.buildingNameQuery %} {{ t('common.and')}} <strong>{{ details.buildingNameQuery }}</strong>{% endif %}
37
37
  {%- endset -%}
38
38
 
39
39
  {% if hasAddresses %}
@@ -72,9 +72,9 @@
72
72
  {{ govukButton(buttons.continueButton) }}
73
73
 
74
74
  {% if buttons.manualLink %}
75
- <p class="govuk-body">or <a class="govuk-link govuk-link--no-visited-state" href="{{ buttons.manualLink.href }}">{{buttons.manualLink.text}}</a></p>
75
+ <p class="govuk-body">{{ t('common.or')}} <a class="govuk-link govuk-link--no-visited-state" href="{{ buttons.manualLink.href }}">{{buttons.manualLink.text}}</a></p>
76
76
  {% elif buttons.detailsLink %}
77
- <p class="govuk-body">or <a class="govuk-link govuk-link--no-visited-state" href="{{ buttons.detailsLink.href }}">{{buttons.detailsLink.text}}</a></p>
77
+ <p class="govuk-body">{{ t('common.or')}} <a class="govuk-link govuk-link--no-visited-state" href="{{ buttons.detailsLink.href }}">{{buttons.detailsLink.text}}</a></p>
78
78
  {% endif %}
79
79
  </div>
80
80
  </form>
@@ -1,3 +1,2 @@
1
- import { type JoiExpression, type LanguageMessages, type LanguageMessagesExt } from 'joi';
2
- export declare function convertToLanguageMessages(extLanguageMessages: LanguageMessagesExt): LanguageMessages;
1
+ import { type JoiExpression } from 'joi';
3
2
  export declare function createJoiExpression(expr: string): JoiExpression;
@@ -1,7 +1,4 @@
1
1
  import Joi from 'joi';
2
- export function convertToLanguageMessages(extLanguageMessages) {
3
- return extLanguageMessages;
4
- }
5
2
  export function createJoiExpression(expr) {
6
3
  return Joi.expression(expr);
7
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"type-utils.js","names":["Joi","convertToLanguageMessages","extLanguageMessages","createJoiExpression","expr","expression"],"sources":["../../../src/server/utils/type-utils.ts"],"sourcesContent":["import Joi, {\n type JoiExpression,\n type LanguageMessages,\n type LanguageMessagesExt\n} from 'joi'\n\nexport function convertToLanguageMessages(\n extLanguageMessages: LanguageMessagesExt\n): LanguageMessages {\n return extLanguageMessages as unknown as LanguageMessages\n}\n\nexport function createJoiExpression(expr: string): JoiExpression {\n return Joi.expression(expr) as unknown as JoiExpression\n}\n"],"mappings":"AAAA,OAAOA,GAAG,MAIH,KAAK;AAEZ,OAAO,SAASC,yBAAyBA,CACvCC,mBAAwC,EACtB;EAClB,OAAOA,mBAAmB;AAC5B;AAEA,OAAO,SAASC,mBAAmBA,CAACC,IAAY,EAAiB;EAC/D,OAAOJ,GAAG,CAACK,UAAU,CAACD,IAAI,CAAC;AAC7B","ignoreList":[]}
1
+ {"version":3,"file":"type-utils.js","names":["Joi","createJoiExpression","expr","expression"],"sources":["../../../src/server/utils/type-utils.ts"],"sourcesContent":["import Joi, { type JoiExpression } from 'joi'\n\nexport function createJoiExpression(expr: string): JoiExpression {\n return Joi.expression(expr) as unknown as JoiExpression\n}\n"],"mappings":"AAAA,OAAOA,GAAG,MAA8B,KAAK;AAE7C,OAAO,SAASC,mBAAmBA,CAACC,IAAY,EAAiB;EAC/D,OAAOF,GAAG,CAACG,UAAU,CAACD,IAAI,CAAC;AAC7B","ignoreList":[]}
@@ -15,4 +15,10 @@ export function isValidUUID(str: string): boolean;
15
15
  * @param {AnyFormRequest} request
16
16
  */
17
17
  export function resolveLanguage(request: AnyFormRequest): string;
18
+ /**
19
+ * Create a comma-separated list with the last seperator being 'or'
20
+ * @param { string[] | undefined } items
21
+ * @param {string} [finalSeparator]
22
+ */
23
+ export function joinWithOr(items: string[] | undefined, finalSeparator?: string): string;
18
24
  import type { AnyFormRequest } from '../../server/plugins/engine/types.js';
@@ -43,7 +43,24 @@ export function resolveLanguage(request) {
43
43
  }
44
44
 
45
45
  /**
46
- * @import { FormMetadata } from '@defra/forms-model'
46
+ * Create a comma-separated list with the last seperator being 'or'
47
+ * @param { string[] | undefined } items
48
+ * @param {string} [finalSeparator]
49
+ */
50
+ export function joinWithOr(items, finalSeparator = 'or') {
51
+ if (!items || items.length === 0) {
52
+ return '';
53
+ }
54
+ if (items.length === 1) {
55
+ return items[0];
56
+ }
57
+ if (items.length === 2) {
58
+ return `${items[0]} ${finalSeparator} ${items[1]}`;
59
+ }
60
+ return `${items.slice(0, -1).join(', ')} ${finalSeparator} ${items.at(-1)}`;
61
+ }
62
+
63
+ /**
47
64
  * @import { AnyFormRequest } from '../../server/plugins/engine/types.js'
48
65
  */
49
66
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["getTraceId","Joi","config","getPluginOptions","applyTraceHeaders","existingHeaders","header","get","traceId","headers","undefined","Object","assign","isValidUUID","str","error","string","uuid","validate","resolveLanguage","request","getLanguage","server","query","yar"],"sources":["../../../src/server/utils/utils.js"],"sourcesContent":["import { getTraceId } from '@defra/hapi-tracing'\nimport Joi from 'joi'\n\nimport { config } from '~/src/config/index.js'\nimport { getPluginOptions } from '~/src/server/plugins/engine/helpers.js'\n\n/**\n * Returns a set of headers to use in an HTTP request, merging them with any existing headers in options.\n * @param {Record<string, string> | undefined} [existingHeaders] - Optional existing headers to merge with the tracing headers.\n * @param {string} [header] - The tracing header name to use.\n * @returns {Record<string, string> | undefined} The merged headers, or undefined if no tracing header is available.\n */\nexport function applyTraceHeaders(\n existingHeaders,\n header = config.get('tracing').header\n) {\n if (!header) {\n return existingHeaders\n }\n\n const traceId = getTraceId()\n\n const headers = traceId ? { [header]: traceId } : undefined\n\n return existingHeaders ? Object.assign(existingHeaders, headers) : headers\n}\n\n/**\n * Validates if a string conforms to the uuid structure\n * @param {string} str\n * @returns\n */\nexport function isValidUUID(str) {\n const { error } = Joi.string().uuid().validate(str)\n return error === undefined\n}\n\n/**\n * @param {AnyFormRequest} request\n */\nexport function resolveLanguage(request) {\n const { getLanguage } = getPluginOptions(request.server)\n return getLanguage?.(request.query, request.yar) ?? 'en-GB'\n}\n\n/**\n * @import { FormMetadata } from '@defra/forms-model'\n * @import { AnyFormRequest } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,qBAAqB;AAChD,OAAOC,GAAG,MAAM,KAAK;AAErB,SAASC,MAAM;AACf,SAASC,gBAAgB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,eAAe,EACfC,MAAM,GAAGJ,MAAM,CAACK,GAAG,CAAC,SAAS,CAAC,CAACD,MAAM,EACrC;EACA,IAAI,CAACA,MAAM,EAAE;IACX,OAAOD,eAAe;EACxB;EAEA,MAAMG,OAAO,GAAGR,UAAU,CAAC,CAAC;EAE5B,MAAMS,OAAO,GAAGD,OAAO,GAAG;IAAE,CAACF,MAAM,GAAGE;EAAQ,CAAC,GAAGE,SAAS;EAE3D,OAAOL,eAAe,GAAGM,MAAM,CAACC,MAAM,CAACP,eAAe,EAAEI,OAAO,CAAC,GAAGA,OAAO;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,WAAWA,CAACC,GAAG,EAAE;EAC/B,MAAM;IAAEC;EAAM,CAAC,GAAGd,GAAG,CAACe,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,QAAQ,CAACJ,GAAG,CAAC;EACnD,OAAOC,KAAK,KAAKL,SAAS;AAC5B;;AAEA;AACA;AACA;AACA,OAAO,SAASS,eAAeA,CAACC,OAAO,EAAE;EACvC,MAAM;IAAEC;EAAY,CAAC,GAAGlB,gBAAgB,CAACiB,OAAO,CAACE,MAAM,CAAC;EACxD,OAAOD,WAAW,GAAGD,OAAO,CAACG,KAAK,EAAEH,OAAO,CAACI,GAAG,CAAC,IAAI,OAAO;AAC7D;;AAEA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["getTraceId","Joi","config","getPluginOptions","applyTraceHeaders","existingHeaders","header","get","traceId","headers","undefined","Object","assign","isValidUUID","str","error","string","uuid","validate","resolveLanguage","request","getLanguage","server","query","yar","joinWithOr","items","finalSeparator","length","slice","join","at"],"sources":["../../../src/server/utils/utils.js"],"sourcesContent":["import { getTraceId } from '@defra/hapi-tracing'\nimport Joi from 'joi'\n\nimport { config } from '~/src/config/index.js'\nimport { getPluginOptions } from '~/src/server/plugins/engine/helpers.js'\n\n/**\n * Returns a set of headers to use in an HTTP request, merging them with any existing headers in options.\n * @param {Record<string, string> | undefined} [existingHeaders] - Optional existing headers to merge with the tracing headers.\n * @param {string} [header] - The tracing header name to use.\n * @returns {Record<string, string> | undefined} The merged headers, or undefined if no tracing header is available.\n */\nexport function applyTraceHeaders(\n existingHeaders,\n header = config.get('tracing').header\n) {\n if (!header) {\n return existingHeaders\n }\n\n const traceId = getTraceId()\n\n const headers = traceId ? { [header]: traceId } : undefined\n\n return existingHeaders ? Object.assign(existingHeaders, headers) : headers\n}\n\n/**\n * Validates if a string conforms to the uuid structure\n * @param {string} str\n * @returns\n */\nexport function isValidUUID(str) {\n const { error } = Joi.string().uuid().validate(str)\n return error === undefined\n}\n\n/**\n * @param {AnyFormRequest} request\n */\nexport function resolveLanguage(request) {\n const { getLanguage } = getPluginOptions(request.server)\n return getLanguage?.(request.query, request.yar) ?? 'en-GB'\n}\n\n/**\n * Create a comma-separated list with the last seperator being 'or'\n * @param { string[] | undefined } items\n * @param {string} [finalSeparator]\n */\nexport function joinWithOr(items, finalSeparator = 'or') {\n if (!items || items.length === 0) {\n return ''\n }\n if (items.length === 1) {\n return items[0]\n }\n if (items.length === 2) {\n return `${items[0]} ${finalSeparator} ${items[1]}`\n }\n\n return `${items.slice(0, -1).join(', ')} ${finalSeparator} ${items.at(-1)}`\n}\n\n/**\n * @import { AnyFormRequest } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,qBAAqB;AAChD,OAAOC,GAAG,MAAM,KAAK;AAErB,SAASC,MAAM;AACf,SAASC,gBAAgB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,eAAe,EACfC,MAAM,GAAGJ,MAAM,CAACK,GAAG,CAAC,SAAS,CAAC,CAACD,MAAM,EACrC;EACA,IAAI,CAACA,MAAM,EAAE;IACX,OAAOD,eAAe;EACxB;EAEA,MAAMG,OAAO,GAAGR,UAAU,CAAC,CAAC;EAE5B,MAAMS,OAAO,GAAGD,OAAO,GAAG;IAAE,CAACF,MAAM,GAAGE;EAAQ,CAAC,GAAGE,SAAS;EAE3D,OAAOL,eAAe,GAAGM,MAAM,CAACC,MAAM,CAACP,eAAe,EAAEI,OAAO,CAAC,GAAGA,OAAO;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,WAAWA,CAACC,GAAG,EAAE;EAC/B,MAAM;IAAEC;EAAM,CAAC,GAAGd,GAAG,CAACe,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,QAAQ,CAACJ,GAAG,CAAC;EACnD,OAAOC,KAAK,KAAKL,SAAS;AAC5B;;AAEA;AACA;AACA;AACA,OAAO,SAASS,eAAeA,CAACC,OAAO,EAAE;EACvC,MAAM;IAAEC;EAAY,CAAC,GAAGlB,gBAAgB,CAACiB,OAAO,CAACE,MAAM,CAAC;EACxD,OAAOD,WAAW,GAAGD,OAAO,CAACG,KAAK,EAAEH,OAAO,CAACI,GAAG,CAAC,IAAI,OAAO;AAC7D;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,KAAK,EAAEC,cAAc,GAAG,IAAI,EAAE;EACvD,IAAI,CAACD,KAAK,IAAIA,KAAK,CAACE,MAAM,KAAK,CAAC,EAAE;IAChC,OAAO,EAAE;EACX;EACA,IAAIF,KAAK,CAACE,MAAM,KAAK,CAAC,EAAE;IACtB,OAAOF,KAAK,CAAC,CAAC,CAAC;EACjB;EACA,IAAIA,KAAK,CAACE,MAAM,KAAK,CAAC,EAAE;IACtB,OAAO,GAAGF,KAAK,CAAC,CAAC,CAAC,IAAIC,cAAc,IAAID,KAAK,CAAC,CAAC,CAAC,EAAE;EACpD;EAEA,OAAO,GAAGA,KAAK,CAACG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC,IAAIH,cAAc,IAAID,KAAK,CAACK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;AAC7E;;AAEA;AACA;AACA","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import { getTraceId } from '@defra/hapi-tracing';
2
2
  import { config } from "../../config/index.js";
3
- import { applyTraceHeaders, isValidUUID } from "./utils.js";
3
+ import { applyTraceHeaders, isValidUUID, joinWithOr } from "./utils.js";
4
4
  jest.mock('@defra/hapi-tracing');
5
5
  describe('Header helper functions', () => {
6
6
  it('should include the trace id in the headers if available', () => {
@@ -81,5 +81,25 @@ describe('Header helper functions', () => {
81
81
  }) => {
82
82
  expect(isValidUUID(uuid)).toBe(valid);
83
83
  });
84
+ describe('joinWithOr', () => {
85
+ it('should handle undefined array', () => {
86
+ expect(joinWithOr(undefined)).toBe('');
87
+ });
88
+ it('should handle empty array', () => {
89
+ expect(joinWithOr([])).toBe('');
90
+ });
91
+ it('should handle one item', () => {
92
+ expect(joinWithOr(['item1'])).toBe('item1');
93
+ });
94
+ it('should handle two items', () => {
95
+ expect(joinWithOr(['item1', 'item2'])).toBe('item1 or item2');
96
+ });
97
+ it('should handle three items', () => {
98
+ expect(joinWithOr(['item1', 'item2', 'item3'])).toBe('item1, item2 or item3');
99
+ });
100
+ it('should handle a different last separator', () => {
101
+ expect(joinWithOr(['item1', 'item2', 'item3'], 'and')).toBe('item1, item2 and item3');
102
+ });
103
+ });
84
104
  });
85
105
  //# sourceMappingURL=utils.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.test.js","names":["getTraceId","config","applyTraceHeaders","isValidUUID","jest","mock","describe","it","mocked","mockReturnValue","result","expect","toEqual","get","header","toBeUndefined","existingHeaders","Authorization","toBe","each","uuid","valid"],"sources":["../../../src/server/utils/utils.test.js"],"sourcesContent":["import { getTraceId } from '@defra/hapi-tracing'\n\nimport { config } from '~/src/config/index.js'\nimport { applyTraceHeaders, isValidUUID } from '~/src/server/utils/utils.js'\n\njest.mock('@defra/hapi-tracing')\n\ndescribe('Header helper functions', () => {\n it('should include the trace id in the headers if available', () => {\n jest.mocked(getTraceId).mockReturnValue('my-trace-id')\n\n const result = applyTraceHeaders() // Updated to applyTraceHeaders\n expect(result).toEqual({\n [config.get('tracing').header]: 'my-trace-id'\n })\n })\n\n it('should exclude the trace id in the headers if missing', () => {\n jest.mocked(getTraceId).mockReturnValue(null)\n\n const result = applyTraceHeaders() // Updated to applyTraceHeaders\n expect(result).toBeUndefined()\n })\n\n it('should merge existing headers with the trace id if available', () => {\n jest.mocked(getTraceId).mockReturnValue('my-trace-id')\n\n const existingHeaders = { Authorization: 'Bearer token' }\n const result = applyTraceHeaders(existingHeaders) // Updated to applyTraceHeaders\n\n expect(result).toEqual({\n Authorization: 'Bearer token',\n [config.get('tracing').header]: 'my-trace-id'\n })\n })\n\n it('should return existing headers without modification if trace id is missing', () => {\n jest.mocked(getTraceId).mockReturnValue(null)\n\n const existingHeaders = { Authorization: 'Bearer token' }\n const result = applyTraceHeaders(existingHeaders) // Updated to applyTraceHeaders\n\n expect(result).toEqual({\n Authorization: 'Bearer token'\n })\n })\n\n it('should return existing headers if tracing header configuration is missing', () => {\n const existingHeaders = { Authorization: 'Bearer token' }\n const result = applyTraceHeaders(existingHeaders, '')\n\n expect(result).toBe(existingHeaders)\n })\n\n it.each([\n { uuid: '1f457a37-7b99-452e-8324-df9e041abff2', valid: true },\n { uuid: '0c9a2690-9a0c-4a2c-98d7-e9ef95615ac9', valid: true },\n { uuid: 'f223de3b-5ae5-44b2-8cee-ea8439adc335', valid: true },\n { uuid: '82ecc90c-bc47-4ec5-80af-1a9fc1c4c08c', valid: true },\n { uuid: 'd99ff582-ecce-474f-a44b-bc5961d977c5', valid: true },\n { uuid: '7afffc8a-81ab-4aa6-a8f5-ecf6a600a781', valid: true },\n { uuid: '7afffc8a81ab4aa6a8f5ecf6a600a781', valid: true },\n { uuid: '', valid: false },\n { uuid: 'uuid', valid: false },\n { uuid: 'h4f84ef8-b5e1-4544-94aa-1b671d50d8cb', valid: false }\n ])('should validate uuid appropriately %s', ({ uuid, valid }) => {\n expect(isValidUUID(uuid)).toBe(valid)\n })\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"utils.test.js","names":["getTraceId","config","applyTraceHeaders","isValidUUID","joinWithOr","jest","mock","describe","it","mocked","mockReturnValue","result","expect","toEqual","get","header","toBeUndefined","existingHeaders","Authorization","toBe","each","uuid","valid","undefined"],"sources":["../../../src/server/utils/utils.test.js"],"sourcesContent":["import { getTraceId } from '@defra/hapi-tracing'\n\nimport { config } from '~/src/config/index.js'\nimport {\n applyTraceHeaders,\n isValidUUID,\n joinWithOr\n} from '~/src/server/utils/utils.js'\n\njest.mock('@defra/hapi-tracing')\n\ndescribe('Header helper functions', () => {\n it('should include the trace id in the headers if available', () => {\n jest.mocked(getTraceId).mockReturnValue('my-trace-id')\n\n const result = applyTraceHeaders() // Updated to applyTraceHeaders\n expect(result).toEqual({\n [config.get('tracing').header]: 'my-trace-id'\n })\n })\n\n it('should exclude the trace id in the headers if missing', () => {\n jest.mocked(getTraceId).mockReturnValue(null)\n\n const result = applyTraceHeaders() // Updated to applyTraceHeaders\n expect(result).toBeUndefined()\n })\n\n it('should merge existing headers with the trace id if available', () => {\n jest.mocked(getTraceId).mockReturnValue('my-trace-id')\n\n const existingHeaders = { Authorization: 'Bearer token' }\n const result = applyTraceHeaders(existingHeaders) // Updated to applyTraceHeaders\n\n expect(result).toEqual({\n Authorization: 'Bearer token',\n [config.get('tracing').header]: 'my-trace-id'\n })\n })\n\n it('should return existing headers without modification if trace id is missing', () => {\n jest.mocked(getTraceId).mockReturnValue(null)\n\n const existingHeaders = { Authorization: 'Bearer token' }\n const result = applyTraceHeaders(existingHeaders) // Updated to applyTraceHeaders\n\n expect(result).toEqual({\n Authorization: 'Bearer token'\n })\n })\n\n it('should return existing headers if tracing header configuration is missing', () => {\n const existingHeaders = { Authorization: 'Bearer token' }\n const result = applyTraceHeaders(existingHeaders, '')\n\n expect(result).toBe(existingHeaders)\n })\n\n it.each([\n { uuid: '1f457a37-7b99-452e-8324-df9e041abff2', valid: true },\n { uuid: '0c9a2690-9a0c-4a2c-98d7-e9ef95615ac9', valid: true },\n { uuid: 'f223de3b-5ae5-44b2-8cee-ea8439adc335', valid: true },\n { uuid: '82ecc90c-bc47-4ec5-80af-1a9fc1c4c08c', valid: true },\n { uuid: 'd99ff582-ecce-474f-a44b-bc5961d977c5', valid: true },\n { uuid: '7afffc8a-81ab-4aa6-a8f5-ecf6a600a781', valid: true },\n { uuid: '7afffc8a81ab4aa6a8f5ecf6a600a781', valid: true },\n { uuid: '', valid: false },\n { uuid: 'uuid', valid: false },\n { uuid: 'h4f84ef8-b5e1-4544-94aa-1b671d50d8cb', valid: false }\n ])('should validate uuid appropriately %s', ({ uuid, valid }) => {\n expect(isValidUUID(uuid)).toBe(valid)\n })\n\n describe('joinWithOr', () => {\n it('should handle undefined array', () => {\n expect(joinWithOr(undefined)).toBe('')\n })\n it('should handle empty array', () => {\n expect(joinWithOr([])).toBe('')\n })\n it('should handle one item', () => {\n expect(joinWithOr(['item1'])).toBe('item1')\n })\n it('should handle two items', () => {\n expect(joinWithOr(['item1', 'item2'])).toBe('item1 or item2')\n })\n it('should handle three items', () => {\n expect(joinWithOr(['item1', 'item2', 'item3'])).toBe(\n 'item1, item2 or item3'\n )\n })\n it('should handle a different last separator', () => {\n expect(joinWithOr(['item1', 'item2', 'item3'], 'and')).toBe(\n 'item1, item2 and item3'\n )\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "5.0.0-alpha.1",
3
+ "version": "5.0.0-alpha.11",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "files": [
@@ -19,6 +19,11 @@
19
19
  "import": "./.server/server/plugins/engine/types/index.js",
20
20
  "default": "./.server/server/plugins/engine/types/index.js"
21
21
  },
22
+ "./maps": {
23
+ "sass": "./.server/client/stylesheets/maps.scss",
24
+ "import": "./.server/client/javascripts/maps.js",
25
+ "default": "./.server/client/javascripts/maps.js"
26
+ },
22
27
  "./shared.js": "./.server/client/javascripts/shared.js",
23
28
  "./shared.min.js": "./.public/javascripts/shared.min.js",
24
29
  "./shared.min.js.map": "./.public/javascripts/shared.min.js.map",
@@ -87,7 +92,7 @@
87
92
  },
88
93
  "license": "SEE LICENSE IN LICENSE",
89
94
  "dependencies": {
90
- "@defra/forms-model": "^3.0.687",
95
+ "@defra/forms-model": "^3.0.693",
91
96
  "@defra/hapi-tracing": "^1.29.0",
92
97
  "@defra/interactive-map": "^0.0.33-alpha",
93
98
  "@elastic/ecs-pino-format": "^1.5.0",
@@ -107,6 +112,7 @@
107
112
  "@turf/bbox": "^7.3.4",
108
113
  "@turf/boolean-within": "^7.3.5",
109
114
  "@turf/centroid": "^7.3.4",
115
+ "@turf/helpers": "^7.3.5",
110
116
  "@types/humanize-duration": "^3.27.4",
111
117
  "accessible-autocomplete": "^3.0.1",
112
118
  "atob": "^2.1.2",
@@ -131,6 +137,7 @@
131
137
  "joi": "^17.13.3",
132
138
  "liquidjs": "^10.24.0",
133
139
  "lodash": "^4.17.21",
140
+ "lru-cache": "^11.5.1",
134
141
  "maplibre-gl": "^5.24.0",
135
142
  "marked": "^15.0.12",
136
143
  "nunjucks": "^3.2.4",
@@ -305,17 +305,19 @@ function pollUploadStatus(uploadId) {
305
305
  * @param {HTMLButtonElement} uploadButton - The upload button
306
306
  * @param {HTMLButtonElement} continueButton - The continue button
307
307
  * @param {File[]} selectedFiles - The selected files
308
+ * @param {string} uploadingLabel - The text to display while uploading (can be multiple languages)
308
309
  */
309
310
  function handleStandardFormSubmission(
310
311
  formElement,
311
312
  fileInput,
312
313
  uploadButton,
313
314
  continueButton,
314
- selectedFiles
315
+ selectedFiles,
316
+ uploadingLabel
315
317
  ) {
316
318
  // Render in reverse so first file ends up at the top of the summary list
317
319
  for (let i = selectedFiles.length - 1; i >= 0; i--) {
318
- renderSummary(selectedFiles[i], 'Uploading…', formElement)
320
+ renderSummary(selectedFiles[i], uploadingLabel, formElement)
319
321
  }
320
322
 
321
323
  fileInput.focus()
@@ -405,6 +407,10 @@ function initUpload() {
405
407
  return
406
408
  }
407
409
 
410
+ const uploadingLabel =
411
+ document.getElementById('uploadedFilesContainer')?.dataset.uploadinglabel ??
412
+ 'Uploading…'
413
+
408
414
  const formElement = /** @type {HTMLFormElement} */ (form)
409
415
  /** @type {File[]} */
410
416
  let selectedFiles = []
@@ -418,6 +424,7 @@ function initUpload() {
418
424
 
419
425
  if (fileInput.files && fileInput.files.length > 0) {
420
426
  selectedFiles = Array.from(fileInput.files)
427
+ uploadButton.click()
421
428
  }
422
429
  })
423
430
 
@@ -445,7 +452,8 @@ function initUpload() {
445
452
  fileInput,
446
453
  uploadButton,
447
454
  continueButton,
448
- selectedFiles
455
+ selectedFiles,
456
+ uploadingLabel
449
457
  )
450
458
 
451
459
  handleAjaxFormSubmission(
@@ -10,6 +10,7 @@ import {
10
10
  defaultConfig,
11
11
  getCentroidGridRef,
12
12
  getCoordinateGridRef,
13
+ getMapCountryLayers,
13
14
  getMapLayers
14
15
  } from './map.js'
15
16
  import sssiDataset from './sssi-dataset.js'
@@ -174,43 +175,15 @@ export function processGeospatial(config, geospatial, index) {
174
175
  const plugins = [drawPlugin]
175
176
  const country = geospatial.dataset.country
176
177
  const mapLayers = getMapLayers(geospatial.dataset.maplayers)
178
+ const datasets = getMapCountryLayers(config.apiPath, country)
177
179
 
178
- if (country) {
179
- // Add the country bounds as a dataset plugin to show the valid area on the map
180
- // and provide feedback to the user when they add features outside of the bounds.
181
- const countriesDatasetPlugin = createDatasetsPlugin({
182
- datasets: [
183
- {
184
- id: 'invalid-area',
185
- label: 'Invalid areas',
186
- geojson: `${config.apiPath}/maps/countries.geojson?omit=${country}`,
187
- showInKey: false,
188
- showInMenu: false,
189
- style: {
190
- stroke: 'gray',
191
- strokeWidth: 1,
192
- fill: 'rgba(211,211,211,0.8)'
193
- }
194
- },
195
- {
196
- id: 'valid-area',
197
- label: 'Valid areas',
198
- geojson: `${config.apiPath}/maps/countries.geojson?only=${country}`,
199
- showInKey: false,
200
- showInMenu: false,
201
- style: {
202
- stroke: 'rgba(0,112,60,1)',
203
- strokeWidth: 1
204
- }
205
- }
206
- ]
207
- })
208
-
209
- plugins.push(countriesDatasetPlugin)
180
+ if (mapLayers.includes('sssi')) {
181
+ datasets.push(...sssiDataset)
210
182
  }
211
183
 
212
- if (mapLayers.includes('sssi')) {
213
- plugins.push(createDatasetsPlugin(sssiDataset))
184
+ // Create a map dataset plugin if there are any present
185
+ if (datasets.length) {
186
+ plugins.push(createDatasetsPlugin({ datasets }))
214
187
  }
215
188
 
216
189
  const initConfig = {
@@ -3,6 +3,7 @@ import {
3
3
  CharacterCount,
4
4
  Checkboxes,
5
5
  ErrorSummary,
6
+ FileUpload,
6
7
  Header,
7
8
  NotificationBanner,
8
9
  Radios,
@@ -16,6 +17,7 @@ export function initAllGovuk() {
16
17
  createAll(Checkboxes)
17
18
  createAll(ErrorSummary)
18
19
  createAll(Header)
20
+ createAll(FileUpload)
19
21
  createAll(NotificationBanner)
20
22
  createAll(Radios)
21
23
  createAll(SkipLink)
@@ -7,6 +7,7 @@ import {
7
7
  createMap,
8
8
  defaultConfig,
9
9
  eastingNorthingToLatLong,
10
+ getMapCountryLayers,
10
11
  getMapLayers,
11
12
  latLongToEastingNorthing,
12
13
  latLongToOsGridRef,
@@ -423,10 +424,17 @@ export function processLocation(config, location, index) {
423
424
 
424
425
  locationInputs.after(mapContainer)
425
426
 
427
+ const country = location.dataset.country
426
428
  const mapLayers = getMapLayers(location.dataset.maplayers)
429
+ const datasets = getMapCountryLayers(config.apiPath, country)
427
430
 
428
431
  if (mapLayers.includes('sssi')) {
429
- initConfig.plugins = [createDatasetsPlugin(sssiDataset)]
432
+ datasets.push(...sssiDataset)
433
+ }
434
+
435
+ // Create a map dataset plugin if there are any present
436
+ if (datasets.length) {
437
+ initConfig.plugins = [createDatasetsPlugin({ datasets })]
430
438
  }
431
439
 
432
440
  const { map, interactPlugin } = createMap(mapId, initConfig, config)
@@ -367,6 +367,48 @@ export function getMapLayers(layers) {
367
367
  return trimmed ? trimmed.split(',') : []
368
368
  }
369
369
 
370
+ /**
371
+ * Adds the country layers to a datasets array
372
+ * @param {string} apiPath
373
+ * @param {string} [country]
374
+ */
375
+ export function getMapCountryLayers(apiPath, country) {
376
+ /** @type {any[]} */
377
+ const datasets = []
378
+
379
+ if (country) {
380
+ // Add the country bounds to the datasets array to show the valid area on the map
381
+ // and provide feedback to the user when they add features outside of the bounds.
382
+ datasets.push(
383
+ {
384
+ id: 'invalid-area',
385
+ label: 'Invalid areas',
386
+ geojson: `${apiPath}/maps/countries.geojson?omit=${country}`,
387
+ showInKey: false,
388
+ showInMenu: false,
389
+ style: {
390
+ stroke: 'gray',
391
+ strokeWidth: 1,
392
+ fill: 'rgba(211,211,211,0.8)'
393
+ }
394
+ },
395
+ {
396
+ id: 'valid-area',
397
+ label: 'Valid areas',
398
+ geojson: `${apiPath}/maps/countries.geojson?only=${country}`,
399
+ showInKey: false,
400
+ showInMenu: false,
401
+ style: {
402
+ stroke: 'rgba(0,112,60,1)',
403
+ strokeWidth: 1
404
+ }
405
+ }
406
+ )
407
+ }
408
+
409
+ return datasets
410
+ }
411
+
370
412
  /**
371
413
  * @typedef {object} InteractiveMap - an instance of a InteractiveMap
372
414
  * @property {Function} on - register callback listeners to map events
@@ -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,9 +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'
6
+ export * from './maps.js'
9
7
 
10
8
  export const initAllGovuk = initAllGovukImp
11
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
@@ -1,8 +1,11 @@
1
1
  import { type AutocompleteFieldComponent } from '@defra/forms-model'
2
+ import { type LanguageMessages } from 'joi'
2
3
 
3
4
  import { SelectField } from './SelectField.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,14 @@ export class AutocompleteField extends SelectField {
45
48
  formGroup
46
49
  }
47
50
  }
51
+
52
+ getValidationMessagesOverride(translator: Translator) {
53
+ const { t } = translator
54
+ return {
55
+ [this.name]: {
56
+ 'any.required': buildValidationMessages(t).objectRequired,
57
+ 'any.only': buildValidationMessages(t).objectRequired
58
+ } as LanguageMessages
59
+ }
60
+ }
48
61
  }
@@ -1,8 +1,9 @@
1
1
  import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'
2
- import joi, { type ArraySchema } from 'joi'
2
+ import joi, { type ArraySchema, type LanguageMessages } from 'joi'
3
3
 
4
4
  import { isFormValue } from './FormComponent.js'
5
5
  import { SelectionControlField } from './SelectionControlField.js'
6
+ import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
6
7
  import { type Translator } from '../i18n/types.js'
7
8
  import { type FormModel } from '../models/FormModel.js'
8
9
  import { type QuestionPageController } from '../pageControllers/QuestionPageController.js'
@@ -133,6 +134,17 @@ export class CheckboxesField extends SelectionControlField {
133
134
  return this.getContextValueFromFormValue(values)
134
135
  }
135
136
 
137
+ getValidationMessagesOverride(translator: Translator) {
138
+ const { t } = translator
139
+ return {
140
+ [this.name]: {
141
+ 'array.min': buildValidationMessages(t).arrayMin,
142
+ 'array.max': buildValidationMessages(t).arrayMax,
143
+ 'array.length': buildValidationMessages(t).arrayLength
144
+ } as LanguageMessages
145
+ }
146
+ }
147
+
136
148
  /**
137
149
  * For error preview page that shows all possible errors on a component
138
150
  */
@@ -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