@defra/forms-engine-plugin 5.0.0-alpha → 5.0.0-alpha.10

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 (303) hide show
  1. package/.public/assets-manifest.json +3 -5
  2. package/.public/javascripts/application.min.js +1 -1
  3. package/.public/javascripts/application.min.js.map +1 -1
  4. package/.public/javascripts/im-core.min.js +2 -0
  5. package/.public/javascripts/im-core.min.js.map +1 -0
  6. package/.public/javascripts/shared.min.js +1 -1
  7. package/.public/javascripts/shared.min.js.map +1 -1
  8. package/.public/javascripts/vendor/@defra.min.js +1 -1
  9. package/.public/javascripts/vendor/@defra.min.js.map +1 -1
  10. package/.public/stylesheets/application.min.css +1 -1
  11. package/.public/stylesheets/application.min.css.map +1 -1
  12. package/.server/client/javascripts/file-upload.js +5 -3
  13. package/.server/client/javascripts/file-upload.js.map +1 -1
  14. package/.server/client/javascripts/geospatial-map.js +36 -29
  15. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  16. package/.server/client/javascripts/location-map.js +16 -1
  17. package/.server/client/javascripts/location-map.js.map +1 -1
  18. package/.server/client/javascripts/map.d.ts +6 -0
  19. package/.server/client/javascripts/map.js +10 -0
  20. package/.server/client/javascripts/map.js.map +1 -1
  21. package/.server/client/javascripts/maps.d.ts +5 -0
  22. package/.server/client/javascripts/maps.js +6 -0
  23. package/.server/client/javascripts/maps.js.map +1 -0
  24. package/.server/client/javascripts/shared.d.ts +1 -3
  25. package/.server/client/javascripts/shared.js +1 -3
  26. package/.server/client/javascripts/shared.js.map +1 -1
  27. package/.server/client/javascripts/sssi-dataset.d.ts +32 -0
  28. package/.server/client/javascripts/sssi-dataset.js +99 -0
  29. package/.server/client/javascripts/sssi-dataset.js.map +1 -0
  30. package/.server/client/stylesheets/maps.scss +4 -0
  31. package/.server/client/stylesheets/shared.scss +1 -7
  32. package/.server/server/constants.d.ts +2 -0
  33. package/.server/server/constants.js +2 -0
  34. package/.server/server/constants.js.map +1 -1
  35. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  36. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  37. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  38. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +4 -1
  39. package/.server/server/plugins/engine/components/CheckboxesField.js +13 -0
  40. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  41. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  42. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  43. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  44. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  45. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  46. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  47. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  48. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  49. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  50. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  51. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  52. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  53. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +28 -2
  54. package/.server/server/plugins/engine/components/EastingNorthingField.js +93 -54
  55. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  56. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  57. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  58. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  59. package/.server/server/plugins/engine/components/FileUploadField.d.ts +12 -0
  60. package/.server/server/plugins/engine/components/FileUploadField.js +20 -2
  61. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  62. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  63. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  64. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  65. package/.server/server/plugins/engine/components/GeospatialField.d.ts +2 -0
  66. package/.server/server/plugins/engine/components/GeospatialField.js +3 -1
  67. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  69. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  70. package/.server/server/plugins/engine/components/LatLongField.d.ts +28 -2
  71. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  72. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  73. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  74. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  75. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  76. package/.server/server/plugins/engine/components/LocationFieldBase.js +18 -5
  77. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  78. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +10 -2
  79. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +22 -12
  80. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  81. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  82. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  83. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  84. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  85. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  86. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  87. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  89. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  90. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  91. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  92. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  93. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  94. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  95. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  96. package/.server/server/plugins/engine/components/OsGridRefField.js +4 -3
  97. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  98. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  99. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  100. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  101. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  103. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  104. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  105. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  106. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  108. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  109. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  110. package/.server/server/plugins/engine/components/helpers/components.js +1 -2
  111. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  112. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  113. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  114. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  115. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  116. package/.server/server/plugins/engine/components/types.js.map +1 -1
  117. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  118. package/.server/server/plugins/engine/helpers.js +44 -5
  119. package/.server/server/plugins/engine/helpers.js.map +1 -1
  120. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +3 -0
  121. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +10 -7
  122. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  123. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  124. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  125. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  126. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  127. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  128. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  129. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  130. package/.server/server/plugins/engine/i18n/form.js +35 -0
  131. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  132. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  133. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  134. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  135. package/.server/server/plugins/engine/i18n/translations/cy.json +73 -6
  136. package/.server/server/plugins/engine/i18n/translations/en-GB.json +43 -4
  137. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  138. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  139. package/.server/server/plugins/engine/index.d.ts +4 -0
  140. package/.server/server/plugins/engine/index.js +4 -0
  141. package/.server/server/plugins/engine/index.js.map +1 -1
  142. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  143. package/.server/server/plugins/engine/models/FormModel.js +9 -15
  144. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  145. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  146. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  147. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
  148. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  149. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  150. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  151. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  152. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  153. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  154. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +1 -1
  155. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +22 -9
  156. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  157. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  158. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  159. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  160. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  161. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  162. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  163. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  164. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  165. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
  166. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  167. package/.server/server/plugins/engine/pageControllers/validationOptions.js +23 -2
  168. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  169. package/.server/server/plugins/engine/types/schema.js +1 -0
  170. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  171. package/.server/server/plugins/engine/types.d.ts +1 -0
  172. package/.server/server/plugins/engine/types.js.map +1 -1
  173. package/.server/server/plugins/engine/views/components/_location-field-base.html +3 -1
  174. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  175. package/.server/server/plugins/engine/views/components/geospatialfield.html +4 -1
  176. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  177. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  178. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  179. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  180. package/.server/server/plugins/map/routes/index.js +1 -1
  181. package/.server/server/plugins/map/routes/index.js.map +1 -1
  182. package/.server/server/plugins/map/types.d.ts +1 -25
  183. package/.server/server/plugins/map/types.js +1 -16
  184. package/.server/server/plugins/map/types.js.map +1 -1
  185. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  186. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  187. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  188. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  189. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  190. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  191. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  192. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  193. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  194. package/.server/server/plugins/payment/helper.d.ts +11 -1
  195. package/.server/server/plugins/payment/helper.js +18 -2
  196. package/.server/server/plugins/payment/helper.js.map +1 -1
  197. package/.server/server/plugins/payment/helper.test.js +2 -1
  198. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  199. package/.server/server/plugins/payment/service.d.ts +2 -1
  200. package/.server/server/plugins/payment/service.js +5 -2
  201. package/.server/server/plugins/payment/service.js.map +1 -1
  202. package/.server/server/plugins/payment/service.test.js +7 -3
  203. package/.server/server/plugins/payment/service.test.js.map +1 -1
  204. package/.server/server/plugins/payment/types.d.ts +4 -0
  205. package/.server/server/plugins/payment/types.js +1 -0
  206. package/.server/server/plugins/payment/types.js.map +1 -1
  207. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  208. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  209. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  210. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  211. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  212. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  213. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  214. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  215. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  216. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  217. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  218. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  219. package/.server/server/utils/type-utils.d.ts +1 -2
  220. package/.server/server/utils/type-utils.js +0 -3
  221. package/.server/server/utils/type-utils.js.map +1 -1
  222. package/package.json +9 -3
  223. package/src/client/javascripts/file-upload.js +10 -3
  224. package/src/client/javascripts/geospatial-map.js +38 -32
  225. package/src/client/javascripts/location-map.js +17 -0
  226. package/src/client/javascripts/map.js +10 -0
  227. package/src/client/javascripts/maps.js +5 -0
  228. package/src/client/javascripts/shared.js +1 -3
  229. package/src/client/javascripts/sssi-dataset.js +104 -0
  230. package/src/client/stylesheets/maps.scss +4 -0
  231. package/src/client/stylesheets/shared.scss +1 -7
  232. package/src/server/constants.js +2 -0
  233. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  234. package/src/server/plugins/engine/components/CheckboxesField.ts +13 -1
  235. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  236. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  237. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  238. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  239. package/src/server/plugins/engine/components/EastingNorthingField.ts +154 -89
  240. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  241. package/src/server/plugins/engine/components/FileUploadField.ts +21 -2
  242. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  243. package/src/server/plugins/engine/components/GeospatialField.ts +8 -1
  244. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  245. package/src/server/plugins/engine/components/LocationFieldBase.ts +23 -6
  246. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +35 -12
  247. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  248. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  249. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  250. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  251. package/src/server/plugins/engine/components/OsGridRefField.ts +9 -3
  252. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  253. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  254. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  255. package/src/server/plugins/engine/components/helpers/components.ts +1 -2
  256. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  257. package/src/server/plugins/engine/components/types.ts +1 -0
  258. package/src/server/plugins/engine/helpers.ts +52 -5
  259. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +10 -7
  260. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  261. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  262. package/src/server/plugins/engine/i18n/form.ts +54 -0
  263. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  264. package/src/server/plugins/engine/i18n/translations/cy.json +73 -6
  265. package/src/server/plugins/engine/i18n/translations/en-GB.json +43 -4
  266. package/src/server/plugins/engine/i18n/types.ts +2 -0
  267. package/src/server/plugins/engine/index.ts +7 -0
  268. package/src/server/plugins/engine/models/FormModel.ts +9 -15
  269. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  270. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
  271. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  272. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  273. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +18 -8
  274. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  275. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  276. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  277. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
  278. package/src/server/plugins/engine/pageControllers/validationOptions.ts +27 -2
  279. package/src/server/plugins/engine/types/schema.ts +1 -0
  280. package/src/server/plugins/engine/types.ts +1 -0
  281. package/src/server/plugins/engine/views/components/_location-field-base.html +3 -1
  282. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  283. package/src/server/plugins/engine/views/components/geospatialfield.html +4 -1
  284. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  285. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  286. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  287. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  288. package/src/server/plugins/map/routes/index.js +1 -1
  289. package/src/server/plugins/map/types.js +1 -16
  290. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  291. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  292. package/src/server/plugins/payment/helper.js +22 -2
  293. package/src/server/plugins/payment/service.js +6 -2
  294. package/src/server/plugins/payment/types.js +1 -0
  295. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  296. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  297. package/src/server/plugins/postcode-lookup/types.js +6 -1
  298. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  299. package/src/server/utils/type-utils.ts +1 -11
  300. package/.public/javascripts/im-search-plugin.min.js +0 -2
  301. package/.public/javascripts/im-search-plugin.min.js.map +0 -1
  302. package/.public/javascripts/vendor/preact.min.js +0 -2
  303. package/.public/javascripts/vendor/preact.min.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DeclarationField.js","names":["ComponentType","hasFormComponents","isFormType","joi","FormComponent","isFormValue","buildValidationMessages","messageTemplate","DeclarationField","headerStartLevel","constructor","def","props","options","content","checkboxSchema","string","valid","required","formSchema","array","items","strip","label","single","messages","declarationRequired","stateSchema","boolean","cast","declarationConfirmationLabel","formComponents","page","pageDef","components","numOfQuestionsOnPage","filter","q","type","length","hasGuidance","some","comp","idx","Markdown","getFormValueFromState","state","name","getFormDataFromState","getStateFromValidForm","payload","payloadValue","value","isValue","every","v","getContextValueFromFormValue","getFormValue","undefined","getValidationMessagesOverride","translator","t","msg","getDisplayStringFromFormValue","getViewModel","context","tComponent","hint","viewModel","fieldset","legend","text","classes","isChecked","Array","isArray","x","checked","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isBool"],"sources":["../../../../../src/server/plugins/engine/components/DeclarationField.ts"],"sourcesContent":["import {\n ComponentType,\n hasFormComponents,\n isFormType,\n type ComponentDef,\n type DeclarationFieldComponent,\n type Item\n} from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\n type LanguageMessages,\n type StringSchema\n} from 'joi'\n\nimport {\n FormComponent,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionState,\n type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport class DeclarationField extends FormComponent {\n declare options: DeclarationFieldComponent['options']\n\n declare declarationConfirmationLabel: string | undefined\n\n declare formSchema: ArraySchema<StringSchema[]>\n declare stateSchema: BooleanSchema\n declare content: string\n headerStartLevel: number\n\n constructor(\n def: DeclarationFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, content } = def\n\n let checkboxSchema = joi.string().valid('true')\n\n if (options.required !== false) {\n checkboxSchema = checkboxSchema.required()\n }\n\n const formSchema = joi\n .array()\n .items(checkboxSchema, joi.string().valid('unchecked').strip())\n .label(this.label)\n .single()\n .messages({\n 'any.required': messageTemplate.declarationRequired as string,\n 'any.unknown': messageTemplate.declarationRequired as string,\n 'array.includesRequiredUnknowns':\n messageTemplate.declarationRequired as string\n }) as ArraySchema<StringSchema[]>\n\n this.formSchema = formSchema\n this.stateSchema = joi.boolean().cast('string').label(this.label).required()\n\n this.options = options\n this.content = content\n // Store only the form-authored label (if provided). If absent, getViewModel\n // resolves the default via t() at render time so the correct language is used.\n this.declarationConfirmationLabel = options.declarationConfirmationLabel\n const formComponents = hasFormComponents(props.page?.pageDef)\n ? props.page.pageDef.components\n : []\n const numOfQuestionsOnPage = formComponents.filter((q) =>\n isFormType(q.type)\n ).length\n const hasGuidance = formComponents.some(\n (comp, idx) => comp.type === ComponentType.Markdown && idx === 0\n )\n this.headerStartLevel = numOfQuestionsOnPage < 2 && !hasGuidance ? 2 : 3\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return state[name] === true ? 'true' : 'false'\n }\n\n getFormDataFromState(state: FormSubmissionState): FormPayload {\n const { name } = this\n return { [name]: state[name] === true ? 'true' : 'false' }\n }\n\n getStateFromValidForm(payload: FormPayload): FormState {\n const { name } = this\n const payloadValue = payload[name]\n const value =\n this.isValue(payloadValue) &&\n payloadValue.length > 0 &&\n payloadValue.every((v) => {\n return v === 'true'\n })\n\n return { [name]: value }\n }\n\n getContextValueFromFormValue(value: FormValue | FormPayload): boolean {\n return value === 'true'\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { declarationRequired } = buildValidationMessages(translator.t)\n const msg = declarationRequired as unknown as string\n return {\n 'any.required': msg,\n 'any.unknown': msg,\n 'array.includesRequiredUnknowns': msg\n } as unknown as LanguageMessages\n }\n\n getDisplayStringFromFormValue(\n value: FormValue | FormPayload,\n translator: Translator\n ): string {\n const { t } = translator\n return value === 'true'\n ? (this.declarationConfirmationLabel ??\n t('components.declarationField.defaultLabel'))\n : t('components.declarationField.notProvided')\n }\n\n getViewModel(context: RenderContext) {\n const { payload } = context\n const { t, tComponent } = context.translator\n\n const {\n hint,\n declarationConfirmationLabel = t(\n 'components.declarationField.defaultLabel'\n )\n } = this\n const content = tComponent(this as unknown as ComponentDef, 'content')\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const payloadValue = payload[this.name]\n const isChecked =\n payloadValue === 'true' ||\n payloadValue === true ||\n (Array.isArray(payloadValue) && payloadValue.some((x) => x === 'true'))\n\n return {\n ...viewModel,\n hint: hint ? { text: hint } : undefined,\n fieldset,\n content,\n items: [\n {\n text: declarationConfirmationLabel,\n value: 'true',\n checked: isChecked\n }\n ],\n headerStartLevel: this.headerStartLevel\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return DeclarationField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.declarationRequired }\n ],\n advancedSettingsErrors: []\n }\n }\n\n static isBool(value?: FormStateValue | FormState): value is boolean {\n return isFormValue(value) && typeof value === 'boolean'\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DeclarationField.js","names":["ComponentType","hasFormComponents","isFormType","joi","FormComponent","isFormValue","buildValidationMessages","messageTemplate","DeclarationField","headerStartLevel","constructor","def","props","options","content","checkboxSchema","string","valid","required","formSchema","array","items","strip","label","single","messages","declarationRequired","stateSchema","boolean","cast","declarationConfirmationLabel","formComponents","page","pageDef","components","numOfQuestionsOnPage","filter","q","type","length","hasGuidance","some","comp","idx","Markdown","getFormValueFromState","state","name","getFormDataFromState","getStateFromValidForm","payload","payloadValue","value","isValue","every","v","getContextValueFromFormValue","getFormValue","undefined","getValidationMessagesOverride","translator","t","msg","getDisplayStringFromFormValue","getViewModel","context","tComponent","hint","viewModel","fieldset","legend","text","classes","isChecked","Array","isArray","x","checked","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isBool"],"sources":["../../../../../src/server/plugins/engine/components/DeclarationField.ts"],"sourcesContent":["import {\n ComponentType,\n hasFormComponents,\n isFormType,\n type DeclarationFieldComponent,\n type Item\n} from '@defra/forms-model'\nimport joi, {\n type ArraySchema,\n type BooleanSchema,\n type LanguageMessages,\n type StringSchema\n} from 'joi'\n\nimport {\n FormComponent,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { buildValidationMessages } from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionState,\n type FormValue\n} from '~/src/server/plugins/engine/types.js'\n\nexport class DeclarationField extends FormComponent {\n declare options: DeclarationFieldComponent['options']\n\n declare declarationConfirmationLabel: string | undefined\n\n declare formSchema: ArraySchema<StringSchema[]>\n declare stateSchema: BooleanSchema\n declare content: string\n headerStartLevel: number\n\n constructor(\n def: DeclarationFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, content } = def\n\n let checkboxSchema = joi.string().valid('true')\n\n if (options.required !== false) {\n checkboxSchema = checkboxSchema.required()\n }\n\n const formSchema = joi\n .array()\n .items(checkboxSchema, joi.string().valid('unchecked').strip())\n .label(this.label)\n .single()\n .messages({\n 'any.required': messageTemplate.declarationRequired as string,\n 'any.unknown': messageTemplate.declarationRequired as string,\n 'array.includesRequiredUnknowns':\n messageTemplate.declarationRequired as string\n }) as ArraySchema<StringSchema[]>\n\n this.formSchema = formSchema\n this.stateSchema = joi.boolean().cast('string').label(this.label).required()\n\n this.options = options\n this.content = content\n // Store only the form-authored label (if provided). If absent, getViewModel\n // resolves the default via t() at render time so the correct language is used.\n this.declarationConfirmationLabel = options.declarationConfirmationLabel\n const formComponents = hasFormComponents(props.page?.pageDef)\n ? props.page.pageDef.components\n : []\n const numOfQuestionsOnPage = formComponents.filter((q) =>\n isFormType(q.type)\n ).length\n const hasGuidance = formComponents.some(\n (comp, idx) => comp.type === ComponentType.Markdown && idx === 0\n )\n this.headerStartLevel = numOfQuestionsOnPage < 2 && !hasGuidance ? 2 : 3\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return state[name] === true ? 'true' : 'false'\n }\n\n getFormDataFromState(state: FormSubmissionState): FormPayload {\n const { name } = this\n return { [name]: state[name] === true ? 'true' : 'false' }\n }\n\n getStateFromValidForm(payload: FormPayload): FormState {\n const { name } = this\n const payloadValue = payload[name]\n const value =\n this.isValue(payloadValue) &&\n payloadValue.length > 0 &&\n payloadValue.every((v) => {\n return v === 'true'\n })\n\n return { [name]: value }\n }\n\n getContextValueFromFormValue(value: FormValue | FormPayload): boolean {\n return value === 'true'\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { declarationRequired } = buildValidationMessages(translator.t)\n const msg = declarationRequired as unknown as string\n return {\n [this.name]: {\n 'any.required': msg,\n 'any.unknown': msg,\n 'array.includesRequiredUnknowns': msg\n } as unknown as LanguageMessages\n }\n }\n\n getDisplayStringFromFormValue(\n value: FormValue | FormPayload,\n translator: Translator\n ): string {\n const { t } = translator\n return value === 'true'\n ? (this.declarationConfirmationLabel ??\n t('components.declarationField.defaultLabel'))\n : t('components.declarationField.notProvided')\n }\n\n getViewModel(context: RenderContext) {\n const { payload } = context\n const { t, tComponent } = context.translator\n\n const {\n hint,\n declarationConfirmationLabel = t(\n 'components.declarationField.defaultLabel'\n )\n } = this\n const content = tComponent(this.def, 'content')\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n const payloadValue = payload[this.name]\n const isChecked =\n payloadValue === 'true' ||\n payloadValue === true ||\n (Array.isArray(payloadValue) && payloadValue.some((x) => x === 'true'))\n\n return {\n ...viewModel,\n hint: hint ? { text: hint } : undefined,\n fieldset,\n content,\n items: [\n {\n text: declarationConfirmationLabel,\n value: 'true',\n checked: isChecked\n }\n ],\n headerStartLevel: this.headerStartLevel\n }\n }\n\n isValue(value?: FormStateValue | FormState): value is Item['value'][] {\n if (!Array.isArray(value)) {\n return false\n }\n\n // Skip checks when empty\n if (!value.length) {\n return true\n }\n\n return value.every(isFormValue)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return DeclarationField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.declarationRequired }\n ],\n advancedSettingsErrors: []\n }\n }\n\n static isBool(value?: FormStateValue | FormState): value is boolean {\n return isFormValue(value) && typeof value === 'boolean'\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -49,6 +49,7 @@ export declare class Details extends ComponentBase {
49
49
  upload?: {
50
50
  count: number;
51
51
  summaryList: import("../types.js").SummaryList;
52
+ uploadingLabel?: string;
52
53
  };
53
54
  };
54
55
  }
@@ -1,5 +1,5 @@
1
1
  import { type EastingNorthingFieldComponent } from '@defra/forms-model';
2
- import { type ObjectSchema } from 'joi';
2
+ import { type LanguageMessages, type ObjectSchema } from 'joi';
3
3
  import { ComponentCollection } from '../../../../server/plugins/engine/components/ComponentCollection.js';
4
4
  import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
5
5
  import { type EastingNorthingState, type RenderContext } from '../../../../server/plugins/engine/components/types.js';
@@ -12,7 +12,7 @@ export declare class EastingNorthingField extends FormComponent {
12
12
  collection: ComponentCollection;
13
13
  constructor(def: EastingNorthingFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
14
14
  getFormValueFromState(state: FormSubmissionState): EastingNorthingState | undefined;
15
- getDisplayStringFromFormValue(value: EastingNorthingState | undefined, _translator: Translator): string;
15
+ getDisplayStringFromFormValue(value: EastingNorthingState | undefined, translator: Translator): string;
16
16
  getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
17
17
  getContextValueFromFormValue(value: EastingNorthingState | undefined): string | null;
18
18
  getContextValueFromState(state: FormSubmissionState): string | null;
@@ -22,6 +22,7 @@ export declare class EastingNorthingField extends FormComponent {
22
22
  legend?: import("../../../../server/plugins/engine/components/types.js").Label;
23
23
  };
24
24
  items: import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
25
+ mapLayers: string;
25
26
  label: import("../../../../server/plugins/engine/components/types.js").Label;
26
27
  type?: string;
27
28
  id: string;
@@ -61,6 +62,7 @@ export declare class EastingNorthingField extends FormComponent {
61
62
  upload?: {
62
63
  count: number;
63
64
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
65
+ uploadingLabel?: string;
64
66
  };
65
67
  } | {
66
68
  instructionText: string;
@@ -69,6 +71,7 @@ export declare class EastingNorthingField extends FormComponent {
69
71
  legend?: import("../../../../server/plugins/engine/components/types.js").Label;
70
72
  };
71
73
  items: import("../../../../server/plugins/engine/components/types.js").DateInputItem[];
74
+ mapLayers: string;
72
75
  label: import("../../../../server/plugins/engine/components/types.js").Label;
73
76
  type?: string;
74
77
  id: string;
@@ -108,10 +111,14 @@ export declare class EastingNorthingField extends FormComponent {
108
111
  upload?: {
109
112
  count: number;
110
113
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
114
+ uploadingLabel?: string;
111
115
  };
112
116
  };
113
117
  getViewErrors(translator: Translator, errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
114
118
  isState(value?: FormStateValue | FormState): value is EastingNorthingState;
119
+ getValidationMessagesOverride(translator: Translator): {
120
+ [x: string]: LanguageMessages;
121
+ };
115
122
  /**
116
123
  * For error preview page that shows all possible errors on a component
117
124
  */
@@ -121,4 +128,23 @@ export declare class EastingNorthingField extends FormComponent {
121
128
  */
122
129
  static getAllPossibleErrors(): ErrorMessageTemplateList;
123
130
  static isEastingNorthing(value?: FormStateValue | FormState): value is EastingNorthingState;
131
+ static buildErrorMessages(label: string, eastingMin: number, eastingMax: number, northingMin: number, northingMax: number, language: string): {
132
+ eastingValidationMessages: LanguageMessages;
133
+ northingValidationMessages: LanguageMessages;
134
+ };
135
+ static getMinMax(schema: {
136
+ easting?: {
137
+ min?: number;
138
+ max?: number;
139
+ };
140
+ northing?: {
141
+ min?: number;
142
+ max?: number;
143
+ };
144
+ } | undefined): {
145
+ eastingMin: number;
146
+ eastingMax: number;
147
+ northingMin: number;
148
+ northingMax: number;
149
+ };
124
150
  }
@@ -4,11 +4,9 @@ import { ComponentCollection } from "./ComponentCollection.js";
4
4
  import { FormComponent, isFormState } from "./FormComponent.js";
5
5
  import { deduplicateErrorsByHref, getLocationFieldViewModel } from "./LocationFieldHelpers.js";
6
6
  import { NumberField } from "./NumberField.js";
7
- import { createLowerFirstExpression } from "./helpers/index.js";
7
+ import { createLowerFirstExpression, getTranslatedLabel } from "./helpers/index.js";
8
8
  import { t as tPlugin } from "../i18n/index.js";
9
9
  import { messageTemplate } from "../pageControllers/validationOptions.js";
10
- import { convertToLanguageMessages } from "../../../utils/type-utils.js";
11
-
12
10
  // British National Grid coordinate limits
13
11
  const DEFAULT_EASTING_MIN = 0;
14
12
  const DEFAULT_EASTING_MAX = 700000;
@@ -23,51 +21,16 @@ export class EastingNorthingField extends FormComponent {
23
21
  schema
24
22
  } = def;
25
23
  const isRequired = options.required !== false;
26
- const eastingMin = schema?.easting?.min ?? DEFAULT_EASTING_MIN;
27
- const eastingMax = schema?.easting?.max ?? DEFAULT_EASTING_MAX;
28
- const northingMin = schema?.northing?.min ?? DEFAULT_NORTHING_MIN;
29
- const northingMax = schema?.northing?.max ?? DEFAULT_NORTHING_MAX;
30
- const fieldLabel = lowerFirst(this.label);
31
- const eastingDigitsMessage = tPlugin('components.eastingNorthingField.eastingDigits', 'en-GB', {
32
- fieldLabel
33
- });
34
- const northingDigitsMessage = tPlugin('components.eastingNorthingField.northingDigits', 'en-GB', {
35
- fieldLabel
36
- });
37
- const customValidationMessages = convertToLanguageMessages({
38
- 'any.required': tPlugin('components.eastingNorthingField.eastingRequired', 'en-GB'),
39
- 'number.base': tPlugin('components.eastingNorthingField.eastingRequired', 'en-GB'),
40
- 'number.min': tPlugin('components.eastingNorthingField.eastingRange', 'en-GB', {
41
- fieldLabel,
42
- min: eastingMin,
43
- max: eastingMax
44
- }),
45
- 'number.max': tPlugin('components.eastingNorthingField.eastingRange', 'en-GB', {
46
- fieldLabel,
47
- min: eastingMin,
48
- max: eastingMax
49
- }),
50
- 'number.precision': eastingDigitsMessage,
51
- 'number.integer': eastingDigitsMessage,
52
- 'number.unsafe': eastingDigitsMessage
53
- });
54
- const northingValidationMessages = convertToLanguageMessages({
55
- 'any.required': tPlugin('components.eastingNorthingField.northingRequired', 'en-GB'),
56
- 'number.base': tPlugin('components.eastingNorthingField.northingRequired', 'en-GB'),
57
- 'number.min': tPlugin('components.eastingNorthingField.northingRange', 'en-GB', {
58
- fieldLabel,
59
- min: northingMin,
60
- max: northingMax
61
- }),
62
- 'number.max': tPlugin('components.eastingNorthingField.northingRange', 'en-GB', {
63
- fieldLabel,
64
- min: northingMin,
65
- max: northingMax
66
- }),
67
- 'number.precision': northingDigitsMessage,
68
- 'number.integer': northingDigitsMessage,
69
- 'number.unsafe': northingDigitsMessage
70
- });
24
+ const {
25
+ eastingMin,
26
+ eastingMax,
27
+ northingMin,
28
+ northingMax
29
+ } = EastingNorthingField.getMinMax(schema);
30
+ const {
31
+ eastingValidationMessages,
32
+ northingValidationMessages
33
+ } = EastingNorthingField.buildErrorMessages(this.label, eastingMin, eastingMax, northingMin, northingMax, 'en-GB');
71
34
  this.collection = new ComponentCollection([{
72
35
  type: ComponentType.NumberField,
73
36
  name: `${name}__easting`,
@@ -81,7 +44,7 @@ export class EastingNorthingField extends FormComponent {
81
44
  required: isRequired,
82
45
  optionalText: true,
83
46
  classes: 'govuk-input--width-10',
84
- customValidationMessages
47
+ customValidationMessages: eastingValidationMessages
85
48
  }
86
49
  }, {
87
50
  type: ComponentType.NumberField,
@@ -112,13 +75,14 @@ export class EastingNorthingField extends FormComponent {
112
75
  const value = super.getFormValueFromState(state);
113
76
  return EastingNorthingField.isEastingNorthing(value) ? value : undefined;
114
77
  }
115
- getDisplayStringFromFormValue(value, _translator) {
78
+ getDisplayStringFromFormValue(value, translator) {
116
79
  if (!value) {
117
80
  return '';
118
81
  }
119
-
120
- // CYA page format: <<eastingvalue, northingvalue>>
121
- return `${value.easting}, ${value.northing}`;
82
+ const {
83
+ t
84
+ } = translator;
85
+ return `${t('components.eastingNorthingField.easting')}: ${value.easting}\n${t('components.eastingNorthingField.northing')}: ${value.northing}`;
122
86
  }
123
87
  getDisplayStringFromState(state, translator) {
124
88
  const value = this.getFormValueFromState(state);
@@ -128,7 +92,7 @@ export class EastingNorthingField extends FormComponent {
128
92
  if (!value) {
129
93
  return null;
130
94
  }
131
- return `Easting: ${value.easting}\nNorthing: ${value.northing}`;
95
+ return `${value.easting}, ${value.northing}`;
132
96
  }
133
97
  getContextValueFromState(state) {
134
98
  const value = this.getFormValueFromState(state);
@@ -145,6 +109,24 @@ export class EastingNorthingField extends FormComponent {
145
109
  isState(value) {
146
110
  return EastingNorthingField.isEastingNorthing(value);
147
111
  }
112
+ getValidationMessagesOverride(translator) {
113
+ const def = this.def;
114
+ const translatedLabel = getTranslatedLabel(def, translator);
115
+ const {
116
+ eastingMin,
117
+ eastingMax,
118
+ northingMin,
119
+ northingMax
120
+ } = EastingNorthingField.getMinMax(def.schema);
121
+ const {
122
+ eastingValidationMessages,
123
+ northingValidationMessages
124
+ } = EastingNorthingField.buildErrorMessages(translatedLabel, eastingMin, eastingMax, northingMin, northingMax, translator.language);
125
+ return {
126
+ [`${this.name}__easting`]: eastingValidationMessages,
127
+ [`${this.name}__northing`]: northingValidationMessages
128
+ };
129
+ }
148
130
 
149
131
  /**
150
132
  * For error preview page that shows all possible errors on a component
@@ -186,5 +168,62 @@ export class EastingNorthingField extends FormComponent {
186
168
  static isEastingNorthing(value) {
187
169
  return isFormState(value) && NumberField.isNumber(value.easting) && NumberField.isNumber(value.northing);
188
170
  }
171
+ static buildErrorMessages(label, eastingMin, eastingMax, northingMin, northingMax, language) {
172
+ const fieldLabel = lowerFirst(label);
173
+ const eastingDigitsMessage = tPlugin('components.eastingNorthingField.eastingDigits', language, {
174
+ fieldLabel
175
+ });
176
+ const northingDigitsMessage = tPlugin('components.eastingNorthingField.northingDigits', language, {
177
+ fieldLabel
178
+ });
179
+ const eastingValidationMessages = {
180
+ 'any.required': tPlugin('components.eastingNorthingField.eastingRequired', language),
181
+ 'number.base': tPlugin('components.eastingNorthingField.eastingRequired', language),
182
+ 'number.min': tPlugin('components.eastingNorthingField.eastingRange', language, {
183
+ fieldLabel,
184
+ min: eastingMin,
185
+ max: eastingMax
186
+ }),
187
+ 'number.max': tPlugin('components.eastingNorthingField.eastingRange', language, {
188
+ fieldLabel,
189
+ min: eastingMin,
190
+ max: eastingMax
191
+ }),
192
+ 'number.precision': eastingDigitsMessage,
193
+ 'number.integer': eastingDigitsMessage,
194
+ 'number.unsafe': eastingDigitsMessage
195
+ };
196
+ const northingValidationMessages = {
197
+ 'any.required': tPlugin('components.eastingNorthingField.northingRequired', language),
198
+ 'number.base': tPlugin('components.eastingNorthingField.northingRequired', language),
199
+ 'number.min': tPlugin('components.eastingNorthingField.northingRange', language, {
200
+ fieldLabel,
201
+ min: northingMin,
202
+ max: northingMax
203
+ }),
204
+ 'number.max': tPlugin('components.eastingNorthingField.northingRange', language, {
205
+ fieldLabel,
206
+ min: northingMin,
207
+ max: northingMax
208
+ }),
209
+ 'number.precision': northingDigitsMessage,
210
+ 'number.integer': northingDigitsMessage,
211
+ 'number.unsafe': northingDigitsMessage
212
+ };
213
+ return {
214
+ eastingValidationMessages,
215
+ northingValidationMessages
216
+ };
217
+ }
218
+
219
+ // Read schema values from def.schema with fallback defaults
220
+ static getMinMax(schema) {
221
+ return {
222
+ eastingMin: schema?.easting?.min ?? DEFAULT_EASTING_MIN,
223
+ eastingMax: schema?.easting?.max ?? DEFAULT_EASTING_MAX,
224
+ northingMin: schema?.northing?.min ?? DEFAULT_NORTHING_MIN,
225
+ northingMax: schema?.northing?.max ?? DEFAULT_NORTHING_MAX
226
+ };
227
+ }
189
228
  }
190
229
  //# sourceMappingURL=EastingNorthingField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EastingNorthingField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","createLowerFirstExpression","t","tPlugin","messageTemplate","convertToLanguageMessages","DEFAULT_EASTING_MIN","DEFAULT_EASTING_MAX","DEFAULT_NORTHING_MIN","DEFAULT_NORTHING_MAX","EastingNorthingField","constructor","def","props","name","options","schema","isRequired","required","eastingMin","easting","min","eastingMax","max","northingMin","northing","northingMax","fieldLabel","label","eastingDigitsMessage","northingDigitsMessage","customValidationMessages","northingValidationMessages","collection","type","title","precision","optionalText","classes","parent","peers","formSchema","stateSchema","getFormValueFromState","state","value","isEastingNorthing","undefined","getDisplayStringFromFormValue","_translator","getDisplayStringFromState","translator","getContextValueFromFormValue","getContextValueFromState","getViewModel","context","viewModel","getViewErrors","errors","allErrors","getErrors","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isNumber"],"sources":["../../../../../src/server/plugins/engine/components/EastingNorthingField.ts"],"sourcesContent":["import {\n ComponentType,\n type EastingNorthingFieldComponent\n} from '@defra/forms-model'\nimport { type LanguageMessages, type ObjectSchema } from 'joi'\nimport lowerFirst from 'lodash/lowerFirst.js'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n deduplicateErrorsByHref,\n getLocationFieldViewModel\n} from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n type EastingNorthingState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { convertToLanguageMessages } from '~/src/server/utils/type-utils.js'\n\n// British National Grid coordinate limits\nconst DEFAULT_EASTING_MIN = 0\nconst DEFAULT_EASTING_MAX = 700000\nconst DEFAULT_NORTHING_MIN = 0\nconst DEFAULT_NORTHING_MAX = 1300000\n\nexport class EastingNorthingField extends FormComponent {\n declare options: EastingNorthingFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: EastingNorthingFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options, schema } = def\n\n const isRequired = options.required !== false\n\n const eastingMin = schema?.easting?.min ?? DEFAULT_EASTING_MIN\n const eastingMax = schema?.easting?.max ?? DEFAULT_EASTING_MAX\n const northingMin = schema?.northing?.min ?? DEFAULT_NORTHING_MIN\n const northingMax = schema?.northing?.max ?? DEFAULT_NORTHING_MAX\n\n const fieldLabel = lowerFirst(this.label)\n\n const eastingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.eastingDigits',\n 'en-GB',\n { fieldLabel }\n )\n const northingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.northingDigits',\n 'en-GB',\n { fieldLabel }\n )\n\n const customValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'any.required': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n 'en-GB'\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n 'en-GB'\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n 'en-GB',\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n 'en-GB',\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.precision': eastingDigitsMessage,\n 'number.integer': eastingDigitsMessage,\n 'number.unsafe': eastingDigitsMessage\n })\n\n const northingValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'any.required': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n 'en-GB'\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n 'en-GB'\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.northingRange',\n 'en-GB',\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.northingRange',\n 'en-GB',\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.precision': northingDigitsMessage,\n 'number.integer': northingDigitsMessage,\n 'number.unsafe': northingDigitsMessage\n })\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__easting`,\n title: 'components.eastingNorthingField.easting',\n schema: {\n min: eastingMin,\n max: eastingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__northing`,\n title: 'components.eastingNorthingField.northing',\n schema: {\n min: northingMin,\n max: northingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: northingValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n peers: [`${name}__easting`, `${name}__northing`]\n }\n )\n\n this.options = options\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return EastingNorthingField.isEastingNorthing(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: EastingNorthingState | undefined,\n _translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n // CYA page format: <<eastingvalue, northingvalue>>\n return `${value.easting}, ${value.northing}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: EastingNorthingState | undefined\n ): string | null {\n if (!value) {\n return null\n }\n\n return `Easting: ${value.easting}\\nNorthing: ${value.northing}`\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n return getLocationFieldViewModel(this, viewModel, context)\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const allErrors = this.getErrors(translator, errors)\n return deduplicateErrorsByHref(allErrors)\n }\n\n isState(value?: FormStateValue | FormState) {\n return EastingNorthingField.isEastingNorthing(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EastingNorthingField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n {\n type: 'eastingFormat',\n template: createLowerFirstExpression(\n 'Easting for {{lowerFirst(#title)}} must be between 1 and 6 digits'\n )\n },\n {\n type: 'northingFormat',\n template: createLowerFirstExpression(\n 'Northing for {{lowerFirst(#title)}} must be between 1 and 7 digits'\n )\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'eastingMin',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'eastingMax',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'northingMin',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n },\n {\n type: 'northingMax',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n }\n ]\n }\n }\n\n static isEastingNorthing(\n value?: FormStateValue | FormState\n ): value is EastingNorthingState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.easting) &&\n NumberField.isNumber(value.northing)\n )\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"EastingNorthingField.js","names":["ComponentType","lowerFirst","ComponentCollection","FormComponent","isFormState","deduplicateErrorsByHref","getLocationFieldViewModel","NumberField","createLowerFirstExpression","getTranslatedLabel","t","tPlugin","messageTemplate","DEFAULT_EASTING_MIN","DEFAULT_EASTING_MAX","DEFAULT_NORTHING_MIN","DEFAULT_NORTHING_MAX","EastingNorthingField","constructor","def","props","name","options","schema","isRequired","required","eastingMin","eastingMax","northingMin","northingMax","getMinMax","eastingValidationMessages","northingValidationMessages","buildErrorMessages","label","collection","type","title","min","max","precision","optionalText","classes","customValidationMessages","parent","peers","formSchema","stateSchema","getFormValueFromState","state","value","isEastingNorthing","undefined","getDisplayStringFromFormValue","translator","easting","northing","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getViewModel","context","viewModel","getViewErrors","errors","allErrors","getErrors","isState","getValidationMessagesOverride","translatedLabel","language","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","isNumber","fieldLabel","eastingDigitsMessage","northingDigitsMessage"],"sources":["../../../../../src/server/plugins/engine/components/EastingNorthingField.ts"],"sourcesContent":["import {\n ComponentType,\n type EastingNorthingFieldComponent\n} from '@defra/forms-model'\nimport { type LanguageMessages, type ObjectSchema } from 'joi'\nimport lowerFirst from 'lodash/lowerFirst.js'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n deduplicateErrorsByHref,\n getLocationFieldViewModel\n} from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport {\n createLowerFirstExpression,\n getTranslatedLabel\n} from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n type EastingNorthingState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { t as tPlugin } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormPayload,\n type FormState,\n type FormStateValue,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\n// British National Grid coordinate limits\nconst DEFAULT_EASTING_MIN = 0\nconst DEFAULT_EASTING_MAX = 700000\nconst DEFAULT_NORTHING_MIN = 0\nconst DEFAULT_NORTHING_MAX = 1300000\n\nexport class EastingNorthingField extends FormComponent {\n declare options: EastingNorthingFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: EastingNorthingFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options, schema } = def\n\n const isRequired = options.required !== false\n\n const { eastingMin, eastingMax, northingMin, northingMax } =\n EastingNorthingField.getMinMax(schema)\n\n const { eastingValidationMessages, northingValidationMessages } =\n EastingNorthingField.buildErrorMessages(\n this.label,\n eastingMin,\n eastingMax,\n northingMin,\n northingMax,\n 'en-GB'\n )\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__easting`,\n title: 'components.eastingNorthingField.easting',\n schema: {\n min: eastingMin,\n max: eastingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: eastingValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__northing`,\n title: 'components.eastingNorthingField.northing',\n schema: {\n min: northingMin,\n max: northingMax,\n precision: 0\n },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-10',\n customValidationMessages: northingValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n peers: [`${name}__easting`, `${name}__northing`]\n }\n )\n\n this.options = options\n this.formSchema = this.collection.formSchema\n this.stateSchema = this.collection.stateSchema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const value = super.getFormValueFromState(state)\n return EastingNorthingField.isEastingNorthing(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: EastingNorthingState | undefined,\n translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const { t } = translator\n\n return `${t('components.eastingNorthingField.easting')}: ${value.easting}\\n${t('components.eastingNorthingField.northing')}: ${value.northing}`\n }\n\n getDisplayStringFromState(\n state: FormSubmissionState,\n translator: Translator\n ) {\n const value = this.getFormValueFromState(state)\n\n return this.getDisplayStringFromFormValue(value, translator)\n }\n\n getContextValueFromFormValue(\n value: EastingNorthingState | undefined\n ): string | null {\n if (!value) {\n return null\n }\n\n return `${value.easting}, ${value.northing}`\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n return getLocationFieldViewModel(this, viewModel, context)\n }\n\n getViewErrors(\n translator: Translator,\n errors?: FormSubmissionError[]\n ): FormSubmissionError[] | undefined {\n const allErrors = this.getErrors(translator, errors)\n return deduplicateErrorsByHref(allErrors)\n }\n\n isState(value?: FormStateValue | FormState) {\n return EastingNorthingField.isEastingNorthing(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const def = this.def as EastingNorthingFieldComponent\n const translatedLabel = getTranslatedLabel(def, translator)\n const { eastingMin, eastingMax, northingMin, northingMax } =\n EastingNorthingField.getMinMax(def.schema)\n const { eastingValidationMessages, northingValidationMessages } =\n EastingNorthingField.buildErrorMessages(\n translatedLabel,\n eastingMin,\n eastingMax,\n northingMin,\n northingMax,\n translator.language\n )\n return {\n [`${this.name}__easting`]: eastingValidationMessages,\n [`${this.name}__northing`]: northingValidationMessages\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EastingNorthingField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n {\n type: 'eastingFormat',\n template: createLowerFirstExpression(\n 'Easting for {{lowerFirst(#title)}} must be between 1 and 6 digits'\n )\n },\n {\n type: 'northingFormat',\n template: createLowerFirstExpression(\n 'Northing for {{lowerFirst(#title)}} must be between 1 and 7 digits'\n )\n }\n ],\n advancedSettingsErrors: [\n {\n type: 'eastingMin',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'eastingMax',\n template: createLowerFirstExpression(\n `Easting for {{lowerFirst(#title)}} must be between ${DEFAULT_EASTING_MIN} and ${DEFAULT_EASTING_MAX}`\n )\n },\n {\n type: 'northingMin',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n },\n {\n type: 'northingMax',\n template: createLowerFirstExpression(\n `Northing for {{lowerFirst(#title)}} must be between ${DEFAULT_NORTHING_MIN} and ${DEFAULT_NORTHING_MAX}`\n )\n }\n ]\n }\n }\n\n static isEastingNorthing(\n value?: FormStateValue | FormState\n ): value is EastingNorthingState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.easting) &&\n NumberField.isNumber(value.northing)\n )\n }\n\n static buildErrorMessages(\n label: string,\n eastingMin: number,\n eastingMax: number,\n northingMin: number,\n northingMax: number,\n language: string\n ) {\n const fieldLabel = lowerFirst(label)\n\n const eastingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.eastingDigits',\n language,\n { fieldLabel }\n )\n const northingDigitsMessage = tPlugin(\n 'components.eastingNorthingField.northingDigits',\n language,\n { fieldLabel }\n )\n\n const eastingValidationMessages: LanguageMessages = {\n 'any.required': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.eastingRequired',\n language\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n language,\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.eastingRange',\n language,\n {\n fieldLabel,\n min: eastingMin,\n max: eastingMax\n }\n ),\n 'number.precision': eastingDigitsMessage,\n 'number.integer': eastingDigitsMessage,\n 'number.unsafe': eastingDigitsMessage\n }\n\n const northingValidationMessages: LanguageMessages = {\n 'any.required': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n language\n ),\n 'number.base': tPlugin(\n 'components.eastingNorthingField.northingRequired',\n language\n ),\n 'number.min': tPlugin(\n 'components.eastingNorthingField.northingRange',\n language,\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.max': tPlugin(\n 'components.eastingNorthingField.northingRange',\n language,\n {\n fieldLabel,\n min: northingMin,\n max: northingMax\n }\n ),\n 'number.precision': northingDigitsMessage,\n 'number.integer': northingDigitsMessage,\n 'number.unsafe': northingDigitsMessage\n }\n return {\n eastingValidationMessages,\n northingValidationMessages\n }\n }\n\n // Read schema values from def.schema with fallback defaults\n static getMinMax(\n schema:\n | {\n easting?: {\n min?: number\n max?: number\n }\n northing?: {\n min?: number\n max?: number\n }\n }\n | undefined\n ) {\n return {\n eastingMin: schema?.easting?.min ?? DEFAULT_EASTING_MIN,\n eastingMax: schema?.easting?.max ?? DEFAULT_EASTING_MAX,\n northingMin: schema?.northing?.min ?? DEFAULT_NORTHING_MIN,\n northingMax: schema?.northing?.max ?? DEFAULT_NORTHING_MAX\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -30,7 +30,9 @@ export declare class EmailAddressField extends FormComponent {
30
30
  attributes: {
31
31
  autocomplete?: string;
32
32
  maxlength?: number;
33
- multiple?: string;
33
+ multiple? /**
34
+ * Static version of getAllPossibleErrors that doesn't require a component instance.
35
+ */: string;
34
36
  accept?: string;
35
37
  inputmode?: string;
36
38
  };
@@ -52,6 +54,7 @@ export declare class EmailAddressField extends FormComponent {
52
54
  upload?: {
53
55
  count: number;
54
56
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
57
+ uploadingLabel?: string;
55
58
  };
56
59
  };
57
60
  /**
@@ -17,7 +17,8 @@ export class EmailAddressField extends FormComponent {
17
17
  formSchema = formSchema.messages({
18
18
  'any.required': message,
19
19
  'string.empty': message,
20
- 'string.email': message
20
+ 'string.email': message,
21
+ 'string.unicode': message
21
22
  });
22
23
  } else if (options.customValidationMessages) {
23
24
  formSchema = formSchema.messages(options.customValidationMessages);
@@ -1 +1 @@
1
- {"version":3,"file":"EmailAddressField.js","names":["preventUnicodeInEmail","joi","FormComponent","messageTemplate","EmailAddressField","constructor","def","props","options","formSchema","string","trim","email","custom","value","helpers","label","required","allow","customValidationMessage","message","messages","customValidationMessages","default","stateSchema","getViewModel","context","viewModel","attributes","autocomplete","type","getAllPossibleErrors","baseErrors","template","format","unicode","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/EmailAddressField.ts"],"sourcesContent":["import {\n preventUnicodeInEmail,\n type EmailAddressFieldComponent\n} from '@defra/forms-model'\nimport joi, { type CustomHelpers } from 'joi'\n\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class EmailAddressField extends FormComponent {\n declare options: EmailAddressFieldComponent['options']\n\n constructor(\n def: EmailAddressFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options } = def\n\n let formSchema = joi\n .string()\n .trim()\n .email()\n .custom((value, helpers: CustomHelpers<string>) =>\n preventUnicodeInEmail(value, helpers)\n )\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'string.empty': message,\n 'string.email': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n const { attributes } = viewModel\n\n attributes.autocomplete = 'email'\n\n return {\n ...viewModel,\n type: 'email'\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EmailAddressField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n { type: 'format', template: messageTemplate.format },\n { type: 'unicode', template: messageTemplate.unicode }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAAA,SACEA,qBAAqB,QAEhB,oBAAoB;AAC3B,OAAOC,GAAG,MAA8B,KAAK;AAE7C,SAASC,aAAa;AAEtB,SAASC,eAAe;AAGxB,OAAO,MAAMC,iBAAiB,SAASF,aAAa,CAAC;EAGnDG,WAAWA,CACTC,GAA+B,EAC/BC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC;IAAQ,CAAC,GAAGF,GAAG;IAEvB,IAAIG,UAAU,GAAGR,GAAG,CACjBS,MAAM,CAAC,CAAC,CACRC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,CAAC,CACPC,MAAM,CAAC,CAACC,KAAK,EAAEC,OAA8B,KAC5Cf,qBAAqB,CAACc,KAAK,EAAEC,OAAO,CACtC,CAAC,CACAC,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC,CACjBC,QAAQ,CAAC,CAAC;IAEb,IAAIT,OAAO,CAACS,QAAQ,KAAK,KAAK,EAAE;MAC9BR,UAAU,GAAGA,UAAU,CAACS,KAAK,CAAC,EAAE,CAAC;IACnC;IAEA,IAAIV,OAAO,CAACW,uBAAuB,EAAE;MACnC,MAAMC,OAAO,GAAGZ,OAAO,CAACW,uBAAuB;MAE/CV,UAAU,GAAGA,UAAU,CAACY,QAAQ,CAAC;QAC/B,cAAc,EAAED,OAAO;QACvB,cAAc,EAAEA,OAAO;QACvB,cAAc,EAAEA;MAClB,CAAC,CAAC;IACJ,CAAC,MAAM,IAAIZ,OAAO,CAACc,wBAAwB,EAAE;MAC3Cb,UAAU,GAAGA,UAAU,CAACY,QAAQ,CAACb,OAAO,CAACc,wBAAwB,CAAC;IACpE;IAEA,IAAI,CAACb,UAAU,GAAGA,UAAU,CAACc,OAAO,CAAC,EAAE,CAAC;IACxC,IAAI,CAACC,WAAW,GAAGf,UAAU,CAACc,OAAO,CAAC,IAAI,CAAC,CAACL,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,CAACV,OAAO,GAAGA,OAAO;EACxB;EAEAiB,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAMC,SAAS,GAAG,KAAK,CAACF,YAAY,CAACC,OAAO,CAAC;IAC7C,MAAM;MAAEE;IAAW,CAAC,GAAGD,SAAS;IAEhCC,UAAU,CAACC,YAAY,GAAG,OAAO;IAEjC,OAAO;MACL,GAAGF,SAAS;MACZG,IAAI,EAAE;IACR,CAAC;EACH;;EAEA;AACF;AACA;EACEC,oBAAoBA,CAAA,EAA6B;IAC/C,OAAO3B,iBAAiB,CAAC2B,oBAAoB,CAAC,CAAC;EACjD;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QAAEF,IAAI,EAAE,UAAU;QAAEG,QAAQ,EAAE9B,eAAe,CAACc;MAAS,CAAC,EACxD;QAAEa,IAAI,EAAE,QAAQ;QAAEG,QAAQ,EAAE9B,eAAe,CAAC+B;MAAO,CAAC,EACpD;QAAEJ,IAAI,EAAE,SAAS;QAAEG,QAAQ,EAAE9B,eAAe,CAACgC;MAAQ,CAAC,CACvD;MACDC,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"EmailAddressField.js","names":["preventUnicodeInEmail","joi","FormComponent","messageTemplate","EmailAddressField","constructor","def","props","options","formSchema","string","trim","email","custom","value","helpers","label","required","allow","customValidationMessage","message","messages","customValidationMessages","default","stateSchema","getViewModel","context","viewModel","attributes","autocomplete","type","getAllPossibleErrors","baseErrors","template","format","unicode","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/EmailAddressField.ts"],"sourcesContent":["import {\n preventUnicodeInEmail,\n type EmailAddressFieldComponent\n} from '@defra/forms-model'\nimport joi, { type CustomHelpers } from 'joi'\n\nimport { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { type RenderContext } from '~/src/server/plugins/engine/components/types.js'\nimport { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class EmailAddressField extends FormComponent {\n declare options: EmailAddressFieldComponent['options']\n\n constructor(\n def: EmailAddressFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options } = def\n\n let formSchema = joi\n .string()\n .trim()\n .email()\n .custom((value, helpers: CustomHelpers<string>) =>\n preventUnicodeInEmail(value, helpers)\n )\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'string.empty': message,\n 'string.email': message,\n 'string.unicode': message\n })\n } else if (options.customValidationMessages) {\n formSchema = formSchema.messages(options.customValidationMessages)\n }\n\n this.formSchema = formSchema.default('')\n this.stateSchema = formSchema.default(null).allow(null)\n this.options = options\n }\n\n getViewModel(context: RenderContext) {\n const viewModel = super.getViewModel(context)\n const { attributes } = viewModel\n\n attributes.autocomplete = 'email'\n\n return {\n ...viewModel,\n type: 'email'\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return EmailAddressField.getAllPossibleErrors()\n }\n\n /**\n * Static version of getAllPossibleErrors that doesn't require a component instance.\n */\n static getAllPossibleErrors(): ErrorMessageTemplateList {\n return {\n baseErrors: [\n { type: 'required', template: messageTemplate.required },\n { type: 'format', template: messageTemplate.format },\n { type: 'unicode', template: messageTemplate.unicode }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAAA,SACEA,qBAAqB,QAEhB,oBAAoB;AAC3B,OAAOC,GAAG,MAA8B,KAAK;AAE7C,SAASC,aAAa;AAEtB,SAASC,eAAe;AAGxB,OAAO,MAAMC,iBAAiB,SAASF,aAAa,CAAC;EAGnDG,WAAWA,CACTC,GAA+B,EAC/BC,KAAqD,EACrD;IACA,KAAK,CAACD,GAAG,EAAEC,KAAK,CAAC;IAEjB,MAAM;MAAEC;IAAQ,CAAC,GAAGF,GAAG;IAEvB,IAAIG,UAAU,GAAGR,GAAG,CACjBS,MAAM,CAAC,CAAC,CACRC,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,CAAC,CACPC,MAAM,CAAC,CAACC,KAAK,EAAEC,OAA8B,KAC5Cf,qBAAqB,CAACc,KAAK,EAAEC,OAAO,CACtC,CAAC,CACAC,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC,CACjBC,QAAQ,CAAC,CAAC;IAEb,IAAIT,OAAO,CAACS,QAAQ,KAAK,KAAK,EAAE;MAC9BR,UAAU,GAAGA,UAAU,CAACS,KAAK,CAAC,EAAE,CAAC;IACnC;IAEA,IAAIV,OAAO,CAACW,uBAAuB,EAAE;MACnC,MAAMC,OAAO,GAAGZ,OAAO,CAACW,uBAAuB;MAE/CV,UAAU,GAAGA,UAAU,CAACY,QAAQ,CAAC;QAC/B,cAAc,EAAED,OAAO;QACvB,cAAc,EAAEA,OAAO;QACvB,cAAc,EAAEA,OAAO;QACvB,gBAAgB,EAAEA;MACpB,CAAC,CAAC;IACJ,CAAC,MAAM,IAAIZ,OAAO,CAACc,wBAAwB,EAAE;MAC3Cb,UAAU,GAAGA,UAAU,CAACY,QAAQ,CAACb,OAAO,CAACc,wBAAwB,CAAC;IACpE;IAEA,IAAI,CAACb,UAAU,GAAGA,UAAU,CAACc,OAAO,CAAC,EAAE,CAAC;IACxC,IAAI,CAACC,WAAW,GAAGf,UAAU,CAACc,OAAO,CAAC,IAAI,CAAC,CAACL,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,CAACV,OAAO,GAAGA,OAAO;EACxB;EAEAiB,YAAYA,CAACC,OAAsB,EAAE;IACnC,MAAMC,SAAS,GAAG,KAAK,CAACF,YAAY,CAACC,OAAO,CAAC;IAC7C,MAAM;MAAEE;IAAW,CAAC,GAAGD,SAAS;IAEhCC,UAAU,CAACC,YAAY,GAAG,OAAO;IAEjC,OAAO;MACL,GAAGF,SAAS;MACZG,IAAI,EAAE;IACR,CAAC;EACH;;EAEA;AACF;AACA;EACEC,oBAAoBA,CAAA,EAA6B;IAC/C,OAAO3B,iBAAiB,CAAC2B,oBAAoB,CAAC,CAAC;EACjD;;EAEA;AACF;AACA;EACE,OAAOA,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QAAEF,IAAI,EAAE,UAAU;QAAEG,QAAQ,EAAE9B,eAAe,CAACc;MAAS,CAAC,EACxD;QAAEa,IAAI,EAAE,QAAQ;QAAEG,QAAQ,EAAE9B,eAAe,CAAC+B;MAAO,CAAC,EACpD;QAAEJ,IAAI,EAAE,SAAS;QAAEG,QAAQ,EAAE9B,eAAe,CAACgC;MAAQ,CAAC,CACvD;MACDC,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
@@ -78,6 +78,13 @@ export declare class FileUploadField extends FormComponent {
78
78
  components?: import("../../../../server/plugins/engine/components/types.js").ComponentViewModel[];
79
79
  };
80
80
  isValue(value?: FormStateValue | FormState): value is UploadState;
81
+ getValidationMessagesOverride(translator: Translator): {
82
+ [x: string]: {
83
+ 'array.min': string;
84
+ 'array.max': string;
85
+ 'array.length': string;
86
+ };
87
+ };
81
88
  /**
82
89
  * For error preview page that shows all possible errors on a component
83
90
  */
@@ -87,4 +94,9 @@ export declare class FileUploadField extends FormComponent {
87
94
  * Static version of getAllPossibleErrors that doesn't require a component instance.
88
95
  */
89
96
  static getAllPossibleErrors(): ErrorMessageTemplateList;
97
+ static buildErrorMessages(language: string): {
98
+ 'array.min': string;
99
+ 'array.max': string;
100
+ 'array.length': string;
101
+ };
90
102
  }
@@ -1,6 +1,8 @@
1
1
  import Boom from '@hapi/boom';
2
2
  import joi from 'joi';
3
+ import { EN_GB } from "../../../constants.js";
3
4
  import { FormComponent, isUploadState } from "./FormComponent.js";
5
+ import { t as tPlugin } from "../i18n/index.js";
4
6
  import { InvalidComponentStateError } from "../pageControllers/errors.js";
5
7
  import { messageTemplate } from "../pageControllers/validationOptions.js";
6
8
  import { FileStatus, UploadStatus } from "../types.js";
@@ -70,6 +72,7 @@ export class FileUploadField extends FormComponent {
70
72
  } else {
71
73
  formSchema = formSchema.length(schema.length);
72
74
  }
75
+ formSchema = formSchema.messages(FileUploadField.buildErrorMessages(EN_GB));
73
76
  this.formSchema = formSchema.items(formItemSchema);
74
77
  this.stateSchema = formSchema.items(formItemSchema).default(null).allow(null);
75
78
  this.options = options;
@@ -88,7 +91,7 @@ export class FileUploadField extends FormComponent {
88
91
  if (!files?.length) {
89
92
  return '';
90
93
  }
91
- return translator.t('components.fileUploadField.filesCount', {
94
+ return translator.t('pages.summary.fileUpload', {
92
95
  count: files.length
93
96
  });
94
97
  }
@@ -164,7 +167,7 @@ export class FileUploadField extends FormComponent {
164
167
  const href = page?.getHref(`${page.path}${path}`) ?? '#';
165
168
  items.push({
166
169
  href,
167
- text: 'Remove',
170
+ text: t('pages.fileUpload.remove'),
168
171
  classes: 'govuk-link--no-visited-state',
169
172
  attributes: {
170
173
  id: `${id}__${index}`
@@ -215,6 +218,14 @@ export class FileUploadField extends FormComponent {
215
218
  isValue(value) {
216
219
  return isUploadState(value);
217
220
  }
221
+ getValidationMessagesOverride(translator) {
222
+ const {
223
+ language
224
+ } = translator;
225
+ return {
226
+ [this.name]: FileUploadField.buildErrorMessages(language)
227
+ };
228
+ }
218
229
 
219
230
  /**
220
231
  * For error preview page that shows all possible errors on a component
@@ -304,5 +315,12 @@ export class FileUploadField extends FormComponent {
304
315
  }]
305
316
  };
306
317
  }
318
+ static buildErrorMessages(language) {
319
+ return {
320
+ 'array.min': tPlugin('validation.filesMin', language),
321
+ 'array.max': tPlugin('validation.filesMax', language),
322
+ 'array.length': tPlugin('validation.filesLength', language)
323
+ };
324
+ }
307
325
  }
308
326
  //# sourceMappingURL=FileUploadField.js.map