@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
@@ -367,6 +367,48 @@ export function getMapLayers(layers) {
367
367
  return trimmed ? trimmed.split(',') : []
368
368
  }
369
369
 
370
+ /**
371
+ * Adds the country layers to a datasets array
372
+ * @param {string} apiPath
373
+ * @param {string} [country]
374
+ */
375
+ export function getMapCountryLayers(apiPath, country) {
376
+ /** @type {any[]} */
377
+ const datasets = []
378
+
379
+ if (country) {
380
+ // Add the country bounds to the datasets array to show the valid area on the map
381
+ // and provide feedback to the user when they add features outside of the bounds.
382
+ datasets.push(
383
+ {
384
+ id: 'invalid-area',
385
+ label: 'Invalid areas',
386
+ geojson: `${apiPath}/maps/countries.geojson?omit=${country}`,
387
+ showInKey: false,
388
+ showInMenu: false,
389
+ style: {
390
+ stroke: 'gray',
391
+ strokeWidth: 1,
392
+ fill: 'rgba(211,211,211,0.8)'
393
+ }
394
+ },
395
+ {
396
+ id: 'valid-area',
397
+ label: 'Valid areas',
398
+ geojson: `${apiPath}/maps/countries.geojson?only=${country}`,
399
+ showInKey: false,
400
+ showInMenu: false,
401
+ style: {
402
+ stroke: 'rgba(0,112,60,1)',
403
+ strokeWidth: 1
404
+ }
405
+ }
406
+ )
407
+ }
408
+
409
+ return datasets
410
+ }
411
+
370
412
  /**
371
413
  * @typedef {object} InteractiveMap - an instance of a InteractiveMap
372
414
  * @property {Function} on - register callback listeners to map events
@@ -418,3 +460,8 @@ export function getMapLayers(layers) {
418
460
  /**
419
461
  * @import { Feature } from '../../server/plugins/engine/types.js'
420
462
  */
463
+
464
+ /**
465
+ * Supported language codes
466
+ * @typedef {('en-GB'|'cy')} LanguageCode
467
+ */
@@ -0,0 +1,5 @@
1
+ export { initMaps } from './map.js'
2
+ export * as map from './map.js'
3
+ export * as locationMap from './location-map.js'
4
+ export * as geospatialMap from './geospatial-map.js'
5
+ export * as sssiDataset from './sssi-dataset.js'
@@ -3,10 +3,7 @@ import { initDebounceClick as initDebounceClickImp } from './debounce-click.js'
3
3
  import { initFileUpload as initFileUploadImp } from './file-upload.js'
4
4
  import { initAllGovuk as initAllGovukImp } from './govuk.js'
5
5
  import { initPreviewCloseLink as initPreviewCloseLinkImp } from './preview-close-link.js'
6
- export { initMaps } from './map.js'
7
- export * as map from './map.js'
8
- export * as geospatialMap from './geospatial-map.js'
9
- export * as sssiDataset from './sssi-dataset.js'
6
+ export * from './maps.js'
10
7
 
11
8
  export const initAllGovuk = initAllGovukImp
12
9
  export const initAllAutocomplete = initAllAutocompleteImp
@@ -49,49 +49,47 @@ export function sssiScotlandRequestTransformer(url, { bbox }) {
49
49
  }
50
50
  }
51
51
 
52
- export default {
53
- datasets: [
54
- {
55
- id: 'sssi-england',
56
- label: 'Sites of Special Scientific Interest',
57
- dynamicGeoJSON: {
58
- url: englandWFS,
59
- idProperty: 'ref_code',
60
- transformRequest: sssiEnglandRequestTransformer
61
- },
62
- minZoom,
63
- style,
64
- showInKey: true,
65
- showInMenu: false
52
+ export default [
53
+ {
54
+ id: 'sssi-england',
55
+ label: 'Sites of Special Scientific Interest',
56
+ dynamicGeoJSON: {
57
+ url: englandWFS,
58
+ idProperty: 'ref_code',
59
+ transformRequest: sssiEnglandRequestTransformer
66
60
  },
67
- {
68
- id: 'sssi-wales',
69
- label: 'SSSI Wales',
70
- dynamicGeoJSON: {
71
- url: walesWFS,
72
- idProperty: 'id',
73
- transformRequest: sssiWalesRequestTransformer
74
- },
75
- minZoom,
76
- style,
77
- showInKey: false,
78
- showInMenu: false
61
+ minZoom,
62
+ style,
63
+ showInKey: true,
64
+ showInMenu: false
65
+ },
66
+ {
67
+ id: 'sssi-wales',
68
+ label: 'SSSI Wales',
69
+ dynamicGeoJSON: {
70
+ url: walesWFS,
71
+ idProperty: 'id',
72
+ transformRequest: sssiWalesRequestTransformer
79
73
  },
80
- {
81
- id: 'sssi-scotland',
82
- label: 'SSSI Scotland',
83
- dynamicGeoJSON: {
84
- url: scotlandWFS,
85
- idProperty: 'OBJECTID',
86
- transformRequest: sssiScotlandRequestTransformer
87
- },
88
- minZoom,
89
- style,
90
- showInKey: false,
91
- showInMenu: false
92
- }
93
- ]
94
- }
74
+ minZoom,
75
+ style,
76
+ showInKey: false,
77
+ showInMenu: false
78
+ },
79
+ {
80
+ id: 'sssi-scotland',
81
+ label: 'SSSI Scotland',
82
+ dynamicGeoJSON: {
83
+ url: scotlandWFS,
84
+ idProperty: 'OBJECTID',
85
+ transformRequest: sssiScotlandRequestTransformer
86
+ },
87
+ minZoom,
88
+ style,
89
+ showInKey: false,
90
+ showInMenu: false
91
+ }
92
+ ]
95
93
 
96
94
  /**
97
95
  * @typedef {object} TransformRequestOptions
@@ -0,0 +1,4 @@
1
+ @use "@defra/interactive-map/css" as core;
2
+ @use "@defra/interactive-map/plugins/map-styles/css" as mapStyles;
3
+ @use "@defra/interactive-map/plugins/search/css" as search;
4
+ @use "@defra/interactive-map/plugins/scale-bar/css" as scaleBar;
@@ -3,11 +3,7 @@
3
3
  @use "prose";
4
4
  @use "summary-list";
5
5
  @use "location-fields";
6
-
7
- @use "@defra/interactive-map/css" as core;
8
- @use "@defra/interactive-map/plugins/map-styles/css" as mapStyles;
9
- @use "@defra/interactive-map/plugins/search/css" as search;
10
- @use "@defra/interactive-map/plugins/scale-bar/css" as scaleBar;
6
+ @use "maps";
11
7
 
12
8
  // Use default GDS Transport font for autocomplete
13
9
  .autocomplete__hint,
@@ -5,3 +5,5 @@ export const EXTERNAL_STATE_PAYLOAD = 'EXTERNAL_STATE_PAYLOAD'
5
5
  export const EXTERNAL_STATE_APPENDAGE = 'EXTERNAL_STATE_APPENDAGE'
6
6
  export const COMPONENT_STATE_ERROR = 'COMPONENT_STATE_ERROR'
7
7
  export const PAYMENT_EXPIRED_NOTIFICATION = 'PAYMENT_EXPIRED_NOTIFICATION'
8
+ export const EN_GB = 'en-GB' // English language
9
+ export const CY = 'cy' // Welsh language
@@ -0,0 +1,155 @@
1
+ import {
2
+ ComponentType,
3
+ ConditionType,
4
+ ControllerType,
5
+ Engine,
6
+ OperatorName,
7
+ SchemaVersion,
8
+ type FormDefinition,
9
+ type PageQuestion
10
+ } from '@defra/forms-model'
11
+
12
+ const YES_NO_COMPONENT_ID = 'a7c0242f-2a31-45b2-8c71-ff2ac7f53288'
13
+ const USER_TYPE_LIST_ID = '4fa26e9c-07cf-47cd-a9dd-5cec0dd3f544'
14
+ const EXISTING_USER_ITEM_ID = '55fe0067-d011-4d33-886c-e1aa266637c3'
15
+
16
+ /**
17
+ * A minimal, schema-valid V2 definition: one YesNo question page and a
18
+ * summary page. Each call returns a fresh object, so tests can mutate their
19
+ * copy freely without affecting each other.
20
+ */
21
+ export function buildDefinition(): FormDefinition {
22
+ return {
23
+ name: 'Stub definition',
24
+ engine: Engine.V2,
25
+ schema: SchemaVersion.V2,
26
+ startPage: '/summary',
27
+ pages: [
28
+ {
29
+ id: '449c053b-9201-4312-9a75-187afc6ba48b',
30
+ path: '/licence',
31
+ title: 'Licence',
32
+ components: [
33
+ {
34
+ id: YES_NO_COMPONENT_ID,
35
+ name: 'xVrYaJ',
36
+ type: ComponentType.YesNoField,
37
+ title: 'Do you have a licence?',
38
+ shortDescription: 'Licence',
39
+ options: { required: true }
40
+ }
41
+ ],
42
+ next: []
43
+ },
44
+ {
45
+ id: '449c053b-9201-4312-9a75-187afc6ba48c',
46
+ path: '/summary',
47
+ title: 'Summary',
48
+ controller: ControllerType.Summary,
49
+ components: []
50
+ }
51
+ ],
52
+ lists: [],
53
+ sections: [],
54
+ conditions: []
55
+ }
56
+ }
57
+
58
+ /**
59
+ * A definition that passes schema validation but cannot be used by the
60
+ * engine: a ListItemRef condition points at the YesNoField (boolean), so the
61
+ * condition expression builder produces an unparseable expression. Distilled
62
+ * from a real production incident.
63
+ */
64
+ export function buildBrokenConditionDefinition(): FormDefinition {
65
+ const definition = buildDefinition()
66
+
67
+ definition.name = 'Broken condition fixture'
68
+
69
+ const questionPage = definition.pages[0] as PageQuestion
70
+ // A YesNoField cannot legitimately carry a custom list — that is the
71
+ // corruption this fixture models — so the TS component types (rightly)
72
+ // have no `list` property here and a cast is required.
73
+ ;(questionPage.components[0] as { list?: string }).list = USER_TYPE_LIST_ID
74
+ definition.lists = [
75
+ {
76
+ id: USER_TYPE_LIST_ID,
77
+ name: 'XtfRYR',
78
+ title: 'User type list',
79
+ type: 'string',
80
+ items: [
81
+ {
82
+ id: EXISTING_USER_ITEM_ID,
83
+ text: 'existing user',
84
+ value: 'existing user'
85
+ },
86
+ {
87
+ id: '2277c7e5-7fef-46c6-993b-d294116d6d6b',
88
+ text: 'new user',
89
+ value: 'new user'
90
+ }
91
+ ]
92
+ }
93
+ ]
94
+ definition.conditions = [
95
+ {
96
+ id: '3f9d3a35-6dee-4706-806c-3f776129f631',
97
+ displayName: 'Existing user',
98
+ items: [
99
+ {
100
+ id: '7d7f58ee-c860-4d24-8a13-de5cb9af53d8',
101
+ componentId: YES_NO_COMPONENT_ID,
102
+ operator: OperatorName.Is,
103
+ type: ConditionType.ListItemRef,
104
+ value: {
105
+ listId: USER_TYPE_LIST_ID,
106
+ itemId: [EXISTING_USER_ITEM_ID]
107
+ }
108
+ }
109
+ ]
110
+ }
111
+ ]
112
+
113
+ return definition
114
+ }
115
+
116
+ /**
117
+ * A schema-valid definition whose first page names a controller that is
118
+ * neither built in nor registered by the host application.
119
+ */
120
+ export function buildUnknownControllerDefinition(): FormDefinition {
121
+ const definition = buildDefinition()
122
+
123
+ definition.name = 'Unknown controller fixture'
124
+ definition.pages[0].controller =
125
+ 'NoSuchPageController' as unknown as ControllerType
126
+
127
+ return definition
128
+ }
129
+
130
+ /**
131
+ * Schema-valid (component types are free strings in the schema), but the
132
+ * question uses a type the engine has no component class for.
133
+ */
134
+ export function buildUnknownComponentDefinition(): FormDefinition {
135
+ const definition = buildDefinition()
136
+
137
+ definition.name = 'Unknown component fixture'
138
+ const questionPage = definition.pages[0] as PageQuestion
139
+ questionPage.components[0].type = 'MyUnknownField' as unknown as ComponentType
140
+
141
+ return definition
142
+ }
143
+
144
+ /**
145
+ * A definition that fails schema validation: the question page appears
146
+ * twice, violating the pages uniqueness rule.
147
+ */
148
+ export function buildSchemaInvalidDefinition(): FormDefinition {
149
+ const definition = buildDefinition()
150
+
151
+ definition.name = 'Schema invalid fixture'
152
+ definition.pages.push(buildDefinition().pages[0])
153
+
154
+ return definition
155
+ }
@@ -1,8 +1,11 @@
1
1
  import { type AutocompleteFieldComponent } from '@defra/forms-model'
2
+ import { type LanguageMessages } from 'joi'
2
3
 
3
4
  import { SelectField } from './SelectField.js'
4
5
  import { type RenderContext } from './types.js'
6
+ import { buildValidationMessages } from '../i18n/buildValidationMessages.js'
5
7
  import { messageTemplate } from '../pageControllers/validationOptions.js'
8
+ import { type Translator } from '../types/index.js'
6
9
 
7
10
  export class AutocompleteField extends SelectField {
8
11
  declare options: AutocompleteFieldComponent['options']
@@ -45,4 +48,14 @@ export class AutocompleteField extends SelectField {
45
48
  formGroup
46
49
  }
47
50
  }
51
+
52
+ getValidationMessagesOverride(translator: Translator) {
53
+ const { t } = translator
54
+ return {
55
+ [this.name]: {
56
+ 'any.required': buildValidationMessages(t).objectRequired,
57
+ 'any.only': buildValidationMessages(t).objectRequired
58
+ } as LanguageMessages
59
+ }
60
+ }
48
61
  }
@@ -1,8 +1,10 @@
1
1
  import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model'
2
2
  import joi, { type ArraySchema } from 'joi'
3
3
 
4
+ import { EN_GB } from '../../../constants.js'
4
5
  import { isFormValue } from './FormComponent.js'
5
6
  import { SelectionControlField } from './SelectionControlField.js'
7
+ import { t as tPlugin } from '../i18n/index.js'
6
8
  import { type Translator } from '../i18n/types.js'
7
9
  import { type FormModel } from '../models/FormModel.js'
8
10
  import { type QuestionPageController } from '../pageControllers/QuestionPageController.js'
@@ -19,6 +21,7 @@ export class CheckboxesField extends SelectionControlField {
19
21
  declare schema: CheckboxesFieldComponent['schema']
20
22
  declare formSchema: ArraySchema<string> | ArraySchema<number>
21
23
  declare stateSchema: ArraySchema<string> | ArraySchema<number>
24
+ declare limits: { min?: number; max?: number; length?: number }
22
25
 
23
26
  constructor(
24
27
  def: CheckboxesFieldComponent,
@@ -41,11 +44,8 @@ export class CheckboxesField extends SelectionControlField {
41
44
  .single()
42
45
  .label(this.label)
43
46
  .required()
44
- .messages({
45
- 'array.min': messageTemplate.arrayMin,
46
- 'array.max': messageTemplate.arrayMax,
47
- 'array.length': messageTemplate.arrayLength
48
- })
47
+
48
+ const limits: { min?: number; max?: number; length?: number } = {}
49
49
 
50
50
  if (options.required === false) {
51
51
  formSchema = formSchema.optional()
@@ -53,16 +53,25 @@ export class CheckboxesField extends SelectionControlField {
53
53
 
54
54
  if (typeof schema?.length === 'number') {
55
55
  formSchema = formSchema.length(schema.length)
56
+ limits.length = schema.length
56
57
  } else {
57
58
  if (typeof schema?.min === 'number') {
58
59
  formSchema = formSchema.min(schema.min)
60
+ limits.min = schema.min
59
61
  }
60
62
 
61
63
  if (typeof schema?.max === 'number') {
62
64
  formSchema = formSchema.max(schema.max)
65
+ limits.max = schema.max
63
66
  }
64
67
  }
65
68
 
69
+ this.limits = limits
70
+
71
+ formSchema = formSchema.messages(
72
+ CheckboxesField.buildErrorMessages(EN_GB, limits)
73
+ )
74
+
66
75
  this.formSchema = formSchema.default([])
67
76
  this.stateSchema = formSchema.default(null).allow(null)
68
77
  this.options = options
@@ -133,6 +142,13 @@ export class CheckboxesField extends SelectionControlField {
133
142
  return this.getContextValueFromFormValue(values)
134
143
  }
135
144
 
145
+ getValidationMessagesOverride(translator: Translator) {
146
+ const { language } = translator
147
+ return {
148
+ [this.name]: CheckboxesField.buildErrorMessages(language, this.limits)
149
+ }
150
+ }
151
+
136
152
  /**
137
153
  * For error preview page that shows all possible errors on a component
138
154
  */
@@ -169,4 +185,21 @@ export class CheckboxesField extends SelectionControlField {
169
185
 
170
186
  return value.every(isFormValue)
171
187
  }
188
+
189
+ static buildErrorMessages(
190
+ language: string,
191
+ limits: { min?: number; max?: number; length?: number } = {}
192
+ ) {
193
+ return {
194
+ 'array.min': tPlugin('validation.arrayMin', language, {
195
+ count: limits.min ?? 1
196
+ }),
197
+ 'array.max': tPlugin('validation.arrayMax', language, {
198
+ count: limits.max ?? 1
199
+ }),
200
+ 'array.length': tPlugin('validation.arrayLength', language, {
201
+ count: limits.length ?? 1
202
+ })
203
+ }
204
+ }
172
205
  }
@@ -28,6 +28,7 @@ export class ComponentBase {
28
28
 
29
29
  isFormComponent = false
30
30
  model: FormModel
31
+ def: ComponentDef
31
32
 
32
33
  /** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
33
34
  formSchema: ComponentSchema = joi.string()
@@ -45,6 +46,7 @@ export class ComponentBase {
45
46
  this.type = def.type
46
47
  this.name = def.name
47
48
  this.title = def.title
49
+ this.def = def
48
50
 
49
51
  if ('schema' in def) {
50
52
  this.schema = def.schema
@@ -15,6 +15,7 @@ import {
15
15
  type Field,
16
16
  type Guidance
17
17
  } from './helpers/components.js'
18
+ import { getTranslatedLabel } from './helpers/index.js'
18
19
  import {
19
20
  type ComponentViewModel,
20
21
  type RenderContext
@@ -302,26 +303,28 @@ export class ComponentCollection {
302
303
  for (const subField of field.collection.fields) {
303
304
  const translatedSubLabel = t(subField.title) || subField.label
304
305
  let patchedSchema = subField.formSchema.label(translatedSubLabel)
305
- if (messagesOverride) {
306
- patchedSchema = patchedSchema.messages(messagesOverride)
306
+ const subFieldMessages = messagesOverride
307
+ ? messagesOverride[subField.name]
308
+ : undefined
309
+ if (subFieldMessages) {
310
+ patchedSchema = patchedSchema.messages(subFieldMessages)
307
311
  }
308
312
  labelOverrides[subField.name] = patchedSchema
309
313
  }
310
314
  } else {
311
- const translatedLabel =
312
- translator.tComponent(
313
- field as unknown as ComponentDef,
314
- 'shortDescription'
315
- ) ||
316
- translator.tComponent(field as unknown as ComponentDef, 'title')
315
+ const fieldDef = field.def
316
+ const translatedLabel = getTranslatedLabel(fieldDef, translator)
317
317
  const messagesOverride =
318
318
  field.getValidationMessagesOverride(translator)
319
319
  let patchedSchema = field.formSchema
320
320
  if (translatedLabel && translatedLabel !== field.label) {
321
321
  patchedSchema = patchedSchema.label(translatedLabel)
322
322
  }
323
- if (messagesOverride) {
324
- patchedSchema = patchedSchema.messages(messagesOverride)
323
+ const fieldMessages = messagesOverride
324
+ ? messagesOverride[field.name]
325
+ : undefined
326
+ if (fieldMessages) {
327
+ patchedSchema = patchedSchema.messages(fieldMessages)
325
328
  }
326
329
  if (patchedSchema !== field.formSchema) {
327
330
  labelOverrides[field.name] = patchedSchema
@@ -340,10 +343,12 @@ export class ComponentCollection {
340
343
  })
341
344
 
342
345
  const details = result.error?.details
346
+ const language = translator?.language
343
347
 
344
348
  return {
345
349
  value: (result.value ?? {}) as typeof value,
346
- errors: this.page?.getErrors(details) ?? getErrors(details)
350
+ errors:
351
+ this.page?.getErrors(details, language) ?? getErrors(language, details)
347
352
  }
348
353
  }
349
354
 
@@ -1,6 +1,11 @@
1
1
  import { ComponentType, type DatePartsFieldComponent } from '@defra/forms-model'
2
2
  import { add, format, isValid, parse, startOfToday, sub } from 'date-fns'
3
- import { type Context, type CustomValidator, type ObjectSchema } from 'joi'
3
+ import {
4
+ type Context,
5
+ type CustomValidator,
6
+ type LanguageMessages,
7
+ type ObjectSchema
8
+ } from 'joi'
4
9
 
5
10
  import { ComponentCollection } from './ComponentCollection.js'
6
11
  import {
@@ -25,7 +30,7 @@ import {
25
30
  type FormStateValue,
26
31
  type FormSubmissionState
27
32
  } from '../types.js'
28
- import { convertToLanguageMessages } from '../../../utils/type-utils.js'
33
+ import { formatDateForLanguage } from '../../payment/helper.js'
29
34
 
30
35
  export class DatePartsField extends FormComponent {
31
36
  declare options: DatePartsFieldComponent['options']
@@ -43,7 +48,7 @@ export class DatePartsField extends FormComponent {
43
48
 
44
49
  const isRequired = options.required !== false
45
50
 
46
- const customValidationMessages = convertToLanguageMessages({
51
+ const customValidationMessages = {
47
52
  'any.required': messageTemplate.objectMissing,
48
53
  'number.base': messageTemplate.objectMissing,
49
54
  'number.precision': messageTemplate.dateFormat,
@@ -51,7 +56,7 @@ export class DatePartsField extends FormComponent {
51
56
  'number.unsafe': messageTemplate.dateFormat,
52
57
  'number.min': messageTemplate.dateFormat,
53
58
  'number.max': messageTemplate.dateFormat
54
- })
59
+ } as LanguageMessages
55
60
 
56
61
  this.collection = new ComponentCollection(
57
62
  [
@@ -111,15 +116,16 @@ export class DatePartsField extends FormComponent {
111
116
 
112
117
  getDisplayStringFromFormValue(
113
118
  formValue: DatePartsState | undefined,
114
- _translator: Translator
119
+ translator: Translator
115
120
  ) {
116
121
  if (!formValue) {
117
122
  return ''
118
123
  }
119
124
 
120
- return format(
125
+ return formatDateForLanguage(
121
126
  `${formValue.year}-${formValue.month}-${formValue.day}`,
122
- 'd MMMM yyyy'
127
+ 'd MMMM yyyy',
128
+ translator.language
123
129
  )
124
130
  }
125
131
 
@@ -158,7 +164,7 @@ export class DatePartsField extends FormComponent {
158
164
 
159
165
  getValidationMessagesOverride(translator: Translator) {
160
166
  const { t } = translator
161
- return convertToLanguageMessages({
167
+ const messages = {
162
168
  'any.required': buildValidationMessages(t).objectMissing,
163
169
  'number.base': buildValidationMessages(t).objectMissing,
164
170
  'number.precision': buildValidationMessages(t).dateFormat,
@@ -166,7 +172,12 @@ export class DatePartsField extends FormComponent {
166
172
  'number.unsafe': buildValidationMessages(t).dateFormat,
167
173
  'number.min': buildValidationMessages(t).dateFormat,
168
174
  'number.max': buildValidationMessages(t).dateFormat
169
- })
175
+ } as LanguageMessages
176
+ return {
177
+ [`${this.name}__day`]: messages,
178
+ [`${this.name}__month`]: messages,
179
+ [`${this.name}__year`]: messages
180
+ }
170
181
  }
171
182
 
172
183
  getViewModel(context: RenderContext) {
@@ -2,7 +2,6 @@ import {
2
2
  ComponentType,
3
3
  hasFormComponents,
4
4
  isFormType,
5
- type ComponentDef,
6
5
  type DeclarationFieldComponent,
7
6
  type Item
8
7
  } from '@defra/forms-model'
@@ -121,10 +120,12 @@ export class DeclarationField extends FormComponent {
121
120
  const { declarationRequired } = buildValidationMessages(translator.t)
122
121
  const msg = declarationRequired as unknown as string
123
122
  return {
124
- 'any.required': msg,
125
- 'any.unknown': msg,
126
- 'array.includesRequiredUnknowns': msg
127
- } as unknown as LanguageMessages
123
+ [this.name]: {
124
+ 'any.required': msg,
125
+ 'any.unknown': msg,
126
+ 'array.includesRequiredUnknowns': msg
127
+ } as unknown as LanguageMessages
128
+ }
128
129
  }
129
130
 
130
131
  getDisplayStringFromFormValue(
@@ -148,7 +149,7 @@ export class DeclarationField extends FormComponent {
148
149
  'components.declarationField.defaultLabel'
149
150
  )
150
151
  } = this
151
- const content = tComponent(this as unknown as ComponentDef, 'content')
152
+ const content = tComponent(this.def, 'content')
152
153
 
153
154
  const viewModel = super.getViewModel(context)
154
155
  let { fieldset, label } = viewModel