@defra/forms-engine-plugin 5.0.0-alpha.3 → 5.0.0-alpha.31

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 (406) hide show
  1. package/.public/37c964ca545c240f010a.mjs +2 -0
  2. package/.public/37c964ca545c240f010a.mjs.LICENSE.txt +4 -0
  3. package/.public/assets-manifest.json +3 -0
  4. package/.public/javascripts/application.min.js +1 -1
  5. package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
  6. package/.public/javascripts/application.min.js.map +1 -1
  7. package/.public/javascripts/shared.min.js +1 -1
  8. package/.public/javascripts/shared.min.js.LICENSE.txt +9 -0
  9. package/.public/javascripts/shared.min.js.map +1 -1
  10. package/.public/javascripts/vendor/@defra.min.js +1 -1
  11. package/.public/javascripts/vendor/@defra.min.js.map +1 -1
  12. package/.public/javascripts/vendor/maplibre-gl.min.js +1 -1
  13. package/.public/javascripts/vendor/maplibre-gl.min.js.LICENSE.txt +3 -3
  14. package/.public/javascripts/vendor/maplibre-gl.min.js.map +1 -1
  15. package/.public/stylesheets/application.min.css +1 -1
  16. package/.public/stylesheets/application.min.css.map +1 -1
  17. package/.server/client/javascripts/file-upload.js +6 -3
  18. package/.server/client/javascripts/file-upload.js.map +1 -1
  19. package/.server/client/javascripts/geospatial-map.d.ts +159 -5
  20. package/.server/client/javascripts/geospatial-map.js +161 -81
  21. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  22. package/.server/client/javascripts/geospatial-map.test.js +152 -0
  23. package/.server/client/javascripts/geospatial-map.test.js.map +1 -0
  24. package/.server/client/javascripts/govuk.js +2 -1
  25. package/.server/client/javascripts/govuk.js.map +1 -1
  26. package/.server/client/javascripts/location-map.d.ts +44 -0
  27. package/.server/client/javascripts/location-map.js +55 -6
  28. package/.server/client/javascripts/location-map.js.map +1 -1
  29. package/.server/client/javascripts/map-constants.d.ts +3 -0
  30. package/.server/client/javascripts/map-constants.js +4 -0
  31. package/.server/client/javascripts/map-constants.js.map +1 -0
  32. package/.server/client/javascripts/map.d.ts +17 -4
  33. package/.server/client/javascripts/map.js +59 -6
  34. package/.server/client/javascripts/map.js.map +1 -1
  35. package/.server/client/javascripts/maps.d.ts +5 -0
  36. package/.server/client/javascripts/maps.js +6 -0
  37. package/.server/client/javascripts/maps.js.map +1 -0
  38. package/.server/client/javascripts/shared.d.ts +1 -4
  39. package/.server/client/javascripts/shared.js +1 -4
  40. package/.server/client/javascripts/shared.js.map +1 -1
  41. package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
  42. package/.server/client/javascripts/sssi-dataset.js +37 -39
  43. package/.server/client/javascripts/sssi-dataset.js.map +1 -1
  44. package/.server/client/stylesheets/maps.scss +4 -0
  45. package/.server/client/stylesheets/shared.scss +1 -5
  46. package/.server/server/constants.d.ts +2 -0
  47. package/.server/server/constants.js +2 -0
  48. package/.server/server/constants.js.map +1 -1
  49. package/.server/server/forms/components.json +8 -0
  50. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
  51. package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
  52. package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
  53. package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
  54. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +8 -3
  55. package/.server/server/plugins/engine/components/AutocompleteField.js +17 -0
  56. package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +23 -2
  58. package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
  59. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  60. package/.server/server/plugins/engine/components/ComponentBase.d.ts +2 -1
  61. package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
  62. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  63. package/.server/server/plugins/engine/components/ComponentCollection.js +12 -7
  64. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  65. package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
  66. package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
  67. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  68. package/.server/server/plugins/engine/components/DeclarationField.d.ts +6 -3
  69. package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
  70. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  71. package/.server/server/plugins/engine/components/Details.d.ts +1 -0
  72. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
  73. package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
  74. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  75. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
  76. package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
  77. package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
  78. package/.server/server/plugins/engine/components/FileUploadField.d.ts +23 -2
  79. package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
  80. package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
  81. package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
  82. package/.server/server/plugins/engine/components/FormComponent.js +5 -2
  83. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  84. package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
  85. package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
  86. package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
  87. package/.server/server/plugins/engine/components/Html.d.ts +1 -0
  88. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
  89. package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
  90. package/.server/server/plugins/engine/components/LatLongField.js +85 -48
  91. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  92. package/.server/server/plugins/engine/components/List.d.ts +1 -0
  93. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +3 -2
  94. package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
  95. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
  96. package/.server/server/plugins/engine/components/LocationFieldBase.js +31 -7
  97. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  98. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
  99. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
  100. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  101. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
  102. package/.server/server/plugins/engine/components/Markdown.js +1 -1
  103. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  104. package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
  105. package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
  106. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  107. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
  108. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
  109. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
  110. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  111. package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
  112. package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
  113. package/.server/server/plugins/engine/components/NumberField.js +22 -0
  114. package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
  115. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
  116. package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
  117. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  118. package/.server/server/plugins/engine/components/PaymentField.d.ts +2 -0
  119. package/.server/server/plugins/engine/components/PaymentField.js +9 -5
  120. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  121. package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
  122. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
  123. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
  124. package/.server/server/plugins/engine/components/TrackingField.d.ts +21 -0
  125. package/.server/server/plugins/engine/components/TrackingField.js +46 -0
  126. package/.server/server/plugins/engine/components/TrackingField.js.map +1 -0
  127. package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
  128. package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
  129. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  130. package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -2
  131. package/.server/server/plugins/engine/components/YesNoField.js +22 -8
  132. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  133. package/.server/server/plugins/engine/components/helpers/components.d.ts +1 -1
  134. package/.server/server/plugins/engine/components/helpers/components.js +6 -3
  135. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  136. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
  137. package/.server/server/plugins/engine/components/helpers/geospatial.js +58 -17
  138. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  139. package/.server/server/plugins/engine/components/helpers/index.d.ts +21 -1
  140. package/.server/server/plugins/engine/components/helpers/index.js +45 -1
  141. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  142. package/.server/server/plugins/engine/components/index.d.ts +1 -0
  143. package/.server/server/plugins/engine/components/index.js +1 -0
  144. package/.server/server/plugins/engine/components/index.js.map +1 -1
  145. package/.server/server/plugins/engine/components/types.d.ts +1 -0
  146. package/.server/server/plugins/engine/components/types.js.map +1 -1
  147. package/.server/server/plugins/engine/errors.d.ts +49 -0
  148. package/.server/server/plugins/engine/errors.js +75 -0
  149. package/.server/server/plugins/engine/errors.js.map +1 -0
  150. package/.server/server/plugins/engine/form-availability.d.ts +3 -2
  151. package/.server/server/plugins/engine/form-availability.js +3 -2
  152. package/.server/server/plugins/engine/form-availability.js.map +1 -1
  153. package/.server/server/plugins/engine/form-context.js +2 -2
  154. package/.server/server/plugins/engine/form-context.js.map +1 -1
  155. package/.server/server/plugins/engine/helpers.d.ts +23 -2
  156. package/.server/server/plugins/engine/helpers.js +44 -5
  157. package/.server/server/plugins/engine/helpers.js.map +1 -1
  158. package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
  159. package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
  160. package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
  161. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  162. package/.server/server/plugins/engine/i18n/createFormTranslator.js +27 -5
  163. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  164. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  165. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  166. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  167. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  168. package/.server/server/plugins/engine/i18n/form.js +35 -0
  169. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  170. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  171. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  172. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  173. package/.server/server/plugins/engine/i18n/translations/cy.json +176 -7
  174. package/.server/server/plugins/engine/i18n/translations/en-GB.json +110 -6
  175. package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
  176. package/.server/server/plugins/engine/i18n/types.js.map +1 -1
  177. package/.server/server/plugins/engine/index.d.ts +4 -0
  178. package/.server/server/plugins/engine/index.js +4 -0
  179. package/.server/server/plugins/engine/index.js.map +1 -1
  180. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  181. package/.server/server/plugins/engine/models/FormModel.js +35 -23
  182. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  183. package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
  184. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  185. package/.server/server/plugins/engine/models/types.d.ts +28 -1
  186. package/.server/server/plugins/engine/models/types.js.map +1 -1
  187. package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
  188. package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
  189. package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
  190. package/.server/server/plugins/engine/options.js +2 -1
  191. package/.server/server/plugins/engine/options.js.map +1 -1
  192. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
  193. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  194. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  195. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  196. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  197. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  198. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  199. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
  200. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
  201. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  202. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  203. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +2 -2
  204. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  205. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
  206. package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
  207. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
  208. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  209. package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
  210. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
  211. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
  212. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
  213. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  214. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
  215. package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
  216. package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
  217. package/.server/server/plugins/engine/plugin.js +3 -0
  218. package/.server/server/plugins/engine/plugin.js.map +1 -1
  219. package/.server/server/plugins/engine/referenceNumbers.d.ts +1 -0
  220. package/.server/server/plugins/engine/referenceNumbers.js +1 -0
  221. package/.server/server/plugins/engine/referenceNumbers.js.map +1 -1
  222. package/.server/server/plugins/engine/routes/index.js +9 -4
  223. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  224. package/.server/server/plugins/engine/types/enums.d.ts +3 -3
  225. package/.server/server/plugins/engine/types/enums.js +5 -4
  226. package/.server/server/plugins/engine/types/enums.js.map +1 -1
  227. package/.server/server/plugins/engine/types/schema.js +15 -4
  228. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  229. package/.server/server/plugins/engine/types.d.ts +24 -2
  230. package/.server/server/plugins/engine/types.js.map +1 -1
  231. package/.server/server/plugins/engine/unavailable-response.js +5 -2
  232. package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
  233. package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
  234. package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  235. package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
  236. package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
  237. package/.server/server/plugins/engine/views/components/trackingfield.html +3 -0
  238. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  239. package/.server/server/plugins/engine/views/file-upload.html +1 -1
  240. package/.server/server/plugins/engine/views/summary.html +1 -0
  241. package/.server/server/plugins/engine/views/unavailable.html +14 -11
  242. package/.server/server/plugins/map/routes/index.d.ts +4 -0
  243. package/.server/server/plugins/map/routes/index.js +12 -4
  244. package/.server/server/plugins/map/routes/index.js.map +1 -1
  245. package/.server/server/plugins/map/routes/index.test.js +7 -0
  246. package/.server/server/plugins/map/routes/index.test.js.map +1 -0
  247. package/.server/server/plugins/map/routes/vts/README.md +38 -0
  248. package/.server/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
  249. package/.server/server/plugins/map/routes/vts/countries.geojson +10 -39283
  250. package/.server/server/plugins/map/types.d.ts +24 -2
  251. package/.server/server/plugins/map/types.js +9 -2
  252. package/.server/server/plugins/map/types.js.map +1 -1
  253. package/.server/server/plugins/nunjucks/enviroment.test.js +11 -4
  254. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
  255. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  256. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  257. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  258. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  259. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  260. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  261. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  262. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  263. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  264. package/.server/server/plugins/payment/helper.d.ts +11 -1
  265. package/.server/server/plugins/payment/helper.js +18 -2
  266. package/.server/server/plugins/payment/helper.js.map +1 -1
  267. package/.server/server/plugins/payment/helper.test.js +2 -1
  268. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  269. package/.server/server/plugins/payment/service.d.ts +2 -1
  270. package/.server/server/plugins/payment/service.js +5 -2
  271. package/.server/server/plugins/payment/service.js.map +1 -1
  272. package/.server/server/plugins/payment/service.test.js +7 -3
  273. package/.server/server/plugins/payment/service.test.js.map +1 -1
  274. package/.server/server/plugins/payment/types.d.ts +4 -0
  275. package/.server/server/plugins/payment/types.js +1 -0
  276. package/.server/server/plugins/payment/types.js.map +1 -1
  277. package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
  278. package/.server/server/plugins/postcode-lookup/models/index.js +103 -36
  279. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  280. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  281. package/.server/server/plugins/postcode-lookup/routes/index.js +64 -18
  282. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  283. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  284. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  285. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  286. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  287. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  288. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  289. package/.server/server/utils/type-utils.d.ts +1 -2
  290. package/.server/server/utils/type-utils.js +0 -3
  291. package/.server/server/utils/type-utils.js.map +1 -1
  292. package/.server/server/utils/utils.d.ts +6 -0
  293. package/.server/server/utils/utils.js +18 -1
  294. package/.server/server/utils/utils.js.map +1 -1
  295. package/.server/server/utils/utils.test.js +21 -1
  296. package/.server/server/utils/utils.test.js.map +1 -1
  297. package/.server/typings/geodesy/index.d.js +2 -0
  298. package/.server/typings/geodesy/index.d.js.map +1 -0
  299. package/.server/typings/hapi/index.d.js.map +1 -1
  300. package/package.json +24 -9
  301. package/src/client/javascripts/file-upload.js +11 -3
  302. package/src/client/javascripts/geospatial-map.js +181 -86
  303. package/src/client/javascripts/govuk.js +2 -0
  304. package/src/client/javascripts/location-map.js +62 -6
  305. package/src/client/javascripts/map-constants.js +3 -0
  306. package/src/client/javascripts/map.js +66 -9
  307. package/src/client/javascripts/maps.js +5 -0
  308. package/src/client/javascripts/shared.js +1 -4
  309. package/src/client/javascripts/sssi-dataset.js +39 -41
  310. package/src/client/stylesheets/maps.scss +4 -0
  311. package/src/client/stylesheets/shared.scss +1 -5
  312. package/src/server/constants.js +2 -0
  313. package/src/server/forms/components.json +8 -0
  314. package/src/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
  315. package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
  316. package/src/server/plugins/engine/components/AutocompleteField.ts +20 -0
  317. package/src/server/plugins/engine/components/CheckboxesField.ts +41 -8
  318. package/src/server/plugins/engine/components/ComponentBase.ts +6 -4
  319. package/src/server/plugins/engine/components/ComponentCollection.ts +17 -15
  320. package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
  321. package/src/server/plugins/engine/components/DeclarationField.ts +10 -10
  322. package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
  323. package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
  324. package/src/server/plugins/engine/components/FileUploadField.ts +46 -5
  325. package/src/server/plugins/engine/components/FormComponent.ts +6 -5
  326. package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
  327. package/src/server/plugins/engine/components/LatLongField.ts +128 -58
  328. package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
  329. package/src/server/plugins/engine/components/LocationFieldBase.ts +41 -8
  330. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
  331. package/src/server/plugins/engine/components/Markdown.ts +2 -3
  332. package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
  333. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
  334. package/src/server/plugins/engine/components/NumberField.ts +24 -0
  335. package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
  336. package/src/server/plugins/engine/components/PaymentField.ts +9 -4
  337. package/src/server/plugins/engine/components/TrackingField.ts +64 -0
  338. package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
  339. package/src/server/plugins/engine/components/YesNoField.ts +27 -9
  340. package/src/server/plugins/engine/components/helpers/components.ts +8 -3
  341. package/src/server/plugins/engine/components/helpers/geospatial.ts +87 -24
  342. package/src/server/plugins/engine/components/helpers/index.ts +64 -1
  343. package/src/server/plugins/engine/components/index.ts +1 -0
  344. package/src/server/plugins/engine/components/types.ts +1 -0
  345. package/src/server/plugins/engine/errors.ts +78 -0
  346. package/src/server/plugins/engine/form-availability.ts +8 -2
  347. package/src/server/plugins/engine/form-context.ts +4 -2
  348. package/src/server/plugins/engine/helpers.ts +52 -5
  349. package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
  350. package/src/server/plugins/engine/i18n/createFormTranslator.ts +43 -12
  351. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  352. package/src/server/plugins/engine/i18n/form.ts +54 -0
  353. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  354. package/src/server/plugins/engine/i18n/translations/cy.json +176 -7
  355. package/src/server/plugins/engine/i18n/translations/en-GB.json +110 -6
  356. package/src/server/plugins/engine/i18n/types.ts +2 -0
  357. package/src/server/plugins/engine/index.ts +7 -0
  358. package/src/server/plugins/engine/models/FormModel.ts +46 -23
  359. package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
  360. package/src/server/plugins/engine/models/types.ts +31 -0
  361. package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
  362. package/src/server/plugins/engine/options.js +2 -1
  363. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
  364. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  365. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  366. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
  367. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +2 -2
  368. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
  369. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
  370. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
  371. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
  372. package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
  373. package/src/server/plugins/engine/plugin.ts +6 -0
  374. package/src/server/plugins/engine/referenceNumbers.ts +2 -0
  375. package/src/server/plugins/engine/routes/index.ts +9 -3
  376. package/src/server/plugins/engine/types/enums.ts +4 -3
  377. package/src/server/plugins/engine/types/schema.ts +22 -5
  378. package/src/server/plugins/engine/types.ts +28 -1
  379. package/src/server/plugins/engine/unavailable-response.ts +6 -2
  380. package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
  381. package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
  382. package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
  383. package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
  384. package/src/server/plugins/engine/views/components/trackingfield.html +3 -0
  385. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  386. package/src/server/plugins/engine/views/file-upload.html +1 -1
  387. package/src/server/plugins/engine/views/summary.html +1 -0
  388. package/src/server/plugins/engine/views/unavailable.html +14 -11
  389. package/src/server/plugins/map/routes/index.js +29 -4
  390. package/src/server/plugins/map/routes/vts/README.md +38 -0
  391. package/src/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
  392. package/src/server/plugins/map/routes/vts/countries.geojson +10 -39283
  393. package/src/server/plugins/map/types.js +9 -2
  394. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  395. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  396. package/src/server/plugins/payment/helper.js +22 -2
  397. package/src/server/plugins/payment/service.js +6 -2
  398. package/src/server/plugins/payment/types.js +1 -0
  399. package/src/server/plugins/postcode-lookup/models/index.js +91 -46
  400. package/src/server/plugins/postcode-lookup/routes/index.js +96 -24
  401. package/src/server/plugins/postcode-lookup/types.js +6 -1
  402. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  403. package/src/server/utils/type-utils.ts +1 -11
  404. package/src/server/utils/utils.js +19 -1
  405. package/src/typings/geodesy/index.d.ts +18 -0
  406. package/src/typings/hapi/index.d.ts +2 -0
@@ -14,7 +14,63 @@
14
14
  "numberInteger": "Rhaid i {{#label}} fod yn rhif cyfan",
15
15
  "numberMin": "Rhaid i {{#label}} fod yn {{#limit}} neu uwch",
16
16
  "numberMax": "Rhaid i {{#label}} fod yn {{#limit}} neu is",
17
- "maxWords": "Rhaid i {{#label}} fod yn {{#limit}} o eiriau neu lai"
17
+ "maxWords": "Rhaid i {{#label}} fod yn {{#limit}} o eiriau neu lai",
18
+ "unicode": "Mae {{#label}} yn cynnwys nodau annilys, er enghraifft, dashes hirion",
19
+ "arrayMin_zero": "Dewiswch o leiaf 1 opsiwn o'r rhestr",
20
+ "arrayMin_one": "Dewiswch o leiaf {{#limit}} opsiwn o'r rhestr",
21
+ "arrayMin_two": "Dewiswch o leiaf ddau opsiwn o'r rhestr",
22
+ "arrayMin_few": "Dewiswch o leiaf {{#limit}} opsiwn o'r rhestr",
23
+ "arrayMin_many": "Dewiswch o leiaf {{#limit}} opsiwn o'r rhestr",
24
+ "arrayMin_other": "Dewiswch o leiaf {{#limit}} opsiwn o'r rhestr",
25
+ "arrayMax_zero": "Dim ond {{#limit}} opsiynau y gellir eu dewis o'r rhestr",
26
+ "arrayMax_one": "Dim ond {{#limit}} opsiwn y gellir ei ddewis o'r rhestr",
27
+ "arrayMax_two": "Dim ond dwy opsiwn y gellir eu dewis o'r rhestr",
28
+ "arrayMax_few": "Dim ond {{#limit}} opsiwn y gellir eu dewis o'r rhestr",
29
+ "arrayMax_many": "Dim ond {{#limit}} opsiwn y gellir eu dewis o'r rhestr",
30
+ "arrayMax_other": "Dim ond {{#limit}} opsiwn y gellir eu dewis o'r rhestr",
31
+ "arrayLength_zero": "Dewiswch 0 opsiwn yn unig o'r rhestr",
32
+ "arrayLength_one": "Dewiswch un opsiwn yn unig o'r rhestr",
33
+ "arrayLength_two": "Dewiswch {{#limit}} opsiwn yn unig o'r rhestr",
34
+ "arrayLength_few": "Dewiswch {{#limit}} opsiwn yn unig o'r rhestr",
35
+ "arrayLength_many": "Dewiswch {{#limit}} opsiwn yn unig o'r rhestr",
36
+ "arrayLength_other": "Dewiswch {{#limit}} opsiwn yn unig o'r rhestr",
37
+
38
+ "featuresMin_zero": "Diffiniwch o leiaf {{#limit}} nodwedd",
39
+ "featuresMin_one": "Diffiniwch o leiaf un nodwedd",
40
+ "featuresMin_two": "Diffiniwch o leiaf {{#limit}} nodwedd",
41
+ "featuresMin_few": "Diffiniwch o leiaf {{#limit}} nodwedd",
42
+ "featuresMin_many": "Diffiniwch o leiaf {{#limit}} nodwedd",
43
+ "featuresMin_other": "Diffiniwch o leiaf {{#limit}} nodwedd",
44
+ "featuresMax_zero": "Dim ond {{#limit}} nodwedd y gellir eu diffinio",
45
+ "featuresMax_one": "Dim ond {{#limit}} nodwedd y gellir ei diffinio",
46
+ "featuresMax_two": "Dim ond {{#limit}} nodwedd y gellir eu diffinio",
47
+ "featuresMax_few": "Dim ond {{#limit}} nodwedd y gellir eu diffinio",
48
+ "featuresMax_many": "Dim ond {{#limit}} nodwedd y gellir eu diffinio",
49
+ "featuresMax_other": "Dim ond {{#limit}} nodwedd y gellir eu diffinio",
50
+ "featuresLength_zero": "Diffiniwch yn union {{#limit}} nodwedd",
51
+ "featuresLength_one": "Diffiniwch un nodwedd yn union",
52
+ "featuresLength_two": "Diffiniwch nodweddion {{#limit}} yn union",
53
+ "featuresLength_few": "Diffiniwch nodweddion {{#limit}} yn union",
54
+ "featuresLength_many": "Diffiniwch nodweddion {{#limit}} yn union",
55
+ "featuresLength_other": "Diffiniwch nodweddion {{#limit}} yn union",
56
+ "filesMin_zero": "Rhaid i chi uwchlwytho {{#limit}} ffeil neu fwy",
57
+ "filesMin_one": "Rhaid i chi uwchlwytho un ffeil neu fwy",
58
+ "filesMin_two": "Rhaid i chi uwchlwytho {{#limit}} o ffeiliau neu fwy",
59
+ "filesMin_few": "Rhaid i chi uwchlwytho {{#limit}} o ffeiliau neu fwy",
60
+ "filesMin_many": "Rhaid i chi uwchlwytho {{#limit}} o ffeiliau neu fwy",
61
+ "filesMin_other": "Rhaid i chi uwchlwytho {{#limit}} o ffeiliau neu fwy",
62
+ "filesMax_zero": "Dim ond {{#limit}} ffeil neu lai y gallwch eu huwchlwytho",
63
+ "filesMax_one": "Dim ond un ffeil neu lai y gallwch ei huwchlwytho",
64
+ "filesMax_two": "Dim ond {{#limit}} o ffeiliau neu lai y gallwch eu huwchlwytho",
65
+ "filesMax_few": "Dim ond {{#limit}} o ffeiliau neu lai y gallwch eu huwchlwytho",
66
+ "filesMax_many": "Dim ond {{#limit}} o ffeiliau neu lai y gallwch eu huwchlwytho",
67
+ "filesMax_other": "Dim ond {{#limit}} o ffeiliau neu lai y gallwch eu huwchlwytho",
68
+ "filesLength_zero": "Rhaid i chi uwchlwytho union {{#limit}} ffeil",
69
+ "filesLength_one": "Rhaid i chi uwchlwytho union un ffeil",
70
+ "filesLength_two": "Rhaid i chi uwchlwytho'n union {{#limit}} o ffeiliau",
71
+ "filesLength_few": "Rhaid i chi uwchlwytho'n union {{#limit}} o ffeiliau",
72
+ "filesLength_many": "Rhaid i chi uwchlwytho'n union {{#limit}} o ffeiliau",
73
+ "filesLength_other": "Rhaid i chi uwchlwytho'n union {{#limit}} o ffeiliau"
18
74
  },
19
75
 
20
76
  "errors": {
@@ -29,7 +85,14 @@
29
85
  "continue": "Parhau",
30
86
  "saveAndExit": "Cadw a gadael",
31
87
  "draft": "ddrafft",
32
- "live": "fyw"
88
+ "live": "fyw",
89
+ "or": "neu",
90
+ "and": "a",
91
+ "england": "Lloegr",
92
+ "wales": "Cymru",
93
+ "northern-ireland": "Gogledd Iwerddon",
94
+ "scotland": "Yr Alban",
95
+ "sendFeedback": "Anfon adborth"
33
96
  },
34
97
 
35
98
  "pages": {
@@ -60,6 +123,12 @@
60
123
  "totalAmount": "Cyfanswm",
61
124
  "reference": "Cyfeirnod",
62
125
  "dateOfPayment": "Dyddiad talu",
126
+ "fileUpload_zero": "Ni uwchlwythwyd unrhyw ffeiliau",
127
+ "fileUpload_one": "Uwchlwythwyd [[count]] ffeil",
128
+ "fileUpload_two": "Uwchlwythwyd dwy feil",
129
+ "fileUpload_few": "Uwchlwythwyd [[count]] ffeil",
130
+ "fileUpload_many": "Uwchlwythwyd [[count]] o ffeiliau",
131
+ "fileUpload_other": "Uwchlwythwyd [[count]] ffeil",
63
132
  "submissionFailed": "Roedd problem ac ni chyflwynwyd eich ffurflen. Ceisiwch gyflwyno'r ffurflen eto",
64
133
  "submissionFailedContactSuffix": " neu gallwch [[contactUsLink]] a dyfynnu'ch cyfeirnod i drefnu ad-daliad",
65
134
  "contactUsLinkText": "cysylltu â ni (yn agor mewn tab newydd)",
@@ -79,17 +148,40 @@
79
148
  "change": "Newid",
80
149
  "notProvided": "Heb ei ddarparu",
81
150
  "visuallyHiddenItem": "eitem [[index]]",
151
+ "pageTitle_zero": "Nid ydych wedi ychwanegu unrhyw atebion",
82
152
  "pageTitle_one": "Rydych wedi ychwanegu [[count]] ateb",
153
+ "pageTitle_two": "Rydych wedi ychwanegu dau ateb",
154
+ "pageTitle_few": "Rydych wedi ychwanegu [[count]] ateb",
155
+ "pageTitle_many": "Rydych wedi ychwanegu [[count]] o atebion",
83
156
  "pageTitle_other": "Rydych wedi ychwanegu [[count]] ateb",
157
+ "tooMany_zero": "Ni allwch ychwanegu unrhyw atebion",
84
158
  "tooMany_one": "Dim ond hyd at [[count]] ateb y gallwch ei ychwanegu",
159
+ "tooMany_two": "Dim ond hyd at ddau gateb y gallwch eu hychwanegu",
160
+ "tooMany_few": "Dim ond hyd at [[count]] ateb y gallwch eu hychwanegu",
161
+ "tooMany_many": "Dim ond hyd at [[count]] o atebion y gallwch eu hychwanegu",
85
162
  "tooMany_other": "Dim ond hyd at [[count]] ateb y gallwch eu hychwanegu",
163
+ "tooFew_zero": "Rhaid i chi ychwanegu atebion",
86
164
  "tooFew_one": "Rhaid i chi ychwanegu o leiaf [[count]] ateb",
165
+ "tooFew_two": "Rhaid i chi ychwanegu o leiaf ddau gateb",
166
+ "tooFew_few": "Rhaid i chi ychwanegu o leiaf [[count]] ateb",
167
+ "tooFew_many": "Rhaid i chi ychwanegu o leiaf [[count]] o atebion",
87
168
  "tooFew_other": "Rhaid i chi ychwanegu o leiaf [[count]] ateb"
88
169
  },
89
170
 
90
171
  "fileUpload": {
91
172
  "upload": "Uwchlwytho ffeil",
92
- "maxFilesReached": "Rydych wedi cyrraedd nifer uchaf y ffeiliau. Tynnwch ffeil i uwchlwytho rhagor."
173
+ "maxFilesReached": "Rydych wedi cyrraedd nifer uchaf y ffeiliau. Tynnwch ffeil i uwchlwytho rhagor.",
174
+ "remove": "Tynnu",
175
+ "removeFileTitle": "Ydych chi'n siŵr eich bod chi eisiau dileu'r ffeil hon?",
176
+ "removeFileBody": "Ni allwch adfer ffeiliau a dynnwyd.",
177
+ "removeFileButton": "Dileu ffeil",
178
+ "cancel": "Canslo",
179
+ "FILE_VIRUS": "Mae'r ffeil a ddewiswyd yn cynnwys firws",
180
+ "FILE_EMPTY": "Mae'r ffeil a ddewiswyd yn wag",
181
+ "FILE_TOO_LARGE": "Rhaid i'r ffeil a ddewiswyd fod yn llai na [[maxFileSizeFormatted]]",
182
+ "FILE_INVALID_TYPE": "Rhaid i'r ffeil a ddewiswyd fod yn [[fileExtensions]]",
183
+ "FILE_UPLOAD_FAILED": "Ni ellid uwchlwytho'r ffeil a ddewiswyd - rhowch gynnig arall arni",
184
+ "FILE_ERROR_UNKNOWN": "Gwall anhysbys"
93
185
  },
94
186
 
95
187
  "exit": {
@@ -115,6 +207,16 @@
115
207
  "bannerForce": "Rhagolwg o ffurflen [[previewMode]] yw hon. Peidiwch â rhoi gwybodaeth bersonol.",
116
208
  "bannerText": "Dyma ragolwg o dudalen ffurflen [[previewMode]] rydych chi'n ei golygu.",
117
209
  "previousPages": "Mae'n dibynnu ar atebion o dudalennau cynharach yn y ffurflen. Yn y fersiwn fyw, bydd angen i ddefnyddwyr gwblhau'r cwestiynau hynny yn gyntaf."
210
+ },
211
+
212
+ "formUnavailable": {
213
+ "title": "Mae'n ddrwg gennyf, nid yw'r ffurflen hon ar gael",
214
+ "subHeading": "Nid yw '[[formTitle]]' ar gael mwyach.",
215
+ "contactDetailsHeading": "Manylion cyswllt ar gyfer [[organisationName]]",
216
+ "telephone": "Ffôn",
217
+ "callCharges": "Dysgwch am gostau galwadau",
218
+ "email": "E-bost",
219
+ "onlineContactForm": "Ffurflen gyswllt ar-lein"
118
220
  }
119
221
  },
120
222
 
@@ -135,7 +237,11 @@
135
237
  "findAnAddressInstead": "dod o hyd i gyfeiriad yn lle hynny",
136
238
  "noAddressFoundTitle": "Ni chanfuwyd cyfeiriad",
137
239
  "noAddressFoundBody": "Ni allem ddod o hyd i gyfeiriad cyfatebol",
240
+ "addressFound_zero": "Ni chanfuwyd unrhyw gyfeiriadau ar gyfer",
138
241
  "addressFound_one": "Canfuwyd [[count]] cyfeiriad ar gyfer",
242
+ "addressFound_two": "Canfuwyd dau gyfeiriad ar gyfer",
243
+ "addressFound_few": "Canfuwyd [[count]] chyfeiriad ar gyfer",
244
+ "addressFound_many": "Canfuwyd [[count]] o gyfeiriadau ar gyfer",
139
245
  "addressFound_other": "Canfuwyd [[count]] cyfeiriad ar gyfer",
140
246
  "validation": {
141
247
  "invalidPostcode": "Nodwch god post dilys neu nodwch gyfeiriad â llaw",
@@ -200,7 +306,8 @@
200
306
  "eastingDigits": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng 1 a 6 digid",
201
307
  "northingDigits": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng 1 a 7 digid",
202
308
  "eastingRange": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng [[min]] a [[max]]",
203
- "northingRange": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng [[min]] a [[max]]"
309
+ "northingRange": "Rhaid i {{#label}} ar gyfer [[fieldLabel]] fod rhwng [[min]] a [[max]]",
310
+ "wrongCountry": "Rhaid i leoliad fod y tu mewn i [[country]]"
204
311
  },
205
312
 
206
313
  "nationalGridField": {
@@ -216,14 +323,23 @@
216
323
  },
217
324
 
218
325
  "locationFieldBase": {
219
- "howToFind": "Sut i ddod o hyd i fanylion lleoliad"
326
+ "howToFind": "Sut i ddod o hyd i fanylion lleoliad",
327
+ "map": {
328
+ "helpPanel": {
329
+ "label": "Sut i ddefnyddio'r map hwn",
330
+ "point1": "Chwilio am sir, lle neu god post",
331
+ "point2": "Defnyddiwch yr eiconau + a - i chwyddo i mewn ac allan",
332
+ "point3": "Defnyddiwch lyfliwr neu allweddlon i ganolbwyntio'r pwynt yn y lleoliad",
333
+ "point4": "Cliciwch i ychwanegu'r lleoliad i'r map"
334
+ }
335
+ }
220
336
  },
221
337
 
222
338
  "yesNoField": {
223
339
  "yes": "Ie",
224
340
  "no": "Nage",
225
341
  "validation": {
226
- "selectYesNoRequired": "{{#label}} - dewiswch ie neu na"
342
+ "selectYesNoRequired": "{{#label}} - dewiswch ie neu nage"
227
343
  }
228
344
  },
229
345
 
@@ -237,8 +353,53 @@
237
353
  },
238
354
 
239
355
  "geospatialField": {
356
+ "added_zero": "Ni ychwanegwyd unrhyw leoliadau",
240
357
  "added_one": "Ychwanegwyd [[count]] lleoliad",
358
+ "added_two": "Ychwanegwyd dau leoliad",
359
+ "added_few": "Ychwanegwyd [[count]] lleoliad",
360
+ "added_many": "Ychwanegwyd [[count]] o leoliadau",
241
361
  "added_other": "Ychwanegwyd [[count]] lleoliad",
362
+ "map": {
363
+ "helpPanel": {
364
+ "label": "Sut i ddefnyddio'r map hwn",
365
+ "ledeIntro": "Gallwch ychwanegu",
366
+ "ledeOutro": "i'r map.",
367
+ "lineText": "llinell",
368
+ "shapeText": "siâp",
369
+ "lineOrShapeText": "llinell neu siâp",
370
+ "typesPhrasePoint": "pwyntiau",
371
+ "typesPhraseLine": "lliniau",
372
+ "typesPhraseShape": "siâpiau",
373
+ "typesPhraseOr": "neu",
374
+ "point1": "Chwilio am sir, lle neu god post",
375
+ "point2": "Defnyddiwch yr eiconau + a - i chwyddo i mewn ac allan",
376
+ "point3": "Cliciwch ddwywaith, neu dewiswch 'Wedi gorffen', pan fyddwch wedi",
377
+ "point4": "Rhowch enw i'r lleoliad"
378
+ },
379
+ "typeDescriptions": {
380
+ "point": "Pwynt",
381
+ "line": "Llinell",
382
+ "polygon": "Siâp"
383
+ },
384
+ "buttons": {
385
+ "point": "Ychwanegu pwynt",
386
+ "line": "Ychwanegu llinell",
387
+ "polygon": "Ychwanegu siâp"
388
+ },
389
+ "itemLabel1": "Lleoliad",
390
+ "itemLabel2": "disgrifiad",
391
+ "itemUpdateLink": "Diweddaru",
392
+ "itemDeleteLink": "Dileu",
393
+ "itemFocusLink": "Dangos",
394
+ "itemVisuallyHidden": "lleoliad",
395
+ "details": {
396
+ "summary": "Cyfesurynnau",
397
+ "type": "Math",
398
+ "centroidGridReference": "Canol cyfeirnod grid",
399
+ "firstPointGridReference": "Cyfeirnod grid y pwynt cyntaf",
400
+ "detailedCoordinates": "Cyfesurynnau manwl"
401
+ }
402
+ },
242
403
  "validation": {
243
404
  "descriptionRequired": "Rhowch ddisgrifiad ar gyfer lleoliad [[count]]",
244
405
  "wrongCountry": "Rhaid i leoliad [[count]] fod y tu mewn i [[country]]"
@@ -262,11 +423,19 @@
262
423
  },
263
424
 
264
425
  "fileUploadField": {
426
+ "uploading": "Yn uwchlwytho…",
265
427
  "uploaded": "Wedi'i uwchlwytho",
266
428
  "uploadFailed": "Roedd problem gyda'ch ffeiliau a uwchlwythwyd. Uwchlwythwch nhw eto cyn cyflwyno'r ffurflen.",
267
429
  "uploadedFilesHeading": "Ffeiliau a uwchlwythwyd",
430
+ "filesCount_zero": "Uwchlwythwyd [[count]] o ffeiliau",
268
431
  "filesCount_one": "Uwchlwythwyd [[count]] ffeil",
269
- "filesCount_other": "Uwchlwythwyd [[count]] ffeil"
432
+ "filesCount_two": "Uwchlwythwyd [[count]] ffeil",
433
+ "filesCount_few": "Uwchlwythwyd [[count]] ffeil",
434
+ "filesCount_many": "Uwchlwythwyd [[count]] o ffeiliau",
435
+ "filesCount_other": "Uwchlwythwyd [[count]] ffeil",
436
+ "chooseFile": "Dewiswch ffeil",
437
+ "dropFile": "neu ollwng ffeil",
438
+ "noFileChosen": "Dim ffeil wedi'i dewis"
270
439
  },
271
440
 
272
441
  "characterCount": {
@@ -14,7 +14,26 @@
14
14
  "numberInteger": "{{#label}} must be a whole number",
15
15
  "numberMin": "{{#label}} must be {{#limit}} or higher",
16
16
  "numberMax": "{{#label}} must be {{#limit}} or lower",
17
- "maxWords": "{{#label}} must be {{#limit}} words or fewer"
17
+ "maxWords": "{{#label}} must be {{#limit}} words or fewer",
18
+ "unicode": "{{#label}} includes invalid characters, for example, long dashes",
19
+ "arrayMin_one": "Select at least {{#limit}} option from the list",
20
+ "arrayMin_other": "Select at least {{#limit}} options from the list",
21
+ "arrayMax_one": "Only {{#limit}} option can be selected from the list",
22
+ "arrayMax_other": "Only {{#limit}} options can be selected from the list",
23
+ "arrayLength_one": "Select only {{#limit}} option from the list",
24
+ "arrayLength_other": "Select only {{#limit}} options from the list",
25
+ "featuresMin_one": "Define at least {{#limit}} feature",
26
+ "featuresMin_other": "Define at least {{#limit}} features",
27
+ "featuresMax_one": "Only {{#limit}} feature can be defined",
28
+ "featuresMax_other": "Only {{#limit}} features can be defined",
29
+ "featuresLength_one": "Define exactly {{#limit}} feature",
30
+ "featuresLength_other": "Define exactly {{#limit}} features",
31
+ "filesMin_one": "You must upload {{#limit}} file or more",
32
+ "filesMin_other": "You must upload {{#limit}} files or more",
33
+ "filesMax_one": "You can only upload {{#limit}} file or less",
34
+ "filesMax_other": "You can only upload {{#limit}} files or less",
35
+ "filesLength_one": "You must upload exactly {{#limit}} file",
36
+ "filesLength_other": "You must upload exactly {{#limit}} files"
18
37
  },
19
38
 
20
39
  "errors": {
@@ -29,7 +48,14 @@
29
48
  "continue": "Continue",
30
49
  "saveAndExit": "Save and exit",
31
50
  "draft": "draft",
32
- "live": "live"
51
+ "live": "live",
52
+ "or": "or",
53
+ "and": "and",
54
+ "england": "England",
55
+ "wales": "Wales",
56
+ "northern-ireland": "Northern Ireland",
57
+ "scotland": "Scotland",
58
+ "sendFeedback": "Send feedback"
33
59
  },
34
60
 
35
61
  "pages": {
@@ -60,6 +86,8 @@
60
86
  "totalAmount": "Total amount",
61
87
  "reference": "Reference",
62
88
  "dateOfPayment": "Date of payment",
89
+ "fileUpload_one": "Uploaded [[count]] file",
90
+ "fileUpload_other": "Uploaded [[count]] files",
63
91
  "submissionFailed": "There was a problem and your form was not submitted. Try submitting the form again",
64
92
  "submissionFailedContactSuffix": " or you can [[contactUsLink]] and quote your reference number to arrange a refund",
65
93
  "contactUsLinkText": "contact us (opens in new tab)",
@@ -89,7 +117,18 @@
89
117
 
90
118
  "fileUpload": {
91
119
  "upload": "Upload file",
92
- "maxFilesReached": "You have reached the maximum number of files. Please remove a file to upload more."
120
+ "maxFilesReached": "You have reached the maximum number of files. Please remove a file to upload more.",
121
+ "remove": "Remove",
122
+ "removeFileTitle": "Are you sure you want to remove this file?",
123
+ "removeFileBody": "You cannot recover removed files.",
124
+ "removeFileButton": "Remove file",
125
+ "cancel": "Cancel",
126
+ "FILE_VIRUS": "The selected file contains a virus",
127
+ "FILE_EMPTY": "The selected file is empty",
128
+ "FILE_TOO_LARGE": "The selected file must be smaller than [[maxFileSizeFormatted]]",
129
+ "FILE_INVALID_TYPE": "The selected file must be a [[fileExtensions]]",
130
+ "FILE_UPLOAD_FAILED": "The selected file could not be uploaded - try again",
131
+ "FILE_ERROR_UNKNOWN": "Unknown error"
93
132
  },
94
133
 
95
134
  "exit": {
@@ -115,6 +154,16 @@
115
154
  "bannerForce": "This is a preview of a [[previewMode]] form. Do not enter personal information.",
116
155
  "bannerText": "This is a preview of a [[previewMode]] form page you are editing.",
117
156
  "previousPages": "It depends on answers from earlier pages in the form. In the live version, users will need to complete those questions first."
157
+ },
158
+
159
+ "formUnavailable": {
160
+ "title": "Sorry, this form is unavailable",
161
+ "subHeading": "'[[formTitle]]' is no longer available.",
162
+ "contactDetailsHeading": "Contact details for [[organisationName]]",
163
+ "telephone": "Telephone",
164
+ "callCharges": "Find out about call charges",
165
+ "email": "Email",
166
+ "onlineContactForm": "Online contact form"
118
167
  }
119
168
  },
120
169
 
@@ -200,7 +249,8 @@
200
249
  "eastingDigits": "{{#label}} for [[fieldLabel]] must be between 1 and 6 digits",
201
250
  "northingDigits": "{{#label}} for [[fieldLabel]] must be between 1 and 7 digits",
202
251
  "eastingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]",
203
- "northingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]"
252
+ "northingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]",
253
+ "wrongCountry": "Location must be within [[country]]"
204
254
  },
205
255
 
206
256
  "nationalGridField": {
@@ -216,7 +266,16 @@
216
266
  },
217
267
 
218
268
  "locationFieldBase": {
219
- "howToFind": "How to find location details"
269
+ "howToFind": "How to find location details",
270
+ "map": {
271
+ "helpPanel": {
272
+ "label": "How to use this map",
273
+ "point1": "Search for a place or postcode",
274
+ "point2": "Use the + and - icons to zoom in and out",
275
+ "point3": "Use a mouse or keyboard to centre the point at the location",
276
+ "point4": "Click to add the location to the map"
277
+ }
278
+ }
220
279
  },
221
280
 
222
281
  "yesNoField": {
@@ -239,6 +298,47 @@
239
298
  "geospatialField": {
240
299
  "added_one": "Added [[count]] location",
241
300
  "added_other": "Added [[count]] locations",
301
+ "map": {
302
+ "helpPanel": {
303
+ "label": "How to use this map",
304
+ "ledeIntro": "You can add",
305
+ "ledeOutro": "to the map.",
306
+ "lineText": "a line",
307
+ "shapeText": "a shape",
308
+ "lineOrShapeText": "a line or shape",
309
+ "typesPhrasePoint": "points",
310
+ "typesPhraseLine": "lines",
311
+ "typesPhraseShape": "shapes",
312
+ "typesPhraseOr": "or",
313
+ "point1": "Search for a county, place or postcode",
314
+ "point2": "Use the + and - icons to zoom in and out",
315
+ "point3": "Double‑click, or select 'Done', when you have finished drawing",
316
+ "point4": "Give the location a name"
317
+ },
318
+ "typeDescriptions": {
319
+ "point": "Point",
320
+ "line": "Line",
321
+ "polygon": "Shape"
322
+ },
323
+ "buttons": {
324
+ "point": "Add point",
325
+ "line": "Add line",
326
+ "polygon": "Add shape"
327
+ },
328
+ "itemLabel1": "Location",
329
+ "itemLabel2": "description",
330
+ "itemUpdateLink": "Update",
331
+ "itemDeleteLink": "Delete",
332
+ "itemFocusLink": "Show",
333
+ "itemVisuallyHidden": "location",
334
+ "details": {
335
+ "summary": "Coordinates",
336
+ "type": "Type",
337
+ "centroidGridReference": "Centre grid reference",
338
+ "firstPointGridReference": "First point grid reference",
339
+ "detailedCoordinates": "Detailed coordinates"
340
+ }
341
+ },
242
342
  "validation": {
243
343
  "descriptionRequired": "Enter description for location [[count]]",
244
344
  "wrongCountry": "Location [[count]] must be within [[country]]"
@@ -262,11 +362,15 @@
262
362
  },
263
363
 
264
364
  "fileUploadField": {
365
+ "uploading": "Uploading…",
265
366
  "uploaded": "Uploaded",
266
367
  "uploadFailed": "There was a problem with your uploaded files. Re-upload them before submitting the form again.",
267
368
  "uploadedFilesHeading": "Uploaded files",
268
369
  "filesCount_one": "[[count]] file uploaded",
269
- "filesCount_other": "[[count]] files uploaded"
370
+ "filesCount_other": "[[count]] files uploaded",
371
+ "chooseFile": "Choose file",
372
+ "dropFile": "or drop file",
373
+ "noFileChosen": "No file chosen"
270
374
  },
271
375
 
272
376
  "characterCount": {
@@ -22,7 +22,9 @@ export type FormDefinitionTranslations = Record<
22
22
  hint: string
23
23
  content: string
24
24
  shortDescription: string
25
+ errorDescription: string
25
26
  paymentDescription: string
27
+ instructionText: string
26
28
  }>
27
29
  >
28
30
  sections: Record<string, Partial<Pick<Section, 'title'>>>
@@ -22,6 +22,13 @@ export {
22
22
  resolveFormModel
23
23
  } from './form-context.js'
24
24
  export * from './form-availability.js'
25
+ export { getAvailableLanguages } from './i18n/languages.js'
26
+ export {
27
+ extractMetadataBaseTranslations,
28
+ loadFormTranslations
29
+ } from './i18n/createFormTranslator.js'
30
+ export { extractBaseTranslations } from './i18n/extractBaseTranslations.js'
31
+ export { applyUrlParam } from '../nunjucks/filters/applyUrlParam.js'
25
32
 
26
33
  const globals = {
27
34
  checkComponentTemplates,
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  ComponentType,
3
+ ConditionEvaluationOutcome,
3
4
  ConditionsModel,
4
5
  ControllerPath,
5
6
  ControllerType,
@@ -8,6 +9,7 @@ import {
8
9
  formDefinitionSchema,
9
10
  formDefinitionV2Schema,
10
11
  generateConditionAlias,
12
+ getErrorMessage,
11
13
  hasComponents,
12
14
  hasComponentsEvenIfNoNext,
13
15
  hasRepeater,
@@ -31,6 +33,7 @@ import { type i18n } from 'i18next'
31
33
  import joi from 'joi'
32
34
 
33
35
  import { logger } from '../../../common/helpers/logging/logger.js'
36
+ import { EN_GB } from '../../../constants.js'
34
37
  import { type ListFormComponent } from '../components/ListFormComponent.js'
35
38
  import {} from '../components/YesNoField.js'
36
39
  import {
@@ -38,6 +41,10 @@ import {
38
41
  type Component
39
42
  } from '../components/helpers/components.js'
40
43
  import { todayAsDateOnly } from '../date-helper.js'
44
+ import {
45
+ ConditionBuildError,
46
+ SchemaValidationError
47
+ } from '../errors.js'
41
48
  import {
42
49
  findPage,
43
50
  getError,
@@ -47,8 +54,12 @@ import { loadFormTranslations } from '../i18n/createFormTranslator.js'
47
54
  import { createTranslator } from '../i18n/createTranslator.js'
48
55
  import { extractBaseTranslations } from '../i18n/extractBaseTranslations.js'
49
56
  import { createFormI18nInstance } from '../i18n/index.js'
57
+ import { getAvailableLanguages } from '../i18n/languages.js'
50
58
  import { type Translator } from '../i18n/types.js'
51
- import { type ExecutableCondition } from './types.js'
59
+ import {
60
+ type ConditionEvaluation,
61
+ type ExecutableCondition
62
+ } from './types.js'
52
63
  import { type PageController } from '../pageControllers/PageController.js'
53
64
  import {
54
65
  createPage,
@@ -122,7 +133,7 @@ export class FormModel {
122
133
  const result = schema.validate(def, { abortEarly: false })
123
134
 
124
135
  if (result.error) {
125
- throw result.error
136
+ throw new SchemaValidationError(result.error)
126
137
  }
127
138
 
128
139
  // Make a clone of the shallow copy returned
@@ -240,7 +251,12 @@ export class FormModel {
240
251
  }
241
252
 
242
253
  /** Returns a scoped translator pair for the given language. */
243
- createTranslator(language = 'en-GB'): Translator {
254
+ createTranslator(language = EN_GB): Translator {
255
+ // @ts-expect-error - dynamic language lookup
256
+ if (!this.def.metadata?.translations?.[language]) {
257
+ // If not translations defined in the FormDefinition, always default to English
258
+ language = EN_GB
259
+ }
244
260
  return createTranslator(this.i18nInstance, language)
245
261
  }
246
262
 
@@ -285,23 +301,43 @@ export class FormModel {
285
301
  })
286
302
 
287
303
  const { name, displayName, value } = condition
288
- const expr = this.toConditionExpression(value, parser)
289
304
 
290
- const fn = (evaluationState: FormState) => {
305
+ let expr
306
+ try {
307
+ expr = this.toConditionExpression(value, parser)
308
+ } catch (cause) {
309
+ throw new ConditionBuildError(displayName, { cause })
310
+ }
311
+
312
+ const evaluate = (evaluationState: FormState): ConditionEvaluation => {
291
313
  const ctx = this.toConditionContext(evaluationState, this.conditions)
314
+
292
315
  try {
293
- return expr.evaluate(ctx) as boolean
294
- } catch {
295
- return false
316
+ return {
317
+ outcome: (expr.evaluate(ctx) as boolean)
318
+ ? ConditionEvaluationOutcome.True
319
+ : ConditionEvaluationOutcome.False
320
+ }
321
+ } catch (err) {
322
+ return {
323
+ outcome: ConditionEvaluationOutcome.Error,
324
+ error: getErrorMessage(err)
325
+ }
296
326
  }
297
327
  }
298
328
 
329
+ // A failed evaluation continues to route as `false`. `evaluate` exists so
330
+ // that the two can be told apart when recording outcomes for submission.
331
+ const fn = (evaluationState: FormState) =>
332
+ evaluate(evaluationState).outcome === ConditionEvaluationOutcome.True
333
+
299
334
  return {
300
335
  name,
301
336
  displayName,
302
337
  value,
303
338
  expr,
304
- fn
339
+ fn,
340
+ evaluate
305
341
  }
306
342
  }
307
343
 
@@ -662,7 +698,7 @@ function validateFormState(
662
698
 
663
699
  // Add relevant state errors
664
700
  if (error) {
665
- const errorsState = error.details.map(getError)
701
+ const errorsState = error.details.map((item) => getError(EN_GB, item))
666
702
  return { ...context, errors: errors.concat(errorsState) }
667
703
  }
668
704
 
@@ -679,16 +715,3 @@ function getReferenceNumber(state: FormSubmissionState): string {
679
715
 
680
716
  return state.$$__referenceNumber
681
717
  }
682
-
683
- export function getAvailableLanguages(
684
- def: FormDefinition
685
- ): { name: string; code: string }[] {
686
- // @ts-expect-error - dynamic property
687
- if (def.metadata?.translations?.cy) {
688
- return [
689
- { name: 'English', code: 'en-GB' },
690
- { name: 'Cymraeg', code: 'cy' }
691
- ]
692
- }
693
- return []
694
- }
@@ -4,6 +4,7 @@ import {
4
4
  type Section
5
5
  } from '@defra/forms-model'
6
6
 
7
+ import { EN_GB } from '../../../constants.js'
7
8
  import { PaymentField } from '../components/PaymentField.js'
8
9
  import { type PaymentState } from '../components/PaymentField.types.js'
9
10
  import {
@@ -96,7 +97,7 @@ export class SummaryViewModel {
96
97
  .validate(this.context.relevantState, { ...opts, stripUnknown: true })
97
98
 
98
99
  // Format errors
99
- this.errors = result.error?.details.map(getError)
100
+ this.errors = result.error?.details.map((item) => getError(EN_GB, item))
100
101
  this.details = this.summaryDetails(request, sections, translator)
101
102
 
102
103
  // Format check answers
@@ -212,12 +213,12 @@ function ItemRepeat(
212
213
  translator: Translator
213
214
  ): DetailItemRepeat {
214
215
  const { collection, repeat } = page
215
- const { name, title } = repeat.options
216
-
216
+ const { name } = repeat.options
217
+ const { t, tPage } = translator
218
+ const title = tPage(page.pageDef, 'repeatTitle') || repeat.options.title
217
219
  const values = page.getListFromState(state)
218
220
  const count = values.length
219
- const value =
220
- count === 0 ? '' : translator.t('pages.repeater.pageTitle', { count })
221
+ const value = count === 0 ? '' : t('pages.repeater.pageTitle', { count })
221
222
 
222
223
  return {
223
224
  name,