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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/.public/javascripts/application.min.js +1 -1
  2. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  3. package/.public/javascripts/application.min.js.map +1 -1
  4. package/.public/javascripts/shared.min.js +1 -1
  5. package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/shared.min.js.map +1 -1
  7. package/.public/stylesheets/application.min.css.map +1 -1
  8. package/.server/client/javascripts/file-upload.js +6 -3
  9. package/.server/client/javascripts/file-upload.js.map +1 -1
  10. package/.server/client/javascripts/geospatial-map.d.ts +153 -5
  11. package/.server/client/javascripts/geospatial-map.js +157 -77
  12. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  13. package/.server/client/javascripts/govuk.js +2 -1
  14. package/.server/client/javascripts/govuk.js.map +1 -1
  15. package/.server/client/javascripts/location-map.d.ts +44 -0
  16. package/.server/client/javascripts/location-map.js +54 -5
  17. package/.server/client/javascripts/location-map.js.map +1 -1
  18. package/.server/client/javascripts/map-constants.d.ts +3 -0
  19. package/.server/client/javascripts/map-constants.js +4 -0
  20. package/.server/client/javascripts/map-constants.js.map +1 -0
  21. package/.server/client/javascripts/map.d.ts +10 -0
  22. package/.server/client/javascripts/map.js +42 -0
  23. package/.server/client/javascripts/map.js.map +1 -1
  24. package/.server/client/javascripts/maps.d.ts +5 -0
  25. package/.server/client/javascripts/maps.js +6 -0
  26. package/.server/client/javascripts/maps.js.map +1 -0
  27. package/.server/client/javascripts/shared.d.ts +1 -4
  28. package/.server/client/javascripts/shared.js +1 -4
  29. package/.server/client/javascripts/shared.js.map +1 -1
  30. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  31. package/.server/client/javascripts/sssi-dataset.js +37 -39
  32. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  33. package/.server/client/stylesheets/maps.scss +4 -0
  34. package/.server/client/stylesheets/shared.scss +1 -5
  35. package/.server/server/constants.d.ts +2 -0
  36. package/.server/server/constants.js +2 -0
  37. package/.server/server/constants.js.map +1 -1
  38. package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
  39. package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
  40. package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
  41. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  42. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  43. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  44. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +21 -0
  45. package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
  46. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  48. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  49. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  50. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  51. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  52. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  53. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  54. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  55. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  56. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  57. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  58. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  59. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
  60. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  61. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  62. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  63. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  64. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  65. package/.server/server/plugins/engine/components/FileUploadField.d.ts +21 -0
  66. package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
  67. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  69. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  70. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  71. package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
  72. package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
  73. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  74. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  75. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  76. package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
  77. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  78. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  79. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  80. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  81. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  82. package/.server/server/plugins/engine/components/LocationFieldBase.js +25 -6
  83. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  84. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
  85. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
  86. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  87. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  89. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  90. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  91. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  92. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  93. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  94. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  95. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  96. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  97. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  98. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  99. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  100. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  101. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
  102. package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
  103. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  104. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  105. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  106. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  108. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  109. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  110. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  111. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  112. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  113. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  114. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  115. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  116. package/.server/server/plugins/engine/components/helpers/components.js +3 -3
  117. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  118. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
  119. package/.server/server/plugins/engine/components/helpers/geospatial.js +56 -15
  120. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  121. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  122. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  123. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  124. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  125. package/.server/server/plugins/engine/components/types.js.map +1 -1
  126. package/.server/server/plugins/engine/errors.d.ts +49 -0
  127. package/.server/server/plugins/engine/errors.js +75 -0
  128. package/.server/server/plugins/engine/errors.js.map +1 -0
  129. package/.server/server/plugins/engine/form-availability.d.ts +3 -2
  130. package/.server/server/plugins/engine/form-availability.js +3 -2
  131. package/.server/server/plugins/engine/form-availability.js.map +1 -1
  132. package/.server/server/plugins/engine/form-context.js +2 -2
  133. package/.server/server/plugins/engine/form-context.js.map +1 -1
  134. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  135. package/.server/server/plugins/engine/helpers.js +44 -5
  136. package/.server/server/plugins/engine/helpers.js.map +1 -1
  137. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
  138. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
  139. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  140. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  141. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  142. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  143. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  144. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  145. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  146. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  147. package/.server/server/plugins/engine/i18n/form.js +35 -0
  148. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  149. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  150. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  151. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  152. package/.server/server/plugins/engine/i18n/translations/cy.json +192 -9
  153. package/.server/server/plugins/engine/i18n/translations/en-GB.json +125 -7
  154. package/.server/server/plugins/engine/i18n/types.d.ts +3 -0
  155. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  156. package/.server/server/plugins/engine/index.d.ts +4 -0
  157. package/.server/server/plugins/engine/index.js +4 -0
  158. package/.server/server/plugins/engine/index.js.map +1 -1
  159. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  160. package/.server/server/plugins/engine/models/FormModel.js +35 -23
  161. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  162. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  163. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  164. package/.server/server/plugins/engine/models/types.d.ts +28 -1
  165. package/.server/server/plugins/engine/models/types.js.map +1 -1
  166. package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
  167. package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
  168. package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
  169. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
  170. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  171. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  172. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  173. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  174. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  175. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  176. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  177. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  178. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  179. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  180. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  181. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  182. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  183. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  184. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  185. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  186. package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
  187. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
  188. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
  189. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
  190. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  191. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
  192. package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
  193. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  194. package/.server/server/plugins/engine/types/enums.d.ts +3 -3
  195. package/.server/server/plugins/engine/types/enums.js +5 -4
  196. package/.server/server/plugins/engine/types/enums.js.map +1 -1
  197. package/.server/server/plugins/engine/types/schema.js +10 -3
  198. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  199. package/.server/server/plugins/engine/types.d.ts +18 -2
  200. package/.server/server/plugins/engine/types.js.map +1 -1
  201. package/.server/server/plugins/engine/unavailable-response.js +5 -2
  202. package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
  203. package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
  204. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  205. package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
  206. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  207. package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
  208. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  209. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  210. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  211. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  212. package/.server/server/plugins/engine/views/unavailable.html +14 -11
  213. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  214. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  215. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  216. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  217. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  218. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  219. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  220. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  221. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  222. package/.server/server/plugins/payment/helper.d.ts +11 -1
  223. package/.server/server/plugins/payment/helper.js +18 -2
  224. package/.server/server/plugins/payment/helper.js.map +1 -1
  225. package/.server/server/plugins/payment/helper.test.js +2 -1
  226. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  227. package/.server/server/plugins/payment/service.d.ts +2 -1
  228. package/.server/server/plugins/payment/service.js +5 -2
  229. package/.server/server/plugins/payment/service.js.map +1 -1
  230. package/.server/server/plugins/payment/service.test.js +7 -3
  231. package/.server/server/plugins/payment/service.test.js.map +1 -1
  232. package/.server/server/plugins/payment/types.d.ts +4 -0
  233. package/.server/server/plugins/payment/types.js +1 -0
  234. package/.server/server/plugins/payment/types.js.map +1 -1
  235. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  236. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  237. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  238. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  239. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  240. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  241. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  242. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  243. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  244. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  245. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  246. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  247. package/.server/server/utils/type-utils.d.ts +1 -2
  248. package/.server/server/utils/type-utils.js +0 -3
  249. package/.server/server/utils/type-utils.js.map +1 -1
  250. package/.server/server/utils/utils.d.ts +6 -0
  251. package/.server/server/utils/utils.js +18 -1
  252. package/.server/server/utils/utils.js.map +1 -1
  253. package/.server/server/utils/utils.test.js +21 -1
  254. package/.server/server/utils/utils.test.js.map +1 -1
  255. package/package.json +20 -5
  256. package/src/client/javascripts/file-upload.js +11 -3
  257. package/src/client/javascripts/geospatial-map.js +176 -81
  258. package/src/client/javascripts/govuk.js +2 -0
  259. package/src/client/javascripts/location-map.js +60 -4
  260. package/src/client/javascripts/map-constants.js +3 -0
  261. package/src/client/javascripts/map.js +47 -0
  262. package/src/client/javascripts/maps.js +5 -0
  263. package/src/client/javascripts/shared.js +1 -4
  264. package/src/client/javascripts/sssi-dataset.js +39 -41
  265. package/src/client/stylesheets/maps.scss +4 -0
  266. package/src/client/stylesheets/shared.scss +1 -5
  267. package/src/server/constants.js +2 -0
  268. package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
  269. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  270. package/src/server/plugins/engine/components/CheckboxesField.ts +38 -5
  271. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  272. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  273. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  274. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  275. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  276. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  277. package/src/server/plugins/engine/components/FileUploadField.ts +44 -3
  278. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  279. package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
  280. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  281. package/src/server/plugins/engine/components/LocationFieldBase.ts +30 -7
  282. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
  283. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  284. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  285. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  286. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  287. package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
  288. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  289. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  290. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  291. package/src/server/plugins/engine/components/helpers/components.ts +3 -3
  292. package/src/server/plugins/engine/components/helpers/geospatial.ts +84 -21
  293. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  294. package/src/server/plugins/engine/components/types.ts +1 -0
  295. package/src/server/plugins/engine/errors.ts +78 -0
  296. package/src/server/plugins/engine/form-availability.ts +8 -2
  297. package/src/server/plugins/engine/form-context.ts +4 -2
  298. package/src/server/plugins/engine/helpers.ts +52 -5
  299. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
  300. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  301. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  302. package/src/server/plugins/engine/i18n/form.ts +54 -0
  303. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  304. package/src/server/plugins/engine/i18n/translations/cy.json +192 -9
  305. package/src/server/plugins/engine/i18n/translations/en-GB.json +125 -7
  306. package/src/server/plugins/engine/i18n/types.ts +3 -0
  307. package/src/server/plugins/engine/index.ts +7 -0
  308. package/src/server/plugins/engine/models/FormModel.ts +46 -23
  309. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  310. package/src/server/plugins/engine/models/types.ts +31 -0
  311. package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
  312. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
  313. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  314. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  315. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  316. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  317. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  318. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  319. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
  320. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
  321. package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
  322. package/src/server/plugins/engine/types/enums.ts +4 -3
  323. package/src/server/plugins/engine/types/schema.ts +17 -4
  324. package/src/server/plugins/engine/types.ts +19 -1
  325. package/src/server/plugins/engine/unavailable-response.ts +6 -2
  326. package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
  327. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  328. package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
  329. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  330. package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
  331. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  332. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  333. package/src/server/plugins/engine/views/file-upload.html +1 -1
  334. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  335. package/src/server/plugins/engine/views/unavailable.html +14 -11
  336. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  337. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  338. package/src/server/plugins/payment/helper.js +22 -2
  339. package/src/server/plugins/payment/service.js +6 -2
  340. package/src/server/plugins/payment/types.js +1 -0
  341. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  342. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  343. package/src/server/plugins/postcode-lookup/types.js +6 -1
  344. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  345. package/src/server/utils/type-utils.ts +1 -11
  346. package/src/server/utils/utils.js +19 -1
@@ -4,21 +4,47 @@ import createDatasetsPlugin from '@defra/interactive-map/plugins/datasets'
4
4
  import createDrawPlugin from '@defra/interactive-map/plugins/draw-ml'
5
5
  import { bbox } from '@turf/bbox'
6
6
 
7
+ import {
8
+ DEFAULT_LANG,
9
+ ENGLISH_LANG,
10
+ WELSH_LANG
11
+ } from './map-constants.js'
7
12
  import {
8
13
  EVENTS,
9
14
  createMap,
10
15
  defaultConfig,
11
16
  getCentroidGridRef,
12
17
  getCoordinateGridRef,
18
+ getMapCountryLayers,
13
19
  getMapLayers
14
20
  } from './map.js'
15
21
  import sssiDataset from './sssi-dataset.js'
16
22
  import { formatDelimtedList } from './utils.js'
23
+ import cy from '../../server/plugins/engine/i18n/translations/cy.json' with { type: 'json' }
24
+ import enGB from '../../server/plugins/engine/i18n/translations/en-GB.json' with { type: 'json' }
25
+
26
+ const englishTranslations = enGB.components.geospatialField.map
27
+ const welshTranslations = cy.components.geospatialField.map
28
+
29
+ /**
30
+ * @type {Record<LanguageCode, GeospatialLanguageTexts>}
31
+ */
32
+ export const languageTexts = {
33
+ [ENGLISH_LANG]: englishTranslations,
34
+ [WELSH_LANG]: welshTranslations
35
+ }
36
+
37
+ /**
38
+ * Get the map texts for the given language code
39
+ * @param {LanguageCode} lang - the lanugae code
40
+ */
41
+ export function getTexts(lang = DEFAULT_LANG) {
42
+ return languageTexts[lang]
43
+ }
17
44
 
18
45
  const helpPanelConfig = {
19
46
  focus: false,
20
47
  showLabel: true,
21
- label: 'How to use this map',
22
48
  mobile: {
23
49
  slot: 'drawer',
24
50
  open: true,
@@ -40,59 +66,79 @@ const helpPanelConfig = {
40
66
  }
41
67
 
42
68
  /**
69
+ * @param {GeospatialPanelTexts} texts
43
70
  * @param {boolean} allowLine
44
71
  * @param {boolean} allowShape
45
72
  */
46
- function getLineOrShapeText(allowLine, allowShape) {
73
+ function getLineOrShapeText(texts, allowLine, allowShape) {
47
74
  if (allowLine && allowShape) {
48
- return 'a line or shape'
75
+ return texts.lineOrShapeText
49
76
  }
50
77
  if (allowLine) {
51
- return 'a line'
78
+ return texts.lineText
52
79
  }
53
80
  if (allowShape) {
54
- return 'a shape'
81
+ return texts.shapeText
55
82
  }
56
83
  return ''
57
84
  }
58
85
 
59
86
  /**
87
+ * @param {GeospatialPanelTexts} texts
60
88
  * @param {boolean} allowPoint
61
89
  * @param {boolean} allowLine
62
90
  * @param {boolean} allowShape
63
91
  */
64
- function getAllowedTypesPhrase(allowPoint, allowLine, allowShape) {
92
+ function getAllowedTypesPhrase(texts, allowPoint, allowLine, allowShape) {
65
93
  const items = []
66
94
 
67
95
  if (allowPoint) {
68
- items.push('points')
96
+ items.push(texts.typesPhrasePoint)
69
97
  }
70
98
  if (allowLine) {
71
- items.push('lines')
99
+ items.push(texts.typesPhraseLine)
72
100
  }
73
101
  if (allowShape) {
74
- items.push('shapes')
102
+ items.push(texts.typesPhraseShape)
75
103
  }
76
104
 
77
- return formatDelimtedList(items, ',', 'or')
105
+ return formatDelimtedList(items, ',', texts.typesPhraseOr)
106
+ }
107
+
108
+ /**
109
+ * Gets the type description for a given feature
110
+ * @param {Feature} feature - the geojson feature
111
+ * @param {GeometryTexts} typeDescriptions
112
+ */
113
+ function getTypeDescription(feature, typeDescriptions) {
114
+ switch (feature.geometry.type) {
115
+ case 'Point':
116
+ return typeDescriptions.point
117
+ case 'LineString':
118
+ return typeDescriptions.line
119
+ case 'Polygon':
120
+ return typeDescriptions.polygon
121
+ }
78
122
  }
79
123
 
80
124
  /**
125
+ * @param {GeospatialPanelTexts} texts
81
126
  * @param {boolean} allowPoint
82
127
  * @param {boolean} allowLine
83
128
  * @param {boolean} allowShape
84
129
  */
85
- export function getHelpPanelHtml(allowPoint, allowLine, allowShape) {
86
- const lineOrShapeText = getLineOrShapeText(allowLine, allowShape)
87
- const doneExtra = lineOrShapeText
88
- ? `<li>Double‑click, or select 'Done', when you have finished drawing ${lineOrShapeText}</li>`
130
+ export function getHelpPanelHtml(texts, allowPoint, allowLine, allowShape) {
131
+ const lineOrShapeText = getLineOrShapeText(texts, allowLine, allowShape)
132
+ const point3 = lineOrShapeText
133
+ ? `<li>${texts.point3} ${lineOrShapeText}</li>`
89
134
  : ''
90
135
  const allowedTypesText = getAllowedTypesPhrase(
136
+ texts,
91
137
  allowPoint,
92
138
  allowLine,
93
139
  allowShape
94
140
  )
95
- return `<p class="govuk-body-s govuk-!-margin-bottom-2">You can add ${allowedTypesText} to the map.</p><ul class="govuk-list govuk-list--number govuk-body-s"><li>Search for a county, place or postcode</li><li>Use the + and - icons to zoom in and out</li>${doneExtra}<li>Give the location a name</li></ul>`
141
+ return `<p class="govuk-body-s govuk-!-margin-bottom-2">${texts.ledeIntro} ${allowedTypesText} ${texts.ledeOutro}</p><ul class="govuk-list govuk-list--number govuk-body-s"><li>${texts.point1}</li><li>${texts.point2}</li>${point3}<li>${texts.point4}</li></ul>`
96
142
  }
97
143
 
98
144
  const lineFeatureProperties = {
@@ -107,15 +153,6 @@ const polygonFeatureProperties = {
107
153
  strokeWidth: 2
108
154
  }
109
155
 
110
- /**
111
- * @type {Record<'Point' | 'LineString' | 'Polygon', string>}
112
- */
113
- const typeDescriptions = {
114
- Point: 'Point',
115
- LineString: 'Line',
116
- Polygon: 'Shape'
117
- }
118
-
119
156
  const POINT_SVG =
120
157
  '<path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0" /><circle cx="12" cy="10" r="3" />'
121
158
  const POLYGON_SVG =
@@ -174,43 +211,15 @@ export function processGeospatial(config, geospatial, index) {
174
211
  const plugins = [drawPlugin]
175
212
  const country = geospatial.dataset.country
176
213
  const mapLayers = getMapLayers(geospatial.dataset.maplayers)
214
+ const datasets = getMapCountryLayers(config.apiPath, country)
177
215
 
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)
216
+ if (mapLayers.includes('sssi')) {
217
+ datasets.push(...sssiDataset)
210
218
  }
211
219
 
212
- if (mapLayers.includes('sssi')) {
213
- plugins.push(createDatasetsPlugin(sssiDataset))
220
+ // Create a map dataset plugin if there are any present
221
+ if (datasets.length) {
222
+ plugins.push(createDatasetsPlugin({ datasets }))
214
223
  }
215
224
 
216
225
  const initConfig = {
@@ -226,19 +235,30 @@ export function processGeospatial(config, geospatial, index) {
226
235
  const options = {
227
236
  geometryTypes
228
237
  }
238
+ const lang = /** @type {LanguageCode} */ (
239
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
240
+ geospatial.dataset.lang || DEFAULT_LANG
241
+ )
229
242
  const uiManager = getUIManager(
230
243
  geojson,
231
244
  map,
232
245
  mapId,
233
246
  listEl,
234
247
  geospatialInput,
235
- options
248
+ options,
249
+ lang
236
250
  )
237
251
 
252
+ const languageManager = {
253
+ lang,
254
+ texts: getTexts(lang)
255
+ }
256
+
238
257
  /**
239
258
  * @type {Context}
240
259
  */
241
260
  const context = {
261
+ languageManager,
242
262
  map,
243
263
  featuresManager,
244
264
  activeFeatureManager,
@@ -278,15 +298,17 @@ export function addFeatureToMap(feature, drawPlugin, map) {
278
298
  * @param {string} mapId - the ID of the map
279
299
  * @param {boolean} [disabled] - render the list with disabled links
280
300
  * @param {boolean} [readonly] - render the list in readonly mode
301
+ * @param {LanguageCode} [lang] - the language for the feature details
281
302
  */
282
303
  export function createFeaturesHTML(
283
304
  features,
284
305
  mapId,
285
306
  disabled = false,
286
- readonly = false
307
+ readonly = false,
308
+ lang = DEFAULT_LANG
287
309
  ) {
288
310
  return `<dl class="govuk-summary-list">
289
- ${features.map((feature, index) => createFeatureHTML(feature, index, mapId, disabled, readonly)).join('\n')}
311
+ ${features.map((feature, index) => createFeatureHTML(feature, index, mapId, disabled, readonly, lang)).join('\n')}
290
312
  </dl>`
291
313
  }
292
314
 
@@ -306,14 +328,17 @@ export function focusFeature(feature, mapProvider) {
306
328
  * @param {string} mapId - the ID of the map
307
329
  * @param {boolean} [disabled] - render the list with disabled links
308
330
  * @param {boolean} [readonly] - render the list item in readonly mode
331
+ * @param {LanguageCode} [lang] - the language for the feature details
309
332
  */
310
333
  export function createFeatureHTML(
311
334
  feature,
312
335
  index,
313
336
  mapId,
314
337
  disabled = false,
315
- readonly = false
338
+ readonly = false,
339
+ lang = DEFAULT_LANG
316
340
  ) {
341
+ const texts = getTexts(lang)
317
342
  const flattened = feature.geometry.coordinates.flat(2)
318
343
 
319
344
  const points = []
@@ -329,28 +354,28 @@ export function createFeatureHTML(
329
354
  // Change action link
330
355
  const changeAction = () => `<li class="govuk-summary-list__actions-list-item">
331
356
  <a class="govuk-link govuk-link--no-visited-state ${disabled ? 'govuk-link--disabled' : ''}" href="#${mapId}" data-action="edit" data-id="${feature.id}"
332
- data-type="${feature.geometry.type}">Update<span class="govuk-visually-hidden"> location</span></a>
357
+ data-type="${feature.geometry.type}">${texts.itemUpdateLink}<span class="govuk-visually-hidden"> ${texts.itemVisuallyHidden}</span></a>
333
358
  </li>`
334
359
 
335
360
  // Delete action link
336
361
  const deleteAction = () => `<li class="govuk-summary-list__actions-list-item">
337
362
  <a class="govuk-link govuk-link--no-visited-state ${disabled ? 'govuk-link--disabled' : ''}" href="#" data-action="delete" data-id="${feature.id}"
338
- data-type="${feature.geometry.type}">Delete<span class="govuk-visually-hidden"> location</span></a>
363
+ data-type="${feature.geometry.type}">${texts.itemDeleteLink}<span class="govuk-visually-hidden"> ${texts.itemVisuallyHidden}</span></a>
339
364
  </li>`
340
365
 
341
366
  // Focus action link
342
367
  const focusAction = () => `<li class="govuk-summary-list__actions-list-item">
343
- <a class="govuk-link govuk-link--no-visited-state" href="#${mapId}" data-action="focus" data-id="${feature.id}">Show<span class="govuk-visually-hidden"> location</span></a>
368
+ <a class="govuk-link govuk-link--no-visited-state" href="#${mapId}" data-action="focus" data-id="${feature.id}">${texts.itemFocusLink}<span class="govuk-visually-hidden"> ${texts.itemVisuallyHidden}</span></a>
344
369
  </li>`
345
370
 
346
371
  const links = readonly ? focusAction() : `${changeAction()}${deleteAction()}`
347
-
348
372
  const actions = `<ul class="govuk-summary-list__actions-list">${links}</ul>`
373
+ const typeDescription = getTypeDescription(feature, texts.typeDescriptions)
349
374
 
350
375
  return `<div class="govuk-summary-list__row govuk-summary-list__row--no-border">
351
376
  <dt class="govuk-summary-list__key">
352
377
  <div class="govuk-form-group">
353
- <label class="govuk-label govuk-label--s" ${readonly ? '' : `for="description_${index}"`}>Location ${index + 1} description</label>
378
+ <label class="govuk-label govuk-label--s" ${readonly ? '' : `for="description_${index}"`}>${texts.itemLabel1} ${index + 1} ${texts.itemLabel2}</label>
354
379
  ${description}
355
380
  </div>
356
381
  </dt>
@@ -361,24 +386,24 @@ export function createFeatureHTML(
361
386
  <div class="govuk-summary-list__row">
362
387
  <details class="govuk-details govuk-!-margin-bottom-2">
363
388
  <summary class="govuk-details__summary">
364
- <span class="govuk-details__summary-text">Coordinates</span>
389
+ <span class="govuk-details__summary-text">${texts.details.summary}</span>
365
390
  </summary>
366
391
  <div class="govuk-details__text">
367
392
  <dl class="govuk-summary-list">
368
393
  <div class="govuk-summary-list__row">
369
- <dt class="govuk-summary-list__key">Type</dt>
370
- <dd class="govuk-summary-list__value">${typeDescriptions[feature.geometry.type]}</dd>
394
+ <dt class="govuk-summary-list__key">${texts.details.type}</dt>
395
+ <dd class="govuk-summary-list__value">${typeDescription}</dd>
371
396
  </div>
372
397
  <div class="govuk-summary-list__row">
373
- <dt class="govuk-summary-list__key">Centre grid reference</dt>
398
+ <dt class="govuk-summary-list__key">${texts.details.centroidGridReference}</dt>
374
399
  <dd class="govuk-summary-list__value">${feature.properties.centroidGridReference}</dd>
375
400
  </div>
376
401
  <div class="govuk-summary-list__row">
377
- <dt class="govuk-summary-list__key">First point grid reference</dt>
402
+ <dt class="govuk-summary-list__key">${texts.details.firstPointGridReference}</dt>
378
403
  <dd class="govuk-summary-list__value">${feature.properties.coordinateGridReference}</dd>
379
404
  </div>
380
405
  <div class="govuk-summary-list__row">
381
- <dt class="govuk-summary-list__key">Detailed coordinates</dt>
406
+ <dt class="govuk-summary-list__key">${texts.details.detailedCoordinates}</dt>
382
407
  <dd class="govuk-summary-list__value">
383
408
  <ol class="govuk-list govuk-list--number">${coordinates}</ol>
384
409
  </dd>
@@ -537,11 +562,24 @@ function getFeaturesManager(geojson) {
537
562
  * @param {string} mapId - the ID of the map
538
563
  * @param {HTMLDivElement} listEl - where to render the feature list
539
564
  * @param {Function} renderValue - function that renders the features JSON into the hidden textarea
565
+ * @param {LanguageCode} [lang] - the language for the feature details
540
566
  * @returns {RenderList}
541
567
  */
542
- function getListRenderer(geojson, mapId, listEl, renderValue) {
568
+ function getListRenderer(
569
+ geojson,
570
+ mapId,
571
+ listEl,
572
+ renderValue,
573
+ lang = DEFAULT_LANG
574
+ ) {
543
575
  return function renderList(disabled = false) {
544
- const html = createFeaturesHTML(geojson.features, mapId, disabled)
576
+ const html = createFeaturesHTML(
577
+ geojson.features,
578
+ mapId,
579
+ disabled,
580
+ false,
581
+ lang
582
+ )
545
583
 
546
584
  listEl.innerHTML = html
547
585
 
@@ -569,6 +607,7 @@ function getValueRenderer(geojson, geospatialInput) {
569
607
  * @param {HTMLDivElement} listEl - where to render the feature list
570
608
  * @param {HTMLTextAreaElement} geospatialInput - the geospatial textarea
571
609
  * @param { UIManagerOptions | undefined } options - extra options such as allowable geometry types
610
+ * @param {LanguageCode} [lang] - the language for the feature details
572
611
  */
573
612
  export function getUIManager(
574
613
  geojson,
@@ -576,7 +615,8 @@ export function getUIManager(
576
615
  mapId,
577
616
  listEl,
578
617
  geospatialInput,
579
- options
618
+ options,
619
+ lang = DEFAULT_LANG
580
620
  ) {
581
621
  /**
582
622
  * Get a CSV list of geometry types the user can create
@@ -621,7 +661,7 @@ export function getUIManager(
621
661
  }
622
662
 
623
663
  const renderValue = getValueRenderer(geojson, geospatialInput)
624
- const renderList = getListRenderer(geojson, mapId, listEl, renderValue)
664
+ const renderList = getListRenderer(geojson, mapId, listEl, renderValue, lang)
625
665
 
626
666
  /** @type {UIManager} */
627
667
  return {
@@ -688,17 +728,19 @@ function onMapReadyFactory(context) {
688
728
  const allowPoint = types.includes('point')
689
729
  const allowLine = types.includes('line')
690
730
  const allowShape = types.includes('shape')
731
+ const { texts } = context.languageManager
691
732
 
692
733
  // Add info panel
693
734
  map.addPanel('info', {
694
735
  ...helpPanelConfig,
695
- html: getHelpPanelHtml(allowPoint, allowLine, allowShape)
736
+ label: texts.helpPanel.label,
737
+ html: getHelpPanelHtml(texts.helpPanel, allowPoint, allowLine, allowShape)
696
738
  })
697
739
 
698
740
  if (allowPoint) {
699
741
  map.addButton('btnAddPoint', {
700
742
  variant: 'tertiary',
701
- label: 'Add point',
743
+ label: texts.buttons.point,
702
744
  iconSvgContent: POINT_SVG,
703
745
  onClick: () => {
704
746
  resetActiveFeature()
@@ -715,7 +757,7 @@ function onMapReadyFactory(context) {
715
757
  if (allowShape) {
716
758
  map.addButton('btnAddPolygon', {
717
759
  variant: 'tertiary',
718
- label: 'Add shape',
760
+ label: texts.buttons.polygon,
719
761
  iconSvgContent: POLYGON_SVG,
720
762
  onClick: () => {
721
763
  resetActiveFeature()
@@ -732,7 +774,7 @@ function onMapReadyFactory(context) {
732
774
  if (allowLine) {
733
775
  map.addButton('btnAddLine', {
734
776
  variant: 'tertiary',
735
- label: 'Add line',
777
+ label: texts.buttons.line,
736
778
  iconSvgContent: LINE_SVG,
737
779
  onClick: () => {
738
780
  resetActiveFeature()
@@ -1156,6 +1198,7 @@ function onListElKeydownFactory() {
1156
1198
  * Renders the features into the list
1157
1199
  * @callback RenderList
1158
1200
  * @param {boolean} [disabled] - whether to render the list with disabled links
1201
+ * @param {LanguageCode} [lang] - the language for the feature details
1159
1202
  * @returns {void}
1160
1203
  */
1161
1204
 
@@ -1210,8 +1253,59 @@ function onListElKeydownFactory() {
1210
1253
  * @property {GetAllowableGeometryTypes} getAllowableGeometryTypes - function that returns the array of geometry types a user can create
1211
1254
  */
1212
1255
 
1256
+ /**
1257
+ * @typedef {object} GeometryTexts
1258
+ * @property {string} point - the label for a point feature in the list
1259
+ * @property {string} line - the label for a line string feature in the list
1260
+ * @property {string} polygon - the label for a polygon feature in the list
1261
+ */
1262
+
1263
+ /**
1264
+ * @typedef {object} GeospatialPanelTexts
1265
+ * @property {string} label - the label for the info panel
1266
+ * @property {string} ledeIntro - the lede intro text for the info panel
1267
+ * @property {string} ledeOutro - the lede outro text for the info panel
1268
+ * @property {string} lineText - the label for the info panel line text
1269
+ * @property {string} shapeText - the label for the info panel shape text
1270
+ * @property {string} point1 - the text for bullet point 1 in the info panel
1271
+ * @property {string} point2 - the text for bullet point 2 in the info panel
1272
+ * @property {string} point3 - the text for bullet point 3 in the info panel
1273
+ * @property {string} point4 - the text for bullet point 4 in the info panel
1274
+ * @property {string} lineOrShapeText - the label for the info panel line or shape text
1275
+ * @property {string} typesPhrasePoint - the label for the info panel types phrase point
1276
+ * @property {string} typesPhraseLine - the label for the info panel types phrase line
1277
+ * @property {string} typesPhraseShape - the label for the info panel types phrase shape
1278
+ * @property {string} typesPhraseOr - the label for the info panel types phrase "or"
1279
+ */
1280
+
1281
+ /**
1282
+ * @typedef {object} GeospatialLanguageTexts
1283
+ * @property {GeometryTexts} typeDescriptions - the descriptions of the geometry types
1284
+ * @property {GeospatialPanelTexts} helpPanel - texts for the info panel
1285
+ * @property {GeometryTexts} buttons - the labels for the action buttons
1286
+ * @property {string} itemLabel1 - the first part of the label for a feature in the list
1287
+ * @property {string} itemLabel2 - the second part of the label for a feature in the list
1288
+ * @property {string} itemUpdateLink - the label for the "update" link for a feature in the list
1289
+ * @property {string} itemDeleteLink - the label for the "delete" link for a feature in the list
1290
+ * @property {string} itemFocusLink - the label for the "focus" link for a feature in the list
1291
+ * @property {string} itemVisuallyHidden - visually hidden text to add context to action links
1292
+ * @property {object} details - labels for the details section of a feature in the list
1293
+ * @property {string} details.summary - label for the summary of a feature in the list
1294
+ * @property {string} details.type - label for the type of a feature in the list
1295
+ * @property {string} details.centroidGridReference - label for the centroid grid reference of a feature in the list
1296
+ * @property {string} details.firstPointGridReference - label for the first point grid reference of a feature in the list
1297
+ * @property {string} details.detailedCoordinates - label for the detailed coordinates of a feature in the list
1298
+ */
1299
+
1300
+ /**
1301
+ * @typedef {object} LanguageManager
1302
+ * @property {LanguageCode} lang - the language for the interactive map
1303
+ * @property {GeospatialLanguageTexts} texts - the descriptions of the geometry types
1304
+ */
1305
+
1213
1306
  /**
1214
1307
  * @typedef {object} Context
1308
+ * @property {LanguageManager} languageManager - the language manager for the interactive map
1215
1309
  * @property {InteractiveMap} map - the interactive map
1216
1310
  * @property {MapLibreMap} [mapProvider] - the interactive map provider
1217
1311
  * @property {FeaturesManager} featuresManager - the features manager
@@ -1222,5 +1316,6 @@ function onListElKeydownFactory() {
1222
1316
  */
1223
1317
 
1224
1318
  /**
1319
+ * @import { LanguageCode } from './map.js'
1225
1320
  * @import { MapLibreMap, UIManagerOptions } from './map.js'
1226
1321
  */
@@ -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)
@@ -1,26 +1,53 @@
1
1
  // @ts-expect-error - no types
2
2
  import createDatasetsPlugin from '@defra/interactive-map/plugins/datasets'
3
3
 
4
+ import {
5
+ DEFAULT_LANG,
6
+ ENGLISH_LANG,
7
+ WELSH_LANG
8
+ } from './map-constants.js'
4
9
  import {
5
10
  EVENTS,
6
11
  centerMap,
7
12
  createMap,
8
13
  defaultConfig,
9
14
  eastingNorthingToLatLong,
15
+ getMapCountryLayers,
10
16
  getMapLayers,
11
17
  latLongToEastingNorthing,
12
18
  latLongToOsGridRef,
13
19
  osGridRefToLatLong
14
20
  } from './map.js'
15
21
  import sssiDataset from './sssi-dataset.js'
22
+ import cy from '../../server/plugins/engine/i18n/translations/cy.json' with { type: 'json' }
23
+ import enGB from '../../server/plugins/engine/i18n/translations/en-GB.json' with { type: 'json' }
24
+
25
+ const englishTranslations = enGB.components.locationFieldBase.map
26
+ const welshTranslations = cy.components.locationFieldBase.map
16
27
 
17
28
  const LOCATION_FIELD_SELECTOR = 'input.govuk-input'
18
29
 
30
+ /**
31
+ * @type {Record<LanguageCode, LocationLanguageTexts>}
32
+ */
33
+ export const languageTexts = {
34
+ [ENGLISH_LANG]: englishTranslations,
35
+ [WELSH_LANG]: welshTranslations
36
+ }
37
+
38
+ /**
39
+ * Get the map texts for the given language code
40
+ * @param {LanguageCode} lang - the lanugae code
41
+ */
42
+ export function getTexts(lang = DEFAULT_LANG) {
43
+ return languageTexts[lang]
44
+ }
45
+
19
46
  /**
20
47
  * Gets initial map config for a location field
21
48
  * @param {HTMLDivElement} locationField - the location field element
22
49
  */
23
- function getInitMapConfig(locationField) {
50
+ export function getInitMapConfig(locationField) {
24
51
  const locationType = locationField.dataset.locationtype
25
52
 
26
53
  switch (locationType) {
@@ -423,12 +450,24 @@ export function processLocation(config, location, index) {
423
450
 
424
451
  locationInputs.after(mapContainer)
425
452
 
453
+ const country = location.dataset.country
426
454
  const mapLayers = getMapLayers(location.dataset.maplayers)
455
+ const datasets = getMapCountryLayers(config.apiPath, country)
427
456
 
428
457
  if (mapLayers.includes('sssi')) {
429
- initConfig.plugins = [createDatasetsPlugin(sssiDataset)]
458
+ datasets.push(...sssiDataset)
430
459
  }
431
460
 
461
+ // Create a map dataset plugin if there are any present
462
+ if (datasets.length) {
463
+ initConfig.plugins = [createDatasetsPlugin({ datasets })]
464
+ }
465
+
466
+ const lang = /** @type {LanguageCode} */ (
467
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
468
+ location.dataset.lang || DEFAULT_LANG
469
+ )
470
+
432
471
  const { map, interactPlugin } = createMap(mapId, initConfig, config)
433
472
 
434
473
  map.on(
@@ -453,11 +492,13 @@ export function processLocation(config, location, index) {
453
492
  throw new Error('Not implemented')
454
493
  }
455
494
 
495
+ const texts = getTexts(lang)
496
+
456
497
  // Add info panel
457
498
  map.addPanel('info', {
458
499
  focus: false,
459
500
  showLabel: true,
460
- label: 'How to use the map',
501
+ label: texts.helpPanel.label,
461
502
  mobile: {
462
503
  slot: 'drawer',
463
504
  open: true,
@@ -476,7 +517,7 @@ export function processLocation(config, location, index) {
476
517
  dismissible: true,
477
518
  modal: false
478
519
  },
479
- html: '<ul><li>Search for a place or postcode</li><li>Use the + and - icons to zoom in and out</li><li>Use a mouse or keyboard to centre the point at the location</li><li>Click to add the location to the map</li></ul>'
520
+ html: `<ul><li>${texts.helpPanel.point1}</li><li>${texts.helpPanel.point2}</li><li>${texts.helpPanel.point3}</li><li>${texts.helpPanel.point4}</li></ul>`
480
521
  })
481
522
 
482
523
  // Enable the interact plugin
@@ -486,5 +527,20 @@ export function processLocation(config, location, index) {
486
527
  }
487
528
 
488
529
  /**
530
+ * @typedef {object} LocationPanelTexts
531
+ * @property {string} label - the label for the info panel
532
+ * @property {string} point1 - the text for bullet point 1 in the info panel
533
+ * @property {string} point2 - the text for bullet point 2 in the info panel
534
+ * @property {string} point3 - the text for bullet point 3 in the info panel
535
+ * @property {string} point4 - the text for bullet point 4 in the info panel
536
+ */
537
+
538
+ /**
539
+ * @typedef {object} LocationLanguageTexts
540
+ * @property {LocationPanelTexts} helpPanel - texts for the info panel
541
+ */
542
+
543
+ /**
544
+ * @import { LanguageCode } from './map.js'
489
545
  * @import { InteractiveMap, InteractiveMapInitConfig, MapCenter, MapLibreMap, MapsEnvironmentConfig } from './map.js'
490
546
  */
@@ -0,0 +1,3 @@
1
+ export const ENGLISH_LANG = 'en-GB'
2
+ export const WELSH_LANG = 'cy'
3
+ export const DEFAULT_LANG = ENGLISH_LANG