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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/.public/javascripts/application.min.js +1 -1
  2. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  3. package/.public/javascripts/application.min.js.map +1 -1
  4. package/.public/javascripts/shared.min.js +1 -1
  5. package/.public/javascripts/shared.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/shared.min.js.map +1 -1
  7. package/.public/stylesheets/application.min.css.map +1 -1
  8. package/.server/client/javascripts/file-upload.js +6 -3
  9. package/.server/client/javascripts/file-upload.js.map +1 -1
  10. package/.server/client/javascripts/geospatial-map.js +10 -31
  11. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  12. package/.server/client/javascripts/govuk.js +2 -1
  13. package/.server/client/javascripts/govuk.js.map +1 -1
  14. package/.server/client/javascripts/location-map.js +11 -2
  15. package/.server/client/javascripts/location-map.js.map +1 -1
  16. package/.server/client/javascripts/map.d.ts +6 -0
  17. package/.server/client/javascripts/map.js +37 -0
  18. package/.server/client/javascripts/map.js.map +1 -1
  19. package/.server/client/javascripts/maps.d.ts +5 -0
  20. package/.server/client/javascripts/maps.js +6 -0
  21. package/.server/client/javascripts/maps.js.map +1 -0
  22. package/.server/client/javascripts/shared.d.ts +1 -3
  23. package/.server/client/javascripts/shared.js +1 -3
  24. package/.server/client/javascripts/shared.js.map +1 -1
  25. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  26. package/.server/client/javascripts/sssi-dataset.js +37 -39
  27. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  28. package/.server/client/stylesheets/maps.scss +4 -0
  29. package/.server/client/stylesheets/shared.scss +1 -5
  30. package/.server/server/constants.d.ts +2 -0
  31. package/.server/server/constants.js +2 -0
  32. package/.server/server/constants.js.map +1 -1
  33. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +9 -3
  34. package/.server/server/plugins/engine/components/AutocompleteField.js +12 -0
  35. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  36. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +4 -1
  37. package/.server/server/plugins/engine/components/CheckboxesField.js +13 -0
  38. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  39. package/.server/server/plugins/engine/components/ComponentBase.d.ts +1 -0
  40. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  41. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  42. package/.server/server/plugins/engine/components/ComponentCollection.js +11 -6
  43. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  44. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  45. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  46. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  47. package/.server/server/plugins/engine/components/DeclarationField.d.ts +5 -2
  48. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  49. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  50. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  51. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +29 -2
  52. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  53. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  54. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  55. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  56. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/FileUploadField.d.ts +12 -0
  58. package/.server/server/plugins/engine/components/FileUploadField.js +23 -3
  59. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  61. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  62. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  63. package/.server/server/plugins/engine/components/GeospatialField.d.ts +1 -0
  64. package/.server/server/plugins/engine/components/GeospatialField.js +1 -1
  65. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  66. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  67. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  68. package/.server/server/plugins/engine/components/LatLongField.d.ts +28 -2
  69. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  70. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  71. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  72. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +1 -0
  73. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  74. package/.server/server/plugins/engine/components/LocationFieldBase.js +18 -5
  75. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  76. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +8 -3
  77. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +13 -12
  78. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  79. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  80. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  81. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  82. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  83. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  84. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  85. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  86. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  87. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  88. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  89. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  90. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  91. package/.server/server/plugins/engine/components/NumberField.js +16 -0
  92. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  93. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
  94. package/.server/server/plugins/engine/components/OsGridRefField.js +4 -3
  95. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  96. package/.server/server/plugins/engine/components/PaymentField.d.ts +3 -0
  97. package/.server/server/plugins/engine/components/PaymentField.js +17 -6
  98. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  99. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  100. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  101. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  103. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  104. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  105. package/.server/server/plugins/engine/components/YesNoField.d.ts +5 -2
  106. package/.server/server/plugins/engine/components/YesNoField.js +17 -8
  107. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  108. package/.server/server/plugins/engine/components/helpers/components.js +1 -2
  109. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  110. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +3 -1
  111. package/.server/server/plugins/engine/components/helpers/geospatial.js +32 -0
  112. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  113. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  114. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  115. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  116. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  117. package/.server/server/plugins/engine/components/types.js.map +1 -1
  118. package/.server/server/plugins/engine/helpers.d.ts +22 -2
  119. package/.server/server/plugins/engine/helpers.js +44 -5
  120. package/.server/server/plugins/engine/helpers.js.map +1 -1
  121. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +3 -0
  122. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +10 -7
  123. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  124. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  125. package/.server/server/plugins/engine/i18n/createFormTranslator.js +33 -4
  126. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  127. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  128. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  129. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  130. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  131. package/.server/server/plugins/engine/i18n/form.js +35 -0
  132. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  133. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  134. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  135. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  136. package/.server/server/plugins/engine/i18n/translations/cy.json +85 -8
  137. package/.server/server/plugins/engine/i18n/translations/en-GB.json +55 -6
  138. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  139. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  140. package/.server/server/plugins/engine/index.d.ts +4 -0
  141. package/.server/server/plugins/engine/index.js +4 -0
  142. package/.server/server/plugins/engine/index.js.map +1 -1
  143. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  144. package/.server/server/plugins/engine/models/FormModel.js +9 -15
  145. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  146. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  147. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  148. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +3 -5
  149. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  150. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  151. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  152. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  153. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  154. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  155. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  156. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  157. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  158. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  159. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +7 -3
  160. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  161. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  162. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  163. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  164. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  165. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  166. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
  167. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  168. package/.server/server/plugins/engine/pageControllers/validationOptions.js +23 -2
  169. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  170. package/.server/server/plugins/engine/types/schema.js +1 -0
  171. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  172. package/.server/server/plugins/engine/types.d.ts +5 -0
  173. package/.server/server/plugins/engine/types.js.map +1 -1
  174. package/.server/server/plugins/engine/views/components/_location-field-base.html +2 -1
  175. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  176. package/.server/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  177. package/.server/server/plugins/engine/views/components/paymentfield.html +1 -1
  178. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  179. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  180. package/.server/server/plugins/engine/views/partials/preview-banner.html +3 -1
  181. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  182. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  183. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  184. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  185. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  186. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  187. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  188. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  189. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  190. package/.server/server/plugins/payment/helper.d.ts +11 -1
  191. package/.server/server/plugins/payment/helper.js +18 -2
  192. package/.server/server/plugins/payment/helper.js.map +1 -1
  193. package/.server/server/plugins/payment/helper.test.js +2 -1
  194. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  195. package/.server/server/plugins/payment/service.d.ts +2 -1
  196. package/.server/server/plugins/payment/service.js +5 -2
  197. package/.server/server/plugins/payment/service.js.map +1 -1
  198. package/.server/server/plugins/payment/service.test.js +7 -3
  199. package/.server/server/plugins/payment/service.test.js.map +1 -1
  200. package/.server/server/plugins/payment/types.d.ts +4 -0
  201. package/.server/server/plugins/payment/types.js +1 -0
  202. package/.server/server/plugins/payment/types.js.map +1 -1
  203. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  204. package/.server/server/plugins/postcode-lookup/models/index.js +87 -33
  205. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  206. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  207. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  208. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  209. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  210. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  211. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  212. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  213. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  214. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  215. package/.server/server/utils/type-utils.d.ts +1 -2
  216. package/.server/server/utils/type-utils.js +0 -3
  217. package/.server/server/utils/type-utils.js.map +1 -1
  218. package/.server/server/utils/utils.d.ts +6 -0
  219. package/.server/server/utils/utils.js +18 -1
  220. package/.server/server/utils/utils.js.map +1 -1
  221. package/.server/server/utils/utils.test.js +21 -1
  222. package/.server/server/utils/utils.test.js.map +1 -1
  223. package/package.json +9 -2
  224. package/src/client/javascripts/file-upload.js +11 -3
  225. package/src/client/javascripts/geospatial-map.js +7 -34
  226. package/src/client/javascripts/govuk.js +2 -0
  227. package/src/client/javascripts/location-map.js +9 -1
  228. package/src/client/javascripts/map.js +42 -0
  229. package/src/client/javascripts/maps.js +5 -0
  230. package/src/client/javascripts/shared.js +1 -3
  231. package/src/client/javascripts/sssi-dataset.js +39 -41
  232. package/src/client/stylesheets/maps.scss +4 -0
  233. package/src/client/stylesheets/shared.scss +1 -5
  234. package/src/server/constants.js +2 -0
  235. package/src/server/plugins/engine/components/AutocompleteField.ts +13 -0
  236. package/src/server/plugins/engine/components/CheckboxesField.ts +13 -1
  237. package/src/server/plugins/engine/components/ComponentBase.ts +2 -0
  238. package/src/server/plugins/engine/components/ComponentCollection.ts +16 -11
  239. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  240. package/src/server/plugins/engine/components/DeclarationField.ts +7 -6
  241. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  242. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  243. package/src/server/plugins/engine/components/FileUploadField.ts +24 -3
  244. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  245. package/src/server/plugins/engine/components/GeospatialField.ts +6 -1
  246. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  247. package/src/server/plugins/engine/components/LocationFieldBase.ts +23 -6
  248. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +20 -13
  249. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  250. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  251. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  252. package/src/server/plugins/engine/components/NumberField.ts +21 -1
  253. package/src/server/plugins/engine/components/OsGridRefField.ts +9 -3
  254. package/src/server/plugins/engine/components/PaymentField.ts +15 -5
  255. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  256. package/src/server/plugins/engine/components/YesNoField.ts +17 -9
  257. package/src/server/plugins/engine/components/helpers/components.ts +1 -2
  258. package/src/server/plugins/engine/components/helpers/geospatial.ts +53 -0
  259. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  260. package/src/server/plugins/engine/components/types.ts +1 -0
  261. package/src/server/plugins/engine/helpers.ts +52 -5
  262. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +10 -7
  263. package/src/server/plugins/engine/i18n/createFormTranslator.ts +62 -11
  264. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  265. package/src/server/plugins/engine/i18n/form.ts +54 -0
  266. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  267. package/src/server/plugins/engine/i18n/translations/cy.json +85 -8
  268. package/src/server/plugins/engine/i18n/translations/en-GB.json +55 -6
  269. package/src/server/plugins/engine/i18n/types.ts +2 -0
  270. package/src/server/plugins/engine/index.ts +7 -0
  271. package/src/server/plugins/engine/models/FormModel.ts +9 -15
  272. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  273. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +3 -6
  274. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  275. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  276. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  277. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +10 -5
  278. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  279. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  280. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
  281. package/src/server/plugins/engine/pageControllers/validationOptions.ts +27 -2
  282. package/src/server/plugins/engine/types/schema.ts +1 -0
  283. package/src/server/plugins/engine/types.ts +5 -0
  284. package/src/server/plugins/engine/views/components/_location-field-base.html +2 -1
  285. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  286. package/src/server/plugins/engine/views/components/multilinetextfield.html +12 -1
  287. package/src/server/plugins/engine/views/components/paymentfield.html +1 -1
  288. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  289. package/src/server/plugins/engine/views/file-upload.html +1 -1
  290. package/src/server/plugins/engine/views/partials/preview-banner.html +3 -1
  291. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  292. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  293. package/src/server/plugins/payment/helper.js +22 -2
  294. package/src/server/plugins/payment/service.js +6 -2
  295. package/src/server/plugins/payment/types.js +1 -0
  296. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  297. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  298. package/src/server/plugins/postcode-lookup/types.js +6 -1
  299. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  300. package/src/server/utils/type-utils.ts +1 -11
  301. package/src/server/utils/utils.js +19 -1
@@ -12,11 +12,13 @@ export declare class MonthYearField extends FormComponent {
12
12
  collection: ComponentCollection;
13
13
  constructor(def: MonthYearFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
14
14
  getFormValueFromState(state: FormSubmissionState): MonthYearState | undefined;
15
- getDisplayStringFromFormValue(value: MonthYearState | undefined, _translator: Translator): string;
15
+ getDisplayStringFromFormValue(value: MonthYearState | undefined, translator: Translator): string;
16
16
  getDisplayStringFromState(state: FormSubmissionState, translator: Translator): string;
17
17
  getContextValueFromFormValue(value: MonthYearState | undefined): string | null;
18
18
  getContextValueFromState(state: FormSubmissionState): string | null;
19
- getValidationMessagesOverride(translator: Translator): LanguageMessages;
19
+ getValidationMessagesOverride(translator: Translator): {
20
+ [x: string]: LanguageMessages;
21
+ };
20
22
  getViewModel(context: RenderContext): {
21
23
  fieldset: {
22
24
  attributes?: string | Record<string, string>;
@@ -64,6 +66,7 @@ export declare class MonthYearField extends FormComponent {
64
66
  upload?: {
65
67
  count: number;
66
68
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
69
+ uploadingLabel?: string;
67
70
  };
68
71
  };
69
72
  isState(value?: FormStateValue | FormState): value is MonthYearState;
@@ -6,7 +6,7 @@ import { NumberField } from "./NumberField.js";
6
6
  import { parseStrictDate } from "../date-helper.js";
7
7
  import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
8
8
  import { messageTemplate } from "../pageControllers/validationOptions.js";
9
- import { convertToLanguageMessages } from "../../../utils/type-utils.js";
9
+ import { formatDateForLanguage } from "../../payment/helper.js";
10
10
  export class MonthYearField extends FormComponent {
11
11
  constructor(def, props) {
12
12
  super(def, props);
@@ -15,7 +15,7 @@ export class MonthYearField extends FormComponent {
15
15
  options
16
16
  } = def;
17
17
  const isRequired = options.required !== false;
18
- const customValidationMessages = convertToLanguageMessages({
18
+ const customValidationMessages = {
19
19
  'any.required': messageTemplate.objectMissing,
20
20
  'number.base': messageTemplate.objectMissing,
21
21
  'number.precision': messageTemplate.dateFormat,
@@ -23,7 +23,7 @@ export class MonthYearField extends FormComponent {
23
23
  'number.unsafe': messageTemplate.dateFormat,
24
24
  'number.min': messageTemplate.dateFormat,
25
25
  'number.max': messageTemplate.dateFormat
26
- });
26
+ };
27
27
  this.collection = new ComponentCollection([{
28
28
  type: ComponentType.NumberField,
29
29
  name: `${name}__month`,
@@ -69,15 +69,15 @@ export class MonthYearField extends FormComponent {
69
69
  const value = super.getFormValueFromState(state);
70
70
  return MonthYearField.isMonthYear(value) ? value : undefined;
71
71
  }
72
- getDisplayStringFromFormValue(value, _translator) {
72
+ getDisplayStringFromFormValue(value, translator) {
73
73
  if (!value) {
74
74
  return '';
75
75
  }
76
76
  const date = new Date();
77
+ // Force to first day of month in case current date was say 31st and specified month has fewer than 31 days
78
+ date.setDate(1);
77
79
  date.setMonth(value.month - 1);
78
- const monthString = date.toLocaleString('default', {
79
- month: 'long'
80
- });
80
+ const monthString = formatDateForLanguage(date, 'LLLL', translator.language);
81
81
  return `${monthString} ${value.year}`;
82
82
  }
83
83
  getDisplayStringFromState(state, translator) {
@@ -98,7 +98,7 @@ export class MonthYearField extends FormComponent {
98
98
  const {
99
99
  t
100
100
  } = translator;
101
- return convertToLanguageMessages({
101
+ const messages = {
102
102
  'any.required': buildValidationMessages(t).objectMissing,
103
103
  'number.base': buildValidationMessages(t).objectMissing,
104
104
  'number.precision': buildValidationMessages(t).dateFormat,
@@ -106,7 +106,11 @@ export class MonthYearField extends FormComponent {
106
106
  'number.unsafe': buildValidationMessages(t).dateFormat,
107
107
  'number.min': buildValidationMessages(t).dateFormat,
108
108
  'number.max': buildValidationMessages(t).dateFormat
109
- });
109
+ };
110
+ return {
111
+ [`${this.name}__month`]: messages,
112
+ [`${this.name}__year`]: messages
113
+ };
110
114
  }
111
115
  getViewModel(context) {
112
116
  const {
@@ -1 +1 @@
1
- {"version":3,"file":"MonthYearField.js","names":["ComponentType","format","isValid","parse","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","parseStrictDate","buildValidationMessages","messageTemplate","convertToLanguageMessages","MonthYearField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorMonthYear","peers","formSchema","stateSchema","getFormValueFromState","state","value","isMonthYear","undefined","getDisplayStringFromFormValue","_translator","date","Date","setMonth","month","monthString","toLocaleString","year","getDisplayStringFromState","translator","getContextValueFromFormValue","getContextValueFromState","getValidationMessagesOverride","t","getViewModel","context","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","dateMin","dateMax","isNumber","component","validator","payload","helpers","values","getStateFromValidForm","missing","keys","key","earliestDate","earliestMonthYear","limit","latestDate","latestMonthYear"],"sources":["../../../../../src/server/plugins/engine/components/MonthYearField.ts"],"sourcesContent":["import { ComponentType, type MonthYearFieldComponent } from '@defra/forms-model'\nimport { format, isValid, parse } from 'date-fns'\nimport {\n type Context,\n type CustomValidator,\n type LanguageMessages,\n type ObjectSchema\n} from 'joi'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport {\n type DateInputItem,\n type MonthYearState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { parseStrictDate } from '~/src/server/plugins/engine/date-helper.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} from '~/src/server/plugins/engine/types.js'\nimport { convertToLanguageMessages } from '~/src/server/utils/type-utils.js'\n\nexport class MonthYearField extends FormComponent {\n declare options: MonthYearFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: MonthYearFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options } = def\n\n const isRequired = options.required !== false\n\n const customValidationMessages: LanguageMessages =\n convertToLanguageMessages({\n 'any.required': messageTemplate.objectMissing,\n 'number.base': messageTemplate.objectMissing,\n 'number.precision': messageTemplate.dateFormat,\n 'number.integer': messageTemplate.dateFormat,\n 'number.unsafe': messageTemplate.dateFormat,\n 'number.min': messageTemplate.dateFormat,\n 'number.max': messageTemplate.dateFormat\n })\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__month`,\n title: 'components.monthYearField.month',\n schema: { min: 1, max: 12, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-2',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__year`,\n title: 'components.monthYearField.year',\n schema: { min: 1000, max: 3000, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-4',\n customValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n custom: getValidatorMonthYear(this),\n peers: [`${name}__month`, `${name}__year`]\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 MonthYearField.isMonthYear(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: MonthYearState | undefined,\n _translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const date = new Date()\n date.setMonth(value.month - 1)\n\n const monthString = date.toLocaleString('default', { month: 'long' })\n return `${monthString} ${value.year}`\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: MonthYearState | undefined\n ): string | null {\n if (\n !value ||\n !isValid(\n parseStrictDate(\n value,\n `${value.year}-${value.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-01`, 'yyyy-MM')\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n return convertToLanguageMessages({\n 'any.required': buildValidationMessages(t).objectMissing,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).dateFormat,\n 'number.integer': buildValidationMessages(t).dateFormat,\n 'number.unsafe': buildValidationMessages(t).dateFormat,\n 'number.min': buildValidationMessages(t).dateFormat,\n 'number.max': buildValidationMessages(t).dateFormat\n })\n }\n\n getViewModel(context: RenderContext) {\n const { errors } = context\n const { collection, name } = this\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n // Check for component errors only\n const hasError = errors?.some((error) => error.name === name)\n\n // Use the component collection to generate the subitems\n const items: DateInputItem[] = collection\n .getViewModel(context)\n .map(({ model }) => {\n let { label, type, value, classes, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text // Date component uses string labels\n }\n\n if (hasError || errorMessage) {\n classes = `${classes} govuk-input--error`.trim()\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes\n }\n })\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n return {\n ...viewModel,\n fieldset,\n items\n }\n }\n\n isState(value?: FormStateValue | FormState) {\n return MonthYearField.isMonthYear(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return MonthYearField.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: 'dateFormatMonth',\n template: '{{#label}} must include a month'\n },\n { type: 'dateFormatYear', template: '{{#label}} must include a year' }\n ],\n advancedSettingsErrors: [\n { type: 'dateEarliest', template: messageTemplate.dateMin },\n { type: 'dateLatest', template: messageTemplate.dateMax }\n ]\n }\n }\n\n static isMonthYear(\n value?: FormStateValue | FormState\n ): value is MonthYearState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport function getValidatorMonthYear(component: MonthYearField) {\n const validator: CustomValidator = (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n const date = parse(\n `${values.year}-${values.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n\n if (!isValid(date)) {\n return helpers.error('date.format', context)\n }\n\n // Minimum date from today\n const earliestDate = options.earliestMonthYear\n ? new Date(`${options.earliestMonthYear}-01`)\n : undefined\n\n if (earliestDate && date < earliestDate) {\n return helpers.error('date.min', { ...context, limit: earliestDate })\n }\n\n // Maximum date from today\n const latestDate = options.latestMonthYear\n ? new Date(`${options.latestMonthYear}-01`)\n : undefined\n\n if (latestDate && date > latestDate) {\n return helpers.error('date.max', { ...context, limit: latestDate })\n }\n\n return payload\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MonthYearField.js","names":["ComponentType","format","isValid","parse","ComponentCollection","FormComponent","isFormState","isFormValue","NumberField","parseStrictDate","buildValidationMessages","messageTemplate","formatDateForLanguage","MonthYearField","constructor","def","props","name","options","isRequired","required","customValidationMessages","objectMissing","dateFormat","collection","type","title","schema","min","max","precision","optionalText","classes","parent","custom","getValidatorMonthYear","peers","formSchema","stateSchema","getFormValueFromState","state","value","isMonthYear","undefined","getDisplayStringFromFormValue","translator","date","Date","setDate","setMonth","month","monthString","language","year","getDisplayStringFromState","getContextValueFromFormValue","getContextValueFromState","getValidationMessagesOverride","t","messages","getViewModel","context","errors","viewModel","fieldset","label","hasError","some","error","items","map","model","errorMessage","toString","text","trim","id","legend","isState","getAllPossibleErrors","baseErrors","template","advancedSettingsErrors","dateMin","dateMax","isNumber","component","validator","payload","helpers","values","getStateFromValidForm","missing","keys","key","earliestDate","earliestMonthYear","limit","latestDate","latestMonthYear"],"sources":["../../../../../src/server/plugins/engine/components/MonthYearField.ts"],"sourcesContent":["import { ComponentType, type MonthYearFieldComponent } from '@defra/forms-model'\nimport { format, isValid, parse } from 'date-fns'\nimport {\n type Context,\n type CustomValidator,\n type LanguageMessages,\n type ObjectSchema\n} from 'joi'\n\nimport { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'\nimport {\n FormComponent,\n isFormState,\n isFormValue\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'\nimport {\n type DateInputItem,\n type MonthYearState,\n type RenderContext\n} from '~/src/server/plugins/engine/components/types.js'\nimport { parseStrictDate } from '~/src/server/plugins/engine/date-helper.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} from '~/src/server/plugins/engine/types.js'\nimport { formatDateForLanguage } from '~/src/server/plugins/payment/helper.js'\n\nexport class MonthYearField extends FormComponent {\n declare options: MonthYearFieldComponent['options']\n declare formSchema: ObjectSchema<FormPayload>\n declare stateSchema: ObjectSchema<FormState>\n declare collection: ComponentCollection\n\n constructor(\n def: MonthYearFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { name, options } = def\n\n const isRequired = options.required !== false\n\n const customValidationMessages = {\n 'any.required': messageTemplate.objectMissing,\n 'number.base': messageTemplate.objectMissing,\n 'number.precision': messageTemplate.dateFormat,\n 'number.integer': messageTemplate.dateFormat,\n 'number.unsafe': messageTemplate.dateFormat,\n 'number.min': messageTemplate.dateFormat,\n 'number.max': messageTemplate.dateFormat\n } as LanguageMessages\n\n this.collection = new ComponentCollection(\n [\n {\n type: ComponentType.NumberField,\n name: `${name}__month`,\n title: 'components.monthYearField.month',\n schema: { min: 1, max: 12, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-2',\n customValidationMessages\n }\n },\n {\n type: ComponentType.NumberField,\n name: `${name}__year`,\n title: 'components.monthYearField.year',\n schema: { min: 1000, max: 3000, precision: 0 },\n options: {\n required: isRequired,\n optionalText: true,\n classes: 'govuk-input--width-4',\n customValidationMessages\n }\n }\n ],\n { ...props, parent: this },\n {\n custom: getValidatorMonthYear(this),\n peers: [`${name}__month`, `${name}__year`]\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 MonthYearField.isMonthYear(value) ? value : undefined\n }\n\n getDisplayStringFromFormValue(\n value: MonthYearState | undefined,\n translator: Translator\n ): string {\n if (!value) {\n return ''\n }\n\n const date = new Date()\n // Force to first day of month in case current date was say 31st and specified month has fewer than 31 days\n date.setDate(1)\n date.setMonth(value.month - 1)\n\n const monthString = formatDateForLanguage(date, 'LLLL', translator.language)\n return `${monthString} ${value.year}`\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: MonthYearState | undefined\n ): string | null {\n if (\n !value ||\n !isValid(\n parseStrictDate(\n value,\n `${value.year}-${value.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n )\n ) {\n return null\n }\n\n return format(`${value.year}-${value.month}-01`, 'yyyy-MM')\n }\n\n getContextValueFromState(state: FormSubmissionState) {\n const value = this.getFormValueFromState(state)\n\n return this.getContextValueFromFormValue(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n const messages = {\n 'any.required': buildValidationMessages(t).objectMissing,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).dateFormat,\n 'number.integer': buildValidationMessages(t).dateFormat,\n 'number.unsafe': buildValidationMessages(t).dateFormat,\n 'number.min': buildValidationMessages(t).dateFormat,\n 'number.max': buildValidationMessages(t).dateFormat\n } as LanguageMessages\n return {\n [`${this.name}__month`]: messages,\n [`${this.name}__year`]: messages\n }\n }\n\n getViewModel(context: RenderContext) {\n const { errors } = context\n const { collection, name } = this\n\n const viewModel = super.getViewModel(context)\n let { fieldset, label } = viewModel\n\n // Check for component errors only\n const hasError = errors?.some((error) => error.name === name)\n\n // Use the component collection to generate the subitems\n const items: DateInputItem[] = collection\n .getViewModel(context)\n .map(({ model }) => {\n let { label, type, value, classes, errorMessage } = model\n\n if (label) {\n label.toString = () => label.text // Date component uses string labels\n }\n\n if (hasError || errorMessage) {\n classes = `${classes} govuk-input--error`.trim()\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n label,\n id: model.id,\n name: model.name,\n type,\n value,\n classes\n }\n })\n\n fieldset ??= {\n legend: {\n text: label.text,\n classes: 'govuk-fieldset__legend--m'\n }\n }\n\n return {\n ...viewModel,\n fieldset,\n items\n }\n }\n\n isState(value?: FormStateValue | FormState) {\n return MonthYearField.isMonthYear(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return MonthYearField.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: 'dateFormatMonth',\n template: '{{#label}} must include a month'\n },\n { type: 'dateFormatYear', template: '{{#label}} must include a year' }\n ],\n advancedSettingsErrors: [\n { type: 'dateEarliest', template: messageTemplate.dateMin },\n { type: 'dateLatest', template: messageTemplate.dateMax }\n ]\n }\n }\n\n static isMonthYear(\n value?: FormStateValue | FormState\n ): value is MonthYearState {\n return (\n isFormState(value) &&\n NumberField.isNumber(value.month) &&\n NumberField.isNumber(value.year)\n )\n }\n}\n\nexport function getValidatorMonthYear(component: MonthYearField) {\n const validator: CustomValidator = (payload: FormPayload, helpers) => {\n const { collection, name, options } = component\n\n const values = component.getFormValueFromState(\n component.getStateFromValidForm(payload)\n )\n\n const context: Context = {\n missing: collection.keys,\n key: name\n }\n\n if (!component.isState(values)) {\n return options.required !== false\n ? helpers.error('object.required', context)\n : payload\n }\n\n const date = parse(\n `${values.year}-${values.month}-01`,\n 'yyyy-MM-dd',\n new Date()\n )\n\n if (!isValid(date)) {\n return helpers.error('date.format', context)\n }\n\n // Minimum date from today\n const earliestDate = options.earliestMonthYear\n ? new Date(`${options.earliestMonthYear}-01`)\n : undefined\n\n if (earliestDate && date < earliestDate) {\n return helpers.error('date.min', { ...context, limit: earliestDate })\n }\n\n // Maximum date from today\n const latestDate = options.latestMonthYear\n ? new Date(`${options.latestMonthYear}-01`)\n : undefined\n\n if (latestDate && date > latestDate) {\n return helpers.error('date.max', { ...context, limit: latestDate })\n }\n\n return payload\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
@@ -59,6 +59,7 @@ export declare class MultilineTextField extends FormComponent {
59
59
  upload?: {
60
60
  count: number;
61
61
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
62
+ uploadingLabel?: string;
62
63
  };
63
64
  };
64
65
  buildMinMaxText(min?: number, max?: number): string;
@@ -1,9 +1,10 @@
1
1
  import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model';
2
2
  import { LocationFieldBase } from '../../../../server/plugins/engine/components/LocationFieldBase.js';
3
+ import { type Translator } from '../../../../server/plugins/engine/i18n/types.js';
3
4
  import { type ErrorMessageTemplateList } from '../../../../server/plugins/engine/types.js';
4
5
  export declare class NationalGridFieldNumberField extends LocationFieldBase {
5
6
  options: NationalGridFieldNumberFieldComponent['options'];
6
- protected getValidationConfig(): {
7
+ protected getValidationConfig(translator: Translator | undefined): {
7
8
  pattern: RegExp;
8
9
  patternErrorMessage: import("joi").JoiExpression;
9
10
  requiredMessage: import("joi").JoiExpression;
@@ -1,16 +1,17 @@
1
+ import { EN_GB } from "../../../constants.js";
1
2
  import { LocationFieldBase } from "./LocationFieldBase.js";
2
3
  import { createLowerFirstExpression } from "./helpers/index.js";
3
4
  import { t } from "../i18n/index.js";
4
5
  export class NationalGridFieldNumberField extends LocationFieldBase {
5
- getValidationConfig() {
6
+ getValidationConfig(translator) {
6
7
  // Regex for OS national grid field references (NGFR)
7
8
  // Validates specific valid OS grid letter combinations with:
8
9
  // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789
9
10
  const pattern = /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\s?([0-9]{4})\s?([0-9]{4})$/;
10
11
  return {
11
12
  pattern,
12
- patternErrorMessage: createLowerFirstExpression(t('components.nationalGridField.pattern', 'en-GB')),
13
- requiredMessage: createLowerFirstExpression(t('components.nationalGridField.required', 'en-GB'))
13
+ patternErrorMessage: createLowerFirstExpression(translator ? translator.t('components.nationalGridField.pattern') : t('components.nationalGridField.pattern', EN_GB)),
14
+ requiredMessage: createLowerFirstExpression(translator ? translator.t('components.nationalGridField.required') : t('components.nationalGridField.required', EN_GB))
14
15
  };
15
16
  }
16
17
  getErrorTemplates() {
@@ -1 +1 @@
1
- {"version":3,"file":"NationalGridFieldNumberField.js","names":["LocationFieldBase","createLowerFirstExpression","t","NationalGridFieldNumberField","getValidationConfig","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/NationalGridFieldNumberField.ts"],"sourcesContent":["import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'\n\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class NationalGridFieldNumberField extends LocationFieldBase {\n declare options: NationalGridFieldNumberFieldComponent['options']\n\n protected getValidationConfig() {\n // Regex for OS national grid field references (NGFR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?([0-9]{4})\\s?([0-9]{4})$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n ),\n requiredMessage: createLowerFirstExpression(\n t('components.nationalGridField.required', 'en-GB')\n )\n }\n }\n\n protected getErrorTemplates() {\n return [\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n )\n }\n ]\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 {\n type: 'required',\n template: createLowerFirstExpression(\n t('components.nationalGridField.required', 'en-GB')\n )\n },\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n )\n }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAEA,SAASA,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,CAAC;AAGV,OAAO,MAAMC,4BAA4B,SAASH,iBAAiB,CAAC;EAGxDI,mBAAmBA,CAAA,EAAG;IAC9B;IACA;IACA;IACA,MAAMC,OAAO,GACX,mIAAmI;IAErI,OAAO;MACLA,OAAO;MACPC,mBAAmB,EAAEL,0BAA0B,CAC7CC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD,CAAC;MACDK,eAAe,EAAEN,0BAA0B,CACzCC,CAAC,CAAC,uCAAuC,EAAE,OAAO,CACpD;IACF,CAAC;EACH;EAEUM,iBAAiBA,CAAA,EAAG;IAC5B,OAAO,CACL;MACEC,IAAI,EAAE,SAAS;MACfC,QAAQ,EAAET,0BAA0B,CAClCC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD;IACF,CAAC,CACF;EACH;;EAEA;AACF;AACA;EACE,OAAOS,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QACEH,IAAI,EAAE,UAAU;QAChBC,QAAQ,EAAET,0BAA0B,CAClCC,CAAC,CAAC,uCAAuC,EAAE,OAAO,CACpD;MACF,CAAC,EACD;QACEO,IAAI,EAAE,SAAS;QACfC,QAAQ,EAAET,0BAA0B,CAClCC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD;MACF,CAAC,CACF;MACDW,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"NationalGridFieldNumberField.js","names":["EN_GB","LocationFieldBase","createLowerFirstExpression","t","NationalGridFieldNumberField","getValidationConfig","translator","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/NationalGridFieldNumberField.ts"],"sourcesContent":["import { type NationalGridFieldNumberFieldComponent } from '@defra/forms-model'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class NationalGridFieldNumberField extends LocationFieldBase {\n declare options: NationalGridFieldNumberFieldComponent['options']\n\n protected getValidationConfig(translator: Translator | undefined) {\n // Regex for OS national grid field references (NGFR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?([0-9]{4})\\s?([0-9]{4})$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.nationalGridField.pattern')\n : t('components.nationalGridField.pattern', EN_GB)\n ),\n requiredMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.nationalGridField.required')\n : t('components.nationalGridField.required', EN_GB)\n )\n }\n }\n\n protected getErrorTemplates() {\n return [\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n )\n }\n ]\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 {\n type: 'required',\n template: createLowerFirstExpression(\n t('components.nationalGridField.required', 'en-GB')\n )\n },\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.nationalGridField.pattern', 'en-GB')\n )\n }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAEA,SAASA,KAAK;AACd,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,CAAC;AAIV,OAAO,MAAMC,4BAA4B,SAASH,iBAAiB,CAAC;EAGxDI,mBAAmBA,CAACC,UAAkC,EAAE;IAChE;IACA;IACA;IACA,MAAMC,OAAO,GACX,mIAAmI;IAErI,OAAO;MACLA,OAAO;MACPC,mBAAmB,EAAEN,0BAA0B,CAC7CI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,sCAAsC,CAAC,GACpDA,CAAC,CAAC,sCAAsC,EAAEH,KAAK,CACrD,CAAC;MACDS,eAAe,EAAEP,0BAA0B,CACzCI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,uCAAuC,CAAC,GACrDA,CAAC,CAAC,uCAAuC,EAAEH,KAAK,CACtD;IACF,CAAC;EACH;EAEUU,iBAAiBA,CAAA,EAAG;IAC5B,OAAO,CACL;MACEC,IAAI,EAAE,SAAS;MACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD;IACF,CAAC,CACF;EACH;;EAEA;AACF;AACA;EACE,OAAOU,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QACEH,IAAI,EAAE,UAAU;QAChBC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,uCAAuC,EAAE,OAAO,CACpD;MACF,CAAC,EACD;QACEQ,IAAI,EAAE,SAAS;QACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,sCAAsC,EAAE,OAAO,CACnD;MACF,CAAC,CACF;MACDY,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
@@ -51,6 +51,7 @@ export declare class NotificationBanner extends ComponentBase {
51
51
  upload?: {
52
52
  count: number;
53
53
  summaryList: import("../types.js").SummaryList;
54
+ uploadingLabel?: string;
54
55
  };
55
56
  };
56
57
  }
@@ -2,6 +2,7 @@ import { type NumberFieldComponent } from '@defra/forms-model';
2
2
  import joi, { type NumberSchema } from 'joi';
3
3
  import { FormComponent } from '../../../../server/plugins/engine/components/FormComponent.js';
4
4
  import { type RenderContext } from '../../../../server/plugins/engine/components/types.js';
5
+ import { type Translator } from '../../../../server/plugins/engine/types/index.js';
5
6
  import { type ErrorMessageTemplateList, type FormState, type FormStateValue, type FormSubmissionState } from '../../../../server/plugins/engine/types.js';
6
7
  export declare class NumberField extends FormComponent {
7
8
  options: NumberFieldComponent['options'];
@@ -58,9 +59,13 @@ export declare class NumberField extends FormComponent {
58
59
  upload?: {
59
60
  count: number;
60
61
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
62
+ uploadingLabel?: string;
61
63
  };
62
64
  };
63
65
  isValue(value?: FormStateValue | FormState): value is number;
66
+ getValidationMessagesOverride(translator: Translator): {
67
+ [x: string]: joi.LanguageMessages;
68
+ };
64
69
  /**
65
70
  * For error preview page that shows all possible errors on a component
66
71
  */
@@ -1,5 +1,6 @@
1
1
  import joi from 'joi';
2
2
  import { FormComponent, isFormValue } from "./FormComponent.js";
3
+ import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
3
4
  import { messageTemplate } from "../pageControllers/validationOptions.js";
4
5
  export class NumberField extends FormComponent {
5
6
  constructor(def, props) {
@@ -97,6 +98,21 @@ export class NumberField extends FormComponent {
97
98
  isValue(value) {
98
99
  return NumberField.isNumber(value);
99
100
  }
101
+ getValidationMessagesOverride(translator) {
102
+ const {
103
+ t
104
+ } = translator;
105
+ return {
106
+ [this.name]: {
107
+ 'any.required': buildValidationMessages(t).objectRequired,
108
+ 'number.base': buildValidationMessages(t).objectMissing,
109
+ 'number.precision': buildValidationMessages(t).numberPrecision,
110
+ 'number.integer': buildValidationMessages(t).numberInteger,
111
+ 'number.min': buildValidationMessages(t).numberMin,
112
+ 'number.max': buildValidationMessages(t).numberMax
113
+ }
114
+ };
115
+ }
100
116
 
101
117
  /**
102
118
  * For error preview page that shows all possible errors on a component
@@ -1 +1 @@
1
- {"version":3,"file":"NumberField.js","names":["joi","FormComponent","isFormValue","messageTemplate","NumberField","constructor","def","props","options","schema","formSchema","number","custom","getValidatorPrecision","label","required","allow","messages","customValidationMessages","empty","min","max","precision","integer","customValidationMessage","message","default","stateSchema","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getViewModel","context","viewModel","attributes","prefix","suffix","inputmode","text","isNumber","getAllPossibleErrors","baseErrors","type","template","numberInteger","advancedSettingsErrors","numberMin","numberMax","numberPrecision","component","validator","helpers","limit","validationSchema","prefs","convert","attempt","error"],"sources":["../../../../../src/server/plugins/engine/components/NumberField.ts"],"sourcesContent":["import { type NumberFieldComponent } from '@defra/forms-model'\nimport joi, { type CustomValidator, type NumberSchema } 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 { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class NumberField extends FormComponent {\n declare options: NumberFieldComponent['options']\n declare schema: NumberFieldComponent['schema']\n declare formSchema: NumberSchema\n declare stateSchema: NumberSchema\n\n constructor(\n def: NumberFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, schema } = def\n\n let formSchema = joi\n .number()\n .custom(getValidatorPrecision(this))\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n } else {\n const messages = options.customValidationMessages\n\n formSchema = formSchema.empty('').messages({\n 'any.required':\n messages?.['any.required'] ?? (messageTemplate.required as string)\n })\n }\n\n if (typeof schema.min === 'number') {\n formSchema = formSchema.min(schema.min)\n }\n\n if (typeof schema.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n\n if (typeof schema.precision === 'number' && schema.precision <= 0) {\n formSchema = formSchema.integer()\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'number.base': message,\n 'number.precision': message,\n 'number.integer': message,\n 'number.min': message,\n 'number.max': 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 this.schema = schema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getViewModel(context: RenderContext) {\n const { options, schema } = this\n\n const viewModel = super.getViewModel(context)\n let { attributes, prefix, suffix, value } = viewModel\n\n if (typeof schema.precision === 'undefined' || schema.precision <= 0) {\n // If precision isn't provided or provided and\n // less than or equal to 0, use numeric inputmode\n attributes.inputmode = 'numeric'\n }\n\n if (options.prefix) {\n prefix = {\n text: options.prefix\n }\n }\n\n if (options.suffix) {\n suffix = {\n text: options.suffix\n }\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n ...viewModel,\n attributes,\n prefix,\n suffix,\n value\n }\n }\n\n isValue(value?: FormStateValue | FormState) {\n return NumberField.isNumber(value)\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return NumberField.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: 'numberInteger', template: messageTemplate.numberInteger }\n ],\n advancedSettingsErrors: [\n { type: 'numberMin', template: messageTemplate.numberMin },\n { type: 'numberMax', template: messageTemplate.numberMax },\n { type: 'numberPrecision', template: messageTemplate.numberPrecision }\n ]\n }\n }\n\n static isNumber(value?: FormStateValue | FormState): value is number {\n return typeof value === 'number'\n }\n}\n\nexport function getValidatorPrecision(component: NumberField) {\n const validator: CustomValidator = (value: number, helpers) => {\n const { options, schema } = component\n\n const { customValidationMessage: custom } = options\n const { precision: limit } = schema\n\n if (!limit || limit <= 0) {\n return value\n }\n\n const validationSchema = joi\n .number()\n .precision(limit)\n .prefs({ convert: false })\n\n try {\n return joi.attempt(value, validationSchema)\n } catch {\n return custom\n ? helpers.message({ custom }, { limit })\n : helpers.error('number.precision', { limit })\n }\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"NumberField.js","names":["joi","FormComponent","isFormValue","buildValidationMessages","messageTemplate","NumberField","constructor","def","props","options","schema","formSchema","number","custom","getValidatorPrecision","label","required","allow","messages","customValidationMessages","empty","min","max","precision","integer","customValidationMessage","message","default","stateSchema","getFormValueFromState","state","name","getFormValue","value","isValue","undefined","getViewModel","context","viewModel","attributes","prefix","suffix","inputmode","text","isNumber","getValidationMessagesOverride","translator","t","objectRequired","objectMissing","numberPrecision","numberInteger","numberMin","numberMax","getAllPossibleErrors","baseErrors","type","template","advancedSettingsErrors","component","validator","helpers","limit","validationSchema","prefs","convert","attempt","error"],"sources":["../../../../../src/server/plugins/engine/components/NumberField.ts"],"sourcesContent":["import { type NumberFieldComponent } from '@defra/forms-model'\nimport joi, {\n type CustomValidator,\n type LanguageMessages,\n type NumberSchema\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 { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport { type Translator } from '~/src/server/plugins/engine/types/index.js'\nimport {\n type ErrorMessageTemplateList,\n type FormState,\n type FormStateValue,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nexport class NumberField extends FormComponent {\n declare options: NumberFieldComponent['options']\n declare schema: NumberFieldComponent['schema']\n declare formSchema: NumberSchema\n declare stateSchema: NumberSchema\n\n constructor(\n def: NumberFieldComponent,\n props: ConstructorParameters<typeof FormComponent>[1]\n ) {\n super(def, props)\n\n const { options, schema } = def\n\n let formSchema = joi\n .number()\n .custom(getValidatorPrecision(this))\n .label(this.label)\n .required()\n\n if (options.required === false) {\n formSchema = formSchema.allow('')\n } else {\n const messages = options.customValidationMessages\n\n formSchema = formSchema.empty('').messages({\n 'any.required':\n messages?.['any.required'] ?? (messageTemplate.required as string)\n })\n }\n\n if (typeof schema.min === 'number') {\n formSchema = formSchema.min(schema.min)\n }\n\n if (typeof schema.max === 'number') {\n formSchema = formSchema.max(schema.max)\n }\n\n if (typeof schema.precision === 'number' && schema.precision <= 0) {\n formSchema = formSchema.integer()\n }\n\n if (options.customValidationMessage) {\n const message = options.customValidationMessage\n\n formSchema = formSchema.messages({\n 'any.required': message,\n 'number.base': message,\n 'number.precision': message,\n 'number.integer': message,\n 'number.min': message,\n 'number.max': 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 this.schema = schema\n }\n\n getFormValueFromState(state: FormSubmissionState) {\n const { name } = this\n return this.getFormValue(state[name])\n }\n\n getFormValue(value?: FormStateValue | FormState) {\n return this.isValue(value) ? value : undefined\n }\n\n getViewModel(context: RenderContext) {\n const { options, schema } = this\n\n const viewModel = super.getViewModel(context)\n let { attributes, prefix, suffix, value } = viewModel\n\n if (typeof schema.precision === 'undefined' || schema.precision <= 0) {\n // If precision isn't provided or provided and\n // less than or equal to 0, use numeric inputmode\n attributes.inputmode = 'numeric'\n }\n\n if (options.prefix) {\n prefix = {\n text: options.prefix\n }\n }\n\n if (options.suffix) {\n suffix = {\n text: options.suffix\n }\n }\n\n // Allow any `toString()`-able value so non-numeric\n // values are shown alongside their error messages\n if (!isFormValue(value)) {\n value = undefined\n }\n\n return {\n ...viewModel,\n attributes,\n prefix,\n suffix,\n value\n }\n }\n\n isValue(value?: FormStateValue | FormState) {\n return NumberField.isNumber(value)\n }\n\n getValidationMessagesOverride(translator: Translator) {\n const { t } = translator\n return {\n [this.name]: {\n 'any.required': buildValidationMessages(t).objectRequired,\n 'number.base': buildValidationMessages(t).objectMissing,\n 'number.precision': buildValidationMessages(t).numberPrecision,\n 'number.integer': buildValidationMessages(t).numberInteger,\n 'number.min': buildValidationMessages(t).numberMin,\n 'number.max': buildValidationMessages(t).numberMax\n } as LanguageMessages\n }\n }\n\n /**\n * For error preview page that shows all possible errors on a component\n */\n getAllPossibleErrors(): ErrorMessageTemplateList {\n return NumberField.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: 'numberInteger', template: messageTemplate.numberInteger }\n ],\n advancedSettingsErrors: [\n { type: 'numberMin', template: messageTemplate.numberMin },\n { type: 'numberMax', template: messageTemplate.numberMax },\n { type: 'numberPrecision', template: messageTemplate.numberPrecision }\n ]\n }\n }\n\n static isNumber(value?: FormStateValue | FormState): value is number {\n return typeof value === 'number'\n }\n}\n\nexport function getValidatorPrecision(component: NumberField) {\n const validator: CustomValidator = (value: number, helpers) => {\n const { options, schema } = component\n\n const { customValidationMessage: custom } = options\n const { precision: limit } = schema\n\n if (!limit || limit <= 0) {\n return value\n }\n\n const validationSchema = joi\n .number()\n .precision(limit)\n .prefs({ convert: false })\n\n try {\n return joi.attempt(value, validationSchema)\n } catch {\n return custom\n ? helpers.message({ custom }, { limit })\n : helpers.error('number.precision', { limit })\n }\n }\n\n return validator\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,10 @@
1
1
  import { type OsGridRefFieldComponent } from '@defra/forms-model';
2
2
  import { LocationFieldBase } from '../../../../server/plugins/engine/components/LocationFieldBase.js';
3
+ import { type Translator } from '../../../../server/plugins/engine/types/index.js';
3
4
  import { type ErrorMessageTemplateList } from '../../../../server/plugins/engine/types.js';
4
5
  export declare class OsGridRefField extends LocationFieldBase {
5
6
  options: OsGridRefFieldComponent['options'];
6
- protected getValidationConfig(): {
7
+ protected getValidationConfig(translator: Translator | undefined): {
7
8
  pattern: RegExp;
8
9
  patternErrorMessage: import("joi").JoiExpression;
9
10
  requiredMessage: import("joi").JoiExpression;
@@ -1,8 +1,9 @@
1
+ import { EN_GB } from "../../../constants.js";
1
2
  import { LocationFieldBase } from "./LocationFieldBase.js";
2
3
  import { createLowerFirstExpression } from "./helpers/index.js";
3
4
  import { t } from "../i18n/index.js";
4
5
  export class OsGridRefField extends LocationFieldBase {
5
- getValidationConfig() {
6
+ getValidationConfig(translator) {
6
7
  // Regex for OS national grid references (NGR)
7
8
  // Validates specific valid OS grid letter combinations with:
8
9
  // - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678
@@ -12,8 +13,8 @@ export class OsGridRefField extends LocationFieldBase {
12
13
  const pattern = /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\s?(([0-9]{3})\s?([0-9]{3})|([0-9]{4})\s?([0-9]{4})|([0-9]{5})\s?([0-9]{5}))$/;
13
14
  return {
14
15
  pattern,
15
- patternErrorMessage: createLowerFirstExpression(t('components.osGridRefField.pattern', 'en-GB')),
16
- requiredMessage: createLowerFirstExpression(t('components.osGridRefField.required', 'en-GB'))
16
+ patternErrorMessage: createLowerFirstExpression(translator ? translator.t('components.osGridRefField.pattern') : t('components.osGridRefField.pattern', EN_GB)),
17
+ requiredMessage: createLowerFirstExpression(translator ? translator.t('components.osGridRefField.required') : t('components.osGridRefField.required', EN_GB))
17
18
  };
18
19
  }
19
20
  getErrorTemplates() {
@@ -1 +1 @@
1
- {"version":3,"file":"OsGridRefField.js","names":["LocationFieldBase","createLowerFirstExpression","t","OsGridRefField","getValidationConfig","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/OsGridRefField.ts"],"sourcesContent":["import { type OsGridRefFieldComponent } from '@defra/forms-model'\n\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class OsGridRefField extends LocationFieldBase {\n declare options: OsGridRefFieldComponent['options']\n\n protected getValidationConfig() {\n // Regex for OS national grid references (NGR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n // - 2 letters & 10 digits in 2 blocks of 5 e.g. SO 12345 12345\n // Optional spaces between each block\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?(([0-9]{3})\\s?([0-9]{3})|([0-9]{4})\\s?([0-9]{4})|([0-9]{5})\\s?([0-9]{5}))$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n t('components.osGridRefField.pattern', 'en-GB')\n ),\n requiredMessage: createLowerFirstExpression(\n t('components.osGridRefField.required', 'en-GB')\n )\n }\n }\n\n protected getErrorTemplates() {\n return [\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.osGridRefField.pattern', 'en-GB')\n )\n }\n ]\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 {\n type: 'required',\n template: createLowerFirstExpression(\n t('components.osGridRefField.required', 'en-GB')\n )\n },\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.osGridRefField.pattern', 'en-GB')\n )\n }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAEA,SAASA,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,CAAC;AAGV,OAAO,MAAMC,cAAc,SAASH,iBAAiB,CAAC;EAG1CI,mBAAmBA,CAAA,EAAG;IAC9B;IACA;IACA;IACA;IACA;IACA;IACA,MAAMC,OAAO,GACX,qLAAqL;IAEvL,OAAO;MACLA,OAAO;MACPC,mBAAmB,EAAEL,0BAA0B,CAC7CC,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAChD,CAAC;MACDK,eAAe,EAAEN,0BAA0B,CACzCC,CAAC,CAAC,oCAAoC,EAAE,OAAO,CACjD;IACF,CAAC;EACH;EAEUM,iBAAiBA,CAAA,EAAG;IAC5B,OAAO,CACL;MACEC,IAAI,EAAE,SAAS;MACfC,QAAQ,EAAET,0BAA0B,CAClCC,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAChD;IACF,CAAC,CACF;EACH;;EAEA;AACF;AACA;EACE,OAAOS,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QACEH,IAAI,EAAE,UAAU;QAChBC,QAAQ,EAAET,0BAA0B,CAClCC,CAAC,CAAC,oCAAoC,EAAE,OAAO,CACjD;MACF,CAAC,EACD;QACEO,IAAI,EAAE,SAAS;QACfC,QAAQ,EAAET,0BAA0B,CAClCC,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAChD;MACF,CAAC,CACF;MACDW,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"OsGridRefField.js","names":["EN_GB","LocationFieldBase","createLowerFirstExpression","t","OsGridRefField","getValidationConfig","translator","pattern","patternErrorMessage","requiredMessage","getErrorTemplates","type","template","getAllPossibleErrors","baseErrors","advancedSettingsErrors"],"sources":["../../../../../src/server/plugins/engine/components/OsGridRefField.ts"],"sourcesContent":["import { type OsGridRefFieldComponent } from '@defra/forms-model'\n\nimport { EN_GB } from '~/src/server/constants.js'\nimport { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'\nimport { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/types/index.js'\nimport { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'\n\nexport class OsGridRefField extends LocationFieldBase {\n declare options: OsGridRefFieldComponent['options']\n\n protected getValidationConfig(translator: Translator | undefined) {\n // Regex for OS national grid references (NGR)\n // Validates specific valid OS grid letter combinations with:\n // - 2 letters & 6 digits in 2 blocks of 3 e.g. ST 678 678\n // - 2 letters & 8 digits in 2 blocks of 4 e.g. ST 6789 6789\n // - 2 letters & 10 digits in 2 blocks of 5 e.g. SO 12345 12345\n // Optional spaces between each block\n const pattern =\n /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\\s?(([0-9]{3})\\s?([0-9]{3})|([0-9]{4})\\s?([0-9]{4})|([0-9]{5})\\s?([0-9]{5}))$/\n\n return {\n pattern,\n patternErrorMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.osGridRefField.pattern')\n : t('components.osGridRefField.pattern', EN_GB)\n ),\n requiredMessage: createLowerFirstExpression(\n translator\n ? translator.t('components.osGridRefField.required')\n : t('components.osGridRefField.required', EN_GB)\n )\n }\n }\n\n protected getErrorTemplates() {\n return [\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.osGridRefField.pattern', 'en-GB')\n )\n }\n ]\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 {\n type: 'required',\n template: createLowerFirstExpression(\n t('components.osGridRefField.required', 'en-GB')\n )\n },\n {\n type: 'pattern',\n template: createLowerFirstExpression(\n t('components.osGridRefField.pattern', 'en-GB')\n )\n }\n ],\n advancedSettingsErrors: []\n }\n }\n}\n"],"mappings":"AAEA,SAASA,KAAK;AACd,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,CAAC;AAIV,OAAO,MAAMC,cAAc,SAASH,iBAAiB,CAAC;EAG1CI,mBAAmBA,CAACC,UAAkC,EAAE;IAChE;IACA;IACA;IACA;IACA;IACA;IACA,MAAMC,OAAO,GACX,qLAAqL;IAEvL,OAAO;MACLA,OAAO;MACPC,mBAAmB,EAAEN,0BAA0B,CAC7CI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,mCAAmC,CAAC,GACjDA,CAAC,CAAC,mCAAmC,EAAEH,KAAK,CAClD,CAAC;MACDS,eAAe,EAAEP,0BAA0B,CACzCI,UAAU,GACNA,UAAU,CAACH,CAAC,CAAC,oCAAoC,CAAC,GAClDA,CAAC,CAAC,oCAAoC,EAAEH,KAAK,CACnD;IACF,CAAC;EACH;EAEUU,iBAAiBA,CAAA,EAAG;IAC5B,OAAO,CACL;MACEC,IAAI,EAAE,SAAS;MACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAChD;IACF,CAAC,CACF;EACH;;EAEA;AACF;AACA;EACE,OAAOU,oBAAoBA,CAAA,EAA6B;IACtD,OAAO;MACLC,UAAU,EAAE,CACV;QACEH,IAAI,EAAE,UAAU;QAChBC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,oCAAoC,EAAE,OAAO,CACjD;MACF,CAAC,EACD;QACEQ,IAAI,EAAE,SAAS;QACfC,QAAQ,EAAEV,0BAA0B,CAClCC,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAChD;MACF,CAAC,CACF;MACDY,sBAAsB,EAAE;IAC1B,CAAC;EACH;AACF","ignoreList":[]}
@@ -11,6 +11,7 @@ export declare class PaymentField extends FormComponent {
11
11
  options: PaymentFieldComponent['options'];
12
12
  formSchema: ObjectSchema;
13
13
  stateSchema: ObjectSchema;
14
+ def: PaymentFieldComponent;
14
15
  isAppendageStateSingleObject: boolean;
15
16
  constructor(def: PaymentFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
16
17
  /**
@@ -68,6 +69,7 @@ export declare class PaymentField extends FormComponent {
68
69
  upload?: {
69
70
  count: number;
70
71
  summaryList: import("../../../../server/plugins/engine/types.js").SummaryList;
72
+ uploadingLabel?: string;
71
73
  };
72
74
  };
73
75
  /**
@@ -122,6 +124,7 @@ export interface PaymentSessionData {
122
124
  reference: string;
123
125
  amount: number;
124
126
  description: string;
127
+ descriptionInEng?: string;
125
128
  paymentId: string;
126
129
  componentName: string;
127
130
  returnUrl: string;
@@ -13,11 +13,13 @@ export class PaymentField extends FormComponent {
13
13
  constructor(def, props) {
14
14
  super(def, props);
15
15
  this.options = def.options;
16
+ this.def = def;
16
17
  const paymentStateSchema = joi.object({
17
18
  paymentId: joi.string().required(),
18
19
  reference: joi.string().required(),
19
20
  amount: joi.number().required(),
20
21
  description: joi.string().required(),
22
+ descriptionInEng: joi.string().optional(),
21
23
  uuid: joi.string().uuid().required(),
22
24
  formId: joi.string().required(),
23
25
  isLivePayment: joi.boolean().required(),
@@ -52,6 +54,12 @@ export class PaymentField extends FormComponent {
52
54
  payload
53
55
  } = context;
54
56
  const viewModel = super.getViewModel(context);
57
+ const {
58
+ translator
59
+ } = context;
60
+ const {
61
+ tComponent
62
+ } = translator;
55
63
 
56
64
  // Payload is pre-populated from state if a payment has already been made
57
65
  const paymentState = this.isPaymentState(payload[this.name]) ? payload[this.name] : undefined;
@@ -63,7 +71,7 @@ export class PaymentField extends FormComponent {
63
71
  return {
64
72
  ...viewModel,
65
73
  amount: formatCurrency(amount),
66
- description: this.options.description,
74
+ description: tComponent(this.def, 'paymentDescription') || this.options.description,
67
75
  paymentState
68
76
  };
69
77
  }
@@ -157,10 +165,11 @@ export class PaymentField extends FormComponent {
157
165
  const {
158
166
  model
159
167
  } = args.controller;
160
- const language = resolveLanguage(request);
161
168
  const {
162
- t
163
- } = model.createTranslator(language);
169
+ language,
170
+ t,
171
+ tComponent
172
+ } = model.createTranslator(resolveLanguage(request));
164
173
  const state = await args.controller.getState(request);
165
174
  const {
166
175
  baseUrl
@@ -182,7 +191,7 @@ export class PaymentField extends FormComponent {
182
191
  if (resolvedAmount === 0) {
183
192
  return h.redirect(summaryUrl).code(StatusCodes.SEE_OTHER);
184
193
  }
185
- const description = options.description;
194
+ const description = tComponent(args.component, 'paymentDescription') || options.description;
186
195
  const slug = `/${model.basePath}`;
187
196
  const payCallbackUrl = `${baseUrl}/payment-callback?uuid=${uuid}`;
188
197
  const paymentPageUrl = args.sourceUrl;
@@ -194,7 +203,8 @@ export class PaymentField extends FormComponent {
194
203
  const amountInPence = Math.round(resolvedAmount * 100);
195
204
  const payment = await paymentService.createPayment(amountInPence, description, payCallbackUrl, reference, isLivePayment, {
196
205
  formId,
197
- slug
206
+ slug,
207
+ language
198
208
  }, prefilledEmail);
199
209
  if (!payment) {
200
210
  const message = isLivePayment ? t('components.paymentField.cannotTakePayment') : t('components.paymentField.testApiKey');
@@ -208,6 +218,7 @@ export class PaymentField extends FormComponent {
208
218
  reference,
209
219
  amount: resolvedAmount,
210
220
  description,
221
+ descriptionInEng: options.description,
211
222
  paymentId: payment.paymentId,
212
223
  componentName,
213
224
  returnUrl: summaryUrl,