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

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 (347) hide show
  1. package/.public/assets-manifest.json +3 -5
  2. package/.public/javascripts/im-core.min.js +2 -0
  3. package/.public/javascripts/im-core.min.js.map +1 -0
  4. package/.public/javascripts/shared.min.js +1 -1
  5. package/.public/javascripts/shared.min.js.map +1 -1
  6. package/.public/javascripts/vendor/@defra.min.js +1 -1
  7. package/.public/javascripts/vendor/@defra.min.js.map +1 -1
  8. package/.public/stylesheets/application.min.css +1 -1
  9. package/.public/stylesheets/application.min.css.map +1 -1
  10. package/.server/client/javascripts/geospatial-map.js +8 -6
  11. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  12. package/.server/client/javascripts/location-map.js +8 -1
  13. package/.server/client/javascripts/location-map.js.map +1 -1
  14. package/.server/client/javascripts/map.d.ts +6 -0
  15. package/.server/client/javascripts/map.js +10 -0
  16. package/.server/client/javascripts/map.js.map +1 -1
  17. package/.server/client/javascripts/sssi-dataset.d.ts +34 -0
  18. package/.server/client/javascripts/sssi-dataset.js +101 -0
  19. package/.server/client/javascripts/sssi-dataset.js.map +1 -0
  20. package/.server/client/stylesheets/shared.scss +0 -2
  21. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
  22. package/.server/server/forms/simple-form.yaml +106 -3
  23. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +11 -11
  24. package/.server/server/plugins/engine/components/AutocompleteField.js +2 -2
  25. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  26. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +3 -2
  27. package/.server/server/plugins/engine/components/CheckboxesField.js +4 -9
  28. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  29. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -7
  30. package/.server/server/plugins/engine/components/ComponentCollection.js +106 -51
  31. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  32. package/.server/server/plugins/engine/components/DatePartsField.d.ts +8 -6
  33. package/.server/server/plugins/engine/components/DatePartsField.js +27 -9
  34. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  35. package/.server/server/plugins/engine/components/DeclarationField.d.ts +13 -11
  36. package/.server/server/plugins/engine/components/DeclarationField.js +31 -9
  37. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  38. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +8 -5
  39. package/.server/server/plugins/engine/components/EastingNorthingField.js +42 -22
  40. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  41. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +11 -14
  42. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -2
  43. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  44. package/.server/server/plugins/engine/components/FileUploadField.d.ts +14 -12
  45. package/.server/server/plugins/engine/components/FileUploadField.js +22 -12
  46. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/FormComponent.d.ts +21 -12
  48. package/.server/server/plugins/engine/components/FormComponent.js +33 -14
  49. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  50. package/.server/server/plugins/engine/components/GeospatialField.d.ts +15 -12
  51. package/.server/server/plugins/engine/components/GeospatialField.js +21 -13
  52. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  53. package/.server/server/plugins/engine/components/LatLongField.d.ts +8 -5
  54. package/.server/server/plugins/engine/components/LatLongField.js +32 -20
  55. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  56. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +7 -6
  57. package/.server/server/plugins/engine/components/ListFormComponent.js +19 -7
  58. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
  59. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +17 -16
  60. package/.server/server/plugins/engine/components/LocationFieldBase.js +2 -2
  61. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  62. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +8 -3
  63. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +14 -3
  64. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  65. package/.server/server/plugins/engine/components/Markdown.d.ts +8 -7
  66. package/.server/server/plugins/engine/components/Markdown.js +5 -2
  67. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  68. package/.server/server/plugins/engine/components/MonthYearField.d.ts +9 -7
  69. package/.server/server/plugins/engine/components/MonthYearField.js +26 -8
  70. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  71. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +10 -9
  72. package/.server/server/plugins/engine/components/MultilineTextField.js +2 -2
  73. package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -1
  74. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  75. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +14 -6
  76. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  77. package/.server/server/plugins/engine/components/NumberField.d.ts +10 -9
  78. package/.server/server/plugins/engine/components/NumberField.js +2 -2
  79. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  80. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  81. package/.server/server/plugins/engine/components/OsGridRefField.js +14 -6
  82. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  83. package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -10
  84. package/.server/server/plugins/engine/components/PaymentField.js +21 -8
  85. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  86. package/.server/server/plugins/engine/components/SelectField.d.ts +11 -11
  87. package/.server/server/plugins/engine/components/SelectField.js +2 -2
  88. package/.server/server/plugins/engine/components/SelectField.js.map +1 -1
  89. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +4 -4
  90. package/.server/server/plugins/engine/components/SelectionControlField.js +2 -2
  91. package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -1
  92. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +10 -9
  93. package/.server/server/plugins/engine/components/TelephoneNumberField.js +2 -2
  94. package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
  95. package/.server/server/plugins/engine/components/UkAddressField.d.ts +12 -10
  96. package/.server/server/plugins/engine/components/UkAddressField.js +29 -17
  97. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  98. package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -0
  99. package/.server/server/plugins/engine/components/YesNoField.js +9 -0
  100. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  101. package/.server/server/plugins/engine/components/helpers/components.d.ts +3 -2
  102. package/.server/server/plugins/engine/components/helpers/components.js +11 -8
  103. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  104. package/.server/server/plugins/engine/components/types.d.ts +8 -1
  105. package/.server/server/plugins/engine/components/types.js.map +1 -1
  106. package/.server/server/plugins/engine/configureEnginePlugin.js +8 -1
  107. package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
  108. package/.server/server/plugins/engine/form-context.d.ts +1 -0
  109. package/.server/server/plugins/engine/form-context.js +4 -2
  110. package/.server/server/plugins/engine/form-context.js.map +1 -1
  111. package/.server/server/plugins/engine/helpers.d.ts +1 -1
  112. package/.server/server/plugins/engine/helpers.js +8 -13
  113. package/.server/server/plugins/engine/helpers.js.map +1 -1
  114. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +39 -0
  115. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +50 -0
  116. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -0
  117. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +5 -0
  118. package/.server/server/plugins/engine/i18n/createFormTranslator.js +18 -0
  119. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -0
  120. package/.server/server/plugins/engine/i18n/createTranslator.d.ts +9 -0
  121. package/.server/server/plugins/engine/i18n/createTranslator.js +51 -0
  122. package/.server/server/plugins/engine/i18n/createTranslator.js.map +1 -0
  123. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +5 -0
  124. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +57 -0
  125. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -0
  126. package/.server/server/plugins/engine/i18n/index.d.ts +18 -0
  127. package/.server/server/plugins/engine/i18n/index.js +71 -0
  128. package/.server/server/plugins/engine/i18n/index.js.map +1 -0
  129. package/.server/server/plugins/engine/i18n/translations/cy.json +271 -0
  130. package/.server/server/plugins/engine/i18n/translations/en-GB.json +271 -0
  131. package/.server/server/plugins/engine/i18n/types.d.ts +41 -0
  132. package/.server/server/plugins/engine/i18n/types.js +2 -0
  133. package/.server/server/plugins/engine/i18n/types.js.map +1 -0
  134. package/.server/server/plugins/engine/index.js +3 -2
  135. package/.server/server/plugins/engine/index.js.map +1 -1
  136. package/.server/server/plugins/engine/models/FormModel.d.ts +9 -1
  137. package/.server/server/plugins/engine/models/FormModel.js +44 -18
  138. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  139. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +5 -2
  140. package/.server/server/plugins/engine/models/SummaryViewModel.js +44 -18
  141. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  142. package/.server/server/plugins/engine/options.js +2 -1
  143. package/.server/server/plugins/engine/options.js.map +1 -1
  144. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +4 -0
  145. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  146. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  147. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  148. package/.server/server/plugins/engine/outputFormatters/machine/v1.js +7 -6
  149. package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -1
  150. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +2 -1
  151. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +6 -3
  152. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  153. package/.server/server/plugins/engine/pageControllers/PageController.d.ts +3 -1
  154. package/.server/server/plugins/engine/pageControllers/PageController.js +11 -1
  155. package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -1
  156. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +4 -2
  157. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +52 -21
  158. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  159. package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +3 -2
  160. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +63 -26
  161. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  162. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +3 -1
  163. package/.server/server/plugins/engine/pageControllers/StartPageController.js +2 -2
  164. package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -1
  165. package/.server/server/plugins/engine/pageControllers/StatusPageController.js +12 -2
  166. package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -1
  167. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +4 -3
  168. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +44 -28
  169. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  170. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.d.ts +2 -0
  171. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js +24 -0
  172. package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js.map +1 -0
  173. package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
  174. package/.server/server/plugins/engine/pageControllers/errors.js +3 -2
  175. package/.server/server/plugins/engine/pageControllers/errors.js.map +1 -1
  176. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +3 -2
  177. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +4 -4
  178. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  179. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +7 -3
  180. package/.server/server/plugins/engine/pageControllers/validationOptions.js +34 -33
  181. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  182. package/.server/server/plugins/engine/plugin.js +2 -0
  183. package/.server/server/plugins/engine/plugin.js.map +1 -1
  184. package/.server/server/plugins/engine/routes/index.js +4 -1
  185. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  186. package/.server/server/plugins/engine/routes/questions.js +5 -2
  187. package/.server/server/plugins/engine/routes/questions.js.map +1 -1
  188. package/.server/server/plugins/engine/types/index.d.ts +1 -0
  189. package/.server/server/plugins/engine/types/index.js.map +1 -1
  190. package/.server/server/plugins/engine/types/schema.js +1 -0
  191. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  192. package/.server/server/plugins/engine/types.d.ts +12 -1
  193. package/.server/server/plugins/engine/types.js.map +1 -1
  194. package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
  195. package/.server/server/plugins/engine/views/components/fileuploadfield.html +3 -3
  196. package/.server/server/plugins/engine/views/components/geospatialfield.html +4 -1
  197. package/.server/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
  198. package/.server/server/plugins/engine/views/components/osgridreffield.html +1 -1
  199. package/.server/server/plugins/engine/views/components/paymentfield.html +8 -8
  200. package/.server/server/plugins/engine/views/components/ukaddressfield.html +4 -4
  201. package/.server/server/plugins/engine/views/confirmation.html +4 -4
  202. package/.server/server/plugins/engine/views/exit.html +4 -4
  203. package/.server/server/plugins/engine/views/file-upload.html +3 -3
  204. package/.server/server/plugins/engine/views/index.html +3 -3
  205. package/.server/server/plugins/engine/views/item-delete.html +1 -1
  206. package/.server/server/plugins/engine/views/partials/form.html +3 -3
  207. package/.server/server/plugins/engine/views/partials/preview-banner.html +4 -4
  208. package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
  209. package/.server/server/plugins/engine/views/repeat-list-summary.html +4 -4
  210. package/.server/server/plugins/engine/views/summary.html +14 -7
  211. package/.server/server/plugins/map/routes/index.js +1 -1
  212. package/.server/server/plugins/map/routes/index.js.map +1 -1
  213. package/.server/server/plugins/map/types.d.ts +1 -25
  214. package/.server/server/plugins/map/types.js +1 -16
  215. package/.server/server/plugins/map/types.js.map +1 -1
  216. package/.server/server/plugins/nunjucks/enviroment.test.js +10 -0
  217. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
  218. package/.server/server/plugins/nunjucks/environment.d.ts +8 -0
  219. package/.server/server/plugins/nunjucks/environment.js +13 -0
  220. package/.server/server/plugins/nunjucks/environment.js.map +1 -1
  221. package/.server/server/plugins/nunjucks/filters/answer.js +9 -1
  222. package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -1
  223. package/.server/server/plugins/nunjucks/filters/answer.test.js +13 -2
  224. package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -1
  225. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  226. package/.server/server/plugins/postcode-lookup/models/index.d.ts +24 -19
  227. package/.server/server/plugins/postcode-lookup/models/index.js +83 -76
  228. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  229. package/.server/server/plugins/postcode-lookup/routes/index.js +7 -13
  230. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  231. package/.server/server/plugins/postcode-lookup/types.d.ts +1 -0
  232. package/.server/server/plugins/postcode-lookup/types.js +1 -0
  233. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  234. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  235. package/.server/server/types.d.ts +2 -1
  236. package/.server/server/types.js.map +1 -1
  237. package/.server/server/utils/utils.d.ts +5 -0
  238. package/.server/server/utils/utils.js +16 -0
  239. package/.server/server/utils/utils.js.map +1 -1
  240. package/.server/typings/hapi/index.d.js.map +1 -1
  241. package/package.json +5 -4
  242. package/src/client/javascripts/geospatial-map.js +10 -6
  243. package/src/client/javascripts/location-map.js +11 -0
  244. package/src/client/javascripts/map.js +10 -0
  245. package/src/client/javascripts/sssi-dataset.js +106 -0
  246. package/src/client/stylesheets/shared.scss +0 -2
  247. package/src/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
  248. package/src/server/forms/simple-form.yaml +106 -3
  249. package/src/server/plugins/engine/components/AutocompleteField.ts +3 -6
  250. package/src/server/plugins/engine/components/CheckboxesField.ts +12 -11
  251. package/src/server/plugins/engine/components/ComponentCollection.ts +143 -61
  252. package/src/server/plugins/engine/components/DatePartsField.ts +33 -11
  253. package/src/server/plugins/engine/components/DeclarationField.ts +37 -14
  254. package/src/server/plugins/engine/components/EastingNorthingField.ts +83 -22
  255. package/src/server/plugins/engine/components/EmailAddressField.ts +4 -7
  256. package/src/server/plugins/engine/components/FileUploadField.ts +28 -22
  257. package/src/server/plugins/engine/components/FormComponent.ts +49 -12
  258. package/src/server/plugins/engine/components/GeospatialField.ts +38 -21
  259. package/src/server/plugins/engine/components/LatLongField.ts +52 -21
  260. package/src/server/plugins/engine/components/ListFormComponent.ts +26 -10
  261. package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -8
  262. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +24 -4
  263. package/src/server/plugins/engine/components/Markdown.ts +7 -3
  264. package/src/server/plugins/engine/components/MonthYearField.ts +32 -10
  265. package/src/server/plugins/engine/components/MultilineTextField.ts +5 -8
  266. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +25 -11
  267. package/src/server/plugins/engine/components/NumberField.ts +3 -4
  268. package/src/server/plugins/engine/components/OsGridRefField.ts +25 -9
  269. package/src/server/plugins/engine/components/PaymentField.ts +22 -12
  270. package/src/server/plugins/engine/components/SelectField.ts +3 -6
  271. package/src/server/plugins/engine/components/SelectionControlField.ts +7 -8
  272. package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -7
  273. package/src/server/plugins/engine/components/UkAddressField.ts +33 -18
  274. package/src/server/plugins/engine/components/YesNoField.ts +10 -0
  275. package/src/server/plugins/engine/components/helpers/components.ts +13 -6
  276. package/src/server/plugins/engine/components/types.ts +9 -0
  277. package/src/server/plugins/engine/configureEnginePlugin.ts +12 -1
  278. package/src/server/plugins/engine/form-context.ts +8 -2
  279. package/src/server/plugins/engine/helpers.ts +10 -18
  280. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +69 -0
  281. package/src/server/plugins/engine/i18n/createFormTranslator.ts +33 -0
  282. package/src/server/plugins/engine/i18n/createTranslator.ts +61 -0
  283. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +61 -0
  284. package/src/server/plugins/engine/i18n/index.ts +80 -0
  285. package/src/server/plugins/engine/i18n/translations/cy.json +271 -0
  286. package/src/server/plugins/engine/i18n/translations/en-GB.json +271 -0
  287. package/src/server/plugins/engine/i18n/types.ts +62 -0
  288. package/src/server/plugins/engine/index.ts +4 -2
  289. package/src/server/plugins/engine/models/FormModel.ts +59 -23
  290. package/src/server/plugins/engine/models/SummaryViewModel.ts +68 -25
  291. package/src/server/plugins/engine/options.js +2 -1
  292. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +5 -0
  293. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -3
  294. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +9 -8
  295. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +7 -3
  296. package/src/server/plugins/engine/pageControllers/PageController.ts +12 -1
  297. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +53 -21
  298. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +66 -29
  299. package/src/server/plugins/engine/pageControllers/StartPageController.ts +7 -2
  300. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +10 -2
  301. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +48 -22
  302. package/src/server/plugins/engine/pageControllers/__stubs__/translator.ts +28 -0
  303. package/src/server/plugins/engine/pageControllers/errors.ts +4 -2
  304. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +11 -4
  305. package/src/server/plugins/engine/pageControllers/validationOptions.ts +43 -53
  306. package/src/server/plugins/engine/plugin.ts +2 -0
  307. package/src/server/plugins/engine/routes/index.ts +9 -1
  308. package/src/server/plugins/engine/routes/questions.ts +5 -1
  309. package/src/server/plugins/engine/types/index.ts +5 -0
  310. package/src/server/plugins/engine/types/schema.ts +1 -0
  311. package/src/server/plugins/engine/types.ts +10 -0
  312. package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
  313. package/src/server/plugins/engine/views/components/fileuploadfield.html +3 -3
  314. package/src/server/plugins/engine/views/components/geospatialfield.html +4 -1
  315. package/src/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
  316. package/src/server/plugins/engine/views/components/osgridreffield.html +1 -1
  317. package/src/server/plugins/engine/views/components/paymentfield.html +8 -8
  318. package/src/server/plugins/engine/views/components/ukaddressfield.html +4 -4
  319. package/src/server/plugins/engine/views/confirmation.html +4 -4
  320. package/src/server/plugins/engine/views/exit.html +4 -4
  321. package/src/server/plugins/engine/views/file-upload.html +3 -3
  322. package/src/server/plugins/engine/views/index.html +3 -3
  323. package/src/server/plugins/engine/views/item-delete.html +1 -1
  324. package/src/server/plugins/engine/views/partials/form.html +3 -3
  325. package/src/server/plugins/engine/views/partials/preview-banner.html +4 -4
  326. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
  327. package/src/server/plugins/engine/views/repeat-list-summary.html +4 -4
  328. package/src/server/plugins/engine/views/summary.html +14 -7
  329. package/src/server/plugins/map/routes/index.js +1 -1
  330. package/src/server/plugins/map/types.js +1 -16
  331. package/src/server/plugins/nunjucks/environment.js +14 -0
  332. package/src/server/plugins/nunjucks/filters/answer.js +12 -1
  333. package/src/server/plugins/postcode-lookup/models/index.js +144 -87
  334. package/src/server/plugins/postcode-lookup/routes/index.js +13 -16
  335. package/src/server/plugins/postcode-lookup/types.js +1 -0
  336. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  337. package/src/server/types.ts +2 -0
  338. package/src/server/utils/utils.js +14 -0
  339. package/src/typings/hapi/index.d.ts +1 -0
  340. package/.public/javascripts/im-search-plugin.min.js +0 -2
  341. package/.public/javascripts/im-search-plugin.min.js.map +0 -1
  342. package/.public/javascripts/vendor/preact.min.js +0 -2
  343. package/.public/javascripts/vendor/preact.min.js.map +0 -1
  344. package/.server/server/plugins/engine/components/constants.d.ts +0 -1
  345. package/.server/server/plugins/engine/components/constants.js +0 -2
  346. package/.server/server/plugins/engine/components/constants.js.map +0 -1
  347. package/src/server/plugins/engine/components/constants.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/postcode-lookup/types.js"],"sourcesContent":["/**\n * @typedef {{\n * ordnanceSurveyApiKey: string\n * }} PostcodeLookupConfiguration\n */\n\n/**\n * @typedef {{\n * name: string\n * step?: string\n * }} PostcodeLookupDispatchArgs\n */\n\n/**\n * @typedef {{\n * sourceUrl: string,\n * formName: string\n * componentName: string\n * componentTitle: string,\n * componentHint?: string\n * step?: string\n * }} PostcodeLookupDispatchData\n */\n\n/**\n * @typedef {{\n * initial: PostcodeLookupDispatchData\n * details: PostcodeLookupDetailsData\n * }} PostcodeLookupSessionData\n */\n\n//\n// Model types\n//\n\n/**\n * The postcode lookup details form view model data\n * @typedef {object} PostcodeLookupDetailsData\n * @property {string} postcodeQuery - postcode query\n * @property {string} buildingNameQuery - Building name or number query\n */\n\n//\n// Route types\n//\n\n/**\n * Postcode lookup query params\n * @typedef {object} PostcodeLookupQuery\n * @property {string} [step] - step\n */\n\n/**\n * @typedef {object} PostcodeLookupDetailsPayloadProperties\n * @property {string} step - step\n */\n\n/**\n * @typedef {PostcodeLookupDetailsData & PostcodeLookupDetailsPayloadProperties} PostcodeLookupDetailsPayload\n */\n\n/**\n * @typedef {object} PostcodeLookupSelectPayload\n * @property {string} step - step\n * @property {string} uprn - postcode\n */\n\n/**\n * Postcode lookup get request\n * @typedef {object} PostcodeLookupGetRequestRefs\n * @property {PostcodeLookupQuery} Query - Request query\n */\n\n/**\n * Postcode lookup post request\n * @typedef {object} PostcodeLookupPostRequestRefs\n * @property {PostcodeLookupDetailsPayload | PostcodeLookupSelectPayload} Payload - Request payload\n */\n\n/**\n * @typedef {PostcodeLookupGetRequestRefs | PostcodeLookupPostRequestRefs} PostcodeLookupRequestRefs\n * @typedef {Request<PostcodeLookupGetRequestRefs>} PostcodeLookupGetRequest\n * @typedef {Request<PostcodeLookupPostRequestRefs>} PostcodeLookupPostRequest\n * @typedef {PostcodeLookupGetRequest | PostcodeLookupPostRequest} PostcodeLookupRequest\n */\n\n/**\n * @typedef {object} PostcodeLookupManualPayload\n * @property {string} addressLine1 - The address line 1\n * @property {string} addressLine2 - The address line 2\n * @property {string} town - The address town or city\n * @property {string} county - The address county\n * @property {string} postcode - The address postcode\n */\n\n//\n// Service types\n//\n\n/**\n * @typedef {object} Address\n * @property {string} uprn - The unique property reference\n * @property {string} address - The full address\n * @property {string} addressLine1 - Address line 1\n * @property {string} addressLine2 - Address line 2\n * @property {string} town - Address town\n * @property {string} county - Address county\n * @property {string} postcode - Address postcode\n * @property {string} formatted - The full formatted address\n */\n\n/**\n * OS places address response\n * @typedef {object} DeliveryPointAddress\n * @property {string} UPRN - Unique property reference number\n * @property {string} UDPRN - Unique delivery point Reference Number\n * @property {string} ADDRESS - Address\n * @property {string} ORGANISATION_NAME - Organisation name\n * @property {string} SUB_BUILDING_NAME - Sub building name\n * @property {string} BUILDING_NAME - Building name\n * @property {string} BUILDING_NUMBER - Building number\n * @property {string} THOROUGHFARE_NAME - Throughfare name\n * @property {string} DEPENDENT_LOCALITY - Dependent locality\n * @property {string} POST_TOWN - Post town\n * @property {string} POSTCODE - Postcode\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressItem\n * @property {DeliveryPointAddress} DPA - Delivery point address\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressResult\n * @property {DeliveryPointAddressItem[]} [results] - Delivery point address results\n */\n\n/**\n * @import { Request } from '@hapi/hapi'\n * @import { FormPayload } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/postcode-lookup/types.js"],"sourcesContent":["/**\n * @typedef {{\n * ordnanceSurveyApiKey: string\n * }} PostcodeLookupConfiguration\n */\n\n/**\n * @typedef {{\n * name: string\n * step?: string\n * }} PostcodeLookupDispatchArgs\n */\n\n/**\n * @typedef {{\n * sourceUrl: string,\n * formName: string\n * componentName: string\n * componentTitle: string,\n * componentHint?: string\n * step?: string\n * language?: string\n * }} PostcodeLookupDispatchData\n */\n\n/**\n * @typedef {{\n * initial: PostcodeLookupDispatchData\n * details: PostcodeLookupDetailsData\n * }} PostcodeLookupSessionData\n */\n\n//\n// Model types\n//\n\n/**\n * The postcode lookup details form view model data\n * @typedef {object} PostcodeLookupDetailsData\n * @property {string} postcodeQuery - postcode query\n * @property {string} buildingNameQuery - Building name or number query\n */\n\n//\n// Route types\n//\n\n/**\n * Postcode lookup query params\n * @typedef {object} PostcodeLookupQuery\n * @property {string} [step] - step\n */\n\n/**\n * @typedef {object} PostcodeLookupDetailsPayloadProperties\n * @property {string} step - step\n */\n\n/**\n * @typedef {PostcodeLookupDetailsData & PostcodeLookupDetailsPayloadProperties} PostcodeLookupDetailsPayload\n */\n\n/**\n * @typedef {object} PostcodeLookupSelectPayload\n * @property {string} step - step\n * @property {string} uprn - postcode\n */\n\n/**\n * Postcode lookup get request\n * @typedef {object} PostcodeLookupGetRequestRefs\n * @property {PostcodeLookupQuery} Query - Request query\n */\n\n/**\n * Postcode lookup post request\n * @typedef {object} PostcodeLookupPostRequestRefs\n * @property {PostcodeLookupDetailsPayload | PostcodeLookupSelectPayload} Payload - Request payload\n */\n\n/**\n * @typedef {PostcodeLookupGetRequestRefs | PostcodeLookupPostRequestRefs} PostcodeLookupRequestRefs\n * @typedef {Request<PostcodeLookupGetRequestRefs>} PostcodeLookupGetRequest\n * @typedef {Request<PostcodeLookupPostRequestRefs>} PostcodeLookupPostRequest\n * @typedef {PostcodeLookupGetRequest | PostcodeLookupPostRequest} PostcodeLookupRequest\n */\n\n/**\n * @typedef {object} PostcodeLookupManualPayload\n * @property {string} addressLine1 - The address line 1\n * @property {string} addressLine2 - The address line 2\n * @property {string} town - The address town or city\n * @property {string} county - The address county\n * @property {string} postcode - The address postcode\n */\n\n//\n// Service types\n//\n\n/**\n * @typedef {object} Address\n * @property {string} uprn - The unique property reference\n * @property {string} address - The full address\n * @property {string} addressLine1 - Address line 1\n * @property {string} addressLine2 - Address line 2\n * @property {string} town - Address town\n * @property {string} county - Address county\n * @property {string} postcode - Address postcode\n * @property {string} formatted - The full formatted address\n */\n\n/**\n * OS places address response\n * @typedef {object} DeliveryPointAddress\n * @property {string} UPRN - Unique property reference number\n * @property {string} UDPRN - Unique delivery point Reference Number\n * @property {string} ADDRESS - Address\n * @property {string} ORGANISATION_NAME - Organisation name\n * @property {string} SUB_BUILDING_NAME - Sub building name\n * @property {string} BUILDING_NAME - Building name\n * @property {string} BUILDING_NUMBER - Building number\n * @property {string} THOROUGHFARE_NAME - Throughfare name\n * @property {string} DEPENDENT_LOCALITY - Dependent locality\n * @property {string} POST_TOWN - Post town\n * @property {string} POSTCODE - Postcode\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressItem\n * @property {DeliveryPointAddress} DPA - Delivery point address\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressResult\n * @property {DeliveryPointAddressItem[]} [results] - Delivery point address results\n */\n\n/**\n * @import { Request } from '@hapi/hapi'\n * @import { FormPayload } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -13,7 +13,7 @@
13
13
  <div class="govuk-grid-column-two-thirds">
14
14
  {% if errors %}
15
15
  {{ govukErrorSummary({
16
- titleText: "There is a problem",
16
+ titleText: t('errors.title'),
17
17
  errorList: errors
18
18
  }) }}
19
19
  {% endif %}
@@ -38,7 +38,7 @@
38
38
 
39
39
  {% if hasAddresses %}
40
40
  <p class="govuk-body">
41
- {{addressCount}} address{{ "es" if hasMultipleAddresses }} found for {{ detailsHtml | safe }}. <a href="{{ searchAgainLink.href }}" class="govuk-link govuk-link--no-visited-state">{{ searchAgainLink.text }}</a>
41
+ {{ addressesFoundText }} {{ detailsHtml | safe }}. <a href="{{ searchAgainLink.href }}" class="govuk-link govuk-link--no-visited-state">{{ searchAgainLink.text }}</a>
42
42
  </p>
43
43
  {% endif %}
44
44
 
@@ -53,7 +53,7 @@
53
53
  }) }}
54
54
  {% else %}
55
55
  <!-- No addresses found - show try again -->
56
- <p class="govuk-body">We could not find an address that matches {{ detailsHtml | safe }}.</p>
56
+ <p class="govuk-body">{{ noAddressFoundText }} {{ detailsHtml | safe }}.</p>
57
57
  {% endif %}
58
58
  {% case "manual" %}
59
59
  <!-- Postcode lookup manual entry -->
@@ -3,7 +3,7 @@ import { type Server } from '@hapi/hapi';
3
3
  import { type FormModel } from '../server/plugins/engine/models/index.js';
4
4
  import { type DetailItem } from '../server/plugins/engine/models/types.js';
5
5
  import { type PageController } from '../server/plugins/engine/pageControllers/PageController.js';
6
- import { type FormContext, type OnRequestCallback, type PluginOptions, type PreparePageEventRequestOptions } from '../server/plugins/engine/types.js';
6
+ import { type FormContext, type GetLanguageHandler, type OnRequestCallback, type PluginOptions, type PreparePageEventRequestOptions } from '../server/plugins/engine/types.js';
7
7
  import { type PaymentService } from '../server/plugins/payment/service.js';
8
8
  import { type FormRequestPayload, type FormStatus } from '../server/routes/types.js';
9
9
  import { type CacheService } from '../server/services/cacheService.js';
@@ -38,6 +38,7 @@ export interface RouteConfig {
38
38
  cacheServiceCreator?: (server: Server) => CacheService;
39
39
  ordnanceSurveyApiKey?: string;
40
40
  ordnanceSurveyApiSecret?: string;
41
+ getLanguage?: GetLanguageHandler;
41
42
  }
42
43
  export interface OutputService {
43
44
  submit: (context: FormContext, request: FormRequestPayload, model: FormModel, emailAddress: string, items: DetailItem[], submitResponse: SubmitResponsePayload, formMetadata?: FormMetadata) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../src/server/types.ts"],"sourcesContent":["import {\n type FormDefinition,\n type FormMetadata,\n type SubmitPayload,\n type SubmitResponsePayload\n} from '@defra/forms-model'\nimport { type Server } from '@hapi/hapi'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type DetailItem } from '~/src/server/plugins/engine/models/types.js'\nimport { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'\nimport {\n type FormContext,\n type OnRequestCallback,\n type PluginOptions,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport { type PaymentService } from '~/src/server/plugins/payment/service.js'\nimport {\n type FormRequestPayload,\n type FormStatus\n} from '~/src/server/routes/types.js'\nimport { type CacheService } from '~/src/server/services/cacheService.js'\n\nexport interface FormsService {\n getFormMetadata: (slug: string) => Promise<FormMetadata>\n getFormMetadataById: (id: string) => Promise<FormMetadata>\n getFormDefinition: (\n id: string,\n state: FormStatus\n ) => Promise<FormDefinition | undefined>\n getFormSecret: (formId: string, secretName: string) => Promise<string>\n}\n\nexport interface FormSubmissionService {\n persistFiles: (\n files: { fileId: string; initiatedRetrievalKey: string }[],\n persistedRetrievalKey: string\n ) => Promise<object>\n submit: (data: SubmitPayload) => Promise<SubmitResponsePayload | undefined>\n}\n\nexport interface Services {\n formsService: FormsService\n formSubmissionService: FormSubmissionService\n outputService: OutputService\n paymentService?: PaymentService\n}\n\nexport interface RouteConfig {\n formFileName?: string\n formFilePath?: string\n enforceCsrf?: boolean\n services?: Services\n controllers?: Record<string, typeof PageController>\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n onRequest?: OnRequestCallback\n saveAndExit?: PluginOptions['saveAndExit']\n cacheServiceCreator?: (server: Server) => CacheService\n ordnanceSurveyApiKey?: string\n ordnanceSurveyApiSecret?: string\n}\n\nexport interface OutputService {\n submit: (\n context: FormContext,\n request: FormRequestPayload,\n model: FormModel,\n emailAddress: string,\n items: DetailItem[],\n submitResponse: SubmitResponsePayload,\n formMetadata?: FormMetadata\n ) => Promise<void>\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/server/types.ts"],"sourcesContent":["import {\n type FormDefinition,\n type FormMetadata,\n type SubmitPayload,\n type SubmitResponsePayload\n} from '@defra/forms-model'\nimport { type Server } from '@hapi/hapi'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type DetailItem } from '~/src/server/plugins/engine/models/types.js'\nimport { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'\nimport {\n type FormContext,\n type GetLanguageHandler,\n type OnRequestCallback,\n type PluginOptions,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport { type PaymentService } from '~/src/server/plugins/payment/service.js'\nimport {\n type FormRequestPayload,\n type FormStatus\n} from '~/src/server/routes/types.js'\nimport { type CacheService } from '~/src/server/services/cacheService.js'\n\nexport interface FormsService {\n getFormMetadata: (slug: string) => Promise<FormMetadata>\n getFormMetadataById: (id: string) => Promise<FormMetadata>\n getFormDefinition: (\n id: string,\n state: FormStatus\n ) => Promise<FormDefinition | undefined>\n getFormSecret: (formId: string, secretName: string) => Promise<string>\n}\n\nexport interface FormSubmissionService {\n persistFiles: (\n files: { fileId: string; initiatedRetrievalKey: string }[],\n persistedRetrievalKey: string\n ) => Promise<object>\n submit: (data: SubmitPayload) => Promise<SubmitResponsePayload | undefined>\n}\n\nexport interface Services {\n formsService: FormsService\n formSubmissionService: FormSubmissionService\n outputService: OutputService\n paymentService?: PaymentService\n}\n\nexport interface RouteConfig {\n formFileName?: string\n formFilePath?: string\n enforceCsrf?: boolean\n services?: Services\n controllers?: Record<string, typeof PageController>\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n onRequest?: OnRequestCallback\n saveAndExit?: PluginOptions['saveAndExit']\n cacheServiceCreator?: (server: Server) => CacheService\n ordnanceSurveyApiKey?: string\n ordnanceSurveyApiSecret?: string\n getLanguage?: GetLanguageHandler\n}\n\nexport interface OutputService {\n submit: (\n context: FormContext,\n request: FormRequestPayload,\n model: FormModel,\n emailAddress: string,\n items: DetailItem[],\n submitResponse: SubmitResponsePayload,\n formMetadata?: FormMetadata\n ) => Promise<void>\n}\n"],"mappings":"","ignoreList":[]}
@@ -11,3 +11,8 @@ export function applyTraceHeaders(existingHeaders?: Record<string, string> | und
11
11
  * @returns
12
12
  */
13
13
  export function isValidUUID(str: string): boolean;
14
+ /**
15
+ * @param {AnyFormRequest} request
16
+ */
17
+ export function resolveLanguage(request: AnyFormRequest): string;
18
+ import type { AnyFormRequest } from '../../server/plugins/engine/types.js';
@@ -1,6 +1,7 @@
1
1
  import { getTraceId } from '@defra/hapi-tracing';
2
2
  import Joi from 'joi';
3
3
  import { config } from "../../config/index.js";
4
+ import { getPluginOptions } from "../plugins/engine/helpers.js";
4
5
 
5
6
  /**
6
7
  * Returns a set of headers to use in an HTTP request, merging them with any existing headers in options.
@@ -30,4 +31,19 @@ export function isValidUUID(str) {
30
31
  } = Joi.string().uuid().validate(str);
31
32
  return error === undefined;
32
33
  }
34
+
35
+ /**
36
+ * @param {AnyFormRequest} request
37
+ */
38
+ export function resolveLanguage(request) {
39
+ const {
40
+ getLanguage
41
+ } = getPluginOptions(request.server);
42
+ return getLanguage?.(request.query, request.yar) ?? 'en-GB';
43
+ }
44
+
45
+ /**
46
+ * @import { FormMetadata } from '@defra/forms-model'
47
+ * @import { AnyFormRequest } from '../../server/plugins/engine/types.js'
48
+ */
33
49
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["getTraceId","Joi","config","applyTraceHeaders","existingHeaders","header","get","traceId","headers","undefined","Object","assign","isValidUUID","str","error","string","uuid","validate"],"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'\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"],"mappings":"AAAA,SAASA,UAAU,QAAQ,qBAAqB;AAChD,OAAOC,GAAG,MAAM,KAAK;AAErB,SAASC,MAAM;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,eAAe,EACfC,MAAM,GAAGH,MAAM,CAACI,GAAG,CAAC,SAAS,CAAC,CAACD,MAAM,EACrC;EACA,IAAI,CAACA,MAAM,EAAE;IACX,OAAOD,eAAe;EACxB;EAEA,MAAMG,OAAO,GAAGP,UAAU,CAAC,CAAC;EAE5B,MAAMQ,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,GAAGb,GAAG,CAACc,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,QAAQ,CAACJ,GAAG,CAAC;EACnD,OAAOC,KAAK,KAAKL,SAAS;AAC5B","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"],"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 +1 @@
1
- {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["import { type Plugin } from '@hapi/hapi'\nimport { type ServerYar, type Yar } from '@hapi/yar'\nimport { type Logger } from 'pino'\n\nimport {\n type COMPONENT_STATE_ERROR,\n type EXTERNAL_STATE_APPENDAGE,\n type EXTERNAL_STATE_PAYLOAD\n} from '~/src/server/constants.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n type AnyFormRequest,\n type FormSubmissionError,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.ts'\nimport { type CacheService } from '~/src/server/services/index.js'\n\ndeclare module '@hapi/yar' {\n interface YarFlashes {\n [EXTERNAL_STATE_APPENDAGE]: object\n [EXTERNAL_STATE_PAYLOAD]: object\n [COMPONENT_STATE_ERROR]: string\n [key: string]: { errors: FormSubmissionError[] }\n }\n}\n\ndeclare module '@hapi/hapi' {\n // Here we are decorating Hapi interface types with\n // props from plugins which doesn't export @types\n interface PluginProperties {\n crumb: {\n generate?: (request: AnyRequest) => string\n }\n 'forms-engine-plugin': {\n baseLayoutPath: string\n cacheService: CacheService\n viewContext?: (\n request: AnyFormRequest | null\n ) => Record<string, unknown> | Promise<Record<string, unknown>>\n saveAndExit?: PluginOptions['saveAndExit']\n baseUrl: string\n services: PluginOptions['services']\n }\n }\n\n interface Request {\n logger: Logger\n yar: Yar\n }\n\n interface RequestApplicationState {\n model?: FormModel\n }\n\n interface Server {\n logger: Logger\n yar: ServerYar\n }\n\n interface ServerApplicationState {\n model?: FormModel\n models?: Map<string, { model: FormModel; updatedAt: Date }>\n }\n}\n\ndeclare module 'blankie' {\n declare const blankie: {\n plugin: Plugin<Record<string, boolean | string | string[]>>\n }\n\n export = blankie\n}\n\ndeclare module 'blipp' {\n declare const blipp: {\n plugin: Plugin\n }\n\n export = blipp\n}\n\ndeclare module 'hapi-pulse' {\n declare const hapiPulse: {\n plugin: Plugin<{\n timeout: number\n }>\n }\n\n export = hapiPulse\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["import { type Plugin } from '@hapi/hapi'\nimport { type ServerYar, type Yar } from '@hapi/yar'\nimport { type Logger } from 'pino'\n\nimport {\n type COMPONENT_STATE_ERROR,\n type EXTERNAL_STATE_APPENDAGE,\n type EXTERNAL_STATE_PAYLOAD\n} from '~/src/server/constants.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n type AnyFormRequest,\n type FormSubmissionError,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.ts'\nimport { type CacheService } from '~/src/server/services/index.js'\n\ndeclare module '@hapi/yar' {\n interface YarFlashes {\n [EXTERNAL_STATE_APPENDAGE]: object\n [EXTERNAL_STATE_PAYLOAD]: object\n [COMPONENT_STATE_ERROR]: string\n [key: string]: { errors: FormSubmissionError[] }\n }\n}\n\ndeclare module '@hapi/hapi' {\n // Here we are decorating Hapi interface types with\n // props from plugins which doesn't export @types\n interface PluginProperties {\n crumb: {\n generate?: (request: AnyRequest) => string\n }\n 'forms-engine-plugin': {\n baseLayoutPath: string\n cacheService: CacheService\n viewContext?: (\n request: AnyFormRequest | null\n ) => Record<string, unknown> | Promise<Record<string, unknown>>\n saveAndExit?: PluginOptions['saveAndExit']\n getLanguage?: PluginOptions['getLanguage']\n baseUrl: string\n services: PluginOptions['services']\n }\n }\n\n interface Request {\n logger: Logger\n yar: Yar\n }\n\n interface RequestApplicationState {\n model?: FormModel\n }\n\n interface Server {\n logger: Logger\n yar: ServerYar\n }\n\n interface ServerApplicationState {\n model?: FormModel\n models?: Map<string, { model: FormModel; updatedAt: Date }>\n }\n}\n\ndeclare module 'blankie' {\n declare const blankie: {\n plugin: Plugin<Record<string, boolean | string | string[]>>\n }\n\n export = blankie\n}\n\ndeclare module 'blipp' {\n declare const blipp: {\n plugin: Plugin\n }\n\n export = blipp\n}\n\ndeclare module 'hapi-pulse' {\n declare const hapiPulse: {\n plugin: Plugin<{\n timeout: number\n }>\n }\n\n export = hapiPulse\n}\n"],"mappings":"","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "4.23.0",
3
+ "version": "5.0.0-alpha.1",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "files": [
@@ -83,13 +83,13 @@
83
83
  },
84
84
  "engines": {
85
85
  "node": ">=22.11.0 <25.0.0",
86
- "npm": ">=10.9.0 <11.6.4"
86
+ "npm": ">=10.9.0 <=11.17.0"
87
87
  },
88
88
  "license": "SEE LICENSE IN LICENSE",
89
89
  "dependencies": {
90
- "@defra/forms-model": "^3.0.686",
90
+ "@defra/forms-model": "^3.0.687",
91
91
  "@defra/hapi-tracing": "^1.29.0",
92
- "@defra/interactive-map": "^0.0.22-alpha",
92
+ "@defra/interactive-map": "^0.0.33-alpha",
93
93
  "@elastic/ecs-pino-format": "^1.5.0",
94
94
  "@hapi/boom": "^10.0.1",
95
95
  "@hapi/bourne": "^3.0.0",
@@ -126,6 +126,7 @@
126
126
  "highlight.js": "^11.11.1",
127
127
  "http-status-codes": "^2.3.0",
128
128
  "humanize-duration": "^3.33.1",
129
+ "i18next": "^26.0.5",
129
130
  "ioredis": "^5.8.2",
130
131
  "joi": "^17.13.3",
131
132
  "liquidjs": "^10.24.0",
@@ -1,8 +1,6 @@
1
1
  // @ts-expect-error - no types
2
2
  import createDatasetsPlugin from '@defra/interactive-map/plugins/datasets'
3
3
  // @ts-expect-error - no types
4
- import { maplibreLayerAdapter } from '@defra/interactive-map/plugins/datasets/adapters/maplibre'
5
- // @ts-expect-error - no types
6
4
  import createDrawPlugin from '@defra/interactive-map/plugins/draw-ml'
7
5
  import { bbox } from '@turf/bbox'
8
6
 
@@ -11,8 +9,10 @@ import {
11
9
  createMap,
12
10
  defaultConfig,
13
11
  getCentroidGridRef,
14
- getCoordinateGridRef
12
+ getCoordinateGridRef,
13
+ getMapLayers
15
14
  } from './map.js'
15
+ import sssiDataset from './sssi-dataset.js'
16
16
  import { formatDelimtedList } from './utils.js'
17
17
 
18
18
  const helpPanelConfig = {
@@ -173,12 +173,12 @@ export function processGeospatial(config, geospatial, index) {
173
173
  const drawPlugin = createDrawPlugin()
174
174
  const plugins = [drawPlugin]
175
175
  const country = geospatial.dataset.country
176
+ const mapLayers = getMapLayers(geospatial.dataset.maplayers)
176
177
 
177
178
  if (country) {
178
179
  // Add the country bounds as a dataset plugin to show the valid area on the map
179
180
  // and provide feedback to the user when they add features outside of the bounds.
180
- const datasetsPlugin = createDatasetsPlugin({
181
- layerAdapter: maplibreLayerAdapter,
181
+ const countriesDatasetPlugin = createDatasetsPlugin({
182
182
  datasets: [
183
183
  {
184
184
  id: 'invalid-area',
@@ -206,7 +206,11 @@ export function processGeospatial(config, geospatial, index) {
206
206
  ]
207
207
  })
208
208
 
209
- plugins.push(datasetsPlugin)
209
+ plugins.push(countriesDatasetPlugin)
210
+ }
211
+
212
+ if (mapLayers.includes('sssi')) {
213
+ plugins.push(createDatasetsPlugin(sssiDataset))
210
214
  }
211
215
 
212
216
  const initConfig = {
@@ -1,13 +1,18 @@
1
+ // @ts-expect-error - no types
2
+ import createDatasetsPlugin from '@defra/interactive-map/plugins/datasets'
3
+
1
4
  import {
2
5
  EVENTS,
3
6
  centerMap,
4
7
  createMap,
5
8
  defaultConfig,
6
9
  eastingNorthingToLatLong,
10
+ getMapLayers,
7
11
  latLongToEastingNorthing,
8
12
  latLongToOsGridRef,
9
13
  osGridRefToLatLong
10
14
  } from './map.js'
15
+ import sssiDataset from './sssi-dataset.js'
11
16
 
12
17
  const LOCATION_FIELD_SELECTOR = 'input.govuk-input'
13
18
 
@@ -418,6 +423,12 @@ export function processLocation(config, location, index) {
418
423
 
419
424
  locationInputs.after(mapContainer)
420
425
 
426
+ const mapLayers = getMapLayers(location.dataset.maplayers)
427
+
428
+ if (mapLayers.includes('sssi')) {
429
+ initConfig.plugins = [createDatasetsPlugin(sssiDataset)]
430
+ }
431
+
421
432
  const { map, interactPlugin } = createMap(mapId, initConfig, config)
422
433
 
423
434
  map.on(
@@ -357,6 +357,16 @@ export function centerMap(map, mapProvider, center) {
357
357
  })
358
358
  }
359
359
 
360
+ /**
361
+ * Parse CSV string layers
362
+ * @param {string | undefined} layers
363
+ * @returns {string[]}
364
+ */
365
+ export function getMapLayers(layers) {
366
+ const trimmed = layers?.trim()
367
+ return trimmed ? trimmed.split(',') : []
368
+ }
369
+
360
370
  /**
361
371
  * @typedef {object} InteractiveMap - an instance of a InteractiveMap
362
372
  * @property {Function} on - register callback listeners to map events
@@ -0,0 +1,106 @@
1
+ const style = {
2
+ stroke: '#00897B',
3
+ fillPattern: 'diagonal-cross-hatch',
4
+ fillPatternForegroundColor: '#00897B',
5
+ fillPatternBackgroundColor: 'transparent'
6
+ }
7
+ const minZoom = 12
8
+
9
+ const englandWFS =
10
+ 'https://environment.data.gov.uk/geoservices/datasets/ba8dc201-66ef-4983-9d46-7378af21027e/ogc/features/v1/collections/Sites_of_Special_Scientific_Interest_England/items?f=json'
11
+ const walesWFS =
12
+ 'https://datamap.gov.wales/geoserver/wfs?service=WFS&version=2.0.0&request=GetFeature&typeNames=inspire-nrw:NRW_SSSI&outputFormat=application/json&srsName=EPSG:4326'
13
+ const scotlandWFS =
14
+ 'https://services1.arcgis.com/LM9GyVFsughzHdbO/ArcGIS/rest/services/Sites_of_Special_Scientific_Interest/FeatureServer/0/query?f=geojson&where=1%3D1&geometryType=esriGeometryEnvelope&inSR=4326&spatialRel=esriSpatialRelIntersects&returnGeometry=true&outFields=*'
15
+
16
+ /**
17
+ * @type {TransformRequestArgs}
18
+ */
19
+ export function sssiEnglandRequestTransformer(url, { bbox }) {
20
+ const uri = new URL(url)
21
+ uri.searchParams.set('bbox', bbox.join(','))
22
+
23
+ return {
24
+ url: uri.toString()
25
+ }
26
+ }
27
+
28
+ /**
29
+ * @type {TransformRequestArgs}
30
+ */
31
+ export function sssiWalesRequestTransformer(url, { bbox }) {
32
+ const uri = new URL(url)
33
+ uri.searchParams.set('bbox', `${bbox.join(',')},EPSG:4326`)
34
+
35
+ return {
36
+ url: uri.toString()
37
+ }
38
+ }
39
+
40
+ /**
41
+ * @type {TransformRequestArgs}
42
+ */
43
+ export function sssiScotlandRequestTransformer(url, { bbox }) {
44
+ const uri = new URL(url)
45
+ uri.searchParams.set('geometry', bbox.join(','))
46
+
47
+ return {
48
+ url: uri.toString()
49
+ }
50
+ }
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
66
+ },
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
79
+ },
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
+ }
95
+
96
+ /**
97
+ * @typedef {object} TransformRequestOptions
98
+ * @property {string[]} bbox - the bounding box coordinates
99
+ */
100
+
101
+ /**
102
+ * Transforms the request URL with bounding box parameters
103
+ * @callback TransformRequestArgs
104
+ * @param {string} url - the request URL
105
+ * @param {TransformRequestOptions} options - the bounding box coordinates
106
+ */
@@ -5,11 +5,9 @@
5
5
  @use "location-fields";
6
6
 
7
7
  @use "@defra/interactive-map/css" as core;
8
- @use "@defra/interactive-map/plugins/interact/css" as interact;
9
8
  @use "@defra/interactive-map/plugins/map-styles/css" as mapStyles;
10
9
  @use "@defra/interactive-map/plugins/search/css" as search;
11
10
  @use "@defra/interactive-map/plugins/scale-bar/css" as scaleBar;
12
- @use "@defra/interactive-map/plugins/draw-ml/css" as drawMl;
13
11
 
14
12
  // Use default GDS Transport font for autocomplete
15
13
  .autocomplete__hint,
@@ -242,20 +242,6 @@ pages:
242
242
  content: 'Fill in this field'
243
243
  options:
244
244
  required: false
245
- next:
246
- - path: '/pay-for-your-licence'
247
- - title: Pay for your licence
248
- path: '/pay-for-your-licence'
249
- section: section
250
- components:
251
- - name: licencePayment
252
- title: Unicorn breeder licence fee
253
- type: PaymentField
254
- hint: You'll be redirected to GOV.UK Pay to complete your payment
255
- options:
256
- required: true
257
- amount: 50
258
- description: Unicorn breeder annual licence fee
259
245
  next:
260
246
  - path: '/summary'
261
247
  conditions:
@@ -3,6 +3,57 @@ name: Page events
3
3
  engine: V2
4
4
  schema: 2
5
5
  startPage: '/summary'
6
+ metadata:
7
+ language: en-GB
8
+ translations:
9
+ cy:
10
+ components:
11
+ 1fb8e182-c709-4792-8f83-e01d8b1fee1a:
12
+ title: Beth yw eich enw cyntaf?
13
+ shortDescription: Eich enw cyntaf
14
+ b68df7f1-d4f4-4c17-83c8-402f584906c9:
15
+ title: Beth yw eich enw olaf?
16
+ shortDescription: Eich enw olaf
17
+ 987c1234-56d7-89e0-1234-56789abcdef0:
18
+ title: Llwytho copi o'ch pasbort
19
+ shortDescription: Llwytho pasbort
20
+ 987c1234-56d7-89e0-1234-56789abcdef1:
21
+ title: Llwytho copi o'ch trwydded yrru
22
+ shortDescription: Llwytho trwydded yrru
23
+ 00738799-3489-4ab2-a57b-542eecb31bfa:
24
+ title: Pryd yw pen-blwydd {{ applicantFirstName }} {{ applicantLastName }}?
25
+ shortDescription: Eich pen-blwydd
26
+ 123e4567-e89b-12d3-a456-426614174000:
27
+ title: Beth yw eich cyfeiriad?
28
+ shortDescription: Eich cyfeiriad
29
+ aabbccdd-1122-3344-5566-778899001123:
30
+ title: Oes gennych chi drwydded yrru?
31
+ shortDescription: Trwydded yrru
32
+ aabbccdd-1122-3344-5566-778899001124:
33
+ title: Sut rydych chi fel arfer yn teithio?
34
+ shortDescription: Eich ffordd o deithio
35
+ listItems:
36
+ aabbccdd-1122-3344-5566-778899001126:
37
+ text: Car
38
+ aabbccdd-1122-3344-5566-778899001127:
39
+ text: Bws
40
+ aabbccdd-1122-3344-5566-778899001128:
41
+ text: Trên
42
+ pages:
43
+ 622a35ec-3795-418a-81f3-a45746959045:
44
+ title: Eich enw
45
+ 23456789-0abc-def1-2345-67890abcdef1:
46
+ title: Llwytho copi o'ch pasbort
47
+ 23456789-0abc-def1-2345-67890abcdef2:
48
+ title: Llwytho copi o'ch trwydded yrru
49
+ da0fbdb4-a2de-4650-be16-9ba552af135f:
50
+ title: Dyddiad geni
51
+ 449a45f6-4541-4a46-91bd-8b8931b07b50:
52
+ title: Crynodeb
53
+ 123e4567-e89b-12d3-a456-426614174001:
54
+ title: Ble rydych chi'n byw?
55
+ aabbccdd-1122-3344-5566-778899001122:
56
+ title: Amdanoch chi
6
57
  pages:
7
58
  - title: Your name
8
59
  path: '/your-name'
@@ -36,6 +87,21 @@ pages:
36
87
  id: e18116e0-7c3e-416a-af42-6f229017c5b1
37
88
  next: []
38
89
  id: 622a35ec-3795-418a-81f3-a45746959045
90
+ - title: Where do you live?
91
+ path: '/where-you-live'
92
+ components:
93
+ - type: UkAddressField
94
+ title: What is your address?
95
+ name: applicantAddress
96
+ shortDescription: Your address
97
+ hint: ''
98
+ options:
99
+ required: true
100
+ usePostcodeLookup: true
101
+ schema: {}
102
+ id: 123e4567-e89b-12d3-a456-426614174000
103
+ next: []
104
+ id: 123e4567-e89b-12d3-a456-426614174001
39
105
  - title: Upload a copy of your passport
40
106
  controller: FileUploadPageController
41
107
  path: '/upload-passport'
@@ -46,7 +112,7 @@ pages:
46
112
  shortDescription: Upload passport
47
113
  hint: ''
48
114
  options:
49
- required: true
115
+ required: false
50
116
  schema: {}
51
117
  id: 987c1234-56d7-89e0-1234-56789abcdef0
52
118
  id: 23456789-0abc-def1-2345-67890abcdef1
@@ -60,7 +126,7 @@ pages:
60
126
  shortDescription: Upload drivers licence
61
127
  hint: ''
62
128
  options:
63
- required: true
129
+ required: false
64
130
  schema: {}
65
131
  id: 987c1234-56d7-89e0-1234-56789abcdef1
66
132
  id: 23456789-0abc-def1-2345-67890abcdef2
@@ -78,6 +144,29 @@ pages:
78
144
  id: '00738799-3489-4ab2-a57b-542eecb31bfa'
79
145
  next: []
80
146
  id: da0fbdb4-a2de-4650-be16-9ba552af135f
147
+ - title: About you
148
+ path: '/about-you'
149
+ components:
150
+ - type: YesNoField
151
+ title: Do you have a driving licence?
152
+ name: hasDrivingLicence
153
+ shortDescription: Driving licence
154
+ hint: ''
155
+ options: {}
156
+ schema: {}
157
+ id: aabbccdd-1122-3344-5566-778899001123
158
+ - type: RadiosField
159
+ title: How do you usually travel?
160
+ name: travelMethod
161
+ shortDescription: Your travel method
162
+ hint: ''
163
+ options:
164
+ required: true
165
+ schema: {}
166
+ list: aabbccdd-1122-3344-5566-778899001125
167
+ id: aabbccdd-1122-3344-5566-778899001124
168
+ next: []
169
+ id: aabbccdd-1122-3344-5566-778899001122
81
170
  - title: ''
82
171
  path: '/notification-demo'
83
172
  components:
@@ -103,4 +192,18 @@ pages:
103
192
  controller: SummaryPageController
104
193
  conditions: []
105
194
  sections: []
106
- lists: []
195
+ lists:
196
+ - id: aabbccdd-1122-3344-5566-778899001125
197
+ name: travelMethods
198
+ title: Travel methods
199
+ type: string
200
+ items:
201
+ - id: aabbccdd-1122-3344-5566-778899001126
202
+ text: Car
203
+ value: car
204
+ - id: aabbccdd-1122-3344-5566-778899001127
205
+ text: Bus
206
+ value: bus
207
+ - id: aabbccdd-1122-3344-5566-778899001128
208
+ text: Train
209
+ value: train
@@ -1,11 +1,8 @@
1
1
  import { type AutocompleteFieldComponent } from '@defra/forms-model'
2
2
 
3
3
  import { SelectField } from './SelectField.js'
4
+ import { type RenderContext } from './types.js'
4
5
  import { messageTemplate } from '../pageControllers/validationOptions.js'
5
- import {
6
- type FormPayload,
7
- type FormSubmissionError
8
- } from '../types.js'
9
6
 
10
7
  export class AutocompleteField extends SelectField {
11
8
  declare options: AutocompleteFieldComponent['options']
@@ -34,8 +31,8 @@ export class AutocompleteField extends SelectField {
34
31
  this.formSchema = formSchema
35
32
  }
36
33
 
37
- getViewModel(payload: FormPayload, errors?: FormSubmissionError[]) {
38
- const viewModel = super.getViewModel(payload, errors)
34
+ getViewModel(context: RenderContext) {
35
+ const viewModel = super.getViewModel(context)
39
36
  let { formGroup } = viewModel
40
37
 
41
38
  formGroup ??= {}
@@ -3,6 +3,7 @@ import joi, { type ArraySchema } from 'joi'
3
3
 
4
4
  import { isFormValue } from './FormComponent.js'
5
5
  import { SelectionControlField } from './SelectionControlField.js'
6
+ import { type Translator } from '../i18n/types.js'
6
7
  import { type FormModel } from '../models/FormModel.js'
7
8
  import { type QuestionPageController } from '../pageControllers/QuestionPageController.js'
8
9
  import { messageTemplate } from '../pageControllers/validationOptions.js'
@@ -41,9 +42,9 @@ export class CheckboxesField extends SelectionControlField {
41
42
  .label(this.label)
42
43
  .required()
43
44
  .messages({
44
- 'array.min': messageTemplate.arrayMin as string,
45
- 'array.max': messageTemplate.arrayMax as string,
46
- 'array.length': messageTemplate.arrayLength as string
45
+ 'array.min': messageTemplate.arrayMin,
46
+ 'array.max': messageTemplate.arrayMax,
47
+ 'array.length': messageTemplate.arrayLength
47
48
  })
48
49
 
49
50
  if (options.required === false) {
@@ -86,7 +87,8 @@ export class CheckboxesField extends SelectionControlField {
86
87
  }
87
88
 
88
89
  getDisplayStringFromFormValue(
89
- selected: (string | number | boolean)[] | undefined
90
+ selected: (string | number | boolean)[] | undefined,
91
+ translator: Translator
90
92
  ) {
91
93
  const { items } = this
92
94
 
@@ -94,10 +96,9 @@ export class CheckboxesField extends SelectionControlField {
94
96
  return ''
95
97
  }
96
98
 
97
- // Map selected values to text
98
99
  return items
99
100
  .filter((item) => selected.includes(item.value))
100
- .map((item) => item.text)
101
+ .map((item) => translator.tListItem(item, 'text') || item.text)
101
102
  .join(', ')
102
103
  }
103
104
 
@@ -118,12 +119,12 @@ export class CheckboxesField extends SelectionControlField {
118
119
  return values ?? []
119
120
  }
120
121
 
121
- getDisplayStringFromState(state: FormSubmissionState) {
122
- // Selected checkbox values
122
+ getDisplayStringFromState(
123
+ state: FormSubmissionState,
124
+ translator: Translator
125
+ ) {
123
126
  const selected = this.getFormValueFromState(state) ?? []
124
-
125
- // Map selected values to text
126
- return this.getDisplayStringFromFormValue(selected)
127
+ return this.getDisplayStringFromFormValue(selected, translator)
127
128
  }
128
129
 
129
130
  getContextValueFromState(state: FormSubmissionState) {