@ons/design-system 70.0.7 → 70.0.9

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 (454) hide show
  1. package/README.md +11 -17
  2. package/components/access-code/_macro.njk +31 -25
  3. package/components/access-code/_macro.spec.js +145 -145
  4. package/components/access-code/access-code.dom.js +5 -5
  5. package/components/access-code/access-code.js +16 -16
  6. package/components/access-code/access-code.scss +22 -22
  7. package/components/access-code/access-code.spec.js +17 -17
  8. package/components/access-code/example-access-code-error.njk +49 -37
  9. package/components/access-code/example-access-code.njk +40 -30
  10. package/components/accordion/_macro.njk +7 -6
  11. package/components/accordion/_macro.spec.js +154 -154
  12. package/components/accordion/accordion.dom.js +10 -10
  13. package/components/accordion/accordion.js +50 -50
  14. package/components/accordion/accordion.spec.js +104 -104
  15. package/components/accordion/example-accordion-open.njk +0 -1
  16. package/components/address-input/_macro.njk +23 -11
  17. package/components/address-input/_macro.spec.js +420 -420
  18. package/components/address-input/autosuggest.address.dom.js +5 -5
  19. package/components/address-input/autosuggest.address.error.js +77 -77
  20. package/components/address-input/autosuggest.address.js +354 -359
  21. package/components/address-input/autosuggest.address.setter.js +95 -95
  22. package/components/address-input/autosuggest.address.spec.js +668 -651
  23. package/components/address-input/example-address-input-editable.njk +52 -50
  24. package/components/address-input/example-address-input-manual.njk +23 -21
  25. package/components/address-input/example-address-input.njk +40 -38
  26. package/components/address-output/_address-output.scss +3 -3
  27. package/components/address-output/_macro.njk +6 -6
  28. package/components/address-output/_macro.spec.js +84 -84
  29. package/components/autosuggest/_autosuggest.scss +114 -114
  30. package/components/autosuggest/_macro.njk +57 -37
  31. package/components/autosuggest/_macro.spec.js +255 -255
  32. package/components/autosuggest/autosuggest.dom.js +5 -5
  33. package/components/autosuggest/autosuggest.helpers.js +11 -11
  34. package/components/autosuggest/autosuggest.helpers.spec.js +73 -73
  35. package/components/autosuggest/autosuggest.js +20 -20
  36. package/components/autosuggest/autosuggest.spec.js +542 -536
  37. package/components/autosuggest/autosuggest.ui.js +478 -475
  38. package/components/autosuggest/example-autosuggest-country-multiple.njk +26 -26
  39. package/components/autosuggest/example-autosuggest-country.njk +24 -24
  40. package/components/autosuggest/fuse-config.js +17 -17
  41. package/components/back-to-top/_back-to-top.scss +27 -27
  42. package/components/back-to-top/_macro.spec.js +49 -49
  43. package/components/back-to-top/back-to-top.dom.js +5 -5
  44. package/components/back-to-top/back-to-top.js +52 -52
  45. package/components/back-to-top/back-to-top.spec.js +106 -106
  46. package/components/back-to-top/example-back-to-top.njk +183 -6
  47. package/components/back-to-top/example-full-page-back-to-top.njk +135 -123
  48. package/components/breadcrumbs/_breadcrumbs.scss +63 -65
  49. package/components/breadcrumbs/_macro.njk +12 -4
  50. package/components/breadcrumbs/_macro.spec.js +91 -91
  51. package/components/browser-banner/_browser-banner.scss +23 -23
  52. package/components/browser-banner/_macro.njk +6 -3
  53. package/components/browser-banner/_macro.spec.js +92 -92
  54. package/components/button/_button.scss +525 -491
  55. package/components/button/_macro.njk +63 -62
  56. package/components/button/_macro.spec.js +363 -363
  57. package/components/button/button.dom.js +15 -15
  58. package/components/button/button.js +53 -53
  59. package/components/button/button.spec.js +248 -240
  60. package/components/button/example-button-ghost.njk +1 -0
  61. package/components/call-to-action/_call-to-action.scss +5 -5
  62. package/components/call-to-action/_macro.njk +7 -5
  63. package/components/call-to-action/_macro.spec.js +28 -28
  64. package/components/call-to-action/example-call-to-action-default.njk +3 -2
  65. package/components/card/_card.scss +23 -23
  66. package/components/card/_macro.njk +26 -10
  67. package/components/card/_macro.spec.js +180 -180
  68. package/components/card/example-card-set-with-images.njk +31 -29
  69. package/components/card/example-card-set-with-lists.njk +58 -56
  70. package/components/card/example-card-set.njk +28 -26
  71. package/components/card/example-card.njk +9 -7
  72. package/components/char-check-limit/_macro.njk +1 -3
  73. package/components/char-check-limit/_macro.spec.js +48 -48
  74. package/components/char-check-limit/character-check.js +58 -58
  75. package/components/char-check-limit/character-check.spec.js +173 -173
  76. package/components/char-check-limit/character-limit.js +40 -40
  77. package/components/checkboxes/_checkbox-macro.njk +19 -15
  78. package/components/checkboxes/_checkbox-macro.spec.js +355 -355
  79. package/components/checkboxes/_checkbox.scss +180 -180
  80. package/components/checkboxes/_checkboxes.scss +37 -27
  81. package/components/checkboxes/_macro.njk +81 -72
  82. package/components/checkboxes/_macro.spec.js +261 -261
  83. package/components/checkboxes/checkbox-with-autoselect.js +32 -32
  84. package/components/checkboxes/checkbox-with-fieldset.js +21 -21
  85. package/components/checkboxes/checkboxes-with-reveal.js +10 -10
  86. package/components/checkboxes/checkboxes.dom.js +27 -27
  87. package/components/checkboxes/checkboxes.spec.js +183 -183
  88. package/components/checkboxes/example-checkboxes-disabled.njk +30 -30
  89. package/components/checkboxes/example-checkboxes-error.njk +0 -1
  90. package/components/checkboxes/example-checkboxes-with-descriptions.njk +7 -5
  91. package/components/checkboxes/example-checkboxes-with-hidden-label.njk +162 -170
  92. package/components/checkboxes/example-checkboxes-with-revealed-checkboxes-expanded.njk +81 -81
  93. package/components/checkboxes/example-checkboxes-with-revealed-checkboxes.njk +79 -79
  94. package/components/checkboxes/example-checkboxes-with-revealed-select-expanded.njk +7 -5
  95. package/components/checkboxes/example-checkboxes-with-revealed-select.njk +7 -5
  96. package/components/checkboxes/example-checkboxes-with-revealed-text-input-expanded.njk +7 -5
  97. package/components/checkboxes/example-checkboxes-with-revealed-text-input.njk +7 -5
  98. package/components/checkboxes/example-checkboxes-with-select-all-button.njk +7 -5
  99. package/components/checkboxes/example-checkboxes-with-visible-text-input.njk +7 -5
  100. package/components/checkboxes/example-checkboxes.njk +7 -5
  101. package/components/content-pagination/_content-pagination.scss +41 -41
  102. package/components/content-pagination/_macro.njk +34 -32
  103. package/components/content-pagination/_macro.spec.js +159 -159
  104. package/components/content-pagination/example-content-pagination.njk +17 -17
  105. package/components/cookies-banner/_cookies-banner.scss +22 -22
  106. package/components/cookies-banner/_macro.njk +19 -6
  107. package/components/cookies-banner/_macro.spec.js +177 -177
  108. package/components/cookies-banner/cookies-banner.dom.js +7 -7
  109. package/components/cookies-banner/cookies-banner.js +76 -76
  110. package/components/cookies-banner/cookies-banner.spec.js +72 -68
  111. package/components/cookies-banner/example-cookies-banner-cymraeg.njk +2 -1
  112. package/components/cookies-banner/example-cookies-banner.njk +3 -4
  113. package/components/date-input/_macro.njk +71 -63
  114. package/components/date-input/_macro.spec.js +338 -338
  115. package/components/date-input/example-date-input-error-for-single-field.njk +0 -1
  116. package/components/date-input/example-date-input-error.njk +0 -1
  117. package/components/description-list/_description-list.scss +23 -23
  118. package/components/description-list/_macro.njk +20 -11
  119. package/components/description-list/_macro.spec.js +144 -144
  120. package/components/details/_details.scss +109 -109
  121. package/components/details/_macro.njk +18 -11
  122. package/components/details/_macro.spec.js +132 -132
  123. package/components/details/details.dom.js +6 -6
  124. package/components/details/details.js +60 -60
  125. package/components/details/details.spec.js +106 -106
  126. package/components/details/example-details-with-warning.njk +15 -10
  127. package/components/document-list/_macro.njk +102 -93
  128. package/components/document-list/_macro.spec.js +444 -444
  129. package/components/document-list/document-list.scss +145 -149
  130. package/components/document-list/example-document-list-article-featured.njk +27 -25
  131. package/components/document-list/example-document-list-articles.njk +55 -53
  132. package/components/document-list/example-document-list-downloads.njk +49 -47
  133. package/components/document-list/example-document-list-search-result-featured.njk +19 -17
  134. package/components/document-list/example-document-list-search-results.njk +60 -58
  135. package/components/download-resources/_download-resources.scss +109 -108
  136. package/components/download-resources/download-resources.js +907 -900
  137. package/components/download-resources/download-resources.spec.js +461 -461
  138. package/components/duration/_macro.njk +61 -55
  139. package/components/duration/_macro.spec.js +291 -291
  140. package/components/duration/example-duration-error-for-single-field.njk +28 -26
  141. package/components/duration/example-duration-single-field.njk +23 -19
  142. package/components/duration/example-duration.njk +33 -29
  143. package/components/error/_macro.njk +8 -6
  144. package/components/error/_macro.spec.js +72 -72
  145. package/components/external-link/_external-link.scss +19 -19
  146. package/components/external-link/_macro.njk +7 -5
  147. package/components/external-link/_macro.spec.js +68 -68
  148. package/components/external-link/example-external-link.njk +9 -6
  149. package/components/feedback/_feedback.scss +31 -31
  150. package/components/feedback/_macro.njk +7 -5
  151. package/components/feedback/_macro.spec.js +72 -72
  152. package/components/field/_field-group.scss +10 -10
  153. package/components/field/_field.scss +16 -16
  154. package/components/field/_macro.njk +2 -2
  155. package/components/field/_macro.spec.js +80 -80
  156. package/components/fieldset/_fieldset.scss +27 -27
  157. package/components/fieldset/_macro.njk +23 -16
  158. package/components/fieldset/_macro.spec.js +161 -161
  159. package/components/footer/_footer.scss +45 -45
  160. package/components/footer/_macro.njk +28 -21
  161. package/components/footer/_macro.spec.js +452 -452
  162. package/components/footer/example-footer-cymraeg.njk +2 -1
  163. package/components/footer/example-footer-default.njk +3 -4
  164. package/components/footer/example-footer-transactional.njk +2 -1
  165. package/components/footer/example-footer-warning.njk +2 -1
  166. package/components/footer/example-footer-with-alternative-organisation.njk +2 -1
  167. package/components/footer/example-footer-with-coat-of-arms.njk +2 -1
  168. package/components/footer/example-footer-with-copyright.njk +2 -1
  169. package/components/footer/example-footer.njk +2 -1
  170. package/components/header/_header.scss +207 -202
  171. package/components/header/_macro.njk +183 -141
  172. package/components/header/_macro.spec.js +833 -829
  173. package/components/header/example-header-default.njk +2 -1
  174. package/components/header/example-header-external-for-survey-with-description.njk +2 -1
  175. package/components/header/example-header-external-for-surveys.njk +2 -1
  176. package/components/header/example-header-external-welsh.njk +7 -7
  177. package/components/header/example-header-external-with-navigation-and-search.njk +3 -2
  178. package/components/header/example-header-external-with-navigation.njk +2 -1
  179. package/components/header/example-header-external-with-service-links.njk +2 -1
  180. package/components/header/example-header-external-with-sub-navigation-removed.njk +2 -1
  181. package/components/header/example-header-external-with-sub-navigation.njk +3 -2
  182. package/components/header/example-header-internal.njk +2 -1
  183. package/components/header/example-header-multiple-logos.njk +2 -1
  184. package/components/header/{example-header-neutral-for-multicoloured-logo.njk → example-header-neutral.njk} +2 -1
  185. package/components/helpers/_grid.scss +4 -4
  186. package/components/helpers/grid.njk +17 -16
  187. package/components/hero/_hero.scss +48 -48
  188. package/components/hero/_macro.njk +6 -11
  189. package/components/hero/_macro.spec.js +59 -59
  190. package/components/hero/example-hero-dark.njk +2 -1
  191. package/components/hero/example-hero-default.njk +2 -1
  192. package/components/icon/_icon.scss +44 -44
  193. package/components/icon/_macro.njk +601 -168
  194. package/components/icon/_macro.spec.js +110 -110
  195. package/components/image/_image.scss +11 -11
  196. package/components/image/_macro.njk +7 -5
  197. package/components/image/_macro.spec.js +81 -81
  198. package/components/input/_input-type.scss +86 -89
  199. package/components/input/_input.scss +123 -124
  200. package/components/input/_macro.njk +114 -95
  201. package/components/input/_macro.spec.js +604 -604
  202. package/components/input/character-check.dom.js +5 -5
  203. package/components/input/example-input-search-with-character-check.njk +1 -1
  204. package/components/input/example-input-search-with-placeholder.njk +1 -1
  205. package/components/input/example-input-search.njk +1 -1
  206. package/components/input/input.dom.js +5 -5
  207. package/components/input/input.js +10 -10
  208. package/components/input/input.spec.js +18 -18
  209. package/components/label/_label.scss +24 -24
  210. package/components/label/_macro.njk +32 -26
  211. package/components/label/_macro.spec.js +173 -170
  212. package/components/language-selector/_macro.njk +11 -2
  213. package/components/language-selector/_macro.spec.js +97 -97
  214. package/components/language-selector/language.scss +7 -7
  215. package/components/list/_list.scss +110 -97
  216. package/components/list/_macro.njk +93 -73
  217. package/components/list/_macro.spec.js +583 -583
  218. package/components/message/_macro.njk +20 -7
  219. package/components/message/_macro.spec.js +74 -74
  220. package/components/message/_message.scss +39 -39
  221. package/components/message-list/_macro.njk +26 -20
  222. package/components/message-list/_macro.spec.js +86 -86
  223. package/components/message-list/_message-list.scss +16 -16
  224. package/components/modal/_macro.njk +11 -12
  225. package/components/modal/_macro.spec.js +69 -69
  226. package/components/modal/_modal.scss +36 -36
  227. package/components/modal/modal.dom.js +6 -6
  228. package/components/modal/modal.js +89 -89
  229. package/components/modal/modal.spec.js +50 -50
  230. package/components/multiple-input-fields/_macro.njk +30 -28
  231. package/components/mutually-exclusive/_macro.njk +20 -13
  232. package/components/mutually-exclusive/_macro.spec.js +140 -140
  233. package/components/mutually-exclusive/example-mutually-exclusive-checkboxes.njk +6 -4
  234. package/components/mutually-exclusive/example-mutually-exclusive-date.njk +7 -5
  235. package/components/mutually-exclusive/example-mutually-exclusive-duration.njk +44 -40
  236. package/components/mutually-exclusive/example-mutually-exclusive-email.njk +7 -5
  237. package/components/mutually-exclusive/example-mutually-exclusive-multiple-options.njk +6 -4
  238. package/components/mutually-exclusive/example-mutually-exclusive-number.njk +6 -4
  239. package/components/mutually-exclusive/example-mutually-exclusive-textarea.njk +6 -4
  240. package/components/mutually-exclusive/mutually-exclusive.checkboxes.spec.js +188 -188
  241. package/components/mutually-exclusive/mutually-exclusive.date.spec.js +211 -211
  242. package/components/mutually-exclusive/mutually-exclusive.dom.js +5 -5
  243. package/components/mutually-exclusive/mutually-exclusive.duration.spec.js +210 -210
  244. package/components/mutually-exclusive/mutually-exclusive.email.spec.js +90 -90
  245. package/components/mutually-exclusive/mutually-exclusive.js +137 -137
  246. package/components/mutually-exclusive/mutually-exclusive.multiple-options.checkboxes.spec.js +197 -197
  247. package/components/mutually-exclusive/mutually-exclusive.number.spec.js +96 -96
  248. package/components/mutually-exclusive/mutually-exclusive.textarea.spec.js +102 -102
  249. package/components/navigation/_macro.njk +133 -67
  250. package/components/navigation/_macro.spec.js +360 -354
  251. package/components/navigation/_navigation.scss +112 -122
  252. package/components/navigation/navigation.dom.js +35 -35
  253. package/components/navigation/navigation.js +49 -49
  254. package/components/navigation/navigation.spec.js +249 -249
  255. package/components/pagination/_macro.njk +42 -20
  256. package/components/pagination/_macro.spec.js +342 -335
  257. package/components/pagination/_pagination.scss +58 -58
  258. package/components/panel/_macro.njk +27 -16
  259. package/components/panel/_macro.spec.js +372 -372
  260. package/components/panel/_panel.scss +200 -199
  261. package/components/panel/example-panel-bare.njk +6 -4
  262. package/components/panel/example-panel-with-announcement.njk +7 -4
  263. package/components/panel/example-panel-with-error-summary.njk +6 -4
  264. package/components/panel/example-panel-with-warning.njk +5 -3
  265. package/components/password/_macro.njk +7 -5
  266. package/components/password/_macro.spec.js +95 -95
  267. package/components/password/password.dom.js +5 -5
  268. package/components/password/password.js +10 -10
  269. package/components/password/password.spec.js +26 -26
  270. package/components/phase-banner/_macro.njk +3 -3
  271. package/components/phase-banner/_macro.spec.js +86 -86
  272. package/components/phase-banner/_phase-banner.scss +16 -16
  273. package/components/phase-banner/example-phase-banner-alpha.njk +2 -1
  274. package/components/phase-banner/example-phase-banner-beta.njk +4 -3
  275. package/components/question/_macro.njk +62 -47
  276. package/components/question/_macro.spec.js +235 -235
  277. package/components/question/_question.scss +24 -24
  278. package/components/question/example-question-ccs.njk +40 -35
  279. package/components/question/example-question-fieldset.njk +84 -80
  280. package/components/question/example-question-interviewer-note.njk +27 -24
  281. package/components/question/example-question-no-fieldset.njk +39 -33
  282. package/components/quote/_macro.njk +3 -1
  283. package/components/quote/_macro.spec.js +52 -52
  284. package/components/quote/_quote.scss +24 -24
  285. package/components/radios/_macro.njk +54 -36
  286. package/components/radios/_macro.spec.js +545 -524
  287. package/components/radios/_radio.scss +49 -48
  288. package/components/radios/_radios.scss +14 -20
  289. package/components/radios/check-radios.js +21 -21
  290. package/components/radios/clear-radios.js +45 -45
  291. package/components/radios/example-radios-with-clear-button-expanded.njk +6 -4
  292. package/components/radios/example-radios-with-clear-button.njk +6 -4
  293. package/components/radios/example-radios-with-descriptions.njk +7 -5
  294. package/components/radios/example-radios-with-revealed-select-expanded.njk +6 -4
  295. package/components/radios/example-radios-with-revealed-select.njk +6 -4
  296. package/components/radios/example-radios-with-revealed-text-area-expanded.njk +7 -5
  297. package/components/radios/example-radios-with-revealed-text-area.njk +7 -5
  298. package/components/radios/example-radios-with-revealed-text-input-expanded.njk +7 -5
  299. package/components/radios/example-radios-with-revealed-text-input.njk +7 -5
  300. package/components/radios/example-radios-with-separator.njk +6 -4
  301. package/components/radios/example-radios-with-visible-text-input.njk +7 -5
  302. package/components/radios/example-radios-without-border.njk +0 -1
  303. package/components/radios/example-radios.njk +7 -5
  304. package/components/radios/radio-with-fieldset.js +22 -22
  305. package/components/radios/radios.dom.js +32 -32
  306. package/components/radios/radios.spec.js +251 -251
  307. package/components/related-content/_macro.njk +10 -11
  308. package/components/related-content/_macro.spec.js +109 -109
  309. package/components/related-content/_related-content.scss +12 -12
  310. package/components/related-content/_section-macro.njk +7 -7
  311. package/components/related-content/_section-macro.spec.js +20 -20
  312. package/components/related-content/example-related-content-general.njk +5 -3
  313. package/components/related-content/example-related-content-multiple-rows-of-links.njk +51 -49
  314. package/components/related-content/example-related-content-social-media.njk +40 -38
  315. package/components/relationships/_macro.njk +10 -8
  316. package/components/relationships/_macro.spec.js +94 -94
  317. package/components/relationships/_relationships.scss +9 -9
  318. package/components/relationships/example-relationships-error.njk +176 -168
  319. package/components/relationships/example-relationships-you.njk +169 -163
  320. package/components/relationships/example-relationships.njk +167 -161
  321. package/components/relationships/relationships.dom.js +5 -5
  322. package/components/relationships/relationships.js +18 -18
  323. package/components/relationships/relationships.spec.js +71 -71
  324. package/components/reply/_macro.spec.js +47 -47
  325. package/components/reply/reply-input.js +15 -15
  326. package/components/reply/reply.dom.js +5 -5
  327. package/components/reply/reply.spec.js +57 -57
  328. package/components/section-navigation/_macro.njk +34 -12
  329. package/components/section-navigation/_macro.spec.js +210 -210
  330. package/components/section-navigation/_section-navigation.scss +76 -76
  331. package/components/select/_macro.njk +21 -18
  332. package/components/select/_macro.spec.js +166 -166
  333. package/components/share-page/_macro.njk +10 -5
  334. package/components/share-page/_macro.spec.js +68 -68
  335. package/components/skip-to-content/_macro.njk +1 -1
  336. package/components/skip-to-content/_macro.spec.js +54 -54
  337. package/components/skip-to-content/_skip.scss +30 -30
  338. package/components/skip-to-content/example-skip-to-content.njk +1 -0
  339. package/components/skip-to-content/skip-to-content.dom.js +6 -6
  340. package/components/skip-to-content/skip-to-content.js +7 -7
  341. package/components/skip-to-content/skip-to-content.spec.js +21 -21
  342. package/components/status/_macro.njk +1 -1
  343. package/components/status/_macro.spec.js +53 -53
  344. package/components/status/_status.scss +32 -32
  345. package/components/summary/_macro.njk +53 -23
  346. package/components/summary/_macro.spec.js +551 -535
  347. package/components/summary/_summary.scss +191 -195
  348. package/components/summary/example-summary-household-no-rows.njk +18 -16
  349. package/components/summary/example-summary-household.njk +75 -73
  350. package/components/summary/example-summary-hub-minimal.njk +74 -72
  351. package/components/summary/example-summary-hub.njk +169 -167
  352. package/components/table/_macro.njk +72 -45
  353. package/components/table/_macro.spec.js +499 -499
  354. package/components/table/_table.scss +204 -201
  355. package/components/table/scrollable-table.dom.js +5 -5
  356. package/components/table/scrollable-table.js +60 -60
  357. package/components/table/sortable-table.dom.js +5 -5
  358. package/components/table/sortable-table.js +135 -135
  359. package/components/table/table.spec.js +144 -140
  360. package/components/table-of-contents/_macro.njk +34 -32
  361. package/components/table-of-contents/_macro.spec.js +125 -125
  362. package/components/table-of-contents/_toc.scss +9 -9
  363. package/components/table-of-contents/example-table-of-contents-grouped.njk +1 -1
  364. package/components/table-of-contents/example-table-of-contents-single.njk +1 -1
  365. package/components/table-of-contents/example-table-of-contents-sticky-full-page.njk +79 -38
  366. package/components/table-of-contents/example-table-of-contents-sticky.njk +50 -13
  367. package/components/table-of-contents/toc.dom.js +5 -5
  368. package/components/table-of-contents/toc.js +30 -30
  369. package/components/table-of-contents/toc.spec.js +88 -88
  370. package/components/tabs/_macro.njk +12 -6
  371. package/components/tabs/_macro.spec.js +92 -92
  372. package/components/tabs/_tabs.scss +120 -115
  373. package/components/tabs/example-tabs-details.njk +5 -6
  374. package/components/tabs/tabs.dom.js +5 -5
  375. package/components/tabs/tabs.js +266 -266
  376. package/components/tabs/tabs.spec.js +268 -268
  377. package/components/text-indent/_macro.njk +1 -3
  378. package/components/text-indent/_macro.spec.js +33 -33
  379. package/components/text-indent/_text-indent.scss +3 -3
  380. package/components/textarea/_macro.njk +49 -46
  381. package/components/textarea/_macro.spec.js +227 -238
  382. package/components/textarea/textarea.dom.js +5 -5
  383. package/components/textarea/textarea.spec.js +78 -74
  384. package/components/timeline/_macro.njk +4 -6
  385. package/components/timeline/_macro.spec.js +83 -83
  386. package/components/timeline/_timeline.scss +26 -26
  387. package/components/timeout-modal/_macro.njk +21 -19
  388. package/components/timeout-modal/_macro.spec.js +47 -47
  389. package/components/timeout-modal/example-timeout-modal.njk +16 -14
  390. package/components/timeout-modal/timeout-modal.dom.js +9 -9
  391. package/components/timeout-modal/timeout-modal.js +66 -66
  392. package/components/timeout-modal/timeout-modal.spec.js +157 -157
  393. package/components/timeout-panel/_macro.njk +19 -17
  394. package/components/timeout-panel/_macro.spec.js +41 -41
  395. package/components/timeout-panel/example-panel-with-timeout-warning.njk +13 -11
  396. package/components/timeout-panel/timeout-panel.dom.js +8 -8
  397. package/components/timeout-panel/timeout-panel.spec.js +118 -118
  398. package/components/upload/_macro.njk +20 -16
  399. package/components/upload/_macro.spec.js +52 -52
  400. package/components/upload/_upload.scss +28 -28
  401. package/components/video/_macro.njk +16 -2
  402. package/components/video/_macro.spec.js +42 -42
  403. package/components/video/_video.scss +16 -16
  404. package/components/video/example-video.njk +2 -2
  405. package/components/video/video.dom.js +5 -5
  406. package/components/video/video.js +32 -32
  407. package/components/video/video.spec.js +103 -97
  408. package/css/main.css +1 -1
  409. package/favicons/manifest.json +25 -25
  410. package/js/abortable-fetch.js +23 -23
  411. package/js/analytics.js +53 -53
  412. package/js/cookies-functions.js +135 -135
  413. package/js/cookies-settings.dom.js +7 -7
  414. package/js/cookies-settings.js +77 -77
  415. package/js/cookies-settings.spec.js +106 -106
  416. package/js/domready.js +8 -8
  417. package/js/fetch.js +14 -14
  418. package/js/inpagelink.dom.js +5 -5
  419. package/js/inpagelink.js +19 -19
  420. package/js/polyfills.js +0 -1
  421. package/js/print-button.js +6 -6
  422. package/js/timeout.js +211 -211
  423. package/layout/_dsTemplate.njk +22 -20
  424. package/layout/_template.njk +63 -51
  425. package/package.json +132 -128
  426. package/scripts/main.es5.js +1 -1
  427. package/scripts/main.js +1 -1
  428. package/scss/base/_forms.scss +10 -10
  429. package/scss/base/_global.scss +45 -44
  430. package/scss/base/_typography.scss +20 -20
  431. package/scss/helpers/_functions.scss +18 -15
  432. package/scss/helpers/_mixins.scss +59 -53
  433. package/scss/helpers/_mq.scss +62 -65
  434. package/scss/objects/_container.scss +20 -20
  435. package/scss/objects/_page.scss +33 -33
  436. package/scss/objects/_spacing.scss +10 -10
  437. package/scss/overrides/hcm.scss +237 -237
  438. package/scss/overrides/rtl.scss +95 -95
  439. package/scss/print.scss +47 -47
  440. package/scss/utilities/_border.scss +7 -7
  441. package/scss/utilities/_colors.scss +6 -6
  442. package/scss/utilities/_display.scss +8 -8
  443. package/scss/utilities/_float.scss +7 -7
  444. package/scss/utilities/_grid.scss +144 -144
  445. package/scss/utilities/_highlight.scss +4 -4
  446. package/scss/utilities/_margin.scss +17 -17
  447. package/scss/utilities/_pad.scss +15 -15
  448. package/scss/utilities/_typography.scss +35 -33
  449. package/scss/utilities/_utilities.scss +8 -8
  450. package/scss/utilities/_visibility.scss +25 -25
  451. package/scss/vars/_colors.scss +116 -116
  452. package/scss/vars/_forms.scss +22 -22
  453. package/scss/vars/_grid.scss +11 -9
  454. package/scss/vars/_typography.scss +54 -54
@@ -2,729 +2,746 @@ import { PuppeteerEndpointFaker } from '../../tests/helpers/puppeteer';
2
2
  import { renderComponent, setTestPage } from '../../tests/helpers/rendering';
3
3
 
4
4
  const EXAMPLE_ADDRESS_INPUT = {
5
- id: 'address',
6
- autocomplete: 'off',
7
- label: {
8
- text: 'Enter address or postcode and select from results',
9
- },
10
- legend: 'What is the address?',
11
- isEditable: true,
12
- mandatory: true,
13
- dontWrap: true,
14
- instructions: 'Use up and down keys to navigate.',
15
- ariaYouHaveSelected: 'You have selected',
16
- ariaMinChars: 'Enter 3 or more characters for suggestions.',
17
- minChars: 3,
18
- ariaResultsLabel: 'Country suggestions',
19
- ariaOneResult: 'There is one suggestion available.',
20
- ariaNResults: 'There are {n} suggestions available.',
21
- ariaLimitedResults: 'Type more characters to improve your search',
22
- ariaGroupedResults: 'There are {n} for {x}',
23
- groupCount: '{n} addresses',
24
- moreResults: 'Continue entering to improve suggestions',
25
- resultsTitle: 'Suggestions',
26
- resultsTitleId: 'country-of-birth-suggestions',
27
- noResults: 'No suggestions found.',
28
- tooManyResults: '{n} results found. Enter more of the address to improve results',
29
- typeMore: 'Continue entering to get suggestions',
30
- errorTitle: 'There is a problem with your answer',
31
- errorMessageEnter: 'Enter an address',
32
- errorMessageSelect: 'Select an address',
33
- errorMessageAPI: 'Sorry, there is a problem loading addresses',
34
- errorMessageAPILinkText: 'Enter address manually',
35
- options: {
36
- regionCode: 'gb-eng',
37
- addressType: 'residential',
38
- },
39
- organisation: {
40
- label: 'Organisation',
41
- },
42
- line1: {
43
- label: 'Address line 1',
44
- },
45
- line2: {
46
- label: 'Address line 2',
47
- },
48
- town: {
49
- label: 'Town or city',
50
- },
51
- postcode: {
52
- label: 'Postcode',
53
- },
54
- searchButton: 'Search for an address',
55
- manualLinkText: 'Manually enter address',
5
+ id: 'address',
6
+ autocomplete: 'off',
7
+ label: {
8
+ text: 'Enter address or postcode and select from results',
9
+ },
10
+ legend: 'What is the address?',
11
+ isEditable: true,
12
+ mandatory: true,
13
+ dontWrap: true,
14
+ instructions: 'Use up and down keys to navigate.',
15
+ ariaYouHaveSelected: 'You have selected',
16
+ ariaMinChars: 'Enter 3 or more characters for suggestions.',
17
+ minChars: 3,
18
+ ariaResultsLabel: 'Country suggestions',
19
+ ariaOneResult: 'There is one suggestion available.',
20
+ ariaNResults: 'There are {n} suggestions available.',
21
+ ariaLimitedResults: 'Type more characters to improve your search',
22
+ ariaGroupedResults: 'There are {n} for {x}',
23
+ groupCount: '{n} addresses',
24
+ moreResults: 'Continue entering to improve suggestions',
25
+ resultsTitle: 'Suggestions',
26
+ resultsTitleId: 'country-of-birth-suggestions',
27
+ noResults: 'No suggestions found.',
28
+ tooManyResults: '{n} results found. Enter more of the address to improve results',
29
+ typeMore: 'Continue entering to get suggestions',
30
+ errorTitle: 'There is a problem with your answer',
31
+ errorMessageEnter: 'Enter an address',
32
+ errorMessageSelect: 'Select an address',
33
+ errorMessageAPI: 'Sorry, there is a problem loading addresses',
34
+ errorMessageAPILinkText: 'Enter address manually',
35
+ options: {
36
+ regionCode: 'gb-eng',
37
+ addressType: 'residential',
38
+ },
39
+ organisation: {
40
+ label: 'Organisation',
41
+ },
42
+ line1: {
43
+ label: 'Address line 1',
44
+ },
45
+ line2: {
46
+ label: 'Address line 2',
47
+ },
48
+ town: {
49
+ label: 'Town or city',
50
+ },
51
+ postcode: {
52
+ label: 'Postcode',
53
+ },
54
+ searchButton: 'Search for an address',
55
+ manualLinkText: 'Manually enter address',
56
56
  };
57
57
 
58
58
  const EXAMPLE_ADDRESS_INPUT_WITH_API = {
59
- ...EXAMPLE_ADDRESS_INPUT,
60
- APIDomain: '/fake/api',
61
- APIDomainBearerToken: 'someToken',
62
- externalInitialiser: true,
59
+ ...EXAMPLE_ADDRESS_INPUT,
60
+ APIDomain: '/fake/api',
61
+ APIDomainBearerToken: 'someToken',
62
+ externalInitialiser: true,
63
63
  };
64
64
 
65
65
  describe('script: address-input', () => {
66
- const apiFaker = new PuppeteerEndpointFaker(EXAMPLE_ADDRESS_INPUT_WITH_API.APIDomain);
67
-
68
- apiFaker.setOverrides(
69
- [
70
- '/addresses/eq?input=196%20colle&limit=10',
71
- '/addresses/eq?input=cf142&limit=10',
72
- '/addresses/eq?input=cf14%202nt&limit=100&groupfullpostcodes=combo',
73
- ],
74
- {
75
- data: {
76
- status: { code: 200 },
77
- response: {
78
- addresses: [
79
- {
80
- uprn: '100070332099',
81
- formattedAddress: '196 College Road, Birmingham, B44 8HF',
82
- addressType: 'PAF',
83
- },
84
- {
85
- uprn: '100100119969',
86
- formattedAddress: '196 College Road, Whitchurch, Cardiff, CF14 2NZ',
87
- addressType: 'PAF',
88
- },
89
- ],
90
- },
91
- },
92
- },
93
- );
94
-
95
- apiFaker.setOverrides(['/addresses/eq?input=cf14%202&limit=10'], {
96
- data: {
97
- status: { code: 200 },
98
- response: {
99
- partpostcode: 'cf14 2',
100
- postcodes: [
101
- {
102
- postcode: 'CF14 2AA',
103
- streetName: 'Penlline Road',
104
- townName: 'Whitchurch',
105
- addressCount: 41,
106
- firstUprn: 10002526869,
107
- postTown: 'Cardiff',
108
- },
109
- {
110
- postcode: 'CF14 2AB',
111
- streetName: 'Penlline Road',
112
- townName: 'Whitchurch',
113
- addressCount: 1,
114
- firstUprn: 10002511038,
115
- postTown: 'Cardiff',
116
- },
66
+ const apiFaker = new PuppeteerEndpointFaker(EXAMPLE_ADDRESS_INPUT_WITH_API.APIDomain);
67
+
68
+ apiFaker.setOverrides(
69
+ [
70
+ '/addresses/eq?input=196%20colle&limit=10',
71
+ '/addresses/eq?input=cf142&limit=10',
72
+ '/addresses/eq?input=cf14%202nt&limit=100&groupfullpostcodes=combo',
117
73
  ],
118
- },
119
- },
120
- });
121
-
122
- apiFaker.setOverrides(['/addresses/eq/uprn/100070332099?addresstype=paf', '/addresses/eq/uprn/100070332099?addresstype=paf&epoch=75'], {
123
- data: {
124
- status: { code: 200 },
125
- response: {
126
- address: {
127
- uprn: '100070332099',
128
- formattedAddress: '196 College Road, Whitchurch, Cardiff, CF14 2NT',
129
- addressLine1: '196 College Road',
130
- addressLine2: 'Whitchurch',
131
- addressLine3: '',
132
- townName: 'Cardiff',
133
- postcode: 'CF14 2NT',
134
- foundAddressType: 'PAF',
135
- },
136
- },
137
- },
138
- });
139
-
140
- apiFaker.setOverrides(['/addresses/eq/uprn/10002511038?addresstype=paf'], {
141
- data: {
142
- status: { code: 200 },
143
- response: {
144
- address: {
145
- uprn: '10002511038',
146
- formattedAddress: '197 College Road, Whitchurch, Cardiff, CF14 2AB',
147
- addressLine1: '197 College Road',
148
- addressLine2: 'Whitchurch',
149
- addressLine3: '',
150
- townName: 'Cardiff',
151
- postcode: 'CF14 2AB',
152
- foundAddressType: 'PAF',
153
- },
154
- },
155
- },
156
- });
157
-
158
- apiFaker.setOverrides(
159
- ['/addresses/eq/bucket?postcode=CF14%202AA&streetname=Penlline%20Road&townname=Whitchurch&groupfullpostcodes=combo'],
160
- {
161
- data: {
162
- status: { code: 200 },
163
- response: {
164
- addresses: [
165
- {
166
- uprn: '10002511038',
167
- formattedAddress: '197 College Road, Whitchurch, Cardiff, CF14 2AB',
168
- addressType: 'PAF',
74
+ {
75
+ data: {
76
+ status: { code: 200 },
77
+ response: {
78
+ addresses: [
79
+ {
80
+ uprn: '100070332099',
81
+ formattedAddress: '196 College Road, Birmingham, B44 8HF',
82
+ addressType: 'PAF',
83
+ },
84
+ {
85
+ uprn: '100100119969',
86
+ formattedAddress: '196 College Road, Whitchurch, Cardiff, CF14 2NZ',
87
+ addressType: 'PAF',
88
+ },
89
+ ],
90
+ },
169
91
  },
170
- ],
171
92
  },
172
- },
173
- },
174
- );
175
-
176
- beforeAll(async () => {
177
- await apiFaker.setup(page);
178
- });
93
+ );
179
94
 
180
- beforeEach(async () => {
181
- await apiFaker.reset();
182
- });
183
-
184
- describe('When the component initializes', () => {
185
- it('checks api status by trying a request', async () => {
186
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
187
- await page.waitForTimeout(50);
188
-
189
- expect(apiFaker.getRequestCount('/addresses/eq?input=cf142&limit=10')).toBe(1);
95
+ apiFaker.setOverrides(['/addresses/eq?input=cf14%202&limit=10'], {
96
+ data: {
97
+ status: { code: 200 },
98
+ response: {
99
+ partpostcode: 'cf14 2',
100
+ postcodes: [
101
+ {
102
+ postcode: 'CF14 2AA',
103
+ streetName: 'Penlline Road',
104
+ townName: 'Whitchurch',
105
+ addressCount: 41,
106
+ firstUprn: 10002526869,
107
+ postTown: 'Cardiff',
108
+ },
109
+ {
110
+ postcode: 'CF14 2AB',
111
+ streetName: 'Penlline Road',
112
+ townName: 'Whitchurch',
113
+ addressCount: 1,
114
+ firstUprn: 10002511038,
115
+ postTown: 'Cardiff',
116
+ },
117
+ ],
118
+ },
119
+ },
190
120
  });
191
121
 
192
- describe('when api status is okay', () => {
193
- beforeEach(async () => {
194
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
195
- await page.waitForTimeout(50);
196
- });
197
-
198
- it('does not switch to manual input', async () => {
199
- const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
200
- node.classList.contains('ons-u-db-no-js_enabled'),
201
- );
202
- expect(isManualElementHidden).toBe(true);
203
- const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) => node.classList.contains('ons-u-d-no'));
204
- expect(isSearchElementHidden).toBe(false);
205
- });
122
+ apiFaker.setOverrides(['/addresses/eq/uprn/100070332099?addresstype=paf', '/addresses/eq/uprn/100070332099?addresstype=paf&epoch=75'], {
123
+ data: {
124
+ status: { code: 200 },
125
+ response: {
126
+ address: {
127
+ uprn: '100070332099',
128
+ formattedAddress: '196 College Road, Whitchurch, Cardiff, CF14 2NT',
129
+ addressLine1: '196 College Road',
130
+ addressLine2: 'Whitchurch',
131
+ addressLine3: '',
132
+ townName: 'Cardiff',
133
+ postcode: 'CF14 2NT',
134
+ foundAddressType: 'PAF',
135
+ },
136
+ },
137
+ },
206
138
  });
207
139
 
208
- describe('when api status is not okay', () => {
209
- beforeEach(async () => {
210
- apiFaker.setTemporaryOverride('/addresses/eq?input=cf142&limit=10', {
211
- data: {
212
- status: { code: 401 },
213
- },
214
- });
215
-
216
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
217
- await page.waitForTimeout(50);
218
- });
219
-
220
- it('switches to manual input', async () => {
221
- const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
222
- node.classList.contains('ons-u-db-no-js_enabled'),
223
- );
224
- expect(isManualElementHidden).toBe(false);
225
- const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) => node.classList.contains('ons-u-d-no'));
226
- expect(isSearchElementHidden).toBe(true);
227
- });
228
-
229
- it('hides the search button', async () => {
230
- const hassClass = await page.$eval('.ons-js-address-search-btn', (node) => node.classList.contains('ons-u-d-no'));
231
- expect(hassClass).toBe(true);
232
- });
140
+ apiFaker.setOverrides(['/addresses/eq/uprn/10002511038?addresstype=paf'], {
141
+ data: {
142
+ status: { code: 200 },
143
+ response: {
144
+ address: {
145
+ uprn: '10002511038',
146
+ formattedAddress: '197 College Road, Whitchurch, Cardiff, CF14 2AB',
147
+ addressLine1: '197 College Road',
148
+ addressLine2: 'Whitchurch',
149
+ addressLine3: '',
150
+ townName: 'Cardiff',
151
+ postcode: 'CF14 2AB',
152
+ foundAddressType: 'PAF',
153
+ },
154
+ },
155
+ },
233
156
  });
234
- });
235
-
236
- describe('When the user inputs', () => {
237
- it('navigates to the first suggestion with the "Down" arrow key', async () => {
238
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
239
157
 
240
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14'));
241
- await page.type('.ons-js-autosuggest-input', '2', { delay: 20 });
242
- await page.keyboard.press('ArrowDown');
158
+ apiFaker.setOverrides(
159
+ ['/addresses/eq/bucket?postcode=CF14%202AA&streetname=Penlline%20Road&townname=Whitchurch&groupfullpostcodes=combo'],
160
+ {
161
+ data: {
162
+ status: { code: 200 },
163
+ response: {
164
+ addresses: [
165
+ {
166
+ uprn: '10002511038',
167
+ formattedAddress: '197 College Road, Whitchurch, Cardiff, CF14 2AB',
168
+ addressType: 'PAF',
169
+ },
170
+ ],
171
+ },
172
+ },
173
+ },
174
+ );
243
175
 
244
- const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
245
- expect(selectedOption.trim()).toBe('196 College Road, Birmingham, B44 8HF');
176
+ beforeAll(async () => {
177
+ await apiFaker.setup(page);
246
178
  });
247
179
 
248
- it('provides expected parameters to the address API', async () => {
249
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
250
-
251
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = '196 coll'));
252
- await page.type('.ons-js-autosuggest-input', 'e');
253
-
254
- expect(apiFaker.getRequestCount('/addresses/eq?input=196%20colle&limit=10')).toBe(1);
180
+ beforeEach(async () => {
181
+ await apiFaker.reset();
255
182
  });
256
183
 
257
- describe('when the value is a full postcode', () => {
258
- beforeEach(async () => {
259
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
260
-
261
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14 2N'));
262
- await page.type('.ons-js-autosuggest-input', 'T');
263
- });
184
+ describe('When the component initializes', () => {
185
+ it('checks api status by trying a request', async () => {
186
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
187
+ await page.waitForTimeout(50);
264
188
 
265
- it('provides expected parameters to the address API where `limit` is 100', async () => {
266
- expect(apiFaker.getRequestCount('/addresses/eq?input=cf14%202nt&limit=100&groupfullpostcodes=combo')).toBe(1);
267
- });
268
-
269
- it('has expected suggestion entries', async () => {
270
- const suggestions = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.map((node) => node.textContent.trim()));
271
- expect(suggestions).toEqual(['196 College Road, Birmingham, B44 8HF', '196 College Road, Whitchurch, Cardiff, CF14 2NZ']);
272
- });
273
- });
274
-
275
- describe('when the query not a partial postcode', () => {
276
- beforeEach(async () => {
277
- apiFaker.setTemporaryOverride(
278
- '/addresses/eq?input=penlline%20road%20whitchurch%20cardiff%20cf14%202nz&limit=100&groupfullpostcodes=combo',
279
- {
280
- data: {
281
- status: { code: 200 },
282
- response: {
283
- addresses: [
284
- {
285
- uprn: '100070332099',
286
- formattedAddress: '1 Penlline Road, Whitchurch, Cardiff, CF14 2NZ',
287
- addressType: 'PAF',
288
- },
289
- {
290
- uprn: '100100119979',
291
- formattedAddress: '2 Penlline Road, Whitchurch, Cardiff, CF14 2NZ',
292
- addressType: 'PAF',
293
- },
294
- ],
295
- },
296
- },
297
- },
298
- );
299
-
300
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
301
-
302
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'Penlline Road, Whitchurch, Cardiff, CF14 2N'));
303
- await page.type('.ons-js-autosuggest-input', 'Z');
304
- await page.waitForTimeout(100);
305
- });
306
-
307
- it('provides expected parameters to the address API', async () => {
308
- expect(
309
- apiFaker.getRequestCount(
310
- '/addresses/eq?input=penlline%20road%20whitchurch%20cardiff%20cf14%202nz&limit=100&groupfullpostcodes=combo',
311
- ),
312
- ).toBe(1);
313
- });
314
-
315
- it('has expected suggestion entries', async () => {
316
- const suggestions = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.map((node) => node.textContent.trim()));
317
- expect(suggestions).toEqual(['1 Penlline Road, Whitchurch, Cardiff, CF14 2NZ', '2 Penlline Road, Whitchurch, Cardiff, CF14 2NZ']);
318
- });
319
-
320
- describe('when a suggestion is selected', () => {
321
- beforeEach(async () => {
322
- await page.keyboard.press('ArrowDown');
323
- await page.keyboard.press('Enter');
324
- await page.waitForTimeout(100);
189
+ expect(apiFaker.getRequestCount('/addresses/eq?input=cf142&limit=10')).toBe(1);
325
190
  });
326
191
 
327
- it('makes expected request when a suggestion is selected', async () => {
328
- expect(apiFaker.getRequestCount('/addresses/eq/uprn/100070332099?addresstype=paf')).toBe(1);
192
+ describe('when api status is okay', () => {
193
+ beforeEach(async () => {
194
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
195
+ await page.waitForTimeout(50);
196
+ });
197
+
198
+ it('does not switch to manual input', async () => {
199
+ const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
200
+ node.classList.contains('ons-u-db-no-js_enabled'),
201
+ );
202
+ expect(isManualElementHidden).toBe(true);
203
+ const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) =>
204
+ node.classList.contains('ons-u-d-no'),
205
+ );
206
+ expect(isSearchElementHidden).toBe(false);
207
+ });
329
208
  });
330
209
 
331
- it('populates manual input fields with address from selection', async () => {
332
- expect(await page.$eval('.ons-js-address-organisation', (node) => node.value)).toBe('');
333
- expect(await page.$eval('.ons-js-address-line1', (node) => node.value)).toBe('196 College Road');
334
- expect(await page.$eval('.ons-js-address-line2', (node) => node.value)).toBe('Whitchurch');
335
- expect(await page.$eval('.ons-js-address-town', (node) => node.value)).toBe('Cardiff');
336
- expect(await page.$eval('.ons-js-address-postcode', (node) => node.value)).toBe('CF14 2NT');
337
- expect(await page.$eval('.ons-js-hidden-uprn', (node) => node.value)).toBe('100070332099');
210
+ describe('when api status is not okay', () => {
211
+ beforeEach(async () => {
212
+ apiFaker.setTemporaryOverride('/addresses/eq?input=cf142&limit=10', {
213
+ data: {
214
+ status: { code: 401 },
215
+ },
216
+ });
217
+
218
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
219
+ await page.waitForTimeout(50);
220
+ });
221
+
222
+ it('switches to manual input', async () => {
223
+ const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
224
+ node.classList.contains('ons-u-db-no-js_enabled'),
225
+ );
226
+ expect(isManualElementHidden).toBe(false);
227
+ const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) =>
228
+ node.classList.contains('ons-u-d-no'),
229
+ );
230
+ expect(isSearchElementHidden).toBe(true);
231
+ });
232
+
233
+ it('hides the search button', async () => {
234
+ const hassClass = await page.$eval('.ons-js-address-search-btn', (node) => node.classList.contains('ons-u-d-no'));
235
+ expect(hassClass).toBe(true);
236
+ });
338
237
  });
339
- });
340
238
  });
341
239
 
342
- describe('when the query is a partial postcode', () => {
343
- beforeEach(async () => {
344
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
240
+ describe('When the user inputs', () => {
241
+ it('navigates to the first suggestion with the "Down" arrow key', async () => {
242
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
345
243
 
346
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14 '));
347
- await page.type('.ons-js-autosuggest-input', '2');
348
- await page.waitForTimeout(200);
349
- });
350
-
351
- it('provides expected parameters to the address API', async () => {
352
- expect(apiFaker.getRequestCount('/addresses/eq?input=cf14%202&limit=10')).toBe(1);
353
- });
354
-
355
- it('has expected suggestion entries', async () => {
356
- const suggestions = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.map((node) => node.textContent.trim()));
357
- expect(suggestions).toEqual([
358
- 'Penlline Road, Whitchurch, Cardiff, CF14 2AA (41 addresses)',
359
- '197 College Road, Whitchurch, Cardiff, CF14 2AB',
360
- ]);
361
- });
362
-
363
- describe('when a suggestion is selected', () => {
364
- beforeEach(async () => {
365
- await page.keyboard.press('ArrowDown');
366
- await page.keyboard.press('Enter');
367
- await page.waitForTimeout(200);
368
- });
244
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14'));
245
+ await page.type('.ons-js-autosuggest-input', '2', { delay: 20 });
246
+ await page.keyboard.press('ArrowDown');
369
247
 
370
- it('makes expected request', async () => {
371
- expect(
372
- apiFaker.getRequestCount(
373
- '/addresses/eq/bucket?postcode=CF14%202AA&streetname=Penlline%20Road&townname=Whitchurch&groupfullpostcodes=combo',
374
- ),
375
- ).toBe(1);
248
+ const selectedOption = await page.$eval('.ons-autosuggest__option--focused', (node) => node.textContent);
249
+ expect(selectedOption.trim()).toBe('196 College Road, Birmingham, B44 8HF');
376
250
  });
377
251
 
378
- it('has expected suggestion entries', async () => {
379
- const suggestions = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.map((node) => node.textContent.trim()));
380
- expect(suggestions).toEqual(['197 College Road, Whitchurch, Cardiff, CF14 2AB']);
381
- });
252
+ it('provides expected parameters to the address API', async () => {
253
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
382
254
 
383
- describe('when an inner suggestion is selected', () => {
384
- beforeEach(async () => {
385
- await page.keyboard.press('ArrowDown');
386
- await page.keyboard.press('Enter');
387
- await page.waitForTimeout(200);
388
- });
389
-
390
- it('populates manual input fields with address from selection', async () => {
391
- expect(await page.$eval('.ons-js-address-organisation', (node) => node.value)).toBe('');
392
- expect(await page.$eval('.ons-js-address-line1', (node) => node.value)).toBe('197 College Road');
393
- expect(await page.$eval('.ons-js-address-line2', (node) => node.value)).toBe('Whitchurch');
394
- expect(await page.$eval('.ons-js-address-town', (node) => node.value)).toBe('Cardiff');
395
- expect(await page.$eval('.ons-js-address-postcode', (node) => node.value)).toBe('CF14 2AB');
396
- expect(await page.$eval('.ons-js-hidden-uprn', (node) => node.value)).toBe('10002511038');
397
- });
398
- });
399
- });
400
- });
401
-
402
- describe('when there is an error retrieving the address', () => {
403
- it('switches to manual mode and hides search button', async () => {
404
- apiFaker.setTemporaryOverride('/addresses/eq?input=cf142&limit=10', {
405
- data: {
406
- status: { code: 200 },
407
- response: {
408
- addresses: [
409
- {
410
- uprn: 'bad',
411
- formattedAddress: '196 College Road, Birmingham, B44 8HF',
412
- addressType: 'PAF',
413
- },
414
- ],
415
- },
416
- },
417
- });
255
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = '196 coll'));
256
+ await page.type('.ons-js-autosuggest-input', 'e');
418
257
 
419
- apiFaker.setTemporaryOverride('/addresses/eq/uprn/bad?addresstype=paf', {
420
- data: {
421
- status: { code: 400 },
422
- },
258
+ expect(apiFaker.getRequestCount('/addresses/eq?input=196%20colle&limit=10')).toBe(1);
423
259
  });
424
260
 
425
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
261
+ describe('when the value is a full postcode', () => {
262
+ beforeEach(async () => {
263
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
426
264
 
427
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'cf14'));
428
- await page.type('.ons-js-autosuggest-input', '2', { delay: 20 });
429
- await page.keyboard.press('ArrowDown');
430
- await page.keyboard.press('Enter');
431
- await page.waitForTimeout(100);
265
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14 2N'));
266
+ await page.type('.ons-js-autosuggest-input', 'T');
267
+ });
432
268
 
433
- const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
434
- node.classList.contains('ons-u-db-no-js_enabled'),
435
- );
436
- expect(isManualElementHidden).toBe(false);
269
+ it('provides expected parameters to the address API where `limit` is 100', async () => {
270
+ expect(apiFaker.getRequestCount('/addresses/eq?input=cf14%202nt&limit=100&groupfullpostcodes=combo')).toBe(1);
271
+ });
437
272
 
438
- const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) => node.classList.contains('ons-u-d-no'));
439
- expect(isSearchElementHidden).toBe(true);
440
-
441
- const isSearchButtonElementHidden = await page.$eval('.ons-js-address-search-btn', (node) => node.classList.contains('ons-u-d-no'));
442
- expect(isSearchButtonElementHidden).toBe(true);
443
- });
444
- });
273
+ it('has expected suggestion entries', async () => {
274
+ const suggestions = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.map((node) => node.textContent.trim()));
275
+ expect(suggestions).toEqual(['196 College Road, Birmingham, B44 8HF', '196 College Road, Whitchurch, Cardiff, CF14 2NZ']);
276
+ });
277
+ });
445
278
 
446
- describe('when the form is submitted', () => {
447
- describe('when the selected address is manually changed', () => {
448
- it('clears the urpn field', async () => {
449
- await setTestPage(
450
- '/test',
451
- `
452
- <form action="/test/fake/form-handler" method="post">
453
- ${renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API)}
454
- <button type="submit">Submit</button>
455
- </form>
456
- `,
457
- );
458
-
459
- await page.$eval('form', (node) =>
460
- node.addEventListener('submit', (event) => {
461
- event.preventDefault();
462
- return false;
463
- }),
464
- );
465
-
466
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14 2N'));
467
- await page.type('.ons-js-autosuggest-input', 'T', { delay: 20 });
468
- await page.keyboard.press('ArrowDown');
469
- await page.keyboard.press('Enter');
470
- await page.waitForTimeout(100);
471
-
472
- const urpnValueBefore = await page.$eval('.ons-js-hidden-uprn', (node) => node.value);
473
- expect(urpnValueBefore).toBe('100070332099');
474
-
475
- await page.$eval('.ons-js-address-line1', (node) => (node.value = 'Something else'));
476
- await page.click('button[type=submit]');
477
-
478
- const urpnValueAfter = await page.$eval('.ons-js-hidden-uprn', (node) => node.value);
479
- expect(urpnValueAfter).toBe('');
279
+ describe('when the query not a partial postcode', () => {
280
+ beforeEach(async () => {
281
+ apiFaker.setTemporaryOverride(
282
+ '/addresses/eq?input=penlline%20road%20whitchurch%20cardiff%20cf14%202nz&limit=100&groupfullpostcodes=combo',
283
+ {
284
+ data: {
285
+ status: { code: 200 },
286
+ response: {
287
+ addresses: [
288
+ {
289
+ uprn: '100070332099',
290
+ formattedAddress: '1 Penlline Road, Whitchurch, Cardiff, CF14 2NZ',
291
+ addressType: 'PAF',
292
+ },
293
+ {
294
+ uprn: '100100119979',
295
+ formattedAddress: '2 Penlline Road, Whitchurch, Cardiff, CF14 2NZ',
296
+ addressType: 'PAF',
297
+ },
298
+ ],
299
+ },
300
+ },
301
+ },
302
+ );
303
+
304
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
305
+
306
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'Penlline Road, Whitchurch, Cardiff, CF14 2N'));
307
+ await page.type('.ons-js-autosuggest-input', 'Z');
308
+ await page.waitForTimeout(100);
309
+ });
310
+
311
+ it('provides expected parameters to the address API', async () => {
312
+ expect(
313
+ apiFaker.getRequestCount(
314
+ '/addresses/eq?input=penlline%20road%20whitchurch%20cardiff%20cf14%202nz&limit=100&groupfullpostcodes=combo',
315
+ ),
316
+ ).toBe(1);
317
+ });
318
+
319
+ it('has expected suggestion entries', async () => {
320
+ const suggestions = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.map((node) => node.textContent.trim()));
321
+ expect(suggestions).toEqual([
322
+ '1 Penlline Road, Whitchurch, Cardiff, CF14 2NZ',
323
+ '2 Penlline Road, Whitchurch, Cardiff, CF14 2NZ',
324
+ ]);
325
+ });
326
+
327
+ describe('when a suggestion is selected', () => {
328
+ beforeEach(async () => {
329
+ await page.keyboard.press('ArrowDown');
330
+ await page.keyboard.press('Enter');
331
+ await page.waitForTimeout(100);
332
+ });
333
+
334
+ it('makes expected request when a suggestion is selected', async () => {
335
+ expect(apiFaker.getRequestCount('/addresses/eq/uprn/100070332099?addresstype=paf')).toBe(1);
336
+ });
337
+
338
+ it('populates manual input fields with address from selection', async () => {
339
+ expect(await page.$eval('.ons-js-address-organisation', (node) => node.value)).toBe('');
340
+ expect(await page.$eval('.ons-js-address-line1', (node) => node.value)).toBe('196 College Road');
341
+ expect(await page.$eval('.ons-js-address-line2', (node) => node.value)).toBe('Whitchurch');
342
+ expect(await page.$eval('.ons-js-address-town', (node) => node.value)).toBe('Cardiff');
343
+ expect(await page.$eval('.ons-js-address-postcode', (node) => node.value)).toBe('CF14 2NT');
344
+ expect(await page.$eval('.ons-js-hidden-uprn', (node) => node.value)).toBe('100070332099');
345
+ });
346
+ });
480
347
  });
481
- });
482
348
 
483
- describe('when the submit is invalid', () => {
484
- beforeEach(async () => {
485
- await setTestPage(
486
- '/test',
487
- `
488
- <div class="ons-question">
489
- <form action="/test/fake/form-handler" method="post">
490
- ${renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API)}
491
- <button type="submit">Submit</button>
492
- </form>
493
- </div>
494
- `,
495
- );
496
-
497
- await page.$eval('form', (node) =>
498
- node.addEventListener('submit', (event) => {
499
- event.preventDefault();
500
- return false;
501
- }),
502
- );
503
-
504
- await page.click('button[type=submit]');
349
+ describe('when the query is a partial postcode', () => {
350
+ beforeEach(async () => {
351
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
352
+
353
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14 '));
354
+ await page.type('.ons-js-autosuggest-input', '2');
355
+ await page.waitForTimeout(200);
356
+ });
357
+
358
+ it('provides expected parameters to the address API', async () => {
359
+ expect(apiFaker.getRequestCount('/addresses/eq?input=cf14%202&limit=10')).toBe(1);
360
+ });
361
+
362
+ it('has expected suggestion entries', async () => {
363
+ const suggestions = await page.$$eval('.ons-autosuggest__option', (nodes) => nodes.map((node) => node.textContent.trim()));
364
+ expect(suggestions).toEqual([
365
+ 'Penlline Road, Whitchurch, Cardiff, CF14 2AA (41 addresses)',
366
+ '197 College Road, Whitchurch, Cardiff, CF14 2AB',
367
+ ]);
368
+ });
369
+
370
+ describe('when a suggestion is selected', () => {
371
+ beforeEach(async () => {
372
+ await page.keyboard.press('ArrowDown');
373
+ await page.keyboard.press('Enter');
374
+ await page.waitForTimeout(200);
375
+ });
376
+
377
+ it('makes expected request', async () => {
378
+ expect(
379
+ apiFaker.getRequestCount(
380
+ '/addresses/eq/bucket?postcode=CF14%202AA&streetname=Penlline%20Road&townname=Whitchurch&groupfullpostcodes=combo',
381
+ ),
382
+ ).toBe(1);
383
+ });
384
+
385
+ it('has expected suggestion entries', async () => {
386
+ const suggestions = await page.$$eval('.ons-autosuggest__option', (nodes) =>
387
+ nodes.map((node) => node.textContent.trim()),
388
+ );
389
+ expect(suggestions).toEqual(['197 College Road, Whitchurch, Cardiff, CF14 2AB']);
390
+ });
391
+
392
+ describe('when an inner suggestion is selected', () => {
393
+ beforeEach(async () => {
394
+ await page.keyboard.press('ArrowDown');
395
+ await page.keyboard.press('Enter');
396
+ await page.waitForTimeout(200);
397
+ });
398
+
399
+ it('populates manual input fields with address from selection', async () => {
400
+ expect(await page.$eval('.ons-js-address-organisation', (node) => node.value)).toBe('');
401
+ expect(await page.$eval('.ons-js-address-line1', (node) => node.value)).toBe('197 College Road');
402
+ expect(await page.$eval('.ons-js-address-line2', (node) => node.value)).toBe('Whitchurch');
403
+ expect(await page.$eval('.ons-js-address-town', (node) => node.value)).toBe('Cardiff');
404
+ expect(await page.$eval('.ons-js-address-postcode', (node) => node.value)).toBe('CF14 2AB');
405
+ expect(await page.$eval('.ons-js-hidden-uprn', (node) => node.value)).toBe('10002511038');
406
+ });
407
+ });
408
+ });
505
409
  });
506
410
 
507
- it('then an error summary panel should be added to the DOM', async () => {
508
- const panelExists = await page.$$eval('.ons-js-autosuggest-error-panel', (nodes) => nodes.length === 1);
509
- expect(panelExists).toBe(true);
411
+ describe('when there is an error retrieving the address', () => {
412
+ it('switches to manual mode and hides search button', async () => {
413
+ apiFaker.setTemporaryOverride('/addresses/eq?input=cf142&limit=10', {
414
+ data: {
415
+ status: { code: 200 },
416
+ response: {
417
+ addresses: [
418
+ {
419
+ uprn: 'bad',
420
+ formattedAddress: '196 College Road, Birmingham, B44 8HF',
421
+ addressType: 'PAF',
422
+ },
423
+ ],
424
+ },
425
+ },
426
+ });
427
+
428
+ apiFaker.setTemporaryOverride('/addresses/eq/uprn/bad?addresstype=paf', {
429
+ data: {
430
+ status: { code: 400 },
431
+ },
432
+ });
433
+
434
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
435
+
436
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'cf14'));
437
+ await page.type('.ons-js-autosuggest-input', '2', { delay: 20 });
438
+ await page.keyboard.press('ArrowDown');
439
+ await page.keyboard.press('Enter');
440
+ await page.waitForTimeout(100);
441
+
442
+ const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
443
+ node.classList.contains('ons-u-db-no-js_enabled'),
444
+ );
445
+ expect(isManualElementHidden).toBe(false);
446
+
447
+ const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) =>
448
+ node.classList.contains('ons-u-d-no'),
449
+ );
450
+ expect(isSearchElementHidden).toBe(true);
451
+
452
+ const isSearchButtonElementHidden = await page.$eval('.ons-js-address-search-btn', (node) =>
453
+ node.classList.contains('ons-u-d-no'),
454
+ );
455
+ expect(isSearchButtonElementHidden).toBe(true);
456
+ });
510
457
  });
511
458
 
512
- it('then input should be wrapped in an error', async () => {
513
- const inputIsError = await page.$$eval('#autosuggest-input-error', (nodes) => nodes.length === 1);
514
- expect(inputIsError).toBe(true);
459
+ describe('when the form is submitted', () => {
460
+ describe('when the selected address is manually changed', () => {
461
+ it('clears the urpn field', async () => {
462
+ await setTestPage(
463
+ '/test',
464
+ `
465
+ <form action="/test/fake/form-handler" method="post">
466
+ ${renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API)}
467
+ <button type="submit">Submit</button>
468
+ </form>
469
+ `,
470
+ );
471
+
472
+ await page.$eval('form', (node) =>
473
+ node.addEventListener('submit', (event) => {
474
+ event.preventDefault();
475
+ return false;
476
+ }),
477
+ );
478
+
479
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14 2N'));
480
+ await page.type('.ons-js-autosuggest-input', 'T', { delay: 20 });
481
+ await page.keyboard.press('ArrowDown');
482
+ await page.keyboard.press('Enter');
483
+ await page.waitForTimeout(100);
484
+
485
+ const urpnValueBefore = await page.$eval('.ons-js-hidden-uprn', (node) => node.value);
486
+ expect(urpnValueBefore).toBe('100070332099');
487
+
488
+ await page.$eval('.ons-js-address-line1', (node) => (node.value = 'Something else'));
489
+ await page.click('button[type=submit]');
490
+
491
+ const urpnValueAfter = await page.$eval('.ons-js-hidden-uprn', (node) => node.value);
492
+ expect(urpnValueAfter).toBe('');
493
+ });
494
+ });
495
+
496
+ describe('when the submit is invalid', () => {
497
+ beforeEach(async () => {
498
+ await setTestPage(
499
+ '/test',
500
+ `
501
+ <div class="ons-question">
502
+ <form action="/test/fake/form-handler" method="post">
503
+ ${renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API)}
504
+ <button type="submit">Submit</button>
505
+ </form>
506
+ </div>
507
+ `,
508
+ );
509
+
510
+ await page.$eval('form', (node) =>
511
+ node.addEventListener('submit', (event) => {
512
+ event.preventDefault();
513
+ return false;
514
+ }),
515
+ );
516
+
517
+ await page.click('button[type=submit]');
518
+ });
519
+
520
+ it('then an error summary panel should be added to the DOM', async () => {
521
+ const panelExists = await page.$$eval('.ons-js-autosuggest-error-panel', (nodes) => nodes.length === 1);
522
+ expect(panelExists).toBe(true);
523
+ });
524
+
525
+ it('then input should be wrapped in an error', async () => {
526
+ const inputIsError = await page.$$eval('#autosuggest-input-error', (nodes) => nodes.length === 1);
527
+ expect(inputIsError).toBe(true);
528
+ });
529
+
530
+ describe('when the mode is set to manual', () => {
531
+ it('then the error summary should be removed', async () => {
532
+ await page.click('.ons-js-address-manual-btn');
533
+
534
+ const panelExists = await page.$$eval('.ons-js-autosuggest-error-panel', (nodes) => nodes.length === 1);
535
+ expect(panelExists).toBe(false);
536
+ });
537
+ });
538
+ });
515
539
  });
540
+ });
516
541
 
517
- describe('when the mode is set to manual', () => {
518
- it('then the error summary should be removed', async () => {
542
+ describe('When the manual link is clicked', () => {
543
+ beforeEach(async () => {
544
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
519
545
  await page.click('.ons-js-address-manual-btn');
546
+ });
520
547
 
521
- const panelExists = await page.$$eval('.ons-js-autosuggest-error-panel', (nodes) => nodes.length === 1);
522
- expect(panelExists).toBe(false);
523
- });
548
+ it('shows manual input fields', async () => {
549
+ const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
550
+ node.classList.contains('ons-u-db-no-js_enabled'),
551
+ );
552
+ expect(isManualElementHidden).toBe(false);
553
+ const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) =>
554
+ node.classList.contains('ons-u-d-no'),
555
+ );
556
+ expect(isSearchElementHidden).toBe(true);
524
557
  });
525
- });
526
- });
527
- });
528
558
 
529
- describe('When the manual link is clicked', () => {
530
- beforeEach(async () => {
531
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
532
- await page.click('.ons-js-address-manual-btn');
533
- });
559
+ it('clears autosuggest input', async () => {
560
+ const value = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
561
+ expect(value).toBe('');
562
+ });
534
563
 
535
- it('shows manual input fields', async () => {
536
- const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
537
- node.classList.contains('ons-u-db-no-js_enabled'),
538
- );
539
- expect(isManualElementHidden).toBe(false);
540
- const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) => node.classList.contains('ons-u-d-no'));
541
- expect(isSearchElementHidden).toBe(true);
564
+ describe('and then the search link is clicked', () => {
565
+ beforeEach(async () => {
566
+ await page.$eval('.ons-js-address-organisation', (node) => (node.value = 'Test organisation'));
567
+ await page.$eval('.ons-js-address-line1', (node) => (node.value = 'Test address line 1'));
568
+ await page.$eval('.ons-js-address-line2', (node) => (node.value = 'Test address line 2'));
569
+ await page.$eval('.ons-js-address-town', (node) => (node.value = 'Test town'));
570
+ await page.$eval('.ons-js-address-postcode', (node) => (node.value = 'PO37 60DE'));
571
+ await page.$eval('.ons-js-hidden-uprn', (node) => (node.value = '100070332099'));
572
+
573
+ await page.click('.ons-js-address-search-btn');
574
+ });
575
+
576
+ it('hides manual input fields', async () => {
577
+ const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
578
+ node.classList.contains('ons-u-db-no-js_enabled'),
579
+ );
580
+ expect(isManualElementHidden).toBe(true);
581
+ const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) =>
582
+ node.classList.contains('ons-u-d-no'),
583
+ );
584
+ expect(isSearchElementHidden).toBe(false);
585
+ });
586
+
587
+ it('clears manual input fields', async () => {
588
+ expect(await page.$eval('.ons-js-address-organisation', (node) => node.value)).toBe('');
589
+ expect(await page.$eval('.ons-js-address-line1', (node) => node.value)).toBe('');
590
+ expect(await page.$eval('.ons-js-address-line2', (node) => node.value)).toBe('');
591
+ expect(await page.$eval('.ons-js-address-town', (node) => node.value)).toBe('');
592
+ expect(await page.$eval('.ons-js-address-postcode', (node) => node.value)).toBe('');
593
+ expect(await page.$eval('.ons-js-hidden-uprn', (node) => node.value)).toBe('');
594
+ });
595
+ });
542
596
  });
543
597
 
544
- it('clears autosuggest input', async () => {
545
- const value = await page.$eval('.ons-js-autosuggest-input', (node) => node.value);
546
- expect(value).toBe('');
547
- });
598
+ describe('When the language is Welsh', () => {
599
+ beforeEach(async () => {
600
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
601
+ await page.evaluate(() => document.documentElement.setAttribute('lang', 'cy'));
602
+ });
548
603
 
549
- describe('and then the search link is clicked', () => {
550
- beforeEach(async () => {
551
- await page.$eval('.ons-js-address-organisation', (node) => (node.value = 'Test organisation'));
552
- await page.$eval('.ons-js-address-line1', (node) => (node.value = 'Test address line 1'));
553
- await page.$eval('.ons-js-address-line2', (node) => (node.value = 'Test address line 2'));
554
- await page.$eval('.ons-js-address-town', (node) => (node.value = 'Test town'));
555
- await page.$eval('.ons-js-address-postcode', (node) => (node.value = 'PO37 60DE'));
556
- await page.$eval('.ons-js-hidden-uprn', (node) => (node.value = '100070332099'));
557
-
558
- await page.click('.ons-js-address-search-btn');
559
- });
560
-
561
- it('hides manual input fields', async () => {
562
- const isManualElementHidden = await page.$eval('.ons-js-address-input__manual', (node) =>
563
- node.classList.contains('ons-u-db-no-js_enabled'),
564
- );
565
- expect(isManualElementHidden).toBe(true);
566
- const isSearchElementHidden = await page.$eval('.ons-js-address-input__search', (node) => node.classList.contains('ons-u-d-no'));
567
- expect(isSearchElementHidden).toBe(false);
568
- });
569
-
570
- it('clears manual input fields', async () => {
571
- expect(await page.$eval('.ons-js-address-organisation', (node) => node.value)).toBe('');
572
- expect(await page.$eval('.ons-js-address-line1', (node) => node.value)).toBe('');
573
- expect(await page.$eval('.ons-js-address-line2', (node) => node.value)).toBe('');
574
- expect(await page.$eval('.ons-js-address-town', (node) => node.value)).toBe('');
575
- expect(await page.$eval('.ons-js-address-postcode', (node) => node.value)).toBe('');
576
- expect(await page.$eval('.ons-js-hidden-uprn', (node) => node.value)).toBe('');
577
- });
578
- });
579
- });
604
+ it('then the fetch url should contain the favour Welsh parameter', async () => {
605
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = '196 coll'));
606
+ await page.type('.ons-js-autosuggest-input', 'e');
580
607
 
581
- describe('When the language is Welsh', () => {
582
- beforeEach(async () => {
583
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
584
- await page.evaluate(() => document.documentElement.setAttribute('lang', 'cy'));
608
+ expect(apiFaker.getRequestCount('/addresses/eq?input=196%20colle&limit=10&favourwelsh=true')).toBe(1);
609
+ });
585
610
  });
586
611
 
587
- it('then the fetch url should contain the favour Welsh parameter', async () => {
588
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = '196 coll'));
589
- await page.type('.ons-js-autosuggest-input', 'e');
590
-
591
- expect(apiFaker.getRequestCount('/addresses/eq?input=196%20colle&limit=10&favourwelsh=true')).toBe(1);
592
- });
593
- });
612
+ describe('When the component initialises a non-editable address lookup', () => {
613
+ describe('when a query is sent and address selected', () => {
614
+ beforeEach(async () => {
615
+ await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
594
616
 
595
- describe('When the component initialises a non-editable address lookup', () => {
596
- describe('when a query is sent and address selected', () => {
597
- beforeEach(async () => {
598
- await setTestPage('/test', renderComponent('address-input', EXAMPLE_ADDRESS_INPUT_WITH_API));
617
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14'));
618
+ await page.type('.ons-js-autosuggest-input', '2', { delay: 20 });
619
+ await page.keyboard.press('ArrowDown');
620
+ await page.keyboard.press('Enter');
599
621
 
600
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = 'CF14'));
601
- await page.type('.ons-js-autosuggest-input', '2', { delay: 20 });
602
- await page.keyboard.press('ArrowDown');
603
- await page.keyboard.press('Enter');
622
+ await page.waitForTimeout(50);
623
+ });
604
624
 
605
- await page.waitForTimeout(50);
606
- });
625
+ it('then the retrieveAddress function will be called', async () => {
626
+ expect(apiFaker.getRequestCount('/addresses/eq/uprn/100070332099?addresstype=paf')).toBe(1);
627
+ });
628
+ });
607
629
 
608
- it('then the retrieveAddress function will be called', async () => {
609
- expect(apiFaker.getRequestCount('/addresses/eq/uprn/100070332099?addresstype=paf')).toBe(1);
610
- });
630
+ describe('when the form is submitted', () => {
631
+ describe('when the input is empty', () => {
632
+ beforeEach(async () => {
633
+ await setTestPage(
634
+ '/test',
635
+ `
636
+ <div class="ons-question">
637
+ <form action="/test/fake/form-handler" method="post">
638
+ ${renderComponent('address-input', { ...EXAMPLE_ADDRESS_INPUT_WITH_API, isEditable: false })}
639
+ <button type="submit">Submit</button>
640
+ </form>
641
+ </div>
642
+ `,
643
+ );
644
+
645
+ await page.click('button[type=submit]');
646
+ });
647
+
648
+ it('sets aria status message', async () => {
649
+ const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
650
+ expect(statusMessage).toBe('Enter 3 or more characters for suggestions.');
651
+ });
652
+ });
653
+ });
611
654
  });
612
655
 
613
- describe('when the form is submitted', () => {
614
- describe('when the input is empty', () => {
656
+ describe.each([
657
+ [
658
+ 'english, epoch, workplace',
659
+ '/addresses/eq?input=196%20colle&limit=10&classificationfilter=workplace&eboost=10&epoch=75',
660
+ '/addresses/eq/uprn/100070332099?addresstype=paf&epoch=75',
661
+ 'en',
662
+ {
663
+ regionCode: 'gb-eng',
664
+ oneYearAgo: true,
665
+ addressType: 'workplace',
666
+ },
667
+ ],
668
+ [
669
+ 'ni, educational',
670
+ '/addresses/eq?input=196%20colle&limit=10&classificationfilter=educational&eboost=0&sboost=0&wboost=0',
671
+ '/addresses/eq/uprn/100070332099?addresstype=paf',
672
+ 'en',
673
+ {
674
+ regionCode: 'gb-nir',
675
+ addressType: 'educational',
676
+ },
677
+ ],
678
+ [
679
+ 'ni, workplace',
680
+ '/addresses/eq?input=196%20colle&limit=10&classificationfilter=workplace&nboost=10',
681
+ '/addresses/eq/uprn/100070332099?addresstype=paf',
682
+ 'en',
683
+ {
684
+ regionCode: 'gb-nir',
685
+ addressType: 'workplace',
686
+ },
687
+ ],
688
+ [
689
+ 'wales, workspace',
690
+ '/addresses/eq?input=196%20colle&limit=10&classificationfilter=workplace&wboost=10&favourwelsh=true',
691
+ '/addresses/eq/uprn/100070332099?addresstype=paf',
692
+ 'cy',
693
+ {
694
+ regionCode: 'gb-wls',
695
+ addressType: 'workplace',
696
+ },
697
+ ],
698
+ ])('When the component initialises with options - %s', (_, searchEndpoint, uprnEndpoint, lang, options) => {
615
699
  beforeEach(async () => {
616
- await setTestPage(
617
- '/test',
618
- `
619
- <div class="ons-question">
620
- <form action="/test/fake/form-handler" method="post">
621
- ${renderComponent('address-input', { ...EXAMPLE_ADDRESS_INPUT_WITH_API, isEditable: false })}
622
- <button type="submit">Submit</button>
623
- </form>
624
- </div>
625
- `,
626
- );
627
-
628
- await page.click('button[type=submit]');
629
- });
630
-
631
- it('sets aria status message', async () => {
632
- const statusMessage = await page.$eval('.ons-js-autosuggest-aria-status', (node) => node.textContent);
633
- expect(statusMessage).toBe('Enter 3 or more characters for suggestions.');
700
+ apiFaker.setTemporaryOverride(searchEndpoint, {
701
+ data: {
702
+ status: { code: 200 },
703
+ response: {
704
+ input: '196 colle',
705
+ limit: 10,
706
+ addresses: [
707
+ {
708
+ uprn: '100070332099',
709
+ formattedAddress: '196 College Road, Birmingham, B44 8HF',
710
+ addressType: 'PAF',
711
+ },
712
+ ],
713
+ },
714
+ },
715
+ });
716
+
717
+ await setTestPage(
718
+ '/test',
719
+ renderComponent('address-input', {
720
+ ...EXAMPLE_ADDRESS_INPUT_WITH_API,
721
+ options,
722
+ }),
723
+ );
724
+
725
+ const setLangAttribute = (lang) => document.documentElement.setAttribute('lang', lang);
726
+ await page.evaluate(setLangAttribute, lang);
634
727
  });
635
- });
636
- });
637
- });
638
-
639
- describe.each([
640
- [
641
- 'english, epoch, workplace',
642
- '/addresses/eq?input=196%20colle&limit=10&classificationfilter=workplace&eboost=10&epoch=75',
643
- '/addresses/eq/uprn/100070332099?addresstype=paf&epoch=75',
644
- 'en',
645
- {
646
- regionCode: 'gb-eng',
647
- oneYearAgo: true,
648
- addressType: 'workplace',
649
- },
650
- ],
651
- [
652
- 'ni, educational',
653
- '/addresses/eq?input=196%20colle&limit=10&classificationfilter=educational&eboost=0&sboost=0&wboost=0',
654
- '/addresses/eq/uprn/100070332099?addresstype=paf',
655
- 'en',
656
- {
657
- regionCode: 'gb-nir',
658
- addressType: 'educational',
659
- },
660
- ],
661
- [
662
- 'ni, workplace',
663
- '/addresses/eq?input=196%20colle&limit=10&classificationfilter=workplace&nboost=10',
664
- '/addresses/eq/uprn/100070332099?addresstype=paf',
665
- 'en',
666
- {
667
- regionCode: 'gb-nir',
668
- addressType: 'workplace',
669
- },
670
- ],
671
- [
672
- 'wales, workspace',
673
- '/addresses/eq?input=196%20colle&limit=10&classificationfilter=workplace&wboost=10&favourwelsh=true',
674
- '/addresses/eq/uprn/100070332099?addresstype=paf',
675
- 'cy',
676
- {
677
- regionCode: 'gb-wls',
678
- addressType: 'workplace',
679
- },
680
- ],
681
- ])('When the component initialises with options - %s', (_, searchEndpoint, uprnEndpoint, lang, options) => {
682
- beforeEach(async () => {
683
- apiFaker.setTemporaryOverride(searchEndpoint, {
684
- data: {
685
- status: { code: 200 },
686
- response: {
687
- input: '196 colle',
688
- limit: 10,
689
- addresses: [
690
- {
691
- uprn: '100070332099',
692
- formattedAddress: '196 College Road, Birmingham, B44 8HF',
693
- addressType: 'PAF',
694
- },
695
- ],
696
- },
697
- },
698
- });
699
-
700
- await setTestPage(
701
- '/test',
702
- renderComponent('address-input', {
703
- ...EXAMPLE_ADDRESS_INPUT_WITH_API,
704
- options,
705
- }),
706
- );
707
-
708
- const setLangAttribute = (lang) => document.documentElement.setAttribute('lang', lang);
709
- await page.evaluate(setLangAttribute, lang);
710
- });
711
728
 
712
- it('provides expected parameters to the address API', async () => {
713
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = '196 coll'));
714
- await page.type('.ons-js-autosuggest-input', 'e');
729
+ it('provides expected parameters to the address API', async () => {
730
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = '196 coll'));
731
+ await page.type('.ons-js-autosuggest-input', 'e');
715
732
 
716
- expect(apiFaker.getRequestCount(searchEndpoint)).toBe(1);
717
- });
733
+ expect(apiFaker.getRequestCount(searchEndpoint)).toBe(1);
734
+ });
718
735
 
719
- it('requests further information for the selected address from the API with the expected parameters', async () => {
720
- await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = '196 coll'));
721
- await page.type('.ons-js-autosuggest-input', 'e', { delay: 20 });
722
- await page.keyboard.press('ArrowDown');
723
- await page.keyboard.press('Enter');
736
+ it('requests further information for the selected address from the API with the expected parameters', async () => {
737
+ await page.$eval('.ons-js-autosuggest-input', (node) => (node.value = '196 coll'));
738
+ await page.type('.ons-js-autosuggest-input', 'e', { delay: 20 });
739
+ await page.keyboard.press('ArrowDown');
740
+ await page.keyboard.press('Enter');
724
741
 
725
- await page.waitForTimeout(50);
742
+ await page.waitForTimeout(50);
726
743
 
727
- expect(apiFaker.getRequestCount(uprnEndpoint)).toBe(1);
744
+ expect(apiFaker.getRequestCount(uprnEndpoint)).toBe(1);
745
+ });
728
746
  });
729
- });
730
747
  });