@ukic/canary-web-components 2.0.0-canary.6 → 2.0.0-canary.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (412) hide show
  1. package/dist/cjs/core.cjs.js +1 -1
  2. package/dist/cjs/helpers-93c5fc92.js +198 -0
  3. package/dist/cjs/helpers-93c5fc92.js.map +1 -0
  4. package/dist/cjs/{helpers-86375e76.js → helpers-b525d45a.js} +45 -4
  5. package/dist/cjs/helpers-b525d45a.js.map +1 -0
  6. package/dist/cjs/ic-accordion-group.cjs.entry.js +6 -2
  7. package/dist/cjs/ic-accordion-group.cjs.entry.js.map +1 -1
  8. package/dist/cjs/ic-accordion.cjs.entry.js +1 -1
  9. package/dist/cjs/ic-alert.cjs.entry.js +2 -2
  10. package/dist/cjs/ic-alert.cjs.entry.js.map +1 -1
  11. package/dist/cjs/ic-back-to-top.cjs.entry.js +1 -1
  12. package/dist/cjs/ic-badge.cjs.entry.js +4 -3
  13. package/dist/cjs/ic-badge.cjs.entry.js.map +1 -1
  14. package/dist/cjs/ic-breadcrumb-group.cjs.entry.js +1 -1
  15. package/dist/cjs/ic-breadcrumb.cjs.entry.js +1 -1
  16. package/dist/cjs/ic-button_3.cjs.entry.js +34 -10
  17. package/dist/cjs/ic-button_3.cjs.entry.js.map +1 -1
  18. package/dist/cjs/ic-card.cjs.entry.js +7 -7
  19. package/dist/cjs/ic-card.cjs.entry.js.map +1 -1
  20. package/dist/cjs/ic-checkbox-group.cjs.entry.js +1 -1
  21. package/dist/cjs/ic-checkbox.cjs.entry.js +1 -1
  22. package/dist/cjs/ic-chip.cjs.entry.js +1 -1
  23. package/dist/cjs/ic-data-entity.cjs.entry.js +3 -6
  24. package/dist/cjs/ic-data-entity.cjs.entry.js.map +1 -1
  25. package/dist/cjs/ic-data-row.cjs.entry.js +21 -35
  26. package/dist/cjs/ic-data-row.cjs.entry.js.map +1 -1
  27. package/dist/cjs/ic-dialog.cjs.entry.js +4 -2
  28. package/dist/cjs/ic-dialog.cjs.entry.js.map +1 -1
  29. package/dist/cjs/ic-divider.cjs.entry.js +1 -1
  30. package/dist/cjs/ic-empty-state.cjs.entry.js +1 -1
  31. package/dist/cjs/ic-footer-link-group.cjs.entry.js +1 -1
  32. package/dist/cjs/ic-footer-link.cjs.entry.js +1 -1
  33. package/dist/cjs/ic-footer.cjs.entry.js +1 -1
  34. package/dist/cjs/ic-hero.cjs.entry.js +1 -1
  35. package/dist/cjs/ic-horizontal-scroll.cjs.entry.js +1 -1
  36. package/dist/cjs/ic-input-component-container_3.cjs.entry.js +12 -10
  37. package/dist/cjs/ic-input-component-container_3.cjs.entry.js.map +1 -1
  38. package/dist/cjs/ic-input-label_2.cjs.entry.js +1 -1
  39. package/dist/cjs/ic-link.cjs.entry.js +1 -1
  40. package/dist/cjs/ic-menu-group.cjs.entry.js +1 -1
  41. package/dist/cjs/ic-menu-item.cjs.entry.js +1 -1
  42. package/dist/cjs/ic-menu-with-multi.cjs.entry.js +2599 -0
  43. package/dist/cjs/ic-menu-with-multi.cjs.entry.js.map +1 -0
  44. package/dist/cjs/ic-navigation-button.cjs.entry.js +1 -1
  45. package/dist/cjs/ic-navigation-group.cjs.entry.js +1 -1
  46. package/dist/cjs/ic-navigation-item.cjs.entry.js +1 -1
  47. package/dist/cjs/ic-navigation-menu.cjs.entry.js +1 -1
  48. package/dist/cjs/ic-page-header.cjs.entry.js +1 -1
  49. package/dist/cjs/ic-pagination-bar.cjs.entry.js +2 -18
  50. package/dist/cjs/ic-pagination-bar.cjs.entry.js.map +1 -1
  51. package/dist/cjs/ic-pagination_4.cjs.entry.js +21 -13
  52. package/dist/cjs/ic-pagination_4.cjs.entry.js.map +1 -1
  53. package/dist/cjs/ic-popover-menu.cjs.entry.js +1 -1
  54. package/dist/cjs/ic-popover-menu.cjs.entry.js.map +1 -1
  55. package/dist/cjs/ic-radio-group.cjs.entry.js +1 -1
  56. package/dist/cjs/ic-radio-option.cjs.entry.js +1 -1
  57. package/dist/cjs/ic-search-bar.cjs.entry.js +1 -1
  58. package/dist/cjs/ic-search-bar.cjs.entry.js.map +1 -1
  59. package/dist/cjs/ic-select-with-multi.cjs.entry.js +837 -0
  60. package/dist/cjs/ic-select-with-multi.cjs.entry.js.map +1 -0
  61. package/dist/cjs/ic-side-navigation.cjs.entry.js +1 -5
  62. package/dist/cjs/ic-side-navigation.cjs.entry.js.map +1 -1
  63. package/dist/cjs/ic-status-tag.cjs.entry.js +1 -1
  64. package/dist/cjs/ic-step.cjs.entry.js +1 -1
  65. package/dist/cjs/ic-stepper.cjs.entry.js +1 -1
  66. package/dist/cjs/ic-switch.cjs.entry.js +1 -1
  67. package/dist/cjs/ic-tab-group.cjs.entry.js +1 -1
  68. package/dist/cjs/ic-tab-panel.cjs.entry.js +1 -1
  69. package/dist/cjs/ic-tab.cjs.entry.js +1 -1
  70. package/dist/cjs/ic-theme.cjs.entry.js +1 -1
  71. package/dist/cjs/ic-toast.cjs.entry.js +1 -1
  72. package/dist/cjs/ic-toggle-button-group.cjs.entry.js +184 -0
  73. package/dist/cjs/ic-toggle-button-group.cjs.entry.js.map +1 -0
  74. package/dist/cjs/ic-toggle-button.cjs.entry.js +6 -3
  75. package/dist/cjs/ic-toggle-button.cjs.entry.js.map +1 -1
  76. package/dist/cjs/ic-top-navigation.cjs.entry.js +1 -1
  77. package/dist/cjs/ic-typography.cjs.entry.js +1 -1
  78. package/dist/cjs/index-4cf27b16.js +12 -0
  79. package/dist/cjs/loader.cjs.js +1 -1
  80. package/dist/collection/collection-manifest.json +4 -1
  81. package/dist/collection/components/ic-menu-with-multi/ic-menu.css +701 -0
  82. package/dist/collection/components/ic-menu-with-multi/ic-menu.js +1458 -0
  83. package/dist/collection/components/ic-menu-with-multi/ic-menu.js.map +1 -0
  84. package/dist/collection/components/ic-menu-with-multi/test/basic/ic-menu.spec.js +880 -0
  85. package/dist/collection/components/ic-menu-with-multi/test/basic/ic-menu.spec.js.map +1 -0
  86. package/dist/collection/components/ic-select-with-multi/assets/Check.svg +3 -0
  87. package/dist/collection/components/ic-select-with-multi/assets/Clear.svg +3 -0
  88. package/dist/collection/components/ic-select-with-multi/assets/Expand.svg +3 -0
  89. package/dist/collection/components/ic-select-with-multi/ic-select.css +693 -0
  90. package/dist/collection/components/ic-select-with-multi/ic-select.js +1649 -0
  91. package/dist/collection/components/ic-select-with-multi/ic-select.js.map +1 -0
  92. package/dist/collection/components/ic-select-with-multi/story-data.js +216 -0
  93. package/dist/collection/components/ic-select-with-multi/story-data.js.map +1 -0
  94. package/dist/collection/components/ic-select-with-multi/test/a11y/ic-select.test.a11y.js +146 -0
  95. package/dist/collection/components/ic-select-with-multi/test/a11y/ic-select.test.a11y.js.map +1 -0
  96. package/dist/collection/components/ic-select-with-multi/test/basic/ic-select.e2e.js +2040 -0
  97. package/dist/collection/components/ic-select-with-multi/test/basic/ic-select.e2e.js.map +1 -0
  98. package/dist/collection/components/ic-select-with-multi/test/basic/ic-select.spec.js +1518 -0
  99. package/dist/collection/components/ic-select-with-multi/test/basic/ic-select.spec.js.map +1 -0
  100. package/dist/collection/utils/constants.js +28 -0
  101. package/dist/collection/utils/constants.js.map +1 -0
  102. package/dist/collection/utils/helpers.js +168 -5
  103. package/dist/collection/utils/helpers.js.map +1 -1
  104. package/dist/collection/utils/types.js +13 -0
  105. package/dist/collection/utils/types.js.map +1 -0
  106. package/dist/components/helpers.js +44 -4
  107. package/dist/components/helpers.js.map +1 -1
  108. package/dist/components/helpers2.js +183 -0
  109. package/dist/components/helpers2.js.map +1 -0
  110. package/dist/components/ic-accordion-group.js +7 -2
  111. package/dist/components/ic-accordion-group.js.map +1 -1
  112. package/dist/components/ic-alert2.js +1 -1
  113. package/dist/components/ic-alert2.js.map +1 -1
  114. package/dist/components/ic-back-to-top.js +1 -1
  115. package/dist/components/ic-badge.js +4 -3
  116. package/dist/components/ic-badge.js.map +1 -1
  117. package/dist/components/ic-breadcrumb-group.js +1 -1
  118. package/dist/components/ic-breadcrumb2.js +1 -1
  119. package/dist/components/ic-button2.js +38 -9
  120. package/dist/components/ic-button2.js.map +1 -1
  121. package/dist/components/ic-card.js +8 -20
  122. package/dist/components/ic-card.js.map +1 -1
  123. package/dist/components/ic-checkbox-group.js +1 -1
  124. package/dist/components/ic-checkbox.js +1 -1
  125. package/dist/components/ic-chip.js +1 -1
  126. package/dist/components/ic-data-entity.js +3 -6
  127. package/dist/components/ic-data-entity.js.map +1 -1
  128. package/dist/components/ic-data-row.js +21 -35
  129. package/dist/components/ic-data-row.js.map +1 -1
  130. package/dist/components/ic-dialog.js +5 -2
  131. package/dist/components/ic-dialog.js.map +1 -1
  132. package/dist/components/ic-divider2.js +1 -1
  133. package/dist/components/ic-footer-link-group.js +1 -1
  134. package/dist/components/ic-footer-link.js +1 -1
  135. package/dist/components/ic-footer.js +1 -1
  136. package/dist/components/ic-hero.js +1 -1
  137. package/dist/components/ic-horizontal-scroll2.js +1 -1
  138. package/dist/components/ic-input-component-container2.js +7 -6
  139. package/dist/components/ic-input-component-container2.js.map +1 -1
  140. package/dist/components/ic-input-label2.js +1 -1
  141. package/dist/components/ic-input-validation2.js +1 -1
  142. package/dist/components/ic-loading-indicator2.js +1 -1
  143. package/dist/components/ic-menu-group.js +1 -1
  144. package/dist/components/ic-menu-item2.js +1 -1
  145. package/dist/components/ic-menu-with-multi.d.ts +11 -0
  146. package/dist/components/ic-menu-with-multi.js +8 -0
  147. package/dist/components/ic-menu-with-multi.js.map +1 -0
  148. package/dist/components/ic-menu2.js +5 -4
  149. package/dist/components/ic-menu2.js.map +1 -1
  150. package/dist/components/ic-menu3.js +2665 -0
  151. package/dist/components/ic-menu3.js.map +1 -0
  152. package/dist/components/ic-navigation-button.js +1 -1
  153. package/dist/components/ic-navigation-group.js +1 -1
  154. package/dist/components/ic-navigation-item.js +1 -1
  155. package/dist/components/ic-navigation-menu2.js +1 -1
  156. package/dist/components/ic-page-header.js +1 -1
  157. package/dist/components/ic-pagination-bar2.js +1 -17
  158. package/dist/components/ic-pagination-bar2.js.map +1 -1
  159. package/dist/components/ic-pagination-item2.js +1 -1
  160. package/dist/components/ic-pagination2.js +1 -1
  161. package/dist/components/ic-popover-menu.js +2 -2
  162. package/dist/components/ic-popover-menu.js.map +1 -1
  163. package/dist/components/ic-radio-group.js +1 -1
  164. package/dist/components/ic-radio-option.js +1 -1
  165. package/dist/components/ic-search-bar.js +1 -1
  166. package/dist/components/ic-search-bar.js.map +1 -1
  167. package/dist/components/ic-select-with-multi.d.ts +11 -0
  168. package/dist/components/ic-select-with-multi.js +962 -0
  169. package/dist/components/ic-select-with-multi.js.map +1 -0
  170. package/dist/components/ic-select2.js +23 -14
  171. package/dist/components/ic-select2.js.map +1 -1
  172. package/dist/components/ic-side-navigation.js +1 -5
  173. package/dist/components/ic-side-navigation.js.map +1 -1
  174. package/dist/components/ic-step.js +1 -1
  175. package/dist/components/ic-stepper.js +1 -1
  176. package/dist/components/ic-switch.js +1 -1
  177. package/dist/components/ic-tab-panel.js +1 -1
  178. package/dist/components/ic-tab.js +1 -1
  179. package/dist/components/ic-text-field2.js +1 -1
  180. package/dist/components/ic-theme.js +1 -1
  181. package/dist/components/ic-toast.js +1 -1
  182. package/dist/components/ic-toggle-button-group.js +210 -0
  183. package/dist/components/ic-toggle-button-group.js.map +1 -0
  184. package/dist/components/ic-toggle-button.js +6 -3
  185. package/dist/components/ic-toggle-button.js.map +1 -1
  186. package/dist/components/ic-tooltip2.js +1 -1
  187. package/dist/components/ic-tooltip2.js.map +1 -1
  188. package/dist/components/ic-top-navigation.js +1 -1
  189. package/dist/core/core.css +8 -5
  190. package/dist/core/core.esm.js +1 -1
  191. package/dist/core/core.esm.js.map +1 -1
  192. package/dist/core/{p-4119a26b.entry.js → p-045359e1.entry.js} +2 -2
  193. package/dist/core/{p-cae71c32.entry.js → p-10fb4c46.entry.js} +2 -2
  194. package/dist/core/{p-7a0790e4.entry.js → p-169bfa51.entry.js} +2 -2
  195. package/dist/core/{p-56645c00.entry.js → p-1ca332ca.entry.js} +2 -2
  196. package/dist/core/{p-fddc7254.entry.js → p-204ace96.entry.js} +2 -2
  197. package/dist/core/p-21150122.entry.js +2 -0
  198. package/dist/core/p-21150122.entry.js.map +1 -0
  199. package/dist/core/{p-5332a426.entry.js → p-2eac7dcc.entry.js} +2 -2
  200. package/dist/core/{p-3294eba4.entry.js → p-3803a5b5.entry.js} +2 -2
  201. package/dist/core/{p-24945ee5.entry.js → p-452985d9.entry.js} +2 -2
  202. package/dist/core/p-452985d9.entry.js.map +1 -0
  203. package/dist/core/p-4753bac8.entry.js +2 -0
  204. package/dist/core/p-4753bac8.entry.js.map +1 -0
  205. package/dist/core/{p-a048beab.entry.js → p-4baa0916.entry.js} +2 -2
  206. package/dist/core/{p-7e0197a4.entry.js → p-4f413fc0.entry.js} +2 -2
  207. package/dist/core/{p-a6a90c56.entry.js → p-595be57d.entry.js} +2 -2
  208. package/dist/core/{p-5f8c4c83.entry.js → p-5ae93c16.entry.js} +2 -2
  209. package/dist/core/{p-03fdee20.entry.js → p-5e0c830b.entry.js} +2 -2
  210. package/dist/core/{p-03fdee20.entry.js.map → p-5e0c830b.entry.js.map} +1 -1
  211. package/dist/core/p-624d4f5f.entry.js +2 -0
  212. package/dist/core/p-624d4f5f.entry.js.map +1 -0
  213. package/dist/core/{p-fff91bd9.entry.js → p-6933f8e9.entry.js} +2 -2
  214. package/dist/core/{p-043e4073.entry.js → p-6c3044b6.entry.js} +2 -2
  215. package/dist/core/{p-7b17f3ce.entry.js → p-73be1251.entry.js} +2 -2
  216. package/dist/core/{p-e0d8d7a5.entry.js → p-75dac3d1.entry.js} +2 -2
  217. package/dist/core/{p-a3ab9f4c.entry.js → p-76915584.entry.js} +2 -2
  218. package/dist/core/p-76915584.entry.js.map +1 -0
  219. package/dist/core/{p-78ad0c34.entry.js → p-7ef8d616.entry.js} +2 -2
  220. package/dist/core/{p-78ad0c34.entry.js.map → p-7ef8d616.entry.js.map} +1 -1
  221. package/dist/core/{p-f2318ddc.entry.js → p-81ddc39d.entry.js} +2 -2
  222. package/dist/core/{p-3e36c9e4.entry.js → p-869954a2.entry.js} +2 -2
  223. package/dist/core/{p-a561980f.entry.js → p-88d54b72.entry.js} +2 -2
  224. package/dist/core/{p-f4c11be0.entry.js → p-8b08d8fe.entry.js} +2 -2
  225. package/dist/core/p-8b08d8fe.entry.js.map +1 -0
  226. package/dist/core/{p-c2884fcd.entry.js → p-917c5721.entry.js} +2 -2
  227. package/dist/core/{p-217db3af.entry.js → p-942282cd.entry.js} +2 -2
  228. package/dist/core/p-99cad6c2.js +2 -0
  229. package/dist/core/p-99cad6c2.js.map +1 -0
  230. package/dist/core/p-9caf19eb.js +2 -0
  231. package/dist/core/p-9caf19eb.js.map +1 -0
  232. package/dist/core/{p-99a9ce86.entry.js → p-a0f8efb2.entry.js} +2 -2
  233. package/dist/core/{p-234edce6.entry.js → p-a31031a5.entry.js} +2 -2
  234. package/dist/core/{p-faaa06d7.entry.js → p-a434c3d4.entry.js} +2 -2
  235. package/dist/core/{p-ae337896.entry.js → p-a43c12cd.entry.js} +2 -2
  236. package/dist/core/{p-010053ab.entry.js → p-a50c3b9e.entry.js} +2 -2
  237. package/dist/core/{p-b4591bfe.entry.js → p-ab09986c.entry.js} +2 -2
  238. package/dist/core/p-ab09986c.entry.js.map +1 -0
  239. package/dist/core/p-ac4e40a7.entry.js +2 -0
  240. package/dist/core/p-ac4e40a7.entry.js.map +1 -0
  241. package/dist/core/{p-cedabab7.entry.js → p-b82dcc29.entry.js} +2 -2
  242. package/dist/core/{p-8eaed5b7.entry.js → p-ba86928c.entry.js} +2 -2
  243. package/dist/core/{p-9c6e48fb.entry.js → p-c125b65a.entry.js} +2 -2
  244. package/dist/core/{p-452be32a.entry.js → p-c34848da.entry.js} +2 -2
  245. package/dist/core/{p-1e9f689b.entry.js → p-d8469ac0.entry.js} +2 -2
  246. package/dist/core/{p-79b39c8a.entry.js → p-db9c03c0.entry.js} +2 -2
  247. package/dist/core/{p-dd0a5ef0.entry.js → p-e0462b23.entry.js} +2 -2
  248. package/dist/core/p-e0462b23.entry.js.map +1 -0
  249. package/dist/core/p-e0a94f2d.entry.js +2 -0
  250. package/dist/core/p-e0a94f2d.entry.js.map +1 -0
  251. package/dist/core/{p-eb922333.entry.js → p-e3997d60.entry.js} +2 -2
  252. package/dist/core/p-e79e0292.entry.js +2 -0
  253. package/dist/core/p-e79e0292.entry.js.map +1 -0
  254. package/dist/core/{p-26ca8030.entry.js → p-e834344e.entry.js} +2 -2
  255. package/dist/core/{p-2addb040.entry.js → p-f14454b1.entry.js} +2 -2
  256. package/dist/core/{p-e9bc9ee2.entry.js → p-f3c840cd.entry.js} +2 -2
  257. package/dist/core/{p-e9bc9ee2.entry.js.map → p-f3c840cd.entry.js.map} +1 -1
  258. package/dist/core/{p-fc406db5.entry.js → p-f6888309.entry.js} +2 -2
  259. package/dist/core/p-f74a8752.entry.js +2 -0
  260. package/dist/core/p-f74a8752.entry.js.map +1 -0
  261. package/dist/core/{p-e31125df.entry.js → p-f7a14c01.entry.js} +2 -2
  262. package/dist/core/{p-da1f0a53.entry.js → p-f843da01.entry.js} +2 -2
  263. package/dist/core/{p-da1f0a53.entry.js.map → p-f843da01.entry.js.map} +1 -1
  264. package/dist/core/{p-b7d5ced3.entry.js → p-fc5611e2.entry.js} +2 -2
  265. package/dist/core/p-fc5611e2.entry.js.map +1 -0
  266. package/dist/core/p-fde45b29.entry.js +2 -0
  267. package/dist/core/p-fde45b29.entry.js.map +1 -0
  268. package/dist/esm/core.js +1 -1
  269. package/dist/esm/{helpers-229a5574.js → helpers-12b4266a.js} +45 -5
  270. package/dist/esm/helpers-12b4266a.js.map +1 -0
  271. package/dist/esm/helpers-5271897c.js +183 -0
  272. package/dist/esm/helpers-5271897c.js.map +1 -0
  273. package/dist/esm/ic-accordion-group.entry.js +6 -2
  274. package/dist/esm/ic-accordion-group.entry.js.map +1 -1
  275. package/dist/esm/ic-accordion.entry.js +1 -1
  276. package/dist/esm/ic-alert.entry.js +2 -2
  277. package/dist/esm/ic-alert.entry.js.map +1 -1
  278. package/dist/esm/ic-back-to-top.entry.js +1 -1
  279. package/dist/esm/ic-badge.entry.js +4 -3
  280. package/dist/esm/ic-badge.entry.js.map +1 -1
  281. package/dist/esm/ic-breadcrumb-group.entry.js +1 -1
  282. package/dist/esm/ic-breadcrumb.entry.js +1 -1
  283. package/dist/esm/ic-button_3.entry.js +34 -10
  284. package/dist/esm/ic-button_3.entry.js.map +1 -1
  285. package/dist/esm/ic-card.entry.js +7 -7
  286. package/dist/esm/ic-card.entry.js.map +1 -1
  287. package/dist/esm/ic-checkbox-group.entry.js +1 -1
  288. package/dist/esm/ic-checkbox.entry.js +1 -1
  289. package/dist/esm/ic-chip.entry.js +1 -1
  290. package/dist/esm/ic-data-entity.entry.js +3 -6
  291. package/dist/esm/ic-data-entity.entry.js.map +1 -1
  292. package/dist/esm/ic-data-row.entry.js +21 -35
  293. package/dist/esm/ic-data-row.entry.js.map +1 -1
  294. package/dist/esm/ic-dialog.entry.js +4 -2
  295. package/dist/esm/ic-dialog.entry.js.map +1 -1
  296. package/dist/esm/ic-divider.entry.js +1 -1
  297. package/dist/esm/ic-empty-state.entry.js +1 -1
  298. package/dist/esm/ic-footer-link-group.entry.js +1 -1
  299. package/dist/esm/ic-footer-link.entry.js +1 -1
  300. package/dist/esm/ic-footer.entry.js +1 -1
  301. package/dist/esm/ic-hero.entry.js +1 -1
  302. package/dist/esm/ic-horizontal-scroll.entry.js +1 -1
  303. package/dist/esm/ic-input-component-container_3.entry.js +12 -10
  304. package/dist/esm/ic-input-component-container_3.entry.js.map +1 -1
  305. package/dist/esm/ic-input-label_2.entry.js +1 -1
  306. package/dist/esm/ic-link.entry.js +1 -1
  307. package/dist/esm/ic-menu-group.entry.js +1 -1
  308. package/dist/esm/ic-menu-item.entry.js +1 -1
  309. package/dist/esm/ic-menu-with-multi.entry.js +2595 -0
  310. package/dist/esm/ic-menu-with-multi.entry.js.map +1 -0
  311. package/dist/esm/ic-navigation-button.entry.js +1 -1
  312. package/dist/esm/ic-navigation-group.entry.js +1 -1
  313. package/dist/esm/ic-navigation-item.entry.js +1 -1
  314. package/dist/esm/ic-navigation-menu.entry.js +1 -1
  315. package/dist/esm/ic-page-header.entry.js +1 -1
  316. package/dist/esm/ic-pagination-bar.entry.js +1 -17
  317. package/dist/esm/ic-pagination-bar.entry.js.map +1 -1
  318. package/dist/esm/ic-pagination_4.entry.js +21 -13
  319. package/dist/esm/ic-pagination_4.entry.js.map +1 -1
  320. package/dist/esm/ic-popover-menu.entry.js +1 -1
  321. package/dist/esm/ic-popover-menu.entry.js.map +1 -1
  322. package/dist/esm/ic-radio-group.entry.js +1 -1
  323. package/dist/esm/ic-radio-option.entry.js +1 -1
  324. package/dist/esm/ic-search-bar.entry.js +1 -1
  325. package/dist/esm/ic-search-bar.entry.js.map +1 -1
  326. package/dist/esm/ic-select-with-multi.entry.js +833 -0
  327. package/dist/esm/ic-select-with-multi.entry.js.map +1 -0
  328. package/dist/esm/ic-side-navigation.entry.js +1 -5
  329. package/dist/esm/ic-side-navigation.entry.js.map +1 -1
  330. package/dist/esm/ic-status-tag.entry.js +1 -1
  331. package/dist/esm/ic-step.entry.js +1 -1
  332. package/dist/esm/ic-stepper.entry.js +1 -1
  333. package/dist/esm/ic-switch.entry.js +1 -1
  334. package/dist/esm/ic-tab-group.entry.js +1 -1
  335. package/dist/esm/ic-tab-panel.entry.js +1 -1
  336. package/dist/esm/ic-tab.entry.js +1 -1
  337. package/dist/esm/ic-theme.entry.js +1 -1
  338. package/dist/esm/ic-toast.entry.js +1 -1
  339. package/dist/esm/ic-toggle-button-group.entry.js +180 -0
  340. package/dist/esm/ic-toggle-button-group.entry.js.map +1 -0
  341. package/dist/esm/ic-toggle-button.entry.js +6 -3
  342. package/dist/esm/ic-toggle-button.entry.js.map +1 -1
  343. package/dist/esm/ic-top-navigation.entry.js +1 -1
  344. package/dist/esm/ic-typography.entry.js +1 -1
  345. package/dist/esm/index-93509377.js +12 -0
  346. package/dist/esm/loader.js +1 -1
  347. package/dist/types/components/ic-menu-with-multi/ic-menu.d.ts +208 -0
  348. package/dist/types/components/ic-select-with-multi/ic-select.d.ts +289 -0
  349. package/dist/types/components/ic-select-with-multi/story-data.d.ts +32 -0
  350. package/dist/types/components/ic-select-with-multi/test/a11y/ic-select.test.a11y.d.ts +1 -0
  351. package/dist/types/components.d.ts +531 -0
  352. package/dist/types/utils/constants.d.ts +1 -0
  353. package/dist/types/utils/helpers.d.ts +61 -2
  354. package/dist/types/utils/types.d.ts +16 -0
  355. package/hydrate/index.js +6853 -2907
  356. package/package.json +3 -3
  357. package/dist/cjs/helpers-86375e76.js.map +0 -1
  358. package/dist/core/p-0aa1fe4e.entry.js +0 -2
  359. package/dist/core/p-0aa1fe4e.entry.js.map +0 -1
  360. package/dist/core/p-24945ee5.entry.js.map +0 -1
  361. package/dist/core/p-8cde58bf.entry.js +0 -2
  362. package/dist/core/p-8cde58bf.entry.js.map +0 -1
  363. package/dist/core/p-93828f0e.entry.js +0 -2
  364. package/dist/core/p-93828f0e.entry.js.map +0 -1
  365. package/dist/core/p-9fdd7d73.entry.js +0 -2
  366. package/dist/core/p-9fdd7d73.entry.js.map +0 -1
  367. package/dist/core/p-a3ab9f4c.entry.js.map +0 -1
  368. package/dist/core/p-b4591bfe.entry.js.map +0 -1
  369. package/dist/core/p-b7d5ced3.entry.js.map +0 -1
  370. package/dist/core/p-dd0a5ef0.entry.js.map +0 -1
  371. package/dist/core/p-e0102744.js +0 -2
  372. package/dist/core/p-e0102744.js.map +0 -1
  373. package/dist/core/p-e2ccb52b.entry.js +0 -2
  374. package/dist/core/p-e2ccb52b.entry.js.map +0 -1
  375. package/dist/core/p-f4c11be0.entry.js.map +0 -1
  376. package/dist/esm/helpers-229a5574.js.map +0 -1
  377. /package/dist/core/{p-4119a26b.entry.js.map → p-045359e1.entry.js.map} +0 -0
  378. /package/dist/core/{p-cae71c32.entry.js.map → p-10fb4c46.entry.js.map} +0 -0
  379. /package/dist/core/{p-7a0790e4.entry.js.map → p-169bfa51.entry.js.map} +0 -0
  380. /package/dist/core/{p-56645c00.entry.js.map → p-1ca332ca.entry.js.map} +0 -0
  381. /package/dist/core/{p-fddc7254.entry.js.map → p-204ace96.entry.js.map} +0 -0
  382. /package/dist/core/{p-5332a426.entry.js.map → p-2eac7dcc.entry.js.map} +0 -0
  383. /package/dist/core/{p-3294eba4.entry.js.map → p-3803a5b5.entry.js.map} +0 -0
  384. /package/dist/core/{p-a048beab.entry.js.map → p-4baa0916.entry.js.map} +0 -0
  385. /package/dist/core/{p-7e0197a4.entry.js.map → p-4f413fc0.entry.js.map} +0 -0
  386. /package/dist/core/{p-a6a90c56.entry.js.map → p-595be57d.entry.js.map} +0 -0
  387. /package/dist/core/{p-5f8c4c83.entry.js.map → p-5ae93c16.entry.js.map} +0 -0
  388. /package/dist/core/{p-fff91bd9.entry.js.map → p-6933f8e9.entry.js.map} +0 -0
  389. /package/dist/core/{p-043e4073.entry.js.map → p-6c3044b6.entry.js.map} +0 -0
  390. /package/dist/core/{p-7b17f3ce.entry.js.map → p-73be1251.entry.js.map} +0 -0
  391. /package/dist/core/{p-e0d8d7a5.entry.js.map → p-75dac3d1.entry.js.map} +0 -0
  392. /package/dist/core/{p-f2318ddc.entry.js.map → p-81ddc39d.entry.js.map} +0 -0
  393. /package/dist/core/{p-3e36c9e4.entry.js.map → p-869954a2.entry.js.map} +0 -0
  394. /package/dist/core/{p-a561980f.entry.js.map → p-88d54b72.entry.js.map} +0 -0
  395. /package/dist/core/{p-c2884fcd.entry.js.map → p-917c5721.entry.js.map} +0 -0
  396. /package/dist/core/{p-217db3af.entry.js.map → p-942282cd.entry.js.map} +0 -0
  397. /package/dist/core/{p-99a9ce86.entry.js.map → p-a0f8efb2.entry.js.map} +0 -0
  398. /package/dist/core/{p-234edce6.entry.js.map → p-a31031a5.entry.js.map} +0 -0
  399. /package/dist/core/{p-faaa06d7.entry.js.map → p-a434c3d4.entry.js.map} +0 -0
  400. /package/dist/core/{p-ae337896.entry.js.map → p-a43c12cd.entry.js.map} +0 -0
  401. /package/dist/core/{p-010053ab.entry.js.map → p-a50c3b9e.entry.js.map} +0 -0
  402. /package/dist/core/{p-cedabab7.entry.js.map → p-b82dcc29.entry.js.map} +0 -0
  403. /package/dist/core/{p-8eaed5b7.entry.js.map → p-ba86928c.entry.js.map} +0 -0
  404. /package/dist/core/{p-9c6e48fb.entry.js.map → p-c125b65a.entry.js.map} +0 -0
  405. /package/dist/core/{p-452be32a.entry.js.map → p-c34848da.entry.js.map} +0 -0
  406. /package/dist/core/{p-1e9f689b.entry.js.map → p-d8469ac0.entry.js.map} +0 -0
  407. /package/dist/core/{p-79b39c8a.entry.js.map → p-db9c03c0.entry.js.map} +0 -0
  408. /package/dist/core/{p-eb922333.entry.js.map → p-e3997d60.entry.js.map} +0 -0
  409. /package/dist/core/{p-26ca8030.entry.js.map → p-e834344e.entry.js.map} +0 -0
  410. /package/dist/core/{p-2addb040.entry.js.map → p-f14454b1.entry.js.map} +0 -0
  411. /package/dist/core/{p-fc406db5.entry.js.map → p-f6888309.entry.js.map} +0 -0
  412. /package/dist/core/{p-e31125df.entry.js.map → p-f7a14c01.entry.js.map} +0 -0
@@ -0,0 +1,1518 @@
1
+ import { h } from "@stencil/core";
2
+ import { newSpecPage } from "@stencil/core/testing";
3
+ import { Menu } from "../../../ic-menu-with-multi/ic-menu";
4
+ import { Select } from "../../ic-select";
5
+ import * as helpers from "@ukic/web-components/dist/types/utils/helpers";
6
+ import { IcButton } from "@ukic/web-components/dist/components/ic-button";
7
+ import { waitForTimeout } from "../../../../testspec.setup";
8
+ import { IcInputComponentContainer } from "@ukic/web-components/dist/components/ic-input-component-container";
9
+ beforeAll(() => {
10
+ jest.spyOn(console, "warn").mockImplementation(jest.fn());
11
+ });
12
+ const label1 = "Test label 1";
13
+ const value1 = "Test value 1";
14
+ const label2 = "Test label 2";
15
+ const value2 = "Test value 2";
16
+ const label3 = "Test label 3";
17
+ const value3 = "Test value 3";
18
+ const label4 = "Test label 4";
19
+ const value4 = "Test value 4";
20
+ const groupLabel = "Test Group Label";
21
+ const testValue = "Test value";
22
+ const menuUl = "ic-menu ul";
23
+ const noResults = "No results found";
24
+ const clearButtonId = "#clear-button";
25
+ const loadingLabel = "Loading...";
26
+ const loadingErrorLabel = "Loading Error";
27
+ const retryButtonId = "#retry-button";
28
+ const menuOptions = [
29
+ { label: label1, value: value1 },
30
+ { label: label2, value: value2 },
31
+ { label: label3, value: value3 },
32
+ ];
33
+ const menuOptionsWithDescriptions = [
34
+ {
35
+ label: "Cappuccino",
36
+ value: "Cap",
37
+ description: "Coffee frothed up with pressurised steam",
38
+ },
39
+ {
40
+ label: "Latte",
41
+ value: "Lat",
42
+ description: "A milkier coffee than a cappuccino",
43
+ },
44
+ {
45
+ label: "Americano",
46
+ value: "Ame",
47
+ description: "Espresso coffee diluted with hot water",
48
+ },
49
+ ];
50
+ const menuOptionsNoValues = [
51
+ { label: label1 },
52
+ { label: label2 },
53
+ { label: label3 },
54
+ ];
55
+ const menuOptionsWithDuplicates = [
56
+ { label: label1, value: value1 },
57
+ { label: label2, value: value2 },
58
+ { label: label3, value: value3 },
59
+ { label: label3, value: value3 },
60
+ {
61
+ label: groupLabel,
62
+ children: [
63
+ { label: label1, value: value1 },
64
+ { label: label4, value: value4 },
65
+ ],
66
+ },
67
+ ];
68
+ const menuOptionsWithDisabled = [
69
+ { label: label1, value: value1 },
70
+ { label: label2, value: value2 },
71
+ { label: label3, value: value3, disabled: true },
72
+ { label: label4, value: value4 },
73
+ ];
74
+ const menuOptionsWithGroups = [
75
+ {
76
+ label: "Fancy",
77
+ children: [
78
+ { label: "Cappuccino", value: "Cap" },
79
+ { label: "Flat white", value: "Flat" },
80
+ ],
81
+ },
82
+ {
83
+ label: "Boring",
84
+ children: [
85
+ { label: "Filter", value: "Fil" },
86
+ { label: "Latte", value: "Lat" },
87
+ ],
88
+ },
89
+ ];
90
+ const getTestSelect = (props) => `<ic-select label="IC Select Test" ${props}></ic-select>
91
+ <script>
92
+ var select = document.querySelector('ic-select');
93
+ var option = 'Test value 1';
94
+ select.options = ${menuOptions}
95
+ select.addEventListener('icChange', function (event) {
96
+ option = event.detail.value;
97
+ select.value = option;
98
+ });
99
+ </script>`;
100
+ describe("ic-select single", () => {
101
+ it("should not render a label when the 'hide-label' prop is supplied", async () => {
102
+ const page = await newSpecPage({
103
+ components: [Select, Menu, IcInputComponentContainer],
104
+ html: getTestSelect("hide-label"),
105
+ });
106
+ expect(page.root).toMatchSnapshot("hide-label-set");
107
+ });
108
+ it("should test select as submit on form", async () => {
109
+ const page = await newSpecPage({
110
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
111
+ html: `<form id="new-form"></form><ic-select id="ic-select" form="new-form" label="IC Select Test" value="test-value"></ic-select>`,
112
+ });
113
+ expect(page.root).toMatchSnapshot();
114
+ });
115
+ it("should render readonly", async () => {
116
+ const page = await newSpecPage({
117
+ components: [Select, Menu, IcInputComponentContainer],
118
+ html: getTestSelect('readonly="true"'),
119
+ });
120
+ expect(page.root).toMatchSnapshot("readonly");
121
+ });
122
+ it("should have correct validation status", async () => {
123
+ const page = await newSpecPage({
124
+ components: [Select, Menu, IcInputComponentContainer],
125
+ html: getTestSelect('validation-status="error"'),
126
+ });
127
+ expect(page.root).toMatchSnapshot("with-validation-status-error");
128
+ });
129
+ it("should not have a validation status if disabled", async () => {
130
+ const page = await newSpecPage({
131
+ components: [Select, Menu, IcInputComponentContainer],
132
+ html: getTestSelect('disabled validation-status="error"'),
133
+ });
134
+ expect(page.root).toMatchSnapshot("no-validation-status-if-disabled");
135
+ });
136
+ it("should render correct validation text", async () => {
137
+ const page = await newSpecPage({
138
+ components: [Select, Menu, IcInputComponentContainer],
139
+ html: getTestSelect('validation-status="error" validation-text="Test validation text"'),
140
+ });
141
+ expect(page.root).toMatchSnapshot("with-validation-text");
142
+ });
143
+ it("should not render validation text if no validation status has been supplied", async () => {
144
+ const page = await newSpecPage({
145
+ components: [Select, Menu, IcInputComponentContainer],
146
+ html: getTestSelect('validation-text="Test validation text"'),
147
+ });
148
+ expect(page.root).toMatchSnapshot("no-validation-text-if-no-status");
149
+ });
150
+ it("should test with clear button", async () => {
151
+ const eventSpy = jest.fn();
152
+ const page = await newSpecPage({
153
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
154
+ html: `<ic-select label="IC Select Test" show-clear-button="true" value="test-value"></ic-select>`,
155
+ });
156
+ page.root.addEventListener("icClear", eventSpy);
157
+ page.root.options = menuOptions;
158
+ await page.waitForChanges();
159
+ expect(page.root).toMatchSnapshot("with-clear-button");
160
+ page.root.setFocus();
161
+ await page.waitForChanges();
162
+ const clearButton = page.root.shadowRoot.querySelector(clearButtonId);
163
+ clearButton.focus();
164
+ await page.waitForChanges();
165
+ expect(page.rootInstance.clearButtonFocused).toBe(true);
166
+ clearButton.blur();
167
+ await page.waitForChanges();
168
+ expect(page.rootInstance.clearButtonFocused).toBe(false);
169
+ clearButton.click();
170
+ await page.waitForChanges();
171
+ expect(eventSpy).toHaveBeenCalled;
172
+ });
173
+ it("should test menu handleKeyboardOpen method - arrow down (custom select)", async () => {
174
+ const page = await newSpecPage({
175
+ components: [Select, Menu, IcInputComponentContainer],
176
+ html: `<ic-select label="IC Select Test"></ic-select>`,
177
+ });
178
+ page.root.options = menuOptions;
179
+ await page.waitForChanges();
180
+ const menu = page.root.shadowRoot.querySelector("ic-menu");
181
+ const KeyEvent = {
182
+ key: "ArrowDown",
183
+ preventDefault: () => null,
184
+ };
185
+ await menu.handleKeyboardOpen(KeyEvent);
186
+ await page.waitForChanges();
187
+ expect(page.rootInstance.open).toBeTruthy;
188
+ expect(page.rootInstance.value).toBe(value1);
189
+ await menu.handleKeyboardOpen(KeyEvent);
190
+ await page.waitForChanges();
191
+ await menu.handleKeyboardOpen(KeyEvent);
192
+ await page.waitForChanges();
193
+ await menu.handleKeyboardOpen(KeyEvent);
194
+ await page.waitForChanges();
195
+ expect(page.rootInstance.value).toBe(value1);
196
+ });
197
+ it("should test menu handleKeyboardOpen method - arrow up (custom select)", async () => {
198
+ const page = await newSpecPage({
199
+ components: [Select, Menu, IcInputComponentContainer],
200
+ html: `<ic-select label="IC Select Test"></ic-select>`,
201
+ });
202
+ page.root.options = menuOptions;
203
+ await page.waitForChanges();
204
+ const menu = page.root.shadowRoot.querySelector("ic-menu");
205
+ const KeyEvent = {
206
+ key: "ArrowUp",
207
+ preventDefault: () => null,
208
+ };
209
+ await menu.handleKeyboardOpen(KeyEvent);
210
+ await page.waitForChanges();
211
+ expect(page.rootInstance.open).toBeTruthy;
212
+ expect(page.rootInstance.value).toBe(value3);
213
+ await menu.handleKeyboardOpen(KeyEvent);
214
+ await page.waitForChanges();
215
+ await menu.handleKeyboardOpen(KeyEvent);
216
+ await page.waitForChanges();
217
+ await menu.handleKeyboardOpen(KeyEvent);
218
+ await page.waitForChanges();
219
+ expect(page.rootInstance.value).toBe(value3);
220
+ });
221
+ it("should test keydown on menu - space key (custom)", async () => {
222
+ const page = await newSpecPage({
223
+ components: [Select, Menu, IcInputComponentContainer],
224
+ html: `<ic-select label="IC Select Test"></ic-select>`,
225
+ });
226
+ page.root.options = menuOptions;
227
+ page.rootInstance.open = true;
228
+ await page.waitForChanges();
229
+ const list = page.root.shadowRoot.querySelector("ic-menu ul");
230
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
231
+ key: " ",
232
+ bubbles: true,
233
+ cancelable: true,
234
+ }));
235
+ await page.waitForChanges();
236
+ expect(page.rootInstance.open).toBe(false);
237
+ });
238
+ it("should test mousedown handler", async () => {
239
+ const page = await newSpecPage({
240
+ components: [Select, Menu, IcInputComponentContainer],
241
+ html: `<ic-select label="IC Select Test"></ic-select>`,
242
+ });
243
+ page.root.options = menuOptions;
244
+ const button = page.root.shadowRoot.querySelector("button.select-input");
245
+ const event = new Event("mousedown", {
246
+ bubbles: true,
247
+ cancelable: true,
248
+ });
249
+ button.dispatchEvent(event);
250
+ await page.waitForChanges();
251
+ expect(page.rootInstance.open).toBe(false);
252
+ });
253
+ it("should use option labels if no values", async () => {
254
+ const page = await newSpecPage({
255
+ components: [Select, Menu, IcInputComponentContainer],
256
+ html: `<ic-select label="IC Select Test"></ic-select>`,
257
+ });
258
+ page.root.options = menuOptionsNoValues;
259
+ await page.waitForChanges();
260
+ expect(page.root.options[0].value).toBe(label1);
261
+ expect(page.root.options[1].value).toBe(label2);
262
+ expect(page.root.options[2].value).toBe(label3);
263
+ });
264
+ it("should select the option that matches the pressed character key", async () => {
265
+ const page = await newSpecPage({
266
+ components: [Select, Menu, IcInputComponentContainer],
267
+ html: `<ic-select label="IC Select Test"></ic-select>`,
268
+ });
269
+ page.root.options = menuOptionsWithDescriptions;
270
+ await page.waitForChanges();
271
+ const eventSpy = jest.fn();
272
+ page.win.addEventListener("icChange", eventSpy);
273
+ await page.rootInstance.handleKeyDown({
274
+ key: "A",
275
+ preventDefault: () => null,
276
+ });
277
+ await page.waitForChanges();
278
+ expect(eventSpy).toHaveBeenCalledWith(expect.objectContaining({
279
+ detail: expect.objectContaining({
280
+ value: "Ame",
281
+ }),
282
+ }));
283
+ await waitForTimeout(1000);
284
+ await page.rootInstance.handleKeyDown({
285
+ key: "C",
286
+ preventDefault: () => null,
287
+ });
288
+ await page.waitForChanges();
289
+ expect(eventSpy).toHaveBeenCalledWith(expect.objectContaining({
290
+ detail: expect.objectContaining({
291
+ value: "Cap",
292
+ }),
293
+ }));
294
+ });
295
+ it("should select the option that matches the pressed character key - grouped options", async () => {
296
+ const page = await newSpecPage({
297
+ components: [Select, Menu, IcInputComponentContainer],
298
+ html: `<ic-select label="IC Select Test"></ic-select>`,
299
+ });
300
+ page.root.options = menuOptionsWithGroups;
301
+ await page.waitForChanges();
302
+ const eventSpy = jest.fn();
303
+ page.win.addEventListener("icChange", eventSpy);
304
+ await page.rootInstance.handleKeyDown({
305
+ key: "F",
306
+ preventDefault: () => null,
307
+ });
308
+ await page.waitForChanges();
309
+ expect(eventSpy).toHaveBeenCalledWith(expect.objectContaining({
310
+ detail: expect.objectContaining({
311
+ value: "Flat",
312
+ }),
313
+ }));
314
+ });
315
+ it("should test getFilteredChildMenuOptions for custom select", async () => {
316
+ const page = await newSpecPage({
317
+ components: [Select, Menu, IcInputComponentContainer],
318
+ html: `<ic-select label="IC Select Test"></ic-select>`,
319
+ });
320
+ page.root.options = menuOptionsWithGroups;
321
+ await page.waitForChanges();
322
+ const result = await page.rootInstance.getFilteredChildMenuOptions(menuOptionsWithGroups[0]);
323
+ await page.waitForChanges();
324
+ expect(result).toEqual(page.root.options[0]);
325
+ });
326
+ it("should select the option that matches the character key pressed when menu is open", async () => {
327
+ const page = await newSpecPage({
328
+ components: [Select, Menu, IcInputComponentContainer],
329
+ html: `<ic-select label="IC Select Test"></ic-select>`,
330
+ });
331
+ page.root.options = menuOptionsWithDescriptions;
332
+ page.rootInstance.open = true;
333
+ await page.waitForChanges();
334
+ const eventSpy = jest.fn();
335
+ page.win.addEventListener("icChange", eventSpy);
336
+ const list = page.root.shadowRoot.querySelector(menuUl);
337
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
338
+ key: "C",
339
+ bubbles: true,
340
+ cancelable: true,
341
+ }));
342
+ await page.waitForChanges();
343
+ expect(eventSpy).toHaveBeenCalledWith(expect.objectContaining({
344
+ detail: expect.objectContaining({
345
+ value: "Cap",
346
+ }),
347
+ }));
348
+ });
349
+ it("should add to pressedCharacters as characters are pressed and then reset it after 1 second", async () => {
350
+ const page = await newSpecPage({
351
+ components: [Select, Menu, IcInputComponentContainer],
352
+ html: `<ic-select label="IC Select Test"></ic-select>`,
353
+ });
354
+ page.root.options = menuOptionsWithDescriptions;
355
+ await page.waitForChanges();
356
+ await page.rootInstance.handleKeyDown({
357
+ key: "A",
358
+ preventDefault: () => null,
359
+ });
360
+ await page.waitForChanges();
361
+ expect(page.rootInstance.pressedCharacters).toBe("A");
362
+ await page.rootInstance.handleKeyDown({
363
+ key: "B",
364
+ preventDefault: () => null,
365
+ });
366
+ await page.waitForChanges();
367
+ expect(page.rootInstance.pressedCharacters).toBe("AB");
368
+ await page.rootInstance.handleKeyDown({
369
+ key: "C",
370
+ preventDefault: () => null,
371
+ });
372
+ await page.waitForChanges();
373
+ await waitForTimeout(1000);
374
+ await page.waitForChanges();
375
+ expect(page.rootInstance.pressedCharacters).toBe("");
376
+ });
377
+ it("should not open the menu when space key is used as a character key", async () => {
378
+ const page = await newSpecPage({
379
+ components: [Select, Menu, IcInputComponentContainer],
380
+ html: `<ic-select label="IC Select Test"></ic-select>`,
381
+ });
382
+ page.root.options = menuOptionsWithDescriptions;
383
+ await page.waitForChanges();
384
+ await page.rootInstance.handleKeyDown({
385
+ key: "A",
386
+ preventDefault: () => null,
387
+ });
388
+ await page.rootInstance.handleKeyDown({
389
+ key: " ",
390
+ preventDefault: () => null,
391
+ });
392
+ await page.waitForChanges();
393
+ expect(page.rootInstance.pressedCharacters).toBe("A ");
394
+ expect(page.rootInstance.open).toBe(false);
395
+ });
396
+ it("should not close the menu when space key is used as a character key", async () => {
397
+ const page = await newSpecPage({
398
+ components: [Select, Menu, IcInputComponentContainer],
399
+ html: `<ic-select label="IC Select Test"></ic-select>`,
400
+ });
401
+ page.root.options = menuOptionsWithDescriptions;
402
+ page.rootInstance.open = true;
403
+ await page.waitForChanges();
404
+ const eventSpy = jest.fn();
405
+ page.win.addEventListener("icChange", eventSpy);
406
+ const list = page.root.shadowRoot.querySelector(menuUl);
407
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
408
+ key: "C",
409
+ bubbles: true,
410
+ cancelable: true,
411
+ }));
412
+ await page.waitForChanges();
413
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
414
+ key: " ",
415
+ bubbles: true,
416
+ cancelable: true,
417
+ }));
418
+ await page.waitForChanges();
419
+ expect(page.rootInstance.pressedCharacters).toBe("C ");
420
+ expect(page.rootInstance.open).toBe(true);
421
+ });
422
+ it("should test loading state and timeout for custom select", async () => {
423
+ const page = await newSpecPage({
424
+ components: [Select, Menu, IcInputComponentContainer],
425
+ html: `<ic-select label="IC Select Test" timeout="1000"></ic-select>`,
426
+ });
427
+ const eventSpy = jest.fn();
428
+ page.win.addEventListener("icBlur", eventSpy);
429
+ page.rootInstance.loading = true;
430
+ page.rootInstance.open = true;
431
+ await page.waitForChanges();
432
+ expect(page.rootInstance.uniqueOptions[0].label).toEqual(loadingLabel);
433
+ await waitForTimeout(1000);
434
+ expect(page.rootInstance.uniqueOptions[0].label).toEqual(loadingErrorLabel);
435
+ await page.waitForChanges();
436
+ const retryButton = page.root.shadowRoot
437
+ .querySelector("ic-menu")
438
+ .querySelector(retryButtonId);
439
+ retryButton.blur();
440
+ expect(page.rootInstance.open).toBeFalsy;
441
+ expect(eventSpy).toHaveBeenCalled;
442
+ page.root.options = [];
443
+ await page.waitForChanges();
444
+ expect(page.rootInstance.uniqueOptions[0].label).toEqual(loadingErrorLabel);
445
+ });
446
+ it("should focus the input when escape is pressed whilst the menu is focused", async () => {
447
+ const spy = jest.spyOn(HTMLButtonElement.prototype, "focus");
448
+ const page = await newSpecPage({
449
+ components: [Select, Menu, IcInputComponentContainer],
450
+ html: `<ic-select label="IC Select Test"></ic-select>`,
451
+ });
452
+ page.root.options = menuOptions;
453
+ page.rootInstance.open = true;
454
+ await page.waitForChanges();
455
+ const list = page.root.shadowRoot.querySelector(menuUl);
456
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
457
+ key: "Escape",
458
+ bubbles: true,
459
+ cancelable: true,
460
+ }));
461
+ await page.waitForChanges();
462
+ expect(page.rootInstance.open).toBeFalsy();
463
+ expect(spy).toHaveBeenCalled();
464
+ });
465
+ it("should deduplicateOptions and log a console warning about the offending items", async () => {
466
+ const page = await newSpecPage({
467
+ components: [Select, Menu, IcInputComponentContainer],
468
+ html: `<ic-select label="IC Select Test"></ic-select>`,
469
+ });
470
+ page.rootInstance.options = menuOptionsWithDuplicates;
471
+ await page.waitForChanges();
472
+ expect(page.rootInstance.uniqueOptions).toEqual([
473
+ {
474
+ label: label1,
475
+ value: value1,
476
+ },
477
+ {
478
+ label: label2,
479
+ value: value2,
480
+ },
481
+ {
482
+ label: label3,
483
+ value: value3,
484
+ },
485
+ {
486
+ label: groupLabel,
487
+ value: groupLabel,
488
+ children: [
489
+ {
490
+ label: label4,
491
+ value: value4,
492
+ },
493
+ ],
494
+ },
495
+ ]);
496
+ });
497
+ });
498
+ describe("ic-select single native", () => {
499
+ beforeEach(() => {
500
+ Object.defineProperty(helpers, "isMobileOrTablet", {
501
+ value: jest.fn().mockReturnValue(true),
502
+ });
503
+ });
504
+ afterEach(() => {
505
+ Object.defineProperty(helpers, "isMobileOrTablet", {
506
+ value: jest.fn().mockReturnValue(false),
507
+ });
508
+ });
509
+ it("should test native select", async () => {
510
+ const page = await newSpecPage({
511
+ components: [Select],
512
+ html: `<ic-select label="IC Select Test"></ic-select>`,
513
+ });
514
+ page.root.options = menuOptions;
515
+ page.root.label = "New label";
516
+ await page.waitForChanges();
517
+ page.root.setFocus();
518
+ await page.waitForChanges();
519
+ expect(page.root).toMatchSnapshot("native-select");
520
+ });
521
+ it("should test native select with groups", async () => {
522
+ const page = await newSpecPage({
523
+ components: [Select],
524
+ html: `<ic-select label="IC Select Test"></ic-select>`,
525
+ });
526
+ page.root.options = menuOptionsWithGroups;
527
+ page.root.label = "New label";
528
+ await page.waitForChanges();
529
+ page.root.setFocus();
530
+ await page.waitForChanges();
531
+ expect(page.root).toMatchSnapshot("native-select-with-groups");
532
+ let eventSpy = jest.fn();
533
+ page.win.addEventListener("icBlur", eventSpy);
534
+ const select = page.root.shadowRoot.querySelector("select");
535
+ select.blur();
536
+ await page.waitForChanges();
537
+ expect(eventSpy).toHaveBeenCalled();
538
+ eventSpy = jest.fn();
539
+ page.win.addEventListener("icChange", eventSpy);
540
+ const event = new Event("change", {
541
+ bubbles: true,
542
+ cancelable: true,
543
+ });
544
+ page.rootInstance.nativeSelectElement.selectedIndex = 0;
545
+ select.dispatchEvent(event);
546
+ await page.waitForChanges();
547
+ //delay to wait for aria live update
548
+ await waitForTimeout(900);
549
+ expect(eventSpy).toHaveBeenCalled();
550
+ });
551
+ it("should test native select keydown", async () => {
552
+ const page = await newSpecPage({
553
+ components: [Select],
554
+ html: `<ic-select label="IC Select Test"></ic-select>`,
555
+ });
556
+ page.root.options = menuOptions;
557
+ page.root.setFocus();
558
+ await page.waitForChanges();
559
+ await page.rootInstance.handleNativeSelectKeyDown({
560
+ key: "ArrowDown",
561
+ preventDefault: () => null,
562
+ });
563
+ await page.waitForChanges();
564
+ expect(page.rootInstance.open).toBeFalsy;
565
+ });
566
+ });
567
+ describe("ic-select searchable", () => {
568
+ it("should render as required", async () => {
569
+ const page = await newSpecPage({
570
+ components: [Select, Menu, IcInputComponentContainer],
571
+ html: getTestSelect('required="true" searchable="true"'),
572
+ });
573
+ expect(page.root).toMatchSnapshot("required-searchable");
574
+ });
575
+ it("should test with clear button with searchable", async () => {
576
+ const page = await newSpecPage({
577
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
578
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
579
+ });
580
+ page.root.options = menuOptions;
581
+ page.rootInstance.searchableSelectInputValue = "test value";
582
+ await page.waitForChanges();
583
+ const clearButton = page.root.shadowRoot.querySelector(clearButtonId);
584
+ clearButton.focus();
585
+ await page.waitForChanges();
586
+ expect(page.rootInstance.clearButtonFocused).toBe(true);
587
+ clearButton.blur();
588
+ await page.waitForChanges();
589
+ expect(page.rootInstance.clearButtonFocused).toBe(false);
590
+ clearButton.click();
591
+ await page.waitForChanges();
592
+ expect(page.rootInstance.searchableSelectInputValue).toBeNull;
593
+ });
594
+ it("should test keydown handler searchable", async () => {
595
+ const page = await newSpecPage({
596
+ components: [Select, Menu, IcInputComponentContainer],
597
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
598
+ });
599
+ jest.spyOn(page.rootInstance, "setFocus").mockImplementation();
600
+ page.root.options = menuOptions;
601
+ await page.waitForChanges();
602
+ await page.root.setFocus();
603
+ await page.waitForChanges();
604
+ await page.rootInstance.handleKeyDown({
605
+ key: "ArrowDown",
606
+ preventDefault: () => null,
607
+ });
608
+ await page.waitForChanges();
609
+ const menu = page.root.shadowRoot.querySelector("ic-menu");
610
+ expect(menu.options).toEqual(menuOptions);
611
+ expect(page.rootInstance.open).toBeTruthy;
612
+ await page.waitForChanges();
613
+ await page.rootInstance.handleKeyDown({
614
+ key: "Enter",
615
+ preventDefault: () => null,
616
+ });
617
+ await page.waitForChanges();
618
+ expect(page.rootInstance.open).toBeFalsy;
619
+ page.rootInstance.open = true;
620
+ page.rootInstance.noOptions = true;
621
+ await page.waitForChanges();
622
+ await page.rootInstance.handleKeyDown({
623
+ key: "Ctrl",
624
+ preventDefault: () => null,
625
+ });
626
+ await page.waitForChanges();
627
+ expect(page.rootInstance.setFocus).toHaveBeenCalledTimes(2);
628
+ page.rootInstance.open = true;
629
+ page.rootInstance.noOptions = true;
630
+ await page.waitForChanges();
631
+ await page.rootInstance.handleKeyDown({
632
+ key: "Backspace",
633
+ preventDefault: () => null,
634
+ });
635
+ await page.waitForChanges();
636
+ expect(page.rootInstance.setFocus).toHaveBeenCalledTimes(3);
637
+ });
638
+ it("should test keydown on menu - arrow up (searchable)", async () => {
639
+ const page = await newSpecPage({
640
+ components: [Select, Menu, IcInputComponentContainer],
641
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
642
+ });
643
+ page.root.options = menuOptions;
644
+ page.root.value = value2;
645
+ await page.waitForChanges();
646
+ const list = page.root.shadowRoot.querySelector(menuUl);
647
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
648
+ key: "ArrowUp",
649
+ bubbles: true,
650
+ cancelable: true,
651
+ }));
652
+ await page.waitForChanges();
653
+ const input = page.root.shadowRoot.querySelector("input");
654
+ expect(input.value).toBe(label2);
655
+ expect(page.rootInstance.open).toBeTruthy;
656
+ });
657
+ it("should test keydown on menu - arrow up wrap around (searchable)", async () => {
658
+ const page = await newSpecPage({
659
+ components: [Select, Menu, IcInputComponentContainer],
660
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
661
+ });
662
+ page.root.options = menuOptions;
663
+ page.rootInstance.open = true;
664
+ await page.waitForChanges();
665
+ page.root.value = value1;
666
+ await page.waitForChanges();
667
+ const list = page.root.shadowRoot.querySelector(menuUl);
668
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
669
+ key: "ArrowUp",
670
+ bubbles: true,
671
+ cancelable: true,
672
+ }));
673
+ await page.waitForChanges();
674
+ const input = page.root.shadowRoot.querySelector("input");
675
+ expect(input.value).toBe(label1);
676
+ });
677
+ it("should test keydown on menu - arrow down", async () => {
678
+ const page = await newSpecPage({
679
+ components: [Select, Menu, IcInputComponentContainer],
680
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
681
+ });
682
+ page.root.options = menuOptions;
683
+ page.rootInstance.open = true;
684
+ await page.waitForChanges();
685
+ page.root.value = value1;
686
+ await page.waitForChanges();
687
+ const list = page.root.shadowRoot.querySelector(menuUl);
688
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
689
+ key: "ArrowDown",
690
+ bubbles: true,
691
+ cancelable: true,
692
+ }));
693
+ await page.waitForChanges();
694
+ const input = page.root.shadowRoot.querySelector("input");
695
+ expect(input.value).toBe(label1);
696
+ });
697
+ it("should test keydown on menu - arrow down wrap around", async () => {
698
+ const page = await newSpecPage({
699
+ components: [Select, Menu, IcInputComponentContainer],
700
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
701
+ });
702
+ page.root.options = menuOptions;
703
+ page.rootInstance.open = true;
704
+ await page.waitForChanges();
705
+ page.root.value = value3;
706
+ await page.waitForChanges();
707
+ const list = page.root.shadowRoot.querySelector(menuUl);
708
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
709
+ key: "ArrowDown",
710
+ bubbles: true,
711
+ cancelable: true,
712
+ }));
713
+ await page.waitForChanges();
714
+ const input = page.root.shadowRoot.querySelector("input");
715
+ expect(input.value).toBe(label3);
716
+ });
717
+ it("should test keydown on menu - home key", async () => {
718
+ const page = await newSpecPage({
719
+ components: [Select, Menu, IcInputComponentContainer],
720
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
721
+ });
722
+ page.root.options = menuOptions;
723
+ page.rootInstance.open = true;
724
+ await page.waitForChanges();
725
+ page.root.value = value3;
726
+ await page.waitForChanges();
727
+ const list = page.root.shadowRoot.querySelector(menuUl);
728
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
729
+ key: "Home",
730
+ bubbles: true,
731
+ cancelable: true,
732
+ }));
733
+ expect(page.rootInstance.open).toBeTruthy;
734
+ });
735
+ it("should test keydown on menu - end key", async () => {
736
+ const page = await newSpecPage({
737
+ components: [Select, Menu, IcInputComponentContainer],
738
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
739
+ });
740
+ page.root.options = menuOptions;
741
+ page.root.value = value1;
742
+ await page.waitForChanges();
743
+ const list = page.root.shadowRoot.querySelector(menuUl);
744
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
745
+ key: "End",
746
+ bubbles: true,
747
+ cancelable: true,
748
+ }));
749
+ await page.waitForChanges();
750
+ const input = page.root.shadowRoot.querySelector("input");
751
+ expect(input.value).toBe(label1);
752
+ expect(page.rootInstance.open).toBeTruthy;
753
+ });
754
+ it("should test keydown on menu - backspace key", async () => {
755
+ const page = await newSpecPage({
756
+ components: [Select, Menu, IcInputComponentContainer],
757
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
758
+ });
759
+ page.root.options = menuOptions;
760
+ page.rootInstance.open = true;
761
+ await page.waitForChanges();
762
+ page.root.value = value3;
763
+ await page.waitForChanges();
764
+ const list = page.root.shadowRoot.querySelector(menuUl);
765
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
766
+ key: "Backspace",
767
+ bubbles: true,
768
+ cancelable: true,
769
+ }));
770
+ await page.waitForChanges();
771
+ const input = page.root.shadowRoot.querySelector("input");
772
+ expect(input.value).toBe(label3);
773
+ });
774
+ it("should test keydown on menu - enter key", async () => {
775
+ const page = await newSpecPage({
776
+ components: [Select, Menu, IcInputComponentContainer],
777
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
778
+ });
779
+ page.root.options = menuOptions;
780
+ page.rootInstance.open = true;
781
+ await page.waitForChanges();
782
+ page.root.value = value3;
783
+ await page.waitForChanges();
784
+ const list = page.root.shadowRoot.querySelector(menuUl);
785
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
786
+ key: "ArrowDown",
787
+ bubbles: true,
788
+ cancelable: true,
789
+ }));
790
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
791
+ key: "Enter",
792
+ bubbles: true,
793
+ cancelable: true,
794
+ }));
795
+ await page.waitForChanges();
796
+ const input = page.root.shadowRoot.querySelector("input");
797
+ expect(input.value).toBe(label1);
798
+ input.click();
799
+ await page.waitForChanges();
800
+ expect(page.rootInstance.filteredOptions).toHaveLength(3);
801
+ });
802
+ it("should test keydown on menu - space key", async () => {
803
+ const page = await newSpecPage({
804
+ components: [Select, Menu, IcInputComponentContainer],
805
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
806
+ });
807
+ page.root.options = menuOptions;
808
+ page.rootInstance.open = true;
809
+ await page.waitForChanges();
810
+ const list = page.root.shadowRoot.querySelector(menuUl);
811
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
812
+ key: " ",
813
+ bubbles: true,
814
+ cancelable: true,
815
+ }));
816
+ await page.waitForChanges();
817
+ expect(page.rootInstance.open).toBe(true);
818
+ });
819
+ it("should test keydown on menu - other key", async () => {
820
+ const page = await newSpecPage({
821
+ components: [Select, Menu, IcInputComponentContainer],
822
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
823
+ });
824
+ page.root.options = menuOptions;
825
+ page.rootInstance.open = true;
826
+ await page.waitForChanges();
827
+ page.root.value = value2;
828
+ await page.waitForChanges();
829
+ const list = page.root.shadowRoot.querySelector(menuUl);
830
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
831
+ key: "Ctrl",
832
+ bubbles: true,
833
+ cancelable: true,
834
+ }));
835
+ await page.waitForChanges();
836
+ const input = page.root.shadowRoot.querySelector("input");
837
+ expect(input.value).toBe(label2);
838
+ });
839
+ it("should test keyup on menu list", async () => {
840
+ const page = await newSpecPage({
841
+ components: [Select, Menu, IcInputComponentContainer],
842
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
843
+ });
844
+ page.root.options = menuOptions;
845
+ page.rootInstance.open = true;
846
+ await page.waitForChanges();
847
+ page.root.value = value2;
848
+ await page.waitForChanges();
849
+ const list = page.root.shadowRoot.querySelector(menuUl);
850
+ list.dispatchEvent(new window.window.KeyboardEvent("keyup", {
851
+ key: "Tab",
852
+ shiftKey: true,
853
+ bubbles: true,
854
+ cancelable: true,
855
+ }));
856
+ await page.waitForChanges();
857
+ const input = page.root.shadowRoot.querySelector("input");
858
+ expect(input.value).toBe(label2);
859
+ });
860
+ it("should test click on input", async () => {
861
+ const page = await newSpecPage({
862
+ components: [Select, Menu, IcInputComponentContainer],
863
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
864
+ });
865
+ page.root.options = menuOptions;
866
+ await page.waitForChanges();
867
+ const input = page.root.shadowRoot.querySelector("input");
868
+ input.click();
869
+ await page.waitForChanges();
870
+ expect(page.rootInstance.open).toBe(true);
871
+ });
872
+ it("should test click on input with external filtering", async () => {
873
+ const page = await newSpecPage({
874
+ components: [Select, Menu, IcInputComponentContainer],
875
+ html: `<ic-select label="IC Select Test" searchable="true" disable-filter="true"></ic-select>`,
876
+ });
877
+ page.root.options = menuOptions;
878
+ await page.waitForChanges();
879
+ const input = page.root.shadowRoot.querySelector("input");
880
+ input.click();
881
+ await page.waitForChanges();
882
+ expect(page.rootInstance.open).toBe(true);
883
+ });
884
+ it("should test blur on searchable input", async () => {
885
+ const page = await newSpecPage({
886
+ components: [Select, Menu, IcInputComponentContainer],
887
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
888
+ });
889
+ page.root.options = menuOptions;
890
+ await page.waitForChanges();
891
+ const eventSpy = jest.fn();
892
+ page.win.addEventListener("icBlur", eventSpy);
893
+ const input = page.root.shadowRoot.querySelector("input");
894
+ input.blur();
895
+ await page.waitForChanges();
896
+ expect(eventSpy).toHaveBeenCalled();
897
+ });
898
+ it("should test blur on searchable input where target is an element of the menu but not a menu option", async () => {
899
+ const page = await newSpecPage({
900
+ components: [Select, Menu, IcInputComponentContainer],
901
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
902
+ });
903
+ page.root.options = menuOptions;
904
+ await page.waitForChanges();
905
+ const target = page.root.shadowRoot.querySelector("ul.menu");
906
+ const event = new FocusEvent("blur", {
907
+ bubbles: true,
908
+ cancelable: true,
909
+ relatedTarget: target,
910
+ });
911
+ const eventSpy = jest.fn();
912
+ page.win.addEventListener("icBlur", eventSpy);
913
+ await page.rootInstance.onBlur(event);
914
+ await page.waitForChanges();
915
+ expect(eventSpy).not.toHaveBeenCalled();
916
+ });
917
+ it("should test searchable input", async () => {
918
+ const page = await newSpecPage({
919
+ components: [Select, Menu, IcInputComponentContainer],
920
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
921
+ });
922
+ page.root.options = menuOptions;
923
+ await page.waitForChanges();
924
+ const event = new Event("input", {
925
+ bubbles: true,
926
+ cancelable: true,
927
+ });
928
+ const input = page.root.shadowRoot.querySelector("input");
929
+ page.rootInstance.searchableSelectInputValue = testValue;
930
+ input.dispatchEvent(event);
931
+ await page.waitForChanges();
932
+ //delay to wait for aria live update
933
+ await waitForTimeout(900);
934
+ expect(page.rootInstance.open).toBe(true);
935
+ page.rootInstance.searchableSelectInputValue = "";
936
+ await page.waitForChanges();
937
+ input.dispatchEvent(event);
938
+ await page.waitForChanges();
939
+ //delay to wait for aria live update
940
+ await waitForTimeout(900);
941
+ expect(page.rootInstance.open).toBe(true);
942
+ page.root.options = [];
943
+ await page.waitForChanges();
944
+ page.rootInstance.searchableSelectInputValue = "";
945
+ input.dispatchEvent(event);
946
+ await page.waitForChanges();
947
+ //delay to wait for aria live update
948
+ await waitForTimeout(900);
949
+ expect(page.rootInstance.open).toBe(true);
950
+ });
951
+ it("should test searchable input filtering", async () => {
952
+ const page = await newSpecPage({
953
+ components: [Select, Menu, IcInputComponentContainer],
954
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
955
+ });
956
+ page.root.options = menuOptionsWithDescriptions;
957
+ page.rootInstance.searchableSelectInputValue = "c";
958
+ await page.waitForChanges();
959
+ const input = page.root.shadowRoot.querySelector("input");
960
+ const event = new Event("input", {
961
+ bubbles: true,
962
+ cancelable: true,
963
+ });
964
+ input.dispatchEvent(event);
965
+ await page.waitForChanges();
966
+ //delay to wait for aria live update
967
+ await waitForTimeout(900);
968
+ expect(page.rootInstance.filteredOptions.length).toBe(2);
969
+ });
970
+ it("should test searchable input - with search match position set to start", async () => {
971
+ const page = await newSpecPage({
972
+ components: [Select, Menu, IcInputComponentContainer],
973
+ html: `<ic-select label="IC Select Test" searchable="true" search-match-position="start"></ic-select>`,
974
+ });
975
+ page.root.options = menuOptionsWithDescriptions;
976
+ page.rootInstance.searchableSelectInputValue = "c";
977
+ await page.waitForChanges();
978
+ const input = page.root.shadowRoot.querySelector("input");
979
+ const event = new Event("input", {
980
+ bubbles: true,
981
+ cancelable: true,
982
+ });
983
+ input.dispatchEvent(event);
984
+ await page.waitForChanges();
985
+ //delay to wait for aria live update
986
+ await waitForTimeout(900);
987
+ expect(page.rootInstance.filteredOptions.length).toBe(1);
988
+ });
989
+ it("should test searchable input - with descriptions and descriptions included in search", async () => {
990
+ const page = await newSpecPage({
991
+ components: [Select, Menu, IcInputComponentContainer],
992
+ html: `<ic-select label="IC Select Test" searchable="true" include-descriptions-in-search="true"></ic-select>`,
993
+ });
994
+ page.root.options = menuOptionsWithDescriptions;
995
+ page.rootInstance.searchableSelectInputValue = "Test description 2";
996
+ await page.waitForChanges();
997
+ const input = page.root.shadowRoot.querySelector("input");
998
+ const event = new Event("input", {
999
+ bubbles: true,
1000
+ cancelable: true,
1001
+ });
1002
+ input.dispatchEvent(event);
1003
+ await page.waitForChanges();
1004
+ //delay to wait for aria live update
1005
+ await waitForTimeout(900);
1006
+ expect(page.rootInstance.filteredOptions).not.toBeNull;
1007
+ });
1008
+ it("should test searchable input - with search match position set to start and descriptions included in search", async () => {
1009
+ const page = await newSpecPage({
1010
+ components: [Select, Menu, IcInputComponentContainer],
1011
+ html: `<ic-select label="IC Select Test" searchable="true" search-match-position="start" include-descriptions-in-search="true"></ic-select>`,
1012
+ });
1013
+ page.root.options = menuOptionsWithDescriptions;
1014
+ page.rootInstance.searchableSelectInputValue = "e";
1015
+ await page.waitForChanges();
1016
+ const input = page.root.shadowRoot.querySelector("input");
1017
+ const event = new Event("input", {
1018
+ bubbles: true,
1019
+ cancelable: true,
1020
+ });
1021
+ input.dispatchEvent(event);
1022
+ await page.waitForChanges();
1023
+ //delay to wait for aria live update
1024
+ await waitForTimeout(900);
1025
+ expect(page.rootInstance.filteredOptions.length).toBe(1);
1026
+ });
1027
+ it("should test searchable input - with groups", async () => {
1028
+ const page = await newSpecPage({
1029
+ components: [Select, Menu, IcInputComponentContainer],
1030
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
1031
+ });
1032
+ page.root.options = menuOptionsWithGroups;
1033
+ page.rootInstance.searchableSelectInputValue = "Latte";
1034
+ await page.waitForChanges();
1035
+ const input = page.root.shadowRoot.querySelector("input");
1036
+ const event = new Event("input", {
1037
+ bubbles: true,
1038
+ cancelable: true,
1039
+ });
1040
+ input.dispatchEvent(event);
1041
+ await page.waitForChanges();
1042
+ //delay to wait for aria live update
1043
+ await waitForTimeout(900);
1044
+ expect(page.rootInstance.filteredOptions).not.toBeNull;
1045
+ });
1046
+ it("should test searchable input - with groups and group titles included in search", async () => {
1047
+ const page = await newSpecPage({
1048
+ components: [Select, Menu, IcInputComponentContainer],
1049
+ html: `<ic-select label="IC Select Test" searchable="true" include-group-titles-in-search="true"></ic-select>`,
1050
+ });
1051
+ page.root.options = menuOptionsWithGroups;
1052
+ page.rootInstance.searchableSelectInputValue = "Fancy";
1053
+ await page.waitForChanges();
1054
+ const input = page.root.shadowRoot.querySelector("input");
1055
+ const event = new Event("input", {
1056
+ bubbles: true,
1057
+ cancelable: true,
1058
+ });
1059
+ input.dispatchEvent(event);
1060
+ await page.waitForChanges();
1061
+ //delay to wait for aria live update
1062
+ await waitForTimeout(900);
1063
+ expect(page.rootInstance.filteredOptions).not.toBeNull;
1064
+ });
1065
+ it("should test selectchange on no result found entry", async () => {
1066
+ const page = await newSpecPage({
1067
+ components: [Select, Menu, IcInputComponentContainer],
1068
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
1069
+ });
1070
+ page.root.options = menuOptions;
1071
+ page.rootInstance.open = true;
1072
+ page.rootInstance.searchableSelectInputValue = testValue;
1073
+ await page.waitForChanges();
1074
+ page.rootInstance.handleCustomSelectChange({
1075
+ detail: {
1076
+ label: noResults,
1077
+ },
1078
+ });
1079
+ await page.waitForChanges();
1080
+ expect(page.rootInstance.searchableSelectInputValue).toBe(testValue);
1081
+ });
1082
+ it("should test dropdown icon mousedown handler", async () => {
1083
+ const page = await newSpecPage({
1084
+ components: [Select, Menu, IcInputComponentContainer],
1085
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
1086
+ });
1087
+ page.root.options = menuOptions;
1088
+ page.rootInstance.handleExpandIconMouseDown({
1089
+ detail: "some value",
1090
+ preventDefault: () => null,
1091
+ });
1092
+ await page.waitForChanges();
1093
+ expect(page.rootInstance.open).toBe(true);
1094
+ });
1095
+ it("should test form reset event", async () => {
1096
+ const page = await newSpecPage({
1097
+ components: [Select],
1098
+ html: `<form>
1099
+ <ic-select label="IC Select Test" searchable="true"></ic-select>
1100
+ <button id="resetButton" type="reset">Reset</button>
1101
+ </form>`,
1102
+ });
1103
+ expect(page.rootInstance.searchableSelectInputValue).toBe(null);
1104
+ page.rootInstance.searchableSelectInputValue = testValue;
1105
+ await page.waitForChanges();
1106
+ expect(page.rootInstance.searchableSelectInputValue).toBe(testValue);
1107
+ await page.rootInstance.handleFormReset();
1108
+ await page.waitForChanges();
1109
+ expect(page.rootInstance.searchableSelectInputValue).toBe(null);
1110
+ });
1111
+ it("should test debounce change", async () => {
1112
+ const page = await newSpecPage({
1113
+ components: [Select, Menu, IcInputComponentContainer],
1114
+ html: `<ic-select label="IC Select Test" searchable="true" disable-filter="true" debounce="300"></ic-select>`,
1115
+ });
1116
+ await page.waitForChanges();
1117
+ expect(page.rootInstance.currDebounce).toBe(300);
1118
+ page.root.debounce = 500;
1119
+ await page.waitForChanges();
1120
+ expect(page.rootInstance.currDebounce).toBe(500);
1121
+ });
1122
+ it("should test no results state when no options passed and filtering disabled", async () => {
1123
+ const page = await newSpecPage({
1124
+ components: [Select, Menu, IcInputComponentContainer],
1125
+ html: `<ic-select label="IC Select Test" searchable="true" disable-filter="true" debounce="300"></ic-select>`,
1126
+ });
1127
+ page.root.options = menuOptions;
1128
+ page.rootInstance.searchableSelectInputValue = "test";
1129
+ await page.waitForChanges();
1130
+ const input = page.root.shadowRoot.querySelector("input");
1131
+ const event = new Event("input", {
1132
+ bubbles: true,
1133
+ cancelable: true,
1134
+ });
1135
+ input.dispatchEvent(event);
1136
+ await page.waitForChanges();
1137
+ page.root.options = [];
1138
+ await page.waitForChanges();
1139
+ expect(page.rootInstance.filteredOptions).toHaveLength(1);
1140
+ expect(page.rootInstance.filteredOptions[0].label).toEqual(noResults);
1141
+ expect(page.rootInstance.open).toBe(true);
1142
+ input.click();
1143
+ await page.waitForChanges();
1144
+ expect(page.rootInstance.open).toBe(false);
1145
+ page.root.options = menuOptions;
1146
+ await page.waitForChanges();
1147
+ });
1148
+ it("should test menu opens and closes when enter pressed - external filtering", async () => {
1149
+ const page = await newSpecPage({
1150
+ components: [Select, Menu, IcInputComponentContainer],
1151
+ html: `<ic-select label="IC Select Test" searchable="true" disable-filter="true" debounce="300"></ic-select>`,
1152
+ });
1153
+ page.root.options = [];
1154
+ page.rootInstance.searchableSelectInputValue = "test";
1155
+ await page.waitForChanges();
1156
+ const input = page.root.shadowRoot.querySelector("input");
1157
+ const event = new Event("input", {
1158
+ bubbles: true,
1159
+ cancelable: true,
1160
+ });
1161
+ input.dispatchEvent(event);
1162
+ await page.waitForChanges();
1163
+ //test menu displays when Enter pressed
1164
+ input.focus();
1165
+ await page.waitForChanges();
1166
+ await page.rootInstance.handleKeyDown({
1167
+ key: "Enter",
1168
+ preventDefault: () => null,
1169
+ });
1170
+ await page.waitForChanges();
1171
+ expect(page.rootInstance.open).toBe(false);
1172
+ await page.rootInstance.handleKeyDown({
1173
+ key: "Enter",
1174
+ target: { id: "test-event-id" },
1175
+ preventDefault: () => null,
1176
+ });
1177
+ await page.waitForChanges();
1178
+ expect(page.rootInstance.open).toBe(false);
1179
+ });
1180
+ it("should test adding and removing form reset listener on connect and disconnect", async () => {
1181
+ const page = await newSpecPage({
1182
+ components: [Select],
1183
+ html: `<form>
1184
+ <ic-select label="IC Select Test" searchable="true"></ic-select>
1185
+ <button id="resetButton" type="reset">Reset</button>
1186
+ </form>`,
1187
+ });
1188
+ const addSpy = jest.spyOn(page.root, "addEventListener");
1189
+ const removeSpy = jest.spyOn(page.root, "removeEventListener");
1190
+ expect(addSpy).toHaveBeenCalled;
1191
+ page.setContent("");
1192
+ await page.waitForChanges();
1193
+ expect(removeSpy).toHaveBeenCalled;
1194
+ });
1195
+ it("should set the default value of searchable as custom value when not matching options", async () => {
1196
+ const page = await newSpecPage({
1197
+ components: [Select, Menu, IcInputComponentContainer],
1198
+ html: `<ic-select label='Select test' searchable='true' value='Test value 01'></ic-select>`,
1199
+ });
1200
+ page.root.options = [];
1201
+ await page.waitForChanges();
1202
+ expect(page.rootInstance.searchableSelectInputValue).toBe("Test value 01");
1203
+ const input = page.root.shadowRoot.querySelector("input");
1204
+ expect(input.value).toBe("Test value 01");
1205
+ });
1206
+ it("should set the default value of searchable as option label if matching label/value exists", async () => {
1207
+ const page = await newSpecPage({
1208
+ components: [Select, Menu, IcInputComponentContainer],
1209
+ template: () => (h("ic-select", { label: "select test", searchable: true, options: menuOptions, value: value1 })),
1210
+ });
1211
+ expect(page.rootInstance.searchableSelectInputValue).toBe(label1);
1212
+ const input = page.root.shadowRoot.querySelector("input");
1213
+ expect(input.value).toBe(label1);
1214
+ });
1215
+ it("should set the default value of searchable as option label when options initially set to [] then populated", async () => {
1216
+ const page = await newSpecPage({
1217
+ components: [Select, Menu, IcInputComponentContainer],
1218
+ template: () => (h("ic-select", { label: "select test", searchable: true, options: [], value: value1 })),
1219
+ });
1220
+ page.root.options = menuOptions;
1221
+ await page.waitForChanges();
1222
+ expect(page.rootInstance.searchableSelectInputValue).toBe(label1);
1223
+ const input = page.root.shadowRoot.querySelector("input");
1224
+ expect(input.value).toBe(label1);
1225
+ });
1226
+ it("should set the default value to custom value when options initially set to [] then set to [] again", async () => {
1227
+ const page = await newSpecPage({
1228
+ components: [Select, Menu, IcInputComponentContainer],
1229
+ template: () => (h("ic-select", { label: "select test", searchable: true, options: [], value: value1 })),
1230
+ });
1231
+ page.root.options = [];
1232
+ await page.waitForChanges();
1233
+ expect(page.rootInstance.searchableSelectInputValue).toBe(value1);
1234
+ const input = page.root.shadowRoot.querySelector("input");
1235
+ expect(input.value).toBe(value1);
1236
+ });
1237
+ it("should test loading state and timeout for searchable select with external filtering", async () => {
1238
+ const page = await newSpecPage({
1239
+ components: [Select, Menu, IcInputComponentContainer],
1240
+ html: `<ic-select label="IC Select Test" searchable="true" disable-filter="true" debounce="300" timeout="1000"></ic-select>`,
1241
+ });
1242
+ page.rootInstance.searchableSelectInputValue = "test";
1243
+ await page.waitForChanges();
1244
+ const input = page.root.shadowRoot.querySelector("input");
1245
+ const event = new Event("input", {
1246
+ bubbles: true,
1247
+ cancelable: true,
1248
+ });
1249
+ input.dispatchEvent(event);
1250
+ page.rootInstance.loading = true;
1251
+ await page.waitForChanges();
1252
+ expect(page.rootInstance.filteredOptions[0].label).toEqual(loadingLabel);
1253
+ await waitForTimeout(1000);
1254
+ expect(page.rootInstance.filteredOptions[0].label).toEqual(loadingErrorLabel);
1255
+ await page.waitForChanges();
1256
+ const retryButton = page.root.shadowRoot
1257
+ .querySelector("ic-menu")
1258
+ .querySelector(retryButtonId);
1259
+ retryButton.click();
1260
+ page.rootInstance.loading = true;
1261
+ await page.waitForChanges();
1262
+ expect(page.rootInstance.filteredOptions[0].label).toEqual(loadingLabel);
1263
+ page.root.options = [];
1264
+ await page.waitForChanges();
1265
+ expect(page.rootInstance.filteredOptions[0].label).toEqual(noResults);
1266
+ });
1267
+ it("should focus the input when escape is pressed whilst the menu is focused (searchable)", async () => {
1268
+ const spy = jest.spyOn(HTMLInputElement.prototype, "focus");
1269
+ const page = await newSpecPage({
1270
+ components: [Select, Menu, IcInputComponentContainer],
1271
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
1272
+ });
1273
+ page.root.options = menuOptions;
1274
+ page.rootInstance.open = true;
1275
+ await page.waitForChanges();
1276
+ const list = page.root.shadowRoot.querySelector(menuUl);
1277
+ list.dispatchEvent(new window.window.KeyboardEvent("keydown", {
1278
+ key: "Escape",
1279
+ bubbles: true,
1280
+ cancelable: true,
1281
+ }));
1282
+ await page.waitForChanges();
1283
+ expect(page.rootInstance.open).toBeFalsy();
1284
+ expect(spy).toHaveBeenCalled();
1285
+ });
1286
+ it("should test keydown on loading retry button", async () => {
1287
+ const page = await newSpecPage({
1288
+ components: [Select, Menu, IcInputComponentContainer],
1289
+ html: `<ic-select label="IC Select Test" searchable="true" disable-filter="true" debounce="300" timeout="1000"></ic-select>`,
1290
+ });
1291
+ const input = page.root.shadowRoot.querySelector("input");
1292
+ const spy = jest.spyOn(input, "focus");
1293
+ page.rootInstance.searchableSelectInputValue = "test";
1294
+ await page.waitForChanges();
1295
+ let event = new Event("input", {
1296
+ bubbles: true,
1297
+ cancelable: true,
1298
+ });
1299
+ input.dispatchEvent(event);
1300
+ page.rootInstance.loading = true;
1301
+ await page.waitForChanges();
1302
+ await waitForTimeout(1000);
1303
+ await page.waitForChanges();
1304
+ event = new KeyboardEvent("keyDown", {
1305
+ key: "Enter",
1306
+ });
1307
+ const retryButton = page.root.shadowRoot
1308
+ .querySelector("ic-menu")
1309
+ .querySelector(retryButtonId);
1310
+ retryButton.dispatchEvent(event);
1311
+ expect(spy).toHaveBeenCalled;
1312
+ });
1313
+ it("should stop the timeout if clear button is clicked before timeout", async () => {
1314
+ const page = await newSpecPage({
1315
+ components: [Select, Menu, IcInputComponentContainer],
1316
+ html: `<ic-select label="IC Select Test" searchable="true" timeout="1000"></ic-select>`,
1317
+ });
1318
+ page.rootInstance.searchableSelectInputValue = "test";
1319
+ await page.waitForChanges();
1320
+ const event = new Event("input", {
1321
+ bubbles: true,
1322
+ cancelable: true,
1323
+ });
1324
+ const input = page.root.shadowRoot.querySelector("input");
1325
+ input.dispatchEvent(event);
1326
+ page.rootInstance.loading = true;
1327
+ await page.waitForChanges();
1328
+ expect(page.rootInstance.filteredOptions).toHaveLength(1);
1329
+ const clearButton = page.root.shadowRoot.querySelector(clearButtonId);
1330
+ clearButton.click();
1331
+ await page.waitForChanges();
1332
+ expect(page.rootInstance.filteredOptions).toHaveLength(1);
1333
+ expect(page.rootInstance.filteredOptions[0]).toMatchObject({
1334
+ label: noResults,
1335
+ value: "",
1336
+ });
1337
+ await waitForTimeout(1000);
1338
+ expect(page.rootInstance.filteredOptions).toHaveLength(1);
1339
+ expect(page.rootInstance.filteredOptions[0]).toMatchObject({
1340
+ label: noResults,
1341
+ value: "",
1342
+ });
1343
+ });
1344
+ it("should clear the searchable input if the value is programatically set to undefined", async () => {
1345
+ const page = await newSpecPage({
1346
+ components: [Select, Menu, IcInputComponentContainer],
1347
+ html: `<ic-select label="IC Select Test" searchable="true"></ic-select>`,
1348
+ });
1349
+ page.rootInstance.searchableSelectInputValue = "test";
1350
+ await page.waitForChanges();
1351
+ const event = new Event("input", {
1352
+ bubbles: true,
1353
+ cancelable: true,
1354
+ });
1355
+ const input = page.root.shadowRoot.querySelector("input");
1356
+ input.dispatchEvent(event);
1357
+ page.rootInstance.loading = true;
1358
+ await page.waitForChanges();
1359
+ expect(page.rootInstance.filteredOptions).toHaveLength(1);
1360
+ page.rootInstance.value = undefined;
1361
+ await page.waitForChanges();
1362
+ expect(page.rootInstance.searchableSelectInputValue).toBeUndefined;
1363
+ });
1364
+ });
1365
+ describe("ic-select multi", () => {
1366
+ it("should not render a native select on a mobile / tablet screen", async () => {
1367
+ Object.defineProperty(helpers, "isMobileOrTablet", {
1368
+ value: jest.fn().mockReturnValue(true),
1369
+ });
1370
+ const page = await newSpecPage({
1371
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
1372
+ html: `<ic-select label="IC Select Test" multiple="true"></ic-select>`,
1373
+ });
1374
+ page.root.options = menuOptions;
1375
+ await page.waitForChanges();
1376
+ expect(page.root).toMatchSnapshot();
1377
+ });
1378
+ it("should test handleKeyboardOpen method on menu - arrow down", async () => {
1379
+ const page = await newSpecPage({
1380
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
1381
+ html: `<ic-select label="IC Select Test" multiple="true"></ic-select>`,
1382
+ });
1383
+ page.root.options = menuOptions;
1384
+ await page.waitForChanges();
1385
+ const menu = page.root.shadowRoot.querySelector("ic-menu");
1386
+ const KeyEvent = {
1387
+ key: "ArrowDown",
1388
+ preventDefault: () => null,
1389
+ };
1390
+ await menu.handleKeyboardOpen(KeyEvent);
1391
+ await page.waitForChanges();
1392
+ expect(page.rootInstance.open).toBeTruthy;
1393
+ // Test option is not selected by automatic selection
1394
+ expect(page.rootInstance.value).toBe(undefined);
1395
+ });
1396
+ it("should test menu handleKeyboardOpen method - arrow up", async () => {
1397
+ const page = await newSpecPage({
1398
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
1399
+ html: `<ic-select label="IC Select Test" multiple="true"></ic-select>`,
1400
+ });
1401
+ page.root.options = menuOptions;
1402
+ await page.waitForChanges();
1403
+ const menu = page.root.shadowRoot.querySelector("ic-menu");
1404
+ const KeyEvent = {
1405
+ key: "ArrowUp",
1406
+ preventDefault: () => null,
1407
+ };
1408
+ await menu.handleKeyboardOpen(KeyEvent);
1409
+ await page.waitForChanges();
1410
+ expect(page.rootInstance.open).toBeTruthy;
1411
+ // Test option is not selected by automatic selection
1412
+ expect(page.rootInstance.value).toBe(undefined);
1413
+ });
1414
+ it("should test keydown on menu - arrow down, up, and enter", async () => {
1415
+ const page = await newSpecPage({
1416
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
1417
+ html: `<ic-select label="IC Select Test" multiple="true"></ic-select>`,
1418
+ });
1419
+ page.root.options = menuOptions;
1420
+ page.rootInstance.open = true;
1421
+ await page.waitForChanges();
1422
+ const menu = page.root.shadowRoot.querySelector(menuUl);
1423
+ menu.dispatchEvent(new window.window.KeyboardEvent("keydown", {
1424
+ key: "ArrowDown",
1425
+ bubbles: true,
1426
+ cancelable: true,
1427
+ }));
1428
+ await page.waitForChanges();
1429
+ menu.dispatchEvent(new window.window.KeyboardEvent("keydown", {
1430
+ key: "Enter",
1431
+ bubbles: true,
1432
+ cancelable: true,
1433
+ }));
1434
+ await page.waitForChanges();
1435
+ expect(page.rootInstance.value).toEqual([value1]);
1436
+ expect(page.root).toMatchSnapshot();
1437
+ menu.dispatchEvent(new window.window.KeyboardEvent("keydown", {
1438
+ key: "ArrowDown",
1439
+ bubbles: true,
1440
+ cancelable: true,
1441
+ }));
1442
+ await page.waitForChanges();
1443
+ menu.dispatchEvent(new window.window.KeyboardEvent("keydown", {
1444
+ key: "Enter",
1445
+ bubbles: true,
1446
+ cancelable: true,
1447
+ }));
1448
+ await page.waitForChanges();
1449
+ expect(page.rootInstance.value).toEqual([value1, value2]);
1450
+ expect(page.root).toMatchSnapshot();
1451
+ menu.dispatchEvent(new window.window.KeyboardEvent("keydown", {
1452
+ key: "ArrowUp",
1453
+ bubbles: true,
1454
+ cancelable: true,
1455
+ }));
1456
+ await page.waitForChanges();
1457
+ menu.dispatchEvent(new window.window.KeyboardEvent("keydown", {
1458
+ key: "Enter",
1459
+ bubbles: true,
1460
+ cancelable: true,
1461
+ }));
1462
+ await page.waitForChanges();
1463
+ expect(page.rootInstance.value).toEqual([value2]);
1464
+ });
1465
+ it("should select all options - handleSelectAllChange", async () => {
1466
+ const page = await newSpecPage({
1467
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
1468
+ html: `<ic-select label="IC Select Test" multiple="true"></ic-select>`,
1469
+ });
1470
+ const eventSpy = jest.fn();
1471
+ page.win.addEventListener("icOptionSelect", eventSpy);
1472
+ page.root.options = menuOptionsWithDisabled;
1473
+ await page.waitForChanges();
1474
+ page.rootInstance.handleSelectAllChange({ detail: { select: true } });
1475
+ // Test disabled option not selected
1476
+ expect(page.rootInstance.value).toEqual([value1, value2, value4]);
1477
+ expect(eventSpy).toHaveBeenCalledTimes(3);
1478
+ });
1479
+ it("should emit icOptionSelect only for unselected options - handleSelectAllChange", async () => {
1480
+ const page = await newSpecPage({
1481
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
1482
+ html: `<ic-select label="IC Select Test" multiple="true"></ic-select>`,
1483
+ });
1484
+ const eventSpy = jest.fn();
1485
+ page.win.addEventListener("icOptionSelect", eventSpy);
1486
+ page.root.options = menuOptionsWithDisabled;
1487
+ page.root.value = [value1];
1488
+ await page.waitForChanges();
1489
+ page.rootInstance.handleSelectAllChange({ detail: { select: true } });
1490
+ expect(eventSpy).toHaveBeenCalledTimes(2);
1491
+ });
1492
+ it("should deselect all options - handleSelectAllChange", async () => {
1493
+ const page = await newSpecPage({
1494
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
1495
+ html: `<ic-select label="IC Select Test" multiple="true"></ic-select>`,
1496
+ });
1497
+ page.root.options = menuOptionsWithDisabled;
1498
+ page.root.value = [value1, value2, value4];
1499
+ await page.waitForChanges();
1500
+ page.rootInstance.handleSelectAllChange({ detail: { select: false } });
1501
+ expect(page.rootInstance.value).toEqual([]);
1502
+ });
1503
+ it("should sort the selected options by the order of the options in the menu", async () => {
1504
+ const page = await newSpecPage({
1505
+ components: [Select, Menu, IcInputComponentContainer, IcButton],
1506
+ html: `<ic-select label="IC Select Test" multiple="true"></ic-select>`,
1507
+ });
1508
+ page.root.options = menuOptions;
1509
+ page.root.value = [value1];
1510
+ await page.waitForChanges();
1511
+ page.root.value = [value2, value1];
1512
+ await page.waitForChanges();
1513
+ const button = page.root.shadowRoot.querySelector("button.select-input");
1514
+ expect(page.rootInstance.currValue).toEqual([value1, value2]);
1515
+ expect(button.textContent).toContain(`${label1}, ${label2}`);
1516
+ });
1517
+ });
1518
+ //# sourceMappingURL=ic-select.spec.js.map