@crowdstrike/glide-core 0.13.1 → 0.14.1

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 (284) hide show
  1. package/dist/drawer.d.ts +2 -2
  2. package/dist/drawer.js +1 -1
  3. package/dist/drawer.styles.js +3 -14
  4. package/dist/dropdown.styles.js +3 -2
  5. package/dist/input.styles.js +1 -0
  6. package/dist/styles/variables.css +1 -1
  7. package/dist/textarea.styles.js +2 -0
  8. package/dist/toasts.d.ts +2 -2
  9. package/dist/toasts.toast.d.ts +1 -1
  10. package/dist/toasts.toast.js +1 -1
  11. package/dist/toasts.toast.styles.js +8 -0
  12. package/dist/tree.item.styles.js +2 -2
  13. package/package.json +8 -5
  14. package/dist/accordion.stories.d.ts +0 -6
  15. package/dist/accordion.test.basics.d.ts +0 -1
  16. package/dist/accordion.test.basics.js +0 -28
  17. package/dist/accordion.test.events.d.ts +0 -1
  18. package/dist/accordion.test.events.js +0 -28
  19. package/dist/accordion.test.focus.d.ts +0 -1
  20. package/dist/accordion.test.focus.js +0 -11
  21. package/dist/accordion.test.interactions.d.ts +0 -1
  22. package/dist/accordion.test.interactions.js +0 -75
  23. package/dist/button-group.button.test.basics.d.ts +0 -1
  24. package/dist/button-group.button.test.basics.js +0 -97
  25. package/dist/button-group.button.test.events.d.ts +0 -1
  26. package/dist/button-group.button.test.events.js +0 -15
  27. package/dist/button-group.button.test.focus.d.ts +0 -1
  28. package/dist/button-group.button.test.focus.js +0 -13
  29. package/dist/button-group.button.test.interactions.d.ts +0 -1
  30. package/dist/button-group.button.test.interactions.js +0 -42
  31. package/dist/button-group.stories.d.ts +0 -7
  32. package/dist/button-group.test.basics.d.ts +0 -1
  33. package/dist/button-group.test.basics.js +0 -148
  34. package/dist/button-group.test.events.d.ts +0 -1
  35. package/dist/button-group.test.events.js +0 -241
  36. package/dist/button-group.test.focus.d.ts +0 -1
  37. package/dist/button-group.test.focus.js +0 -39
  38. package/dist/button-group.test.interactions.d.ts +0 -1
  39. package/dist/button-group.test.interactions.js +0 -91
  40. package/dist/button.stories.d.ts +0 -7
  41. package/dist/button.test.basics.d.ts +0 -1
  42. package/dist/button.test.basics.js +0 -69
  43. package/dist/button.test.events.d.ts +0 -1
  44. package/dist/button.test.events.js +0 -102
  45. package/dist/checkbox-group.stories.d.ts +0 -6
  46. package/dist/checkbox-group.test.basics.d.ts +0 -1
  47. package/dist/checkbox-group.test.basics.js +0 -116
  48. package/dist/checkbox-group.test.events.d.ts +0 -1
  49. package/dist/checkbox-group.test.events.js +0 -111
  50. package/dist/checkbox-group.test.focus.d.ts +0 -1
  51. package/dist/checkbox-group.test.focus.js +0 -70
  52. package/dist/checkbox-group.test.form.d.ts +0 -1
  53. package/dist/checkbox-group.test.form.js +0 -131
  54. package/dist/checkbox-group.test.interactions.d.ts +0 -1
  55. package/dist/checkbox-group.test.interactions.js +0 -82
  56. package/dist/checkbox-group.test.validity.d.ts +0 -1
  57. package/dist/checkbox-group.test.validity.js +0 -145
  58. package/dist/checkbox.stories.d.ts +0 -5
  59. package/dist/checkbox.test.basics.d.ts +0 -1
  60. package/dist/checkbox.test.basics.js +0 -90
  61. package/dist/checkbox.test.events.d.ts +0 -1
  62. package/dist/checkbox.test.events.js +0 -105
  63. package/dist/checkbox.test.focus.d.ts +0 -1
  64. package/dist/checkbox.test.focus.js +0 -51
  65. package/dist/checkbox.test.form.d.ts +0 -1
  66. package/dist/checkbox.test.form.js +0 -133
  67. package/dist/checkbox.test.interactions.d.ts +0 -1
  68. package/dist/checkbox.test.interactions.js +0 -131
  69. package/dist/checkbox.test.validity.d.ts +0 -1
  70. package/dist/checkbox.test.validity.js +0 -128
  71. package/dist/drawer.stories.d.ts +0 -6
  72. package/dist/drawer.test.accessibility.d.ts +0 -1
  73. package/dist/drawer.test.accessibility.js +0 -22
  74. package/dist/drawer.test.basics.d.ts +0 -1
  75. package/dist/drawer.test.basics.js +0 -44
  76. package/dist/drawer.test.closing.d.ts +0 -1
  77. package/dist/drawer.test.closing.js +0 -40
  78. package/dist/drawer.test.events.d.ts +0 -1
  79. package/dist/drawer.test.events.js +0 -42
  80. package/dist/drawer.test.methods.d.ts +0 -1
  81. package/dist/drawer.test.methods.js +0 -35
  82. package/dist/dropdown.option.test.basics.d.ts +0 -1
  83. package/dist/dropdown.option.test.basics.js +0 -34
  84. package/dist/dropdown.option.test.basics.multiple.d.ts +0 -1
  85. package/dist/dropdown.option.test.basics.multiple.js +0 -36
  86. package/dist/dropdown.option.test.basics.single.d.ts +0 -1
  87. package/dist/dropdown.option.test.basics.single.js +0 -29
  88. package/dist/dropdown.option.test.events.d.ts +0 -1
  89. package/dist/dropdown.option.test.events.js +0 -36
  90. package/dist/dropdown.option.test.focus.d.ts +0 -1
  91. package/dist/dropdown.option.test.focus.js +0 -11
  92. package/dist/dropdown.option.test.interactions.multiple.d.ts +0 -1
  93. package/dist/dropdown.option.test.interactions.multiple.js +0 -42
  94. package/dist/dropdown.option.test.interactions.single.d.ts +0 -1
  95. package/dist/dropdown.option.test.interactions.single.js +0 -76
  96. package/dist/dropdown.stories.d.ts +0 -8
  97. package/dist/dropdown.test.basics.d.ts +0 -1
  98. package/dist/dropdown.test.basics.filterable.d.ts +0 -1
  99. package/dist/dropdown.test.basics.filterable.js +0 -108
  100. package/dist/dropdown.test.basics.js +0 -181
  101. package/dist/dropdown.test.basics.multiple.d.ts +0 -1
  102. package/dist/dropdown.test.basics.multiple.js +0 -259
  103. package/dist/dropdown.test.basics.single.d.ts +0 -1
  104. package/dist/dropdown.test.basics.single.js +0 -122
  105. package/dist/dropdown.test.events.d.ts +0 -1
  106. package/dist/dropdown.test.events.filterable.d.ts +0 -1
  107. package/dist/dropdown.test.events.filterable.js +0 -31
  108. package/dist/dropdown.test.events.js +0 -251
  109. package/dist/dropdown.test.events.multiple.d.ts +0 -1
  110. package/dist/dropdown.test.events.multiple.js +0 -446
  111. package/dist/dropdown.test.events.single.d.ts +0 -1
  112. package/dist/dropdown.test.events.single.js +0 -343
  113. package/dist/dropdown.test.focus.d.ts +0 -1
  114. package/dist/dropdown.test.focus.filterable.d.ts +0 -1
  115. package/dist/dropdown.test.focus.filterable.js +0 -140
  116. package/dist/dropdown.test.focus.js +0 -107
  117. package/dist/dropdown.test.focus.multiple.d.ts +0 -1
  118. package/dist/dropdown.test.focus.multiple.js +0 -170
  119. package/dist/dropdown.test.focus.single.d.ts +0 -1
  120. package/dist/dropdown.test.focus.single.js +0 -42
  121. package/dist/dropdown.test.form.d.ts +0 -1
  122. package/dist/dropdown.test.form.js +0 -74
  123. package/dist/dropdown.test.form.multiple.d.ts +0 -1
  124. package/dist/dropdown.test.form.multiple.js +0 -151
  125. package/dist/dropdown.test.form.single.d.ts +0 -1
  126. package/dist/dropdown.test.form.single.js +0 -129
  127. package/dist/dropdown.test.interactions.d.ts +0 -1
  128. package/dist/dropdown.test.interactions.filterable.d.ts +0 -1
  129. package/dist/dropdown.test.interactions.filterable.js +0 -805
  130. package/dist/dropdown.test.interactions.js +0 -696
  131. package/dist/dropdown.test.interactions.multiple.d.ts +0 -1
  132. package/dist/dropdown.test.interactions.multiple.js +0 -1026
  133. package/dist/dropdown.test.interactions.single.d.ts +0 -1
  134. package/dist/dropdown.test.interactions.single.js +0 -569
  135. package/dist/dropdown.test.validity.d.ts +0 -1
  136. package/dist/dropdown.test.validity.js +0 -181
  137. package/dist/form-controls-layout.stories.d.ts +0 -10
  138. package/dist/form-controls-layout.test.basics.d.ts +0 -2
  139. package/dist/form-controls-layout.test.basics.js +0 -75
  140. package/dist/form-controls-layout.test.interactions.d.ts +0 -2
  141. package/dist/form-controls-layout.test.interactions.js +0 -26
  142. package/dist/icon-button.stories.d.ts +0 -6
  143. package/dist/icon-button.test.basics.d.ts +0 -1
  144. package/dist/icon-button.test.basics.js +0 -43
  145. package/dist/icon-button.test.focus.d.ts +0 -1
  146. package/dist/icon-button.test.focus.js +0 -13
  147. package/dist/input.stories.d.ts +0 -8
  148. package/dist/input.test.basics.d.ts +0 -1
  149. package/dist/input.test.basics.js +0 -138
  150. package/dist/input.test.events.d.ts +0 -1
  151. package/dist/input.test.events.js +0 -98
  152. package/dist/input.test.focus.d.ts +0 -1
  153. package/dist/input.test.focus.js +0 -58
  154. package/dist/input.test.form.d.ts +0 -1
  155. package/dist/input.test.form.js +0 -74
  156. package/dist/input.test.validity.d.ts +0 -1
  157. package/dist/input.test.validity.js +0 -258
  158. package/dist/label.test.basics.d.ts +0 -1
  159. package/dist/label.test.basics.js +0 -136
  160. package/dist/menu.button.test.basics.d.ts +0 -1
  161. package/dist/menu.button.test.basics.js +0 -43
  162. package/dist/menu.link.test.basics.d.ts +0 -1
  163. package/dist/menu.link.test.basics.js +0 -47
  164. package/dist/menu.options.test.basics.d.ts +0 -2
  165. package/dist/menu.options.test.basics.js +0 -44
  166. package/dist/menu.options.test.events.d.ts +0 -1
  167. package/dist/menu.options.test.events.js +0 -19
  168. package/dist/menu.stories.d.ts +0 -11
  169. package/dist/menu.test.basics.d.ts +0 -1
  170. package/dist/menu.test.basics.js +0 -178
  171. package/dist/menu.test.events.d.ts +0 -3
  172. package/dist/menu.test.events.js +0 -125
  173. package/dist/menu.test.focus.d.ts +0 -2
  174. package/dist/menu.test.focus.js +0 -102
  175. package/dist/menu.test.interactions.d.ts +0 -3
  176. package/dist/menu.test.interactions.js +0 -1069
  177. package/dist/modal.icon-button.test.basics.d.ts +0 -1
  178. package/dist/modal.icon-button.test.basics.js +0 -46
  179. package/dist/modal.stories.d.ts +0 -13
  180. package/dist/modal.tertiary-icon.test.basics.d.ts +0 -1
  181. package/dist/modal.tertiary-icon.test.basics.js +0 -60
  182. package/dist/modal.test.accessibility.d.ts +0 -1
  183. package/dist/modal.test.accessibility.js +0 -38
  184. package/dist/modal.test.basics.d.ts +0 -3
  185. package/dist/modal.test.basics.js +0 -204
  186. package/dist/modal.test.close.d.ts +0 -1
  187. package/dist/modal.test.close.js +0 -35
  188. package/dist/modal.test.events.d.ts +0 -1
  189. package/dist/modal.test.events.js +0 -99
  190. package/dist/modal.test.lock-scroll.d.ts +0 -1
  191. package/dist/modal.test.lock-scroll.js +0 -67
  192. package/dist/modal.test.methods.d.ts +0 -1
  193. package/dist/modal.test.methods.js +0 -20
  194. package/dist/modal.test.scrollbars.d.ts +0 -1
  195. package/dist/modal.test.scrollbars.js +0 -18
  196. package/dist/radio-group.stories.d.ts +0 -6
  197. package/dist/radio-group.test.basics.d.ts +0 -2
  198. package/dist/radio-group.test.basics.js +0 -324
  199. package/dist/radio-group.test.events.d.ts +0 -2
  200. package/dist/radio-group.test.events.js +0 -278
  201. package/dist/radio-group.test.focus.d.ts +0 -2
  202. package/dist/radio-group.test.focus.js +0 -95
  203. package/dist/radio-group.test.form.d.ts +0 -1
  204. package/dist/radio-group.test.form.js +0 -124
  205. package/dist/radio-group.test.validity.d.ts +0 -1
  206. package/dist/radio-group.test.validity.js +0 -311
  207. package/dist/split-button.primary-button.test.basics.d.ts +0 -1
  208. package/dist/split-button.primary-button.test.basics.js +0 -31
  209. package/dist/split-button.primary-button.test.focus.d.ts +0 -1
  210. package/dist/split-button.primary-button.test.focus.js +0 -14
  211. package/dist/split-button.primary-link.test.basics.d.ts +0 -1
  212. package/dist/split-button.primary-link.test.basics.js +0 -30
  213. package/dist/split-button.primary-link.test.focus.d.ts +0 -1
  214. package/dist/split-button.primary-link.test.focus.js +0 -15
  215. package/dist/split-button.secondary-button.test.basics.d.ts +0 -1
  216. package/dist/split-button.secondary-button.test.basics.js +0 -58
  217. package/dist/split-button.secondary-button.test.focus.d.ts +0 -1
  218. package/dist/split-button.secondary-button.test.focus.js +0 -14
  219. package/dist/split-button.secondary-button.test.interactions.d.ts +0 -2
  220. package/dist/split-button.secondary-button.test.interactions.js +0 -30
  221. package/dist/split-button.stories.d.ts +0 -13
  222. package/dist/split-button.test.basics.d.ts +0 -2
  223. package/dist/split-button.test.basics.js +0 -87
  224. package/dist/split-button.test.interactions.d.ts +0 -4
  225. package/dist/split-button.test.interactions.js +0 -51
  226. package/dist/tab.group.test.basics.d.ts +0 -3
  227. package/dist/tab.group.test.basics.js +0 -234
  228. package/dist/tab.group.test.interactions.d.ts +0 -3
  229. package/dist/tab.group.test.interactions.js +0 -434
  230. package/dist/tab.test.basics.d.ts +0 -1
  231. package/dist/tab.test.basics.js +0 -50
  232. package/dist/tabs.stories.d.ts +0 -8
  233. package/dist/tag.stories.d.ts +0 -7
  234. package/dist/tag.test.basics.d.ts +0 -1
  235. package/dist/tag.test.basics.js +0 -28
  236. package/dist/tag.test.events.d.ts +0 -1
  237. package/dist/tag.test.events.js +0 -93
  238. package/dist/tag.test.focus.d.ts +0 -1
  239. package/dist/tag.test.focus.js +0 -10
  240. package/dist/tag.test.interactions.d.ts +0 -1
  241. package/dist/tag.test.interactions.js +0 -36
  242. package/dist/textarea.stories.d.ts +0 -5
  243. package/dist/textarea.test.basics.d.ts +0 -1
  244. package/dist/textarea.test.basics.js +0 -177
  245. package/dist/textarea.test.events.d.ts +0 -1
  246. package/dist/textarea.test.events.js +0 -106
  247. package/dist/textarea.test.form.d.ts +0 -1
  248. package/dist/textarea.test.form.js +0 -71
  249. package/dist/textarea.test.validity.d.ts +0 -1
  250. package/dist/textarea.test.validity.js +0 -204
  251. package/dist/toasts.stories.d.ts +0 -7
  252. package/dist/toasts.test.basics.d.ts +0 -1
  253. package/dist/toasts.test.basics.js +0 -115
  254. package/dist/toasts.toast.test.basics.d.ts +0 -1
  255. package/dist/toasts.toast.test.basics.js +0 -139
  256. package/dist/toggle.stories.d.ts +0 -4
  257. package/dist/toggle.test.basics.d.ts +0 -1
  258. package/dist/toggle.test.basics.js +0 -69
  259. package/dist/toggle.test.events.d.ts +0 -1
  260. package/dist/toggle.test.events.js +0 -30
  261. package/dist/toggle.test.focus.d.ts +0 -1
  262. package/dist/toggle.test.focus.js +0 -9
  263. package/dist/toggle.test.interactions.d.ts +0 -1
  264. package/dist/toggle.test.interactions.js +0 -81
  265. package/dist/tooltip.stories.d.ts +0 -7
  266. package/dist/tooltip.test.basics.d.ts +0 -1
  267. package/dist/tooltip.test.basics.js +0 -100
  268. package/dist/tooltip.test.interactions.d.ts +0 -1
  269. package/dist/tooltip.test.interactions.js +0 -203
  270. package/dist/tree.item.icon-button.test.basics.d.ts +0 -1
  271. package/dist/tree.item.icon-button.test.basics.js +0 -22
  272. package/dist/tree.item.menu.test.basics.d.ts +0 -1
  273. package/dist/tree.item.menu.test.basics.js +0 -86
  274. package/dist/tree.item.test.basics.d.ts +0 -2
  275. package/dist/tree.item.test.basics.js +0 -138
  276. package/dist/tree.stories.d.ts +0 -9
  277. package/dist/tree.test.aria.d.ts +0 -1
  278. package/dist/tree.test.aria.js +0 -86
  279. package/dist/tree.test.basics.d.ts +0 -3
  280. package/dist/tree.test.basics.js +0 -130
  281. package/dist/tree.test.events.d.ts +0 -2
  282. package/dist/tree.test.events.js +0 -19
  283. package/dist/tree.test.focus.d.ts +0 -1
  284. package/dist/tree.test.focus.js +0 -383
@@ -1,805 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unused-expressions */
2
- import { aTimeout, assert, elementUpdated, expect, fixture, html, oneEvent, } from '@open-wc/testing';
3
- import { sendKeys } from '@web/test-runner-commands';
4
- import GlideCoreDropdown from './dropdown.js';
5
- import GlideCoreDropdownOption from './dropdown.option.js';
6
- GlideCoreDropdown.shadowRootOptions.mode = 'open';
7
- GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
8
- const defaultSlot = html `
9
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
10
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
11
- <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
12
- <glide-core-dropdown-option label="Four"></glide-core-dropdown-option>
13
- <glide-core-dropdown-option label="Five"></glide-core-dropdown-option>
14
- <glide-core-dropdown-option label="Six"></glide-core-dropdown-option>
15
- <glide-core-dropdown-option label="Seven"></glide-core-dropdown-option>
16
- <glide-core-dropdown-option label="Eight"></glide-core-dropdown-option>
17
- <glide-core-dropdown-option label="Nine"></glide-core-dropdown-option>
18
- <glide-core-dropdown-option label="Ten"></glide-core-dropdown-option>
19
- <glide-core-dropdown-option label="Eleven"></glide-core-dropdown-option>
20
- `;
21
- it('opens on click', async () => {
22
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
23
- ${defaultSlot}
24
- </glide-core-dropdown>`);
25
- // Calling `click()` would be sweet. The problem is it sets `event.detail` to `0`,
26
- // which puts us in a guard in the event handler. `Event` has no `detail` property
27
- // and would work. `CustomEvent` is used for completeness and to get us as close as
28
- // possible to a real click. See the comment in the handler for more information.
29
- component.shadowRoot
30
- ?.querySelector('[data-test="input"]')
31
- ?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
32
- // Wait for it to open.
33
- await aTimeout(0);
34
- const options = component.shadowRoot?.querySelector('[data-test="options"]');
35
- expect(component.open).to.be.true;
36
- expect(options?.checkVisibility()).to.be.true;
37
- });
38
- it('filters', async () => {
39
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
40
- ${defaultSlot}
41
- </glide-core-dropdown>`);
42
- component.focus();
43
- await sendKeys({ type: 'one' });
44
- const options = [
45
- ...component.querySelectorAll('glide-core-dropdown-option'),
46
- ].filter(({ hidden }) => !hidden);
47
- expect(options.length).to.equal(1);
48
- });
49
- it('unfilters when an option is selected via click', async () => {
50
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
51
- ${defaultSlot}
52
- </glide-core-dropdown>`);
53
- // Wait for it to open.
54
- await aTimeout(0);
55
- component.focus();
56
- await sendKeys({ type: 'one' });
57
- [...component.querySelectorAll('glide-core-dropdown-option')]
58
- .find(({ hidden }) => !hidden)
59
- ?.click();
60
- const options = [
61
- ...component.querySelectorAll('glide-core-dropdown-option'),
62
- ].filter(({ hidden }) => !hidden);
63
- expect(options.length).to.equal(11);
64
- });
65
- it('unfilters when an option is selected via Enter', async () => {
66
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
67
- ${defaultSlot}
68
- </glide-core-dropdown>`);
69
- component.focus();
70
- await sendKeys({ type: 'one' });
71
- await sendKeys({ press: 'Enter' });
72
- const options = [
73
- ...component.querySelectorAll('glide-core-dropdown-option'),
74
- ].filter(({ hidden }) => !hidden);
75
- expect(options.length).to.equal(11);
76
- });
77
- it('does nothing on Enter when every option is filtered out', async () => {
78
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
79
- ${defaultSlot}
80
- </glide-core-dropdown>`);
81
- component.focus();
82
- await sendKeys({ type: 'blah' });
83
- await sendKeys({ press: 'Enter' });
84
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
85
- const hiddenOptions = [
86
- ...component.querySelectorAll('glide-core-dropdown-option'),
87
- ].filter(({ hidden }) => hidden);
88
- const selectedOptions = [
89
- ...component.querySelectorAll('glide-core-dropdown-option'),
90
- ].filter(({ selected }) => selected);
91
- expect(input?.value).to.equal('blah');
92
- expect(hiddenOptions.length).to.equal(11);
93
- expect(selectedOptions.length).to.equal(0);
94
- });
95
- it('shows its magnifying glass icon when single-select and filtering', async () => {
96
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
97
- ${defaultSlot}
98
- </glide-core-dropdown>`);
99
- component.focus();
100
- await sendKeys({ type: 'one' });
101
- const icon = component?.shadowRoot?.querySelector('[data-test="magnifying-glass-icon"]');
102
- expect(icon?.checkVisibility()).to.be.true;
103
- });
104
- it('hides its magnifying glass icon when single-select and not filtering', async () => {
105
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
106
- ${defaultSlot}
107
- </glide-core-dropdown>`);
108
- component.focus();
109
- await sendKeys({ type: 'o' });
110
- await sendKeys({ press: 'Backspace' });
111
- const icon = component?.shadowRoot?.querySelector('[data-test="magnifying-glass-icon"]');
112
- expect(icon?.checkVisibility()).to.be.not.ok;
113
- });
114
- it('hides its magnifying glass icon when single-select and the filter is label of the selected option', async () => {
115
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
116
- ${defaultSlot}
117
- </glide-core-dropdown>`);
118
- const option = [
119
- ...component.querySelectorAll('glide-core-dropdown-option'),
120
- ].find(({ hidden }) => !hidden);
121
- option?.click();
122
- component.focus();
123
- await sendKeys({ type: 'One' });
124
- const icon = component?.shadowRoot?.querySelector('[data-test="magnifying-glass-icon"]');
125
- expect(icon?.checkVisibility()).to.be.not.ok;
126
- });
127
- it('hides its magnifying glass icon when single-select and an option is selected', async () => {
128
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
129
- ${defaultSlot}
130
- </glide-core-dropdown>`);
131
- // Wait for it to open.
132
- await aTimeout(0);
133
- component.focus();
134
- await sendKeys({ type: 'one' });
135
- const option = [
136
- ...component.querySelectorAll('glide-core-dropdown-option'),
137
- ].find(({ hidden }) => !hidden);
138
- option?.click();
139
- const icon = component?.shadowRoot?.querySelector('[data-test="magnifying-glass-icon"]');
140
- await elementUpdated(component);
141
- expect(icon?.checkVisibility()).to.be.not.ok;
142
- });
143
- it('hides its magnifying glass icon when single-select and closed programmatically and an option is selected', async () => {
144
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
145
- ${defaultSlot}
146
- </glide-core-dropdown>`);
147
- // Wait for it to open.
148
- await aTimeout(0);
149
- const option = component.querySelector('glide-core-dropdown-option');
150
- assert(option);
151
- option.selected = true;
152
- component.focus();
153
- await sendKeys({ type: 'two' });
154
- const icon = component?.shadowRoot?.querySelector('[data-test="magnifying-glass-icon"]');
155
- component.open = false;
156
- await elementUpdated(component);
157
- expect(icon?.checkVisibility()).to.not.be.ok;
158
- });
159
- it('shows its magnifying glass icon when multiselect and filtering', async () => {
160
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
161
- ${defaultSlot}
162
- </glide-core-dropdown>`);
163
- component.focus();
164
- await sendKeys({ type: 'one' });
165
- const icon = component?.shadowRoot?.querySelector('[data-test="magnifying-glass-icon"]');
166
- expect(icon?.checkVisibility()).to.be.true;
167
- });
168
- it('hides its magnifying glass icon when multiselect and not filtering', async () => {
169
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
170
- ${defaultSlot}
171
- </glide-core-dropdown>`);
172
- component.focus();
173
- await sendKeys({ type: 'o' });
174
- await sendKeys({ press: 'Backspace' });
175
- const icon = component?.shadowRoot?.querySelector('[data-test="magnifying-glass-icon"]');
176
- expect(icon?.checkVisibility()).to.be.not.ok;
177
- });
178
- it('does not clear its filter when a tag is removed via Backspace', async () => {
179
- const component = await fixture(html `<glide-core-dropdown
180
- label="Label"
181
- placeholder="Placeholder"
182
- filterable
183
- multiple
184
- >
185
- <glide-core-dropdown-option
186
- label="One"
187
- selected
188
- ></glide-core-dropdown-option>
189
-
190
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
191
- </glide-core-dropdown>`);
192
- // Wait for it to open.
193
- await aTimeout(0);
194
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
195
- input?.select();
196
- input?.focus();
197
- await sendKeys({ type: 'o' });
198
- await sendKeys({ press: 'ArrowLeft' });
199
- await sendKeys({ press: 'Backspace' });
200
- expect(input?.value).to.equal('o');
201
- });
202
- it('does not clear its filter when every tag is removed via Meta + Backspace', async () => {
203
- const component = await fixture(html `<glide-core-dropdown
204
- label="Label"
205
- placeholder="Placeholder"
206
- filterable
207
- multiple
208
- >
209
- <glide-core-dropdown-option
210
- label="One"
211
- selected
212
- ></glide-core-dropdown-option>
213
-
214
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
215
- </glide-core-dropdown>`);
216
- // Wait for it to open.
217
- await aTimeout(0);
218
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
219
- input?.select();
220
- input?.focus();
221
- await sendKeys({ type: 'o' });
222
- await sendKeys({ press: 'ArrowLeft' });
223
- await sendKeys({ down: 'Meta' });
224
- await sendKeys({ press: 'Backspace' });
225
- await sendKeys({ up: 'Meta' });
226
- expect(input?.value).to.equal('o');
227
- });
228
- it('does not filter on only whitespace', async () => {
229
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
230
- ${defaultSlot}
231
- </glide-core-dropdown>`);
232
- component.focus();
233
- await sendKeys({ type: ' ' });
234
- const options = [
235
- ...component.querySelectorAll('glide-core-dropdown-option'),
236
- ].filter(({ hidden }) => !hidden);
237
- expect(options.length).to.equal(11);
238
- });
239
- it('hides the options when all of them are filtered out', async () => {
240
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
241
- ${defaultSlot}
242
- </glide-core-dropdown>`);
243
- // Wait for it to open.
244
- await aTimeout(0);
245
- component.focus();
246
- await sendKeys({ type: 'fifty' });
247
- // Wait for it to close.
248
- await aTimeout(0);
249
- const options = component.shadowRoot?.querySelector('[data-test="options"]');
250
- expect(options?.checkVisibility()).to.be.false;
251
- });
252
- it('hides Select All when filtering', async () => {
253
- const component = await fixture(html `<glide-core-dropdown
254
- label="Label"
255
- placeholder="Placeholder"
256
- open
257
- multiple
258
- select-all
259
- >
260
- ${defaultSlot}
261
- </glide-core-dropdown>`);
262
- component.focus();
263
- await sendKeys({ type: 'one' });
264
- const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
265
- expect(selectAll?.checkVisibility()).to.not.be.ok;
266
- });
267
- it('unhides every option after filtering when one is selected and Dropdown is reopened', async () => {
268
- const component = await fixture(html `<glide-core-dropdown
269
- label="Label"
270
- placeholder="Placeholder"
271
- open
272
- filterable
273
- >
274
- <glide-core-dropdown-option
275
- label="One"
276
- selected
277
- ></glide-core-dropdown-option>
278
-
279
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
280
- </glide-core-dropdown>`);
281
- // Wait for it to open.
282
- await aTimeout(0);
283
- component.focus();
284
- await sendKeys({ type: 'two' });
285
- component.blur();
286
- await elementUpdated(component);
287
- component.open = true;
288
- // Wait for it to open.
289
- await aTimeout(0);
290
- const options = [
291
- ...component.querySelectorAll('glide-core-dropdown-option'),
292
- ].filter(({ hidden }) => !hidden);
293
- expect(options.length).to.equal(2);
294
- });
295
- it('sets the first unfiltered option as active when the previously active option is filtered out', async () => {
296
- const component = await fixture(html `<glide-core-dropdown
297
- label="Label"
298
- placeholder="Placeholder"
299
- multiple
300
- select-all
301
- >
302
- ${defaultSlot}
303
- </glide-core-dropdown>`);
304
- component.focus();
305
- await sendKeys({ type: 'two' });
306
- const option = [
307
- ...component.querySelectorAll('glide-core-dropdown-option'),
308
- ].find(({ hidden }) => !hidden);
309
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
310
- expect(option?.privateActive).to.be.true;
311
- expect(input?.getAttribute('aria-activedescendant')).to.equal(option?.id);
312
- });
313
- it('updates the `value` of its `<input>` when `label` of a selected option is changed programmatically', async () => {
314
- const component = await fixture(html `<glide-core-dropdown
315
- label="Label"
316
- placeholder="Placeholder"
317
- filterable
318
- >
319
- <glide-core-dropdown-option
320
- label="One"
321
- selected
322
- ></glide-core-dropdown-option>
323
-
324
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
325
- </glide-core-dropdown>`);
326
- const option = component.querySelector('glide-core-dropdown-option');
327
- assert(option);
328
- option.label = 'Three';
329
- await elementUpdated(component);
330
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
331
- expect(input?.value).to.equal('Three');
332
- });
333
- it('updates `value` when an option `value` is changed programmatically', async () => {
334
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
335
- ${defaultSlot}
336
- </glide-core-dropdown>`);
337
- const option = component.querySelector('glide-core-dropdown-option');
338
- assert(option);
339
- option.value = 'two';
340
- expect(component.value).to.deep.equal(['two']);
341
- });
342
- it('sets the `value` of its `<input>` when made filterable', async () => {
343
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
344
- <glide-core-dropdown-option
345
- label="One"
346
- selected
347
- ></glide-core-dropdown-option>
348
-
349
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
350
- </glide-core-dropdown>`);
351
- component.filterable = true;
352
- await elementUpdated(component);
353
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
354
- // Wait for the `filterable` setter to do its thing.
355
- await aTimeout(0);
356
- expect(input?.value).to.equal('One');
357
- });
358
- it('does not select options on Space', async () => {
359
- const component = await fixture(html `<glide-core-dropdown
360
- label="Label"
361
- placeholder="Placeholder"
362
- multiple
363
- open
364
- >
365
- ${defaultSlot}
366
- </glide-core-dropdown>`);
367
- const options = component.querySelectorAll('glide-core-dropdown-option');
368
- options[0]?.focus();
369
- await sendKeys({ press: ' ' });
370
- expect(options[0]?.selected).to.be.false;
371
- });
372
- it('deselects the last selected option on Backspace', async () => {
373
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
374
- ${defaultSlot}
375
- </glide-core-dropdown>`);
376
- const options = component.querySelectorAll('glide-core-dropdown-option');
377
- options[0].selected = true;
378
- options[1].selected = true;
379
- await elementUpdated(component);
380
- component.focus();
381
- component.shadowRoot
382
- ?.querySelector('[data-test="input"]')
383
- ?.setSelectionRange(0, 0);
384
- await sendKeys({ press: 'Backspace' });
385
- expect(options[1].selected).to.be.false;
386
- expect(options[0].selected).to.be.true;
387
- await sendKeys({ press: 'Backspace' });
388
- expect(options[0].selected).to.be.false;
389
- });
390
- it('deselects all options on Meta + Backspace', async () => {
391
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
392
- ${defaultSlot}
393
- </glide-core-dropdown>`);
394
- const options = component.querySelectorAll('glide-core-dropdown-option');
395
- options[0].selected = true;
396
- options[1].selected = true;
397
- await elementUpdated(component);
398
- component.focus();
399
- component.shadowRoot
400
- ?.querySelector('[data-test="input"]')
401
- ?.setSelectionRange(0, 0);
402
- await sendKeys({ down: 'Meta' });
403
- await sendKeys({ press: 'Backspace' });
404
- await sendKeys({ up: 'Meta' });
405
- expect(options[1].selected).to.be.false;
406
- expect(options[0].selected).to.be.false;
407
- });
408
- it('sets the `value` of its `<input>` to the label of the selected option when not `multiple`', async () => {
409
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
410
- ${defaultSlot}
411
- </glide-core-dropdown>`);
412
- const option = component?.querySelector('glide-core-dropdown-option');
413
- option?.click();
414
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
415
- expect(input?.value).to.equal(option?.label);
416
- });
417
- it('clears the `value` of its `<input>` when multiselect and an option is selected', async () => {
418
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
419
- ${defaultSlot}
420
- </glide-core-dropdown>`);
421
- component.focus();
422
- await sendKeys({ type: 'one' });
423
- const option = component?.querySelector('glide-core-dropdown-option');
424
- option?.click();
425
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
426
- expect(input?.value).to.be.empty.string;
427
- });
428
- it('does not clear its filter when a tag is removed', async () => {
429
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
430
- ${defaultSlot}
431
- </glide-core-dropdown>`);
432
- const option = component.querySelector('glide-core-dropdown-option');
433
- assert(option);
434
- option.selected = true;
435
- component.focus();
436
- await sendKeys({ type: 'one' });
437
- component.shadowRoot
438
- ?.querySelector('[data-test="tag"]')
439
- ?.click();
440
- await elementUpdated(component);
441
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
442
- expect(input?.value).to.equal('one');
443
- });
444
- it('uses `placeholder` as a placeholder when multiselect and no option is selected', async () => {
445
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
446
- ${defaultSlot}
447
- </glide-core-dropdown>`);
448
- component?.querySelector('glide-core-dropdown-option')?.click();
449
- await elementUpdated(component);
450
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
451
- expect(input?.placeholder).to.equal('Placeholder');
452
- });
453
- it('sets `aria-activedescendant` on option "mouseover"', async () => {
454
- const component = await fixture(html `<glide-core-dropdown open> ${defaultSlot} </glide-core-dropdown>`);
455
- const options = component.querySelectorAll('glide-core-dropdown-option');
456
- options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
457
- await elementUpdated(component);
458
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
459
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options[1].id);
460
- });
461
- it('sets `aria-activedescendant` on ArrowDown', async () => {
462
- const component = await fixture(html `<glide-core-dropdown
463
- label="Label"
464
- placeholder="Placeholder"
465
- open
466
- multiple
467
- >
468
- ${defaultSlot}
469
- </glide-core-dropdown>`);
470
- // Wait for it to open.
471
- await aTimeout(0);
472
- component.focus();
473
- await sendKeys({ press: 'ArrowDown' });
474
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
475
- const options = component.querySelectorAll('glide-core-dropdown-option');
476
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options[1].id);
477
- });
478
- it('sets `aria-activedescendant` on ArrowUp', async () => {
479
- const component = await fixture(html `<glide-core-dropdown
480
- label="Label"
481
- placeholder="Placeholder"
482
- open
483
- multiple
484
- >
485
- ${defaultSlot}
486
- </glide-core-dropdown>`);
487
- // Wait for it to open.
488
- await aTimeout(0);
489
- const options = component.querySelectorAll('glide-core-dropdown-option');
490
- options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
491
- options[1]?.focus();
492
- await sendKeys({ press: 'ArrowUp' });
493
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
494
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
495
- });
496
- it('sets `aria-activedescendant` on Home', async () => {
497
- const component = await fixture(html `<glide-core-dropdown
498
- label="Label"
499
- placeholder="Placeholder"
500
- open
501
- multiple
502
- >
503
- ${defaultSlot}
504
- </glide-core-dropdown>`);
505
- // Wait for it to open.
506
- await aTimeout(0);
507
- const options = component.querySelectorAll('glide-core-dropdown-option');
508
- options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
509
- options[1].focus();
510
- await sendKeys({ press: 'Home' });
511
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
512
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
513
- });
514
- it('sets `aria-activedescendant` on PageUp', async () => {
515
- const component = await fixture(html `<glide-core-dropdown
516
- label="Label"
517
- placeholder="Placeholder"
518
- open
519
- multiple
520
- >
521
- ${defaultSlot}
522
- </glide-core-dropdown>`);
523
- // Wait for it to open.
524
- await aTimeout(0);
525
- const options = component.querySelectorAll('glide-core-dropdown-option');
526
- options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
527
- options[1].focus();
528
- await sendKeys({ press: 'PageUp' });
529
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
530
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
531
- });
532
- it('sets `aria-activedescendant` on Meta + ArrowUp', async () => {
533
- const component = await fixture(html `<glide-core-dropdown
534
- label="Label"
535
- placeholder="Placeholder"
536
- open
537
- multiple
538
- >
539
- ${defaultSlot}
540
- </glide-core-dropdown>`);
541
- // Wait for it to open.
542
- await aTimeout(0);
543
- component.focus();
544
- const options = component.querySelectorAll('glide-core-dropdown-option');
545
- options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
546
- await sendKeys({ down: 'Meta' });
547
- await sendKeys({ press: 'ArrowUp' });
548
- await sendKeys({ up: 'Meta' });
549
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
550
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options[0].id);
551
- });
552
- it('sets `aria-activedescendant` on open via click', async () => {
553
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
554
- ${defaultSlot}
555
- </glide-core-dropdown>`);
556
- // Calling `click()` would be sweet. The problem is it sets `event.detail` to `0`,
557
- // which puts us in a guard in the event handler. `Event` has no `detail` property
558
- // and would work. `CustomEvent` is used for completeness and to get us as close as
559
- // possible to a real click. See the comment in the handler for more information.
560
- component.shadowRoot
561
- ?.querySelector('[data-test="primary-button"]')
562
- ?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
563
- // Wait for it to open.
564
- await aTimeout(0);
565
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
566
- const option = component.querySelector('glide-core-dropdown-option');
567
- expect(input?.getAttribute('aria-activedescendant')).to.equal(option?.id);
568
- });
569
- it('sets `aria-activedescendant` on open via Space', async () => {
570
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
571
- ${defaultSlot}
572
- </glide-core-dropdown>`);
573
- component.focus();
574
- await sendKeys({ press: ' ' });
575
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
576
- const option = component.querySelector('glide-core-dropdown-option');
577
- expect(input?.getAttribute('aria-activedescendant')).to.equal(option?.id);
578
- });
579
- it('sets `aria-activedescendant` on End', async () => {
580
- const component = await fixture(html `<glide-core-dropdown
581
- label="Label"
582
- placeholder="Placeholder"
583
- open
584
- multiple
585
- >
586
- ${defaultSlot}
587
- </glide-core-dropdown>`);
588
- // Wait for it to open.
589
- await aTimeout(0);
590
- component.focus();
591
- // Made into an array because the linter forces `at(-1)` instead of
592
- // `[options.length - 1]` but doesn't take into account that `options`
593
- // isn't an actual array and doesn't have an `at()` method.
594
- const options = [...component.querySelectorAll('glide-core-dropdown-option')];
595
- await sendKeys({ press: 'End' });
596
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
597
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options.at(-1)?.id);
598
- });
599
- it('sets `aria-activedescendant` on PageDown', async () => {
600
- const component = await fixture(html `<glide-core-dropdown
601
- label="Label"
602
- placeholder="Placeholder"
603
- open
604
- multiple
605
- >
606
- ${defaultSlot}
607
- </glide-core-dropdown>`);
608
- // Wait for it to open.
609
- await aTimeout(0);
610
- component.focus();
611
- // Made into an array because the linter forces `at(-1)` instead of
612
- // `[options.length - 1]` but doesn't take into account that `options`
613
- // isn't an actual array and doesn't have an `at()` method.
614
- const options = [...component.querySelectorAll('glide-core-dropdown-option')];
615
- await sendKeys({ press: 'PageDown' });
616
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
617
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options.at(-1)?.id);
618
- });
619
- it('sets `aria-activedescendant` on Meta + ArrowDown', async () => {
620
- const component = await fixture(html `<glide-core-dropdown
621
- label="Label"
622
- placeholder="Placeholder"
623
- open
624
- multiple
625
- >
626
- ${defaultSlot}
627
- </glide-core-dropdown>`);
628
- // Wait for it to open.
629
- await aTimeout(0);
630
- component.focus();
631
- // Spread into an array because the linter forces `at(-1)` instead of
632
- // `[options.length - 1]` but doesn't take into account that `options`
633
- // isn't an actual array and doesn't have an `at()` method.
634
- const options = [...component.querySelectorAll('glide-core-dropdown-option')];
635
- await sendKeys({ down: 'Meta' });
636
- await sendKeys({ press: 'ArrowDown' });
637
- await sendKeys({ up: 'Meta' });
638
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
639
- expect(input?.getAttribute('aria-activedescendant')).to.equal(options.at(-1)?.id);
640
- });
641
- it('sets `aria-activedescendant` when closed via click', async () => {
642
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
643
- ${defaultSlot}
644
- </glide-core-dropdown>`);
645
- component.shadowRoot
646
- ?.querySelector('[data-test="primary-button"]')
647
- ?.click();
648
- await elementUpdated(component);
649
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
650
- expect(input?.getAttribute('aria-activedescendant')).to.be.empty.string;
651
- });
652
- it('sets `aria-activedescendant` when closed because it lost focus', async () => {
653
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
654
- ${defaultSlot}
655
- </glide-core-dropdown>`);
656
- component.focus();
657
- await sendKeys({ press: 'Tab' });
658
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
659
- expect(input?.getAttribute('aria-activedescendant')).to.be.empty.string;
660
- });
661
- it('sets `aria-activedescendant` when closed because something outside of it was clicked', async () => {
662
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
663
- ${defaultSlot}
664
- </glide-core-dropdown>`);
665
- document.body.click();
666
- await elementUpdated(component);
667
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
668
- expect(input?.getAttribute('aria-activedescendant')).to.be.empty.string;
669
- });
670
- it('sets `aria-activedescendant` when closed via Escape', async () => {
671
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
672
- ${defaultSlot}
673
- </glide-core-dropdown>`);
674
- component.focus();
675
- await sendKeys({ press: 'Escape' });
676
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
677
- expect(input?.getAttribute('aria-activedescendant')).to.be.empty.string;
678
- });
679
- it('cannot be tabbed to when `disabled`', async () => {
680
- await fixture(html `<glide-core-dropdown
681
- label="Label"
682
- placeholder="Placeholder"
683
- multiple
684
- disabled
685
- >
686
- ${defaultSlot}
687
- </glide-core-dropdown>`);
688
- await sendKeys({ press: 'Tab' });
689
- expect(document.activeElement).to.equal(document.body);
690
- });
691
- it('sets the `value` of its `<input>` back to the label of selected option when something other than it is clicked', async () => {
692
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
693
- ${defaultSlot}
694
- </glide-core-dropdown>`);
695
- // Wait for it to open.
696
- await aTimeout(0);
697
- const option = component.querySelector('glide-core-dropdown-option');
698
- assert(option);
699
- option.selected = true;
700
- // Now type something other than "One" so we can check that it's reverted
701
- // back to "One" when something else is clicked.
702
- component.focus();
703
- await sendKeys({ type: 'o' });
704
- document.body.click();
705
- const input = component.shadowRoot?.querySelector('[data-test="input"]');
706
- expect(input?.value).to.equal('One');
707
- });
708
- it('selects the filter text when `click()` is called', async () => {
709
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
710
- ${defaultSlot}
711
- </glide-core-dropdown>`);
712
- component.focus();
713
- await sendKeys({ type: 'one' });
714
- component.click();
715
- expect(window.getSelection()?.toString()).to.equal('one');
716
- });
717
- it('clicks the `<input>` when `click()` is called', async () => {
718
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
719
- ${defaultSlot}
720
- </glide-core-dropdown>`);
721
- const button = component.shadowRoot?.querySelector('[data-test="input"]');
722
- assert(button);
723
- setTimeout(() => {
724
- component.click();
725
- });
726
- const event = await oneEvent(button, 'click');
727
- expect(event instanceof PointerEvent).to.be.true;
728
- });
729
- it('has no icon when filtering and an option is selected', async () => {
730
- const component = await fixture(html `<glide-core-dropdown
731
- label="Label"
732
- placeholder="Placeholder"
733
- filterable
734
- >
735
- <div slot="icon:one">✓</div>
736
- <div slot="icon:two">✓</div>
737
-
738
- <glide-core-dropdown-option
739
- label="One"
740
- selected
741
- ></glide-core-dropdown-option>
742
-
743
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
744
- </glide-core-dropdown>`);
745
- component.focus();
746
- await sendKeys({ type: 'one' });
747
- const iconSlot = component.shadowRoot?.querySelector('[data-test="single-select-icon-slot"]');
748
- expect(iconSlot).to.be.null;
749
- });
750
- it('supports custom filtering', async () => {
751
- const component = await fixture(html `<glide-core-dropdown
752
- label="Label"
753
- placeholder="Placeholder"
754
- filterable
755
- >
756
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
757
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
758
- </glide-core-dropdown>`);
759
- component.filter = async (filter) => {
760
- const options = [
761
- ...component.querySelectorAll('glide-core-dropdown-option'),
762
- ];
763
- return options.filter(({ label }) => label.includes(filter));
764
- };
765
- component.focus();
766
- await sendKeys({ type: 'O' });
767
- const options = [
768
- ...component.querySelectorAll('glide-core-dropdown-option'),
769
- ].filter(({ hidden }) => !hidden);
770
- expect(options.length).to.equal(1);
771
- expect(options[0].label).to.equal('One');
772
- });
773
- it('does nothing when filtering fails', async () => {
774
- const component = await fixture(html `<glide-core-dropdown
775
- label="Label"
776
- placeholder="Placeholder"
777
- filterable
778
- >
779
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
780
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
781
- </glide-core-dropdown>`);
782
- component.filter = () => {
783
- return Promise.reject();
784
- };
785
- component.focus();
786
- await sendKeys({ type: 'O' });
787
- const options = [
788
- ...component.querySelectorAll('glide-core-dropdown-option'),
789
- ].filter(({ hidden }) => !hidden);
790
- expect(options.length).to.equal(2);
791
- });
792
- it('updates its item count after filtering', async () => {
793
- const component = await fixture(html `<glide-core-dropdown
794
- label="Label"
795
- placeholder="Placeholder"
796
- filterable
797
- >
798
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
799
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
800
- </glide-core-dropdown>`);
801
- component.focus();
802
- await sendKeys({ type: 'one' });
803
- const itemCount = component.shadowRoot?.querySelector('[data-test="item-count"]');
804
- expect(itemCount?.ariaLabel).to.equal('1 items');
805
- });