@crowdstrike/glide-core 0.13.1 → 0.14.0

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 -3
  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,1026 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unused-expressions */
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- import { LitElement } from 'lit';
9
- import { aTimeout, assert, elementUpdated, expect, fixture, html, oneEvent, } from '@open-wc/testing';
10
- import { customElement } from 'lit/decorators.js';
11
- import { sendKeys } from '@web/test-runner-commands';
12
- import { sendMouse } from '@web/test-runner-commands';
13
- import GlideCoreDropdown from './dropdown.js';
14
- import GlideCoreDropdownOption from './dropdown.option.js';
15
- import GlideCoreTag from './tag.js';
16
- let GlideCoreDropdownInAnotherComponent = class GlideCoreDropdownInAnotherComponent extends LitElement {
17
- static { this.shadowRootOptions = {
18
- ...LitElement.shadowRootOptions,
19
- mode: 'closed',
20
- }; }
21
- render() {
22
- return html `<glide-core-dropdown
23
- label="Label"
24
- placeholder="Placeholder"
25
- multiple
26
- open
27
- >
28
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
29
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
30
- <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
31
- </glide-core-dropdown>`;
32
- }
33
- };
34
- GlideCoreDropdownInAnotherComponent = __decorate([
35
- customElement('glide-core-dropdown-in-another-component')
36
- ], GlideCoreDropdownInAnotherComponent);
37
- GlideCoreDropdown.shadowRootOptions.mode = 'open';
38
- GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
39
- GlideCoreDropdownInAnotherComponent.shadowRootOptions.mode = 'open';
40
- GlideCoreTag.shadowRootOptions.mode = 'open';
41
- it('opens on click', async () => {
42
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
43
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
44
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
45
- </glide-core-dropdown>`);
46
- // Calling `click()` would be sweet. The problem is it sets `event.detail` to `0`,
47
- // which puts us in a guard in the event handler. `Event` has no `detail` property
48
- // and would work. `CustomEvent` is used for completeness and to get us as close as
49
- // possible to a real click. See the comment in the handler for more information.
50
- component.shadowRoot
51
- ?.querySelector('[data-test="primary-button"]')
52
- ?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
53
- // Wait for it to open.
54
- await aTimeout(0);
55
- const options = component.shadowRoot?.querySelector('[data-test="options"]');
56
- expect(component.open).to.be.true;
57
- expect(options?.checkVisibility()).to.be.true;
58
- });
59
- it('toggles open and closed when the button is clicked', async () => {
60
- const component = await fixture(html `<glide-core-dropdown
61
- label="Label"
62
- placeholder="Placeholder"
63
- open
64
- multiple
65
- >
66
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
67
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
68
- </glide-core-dropdown>`);
69
- // Calling `click()` would be sweet. The problem is it sets `event.detail` to `0`,
70
- // which puts us in a guard in the event handler. `Event` has no `detail` property
71
- // and would work. `CustomEvent` is used for completeness and to get us as close as
72
- // possible to a real click. See the comment in the handler for more information.
73
- component.shadowRoot
74
- ?.querySelector('[data-test="primary-button"]')
75
- ?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
76
- await elementUpdated(component);
77
- const options = component.shadowRoot?.querySelector('[data-test="options"]');
78
- expect(component.open).to.be.false;
79
- expect(options?.checkVisibility()).to.be.false;
80
- });
81
- it('does not toggle open and closed when the button overflow text is clicked', async () => {
82
- const component = await fixture(html `<glide-core-dropdown
83
- label="Label"
84
- placeholder="Placeholder"
85
- open
86
- multiple
87
- >
88
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
89
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
90
- </glide-core-dropdown>`);
91
- // Calling `click()` would be sweet. The problem is it sets `event.detail` to `0`,
92
- // which puts us in a guard in the event handler. `Event` has no `detail` property
93
- // and would work. `CustomEvent` is used for completeness and to get us as close as
94
- // possible to a real click. See the comment in the handler for more information.
95
- component.shadowRoot
96
- ?.querySelector('[data-test="tag-overflow-text"]')
97
- ?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
98
- // Wait for it to open.
99
- await aTimeout(0);
100
- const options = component.shadowRoot?.querySelector('[data-test="options"]');
101
- expect(component.open).to.be.true;
102
- expect(options?.checkVisibility()).to.be.true;
103
- });
104
- it('selects options on click', async () => {
105
- const component = await fixture(html `<glide-core-dropdown
106
- label="Label"
107
- placeholder="Placeholder"
108
- open
109
- multiple
110
- >
111
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
112
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
113
- </glide-core-dropdown>`);
114
- const options = component.querySelectorAll('glide-core-dropdown-option');
115
- options[0]?.click();
116
- options[1]?.click();
117
- await elementUpdated(component);
118
- const labels = component.shadowRoot?.querySelectorAll('[data-test="selected-option-label"]');
119
- expect(options[0]?.selected).to.be.true;
120
- expect(labels?.length).to.equal(2);
121
- expect(labels?.[0]?.textContent?.trim()).to.equal('One,');
122
- expect(labels?.[1]?.textContent?.trim()).to.equal('Two,');
123
- });
124
- it('selects options on Space', async () => {
125
- const component = await fixture(html `<glide-core-dropdown
126
- label="Label"
127
- placeholder="Placeholder"
128
- multiple
129
- open
130
- >
131
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
132
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
133
- </glide-core-dropdown>`);
134
- // Wait for it to open.
135
- await aTimeout(0);
136
- const options = component.querySelectorAll('glide-core-dropdown-option');
137
- options[0]?.focus();
138
- await sendKeys({ press: ' ' });
139
- options[1]?.focus();
140
- await sendKeys({ press: ' ' });
141
- await elementUpdated(component);
142
- const labels = component.shadowRoot?.querySelectorAll('[data-test="selected-option-label"]');
143
- expect(options[0]?.selected).to.be.true;
144
- expect(options[1]?.selected).to.be.true;
145
- expect(labels?.length).to.equal(2);
146
- expect(labels?.[0]?.textContent?.trim()).to.equal('One,');
147
- expect(labels?.[1]?.textContent?.trim()).to.equal('Two,');
148
- });
149
- it('selects options on Enter', async () => {
150
- const component = await fixture(html `<glide-core-dropdown
151
- label="Label"
152
- placeholder="Placeholder"
153
- multiple
154
- open
155
- >
156
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
157
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
158
- </glide-core-dropdown>`);
159
- // Wait for it to open.
160
- await aTimeout(0);
161
- const options = component.querySelectorAll('glide-core-dropdown-option');
162
- options[0]?.focus();
163
- await sendKeys({ press: 'Enter' });
164
- options[1]?.focus();
165
- await sendKeys({ press: 'Enter' });
166
- const labels = component.shadowRoot?.querySelectorAll('[data-test="selected-option-label"]');
167
- expect(options[0]?.selected).to.be.true;
168
- expect(options[1]?.selected).to.be.true;
169
- expect(labels?.length).to.equal(2);
170
- expect(labels?.[0]?.textContent?.trim()).to.equal('One,');
171
- expect(labels?.[1]?.textContent?.trim()).to.equal('Two,');
172
- });
173
- it('activates Select All by default', async () => {
174
- const component = await fixture(html `<glide-core-dropdown open multiple select-all>
175
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
176
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
177
- </glide-core-dropdown>`);
178
- const options = component.querySelectorAll('glide-core-dropdown-option');
179
- const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
180
- expect(selectAll?.privateActive).to.be.true;
181
- expect(options[0]?.privateActive).to.be.false;
182
- expect(options[1]?.privateActive).to.be.false;
183
- });
184
- it('deactivates all other options on "mouseover"', async () => {
185
- const component = await fixture(html `<glide-core-dropdown open multiple select-all>
186
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
187
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
188
- </glide-core-dropdown>`);
189
- const options = [
190
- ...component.querySelectorAll('glide-core-dropdown-option'),
191
- component.shadowRoot?.querySelector('[data-test="select-all"]'),
192
- ];
193
- options[0]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
194
- options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
195
- expect(options[0]?.privateActive).to.be.false;
196
- expect(options[1]?.privateActive).to.be.true;
197
- expect(options[2]?.privateActive).to.be.false;
198
- });
199
- it('remains open when an option is selected via click', async () => {
200
- const component = await fixture(html `<glide-core-dropdown-in-another-component></glide-core-dropdown-in-another-component>`);
201
- // Wait for it to open.
202
- await aTimeout(0);
203
- const option = component.shadowRoot?.querySelector('glide-core-dropdown-option');
204
- assert(option);
205
- const { x, y } = option.getBoundingClientRect();
206
- // Calling `click()` won't do because Dropdown relies on a "mouseup" event to
207
- // decide if it should close.
208
- await sendMouse({
209
- type: 'click',
210
- position: [Math.ceil(x), Math.ceil(y)],
211
- });
212
- const dropdown = component.shadowRoot?.querySelector('glide-core-dropdown');
213
- expect(dropdown?.open).to.be.true;
214
- });
215
- it('remains open when an option is selected via Enter', async () => {
216
- const component = await fixture(html `<glide-core-dropdown
217
- label="Label"
218
- placeholder="Placeholder"
219
- open
220
- multiple
221
- >
222
- <glide-core-dropdown-option
223
- label="One"
224
- selected
225
- ></glide-core-dropdown-option>
226
-
227
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
228
- </glide-core-dropdown>`);
229
- component.querySelector('glide-core-dropdown-option')?.focus();
230
- await sendKeys({ press: 'Enter' });
231
- expect(component.open).to.be.true;
232
- });
233
- it('remains open when an option is selected via Space', async () => {
234
- const component = await fixture(html `<glide-core-dropdown
235
- label="Label"
236
- placeholder="Placeholder"
237
- open
238
- multiple
239
- >
240
- <glide-core-dropdown-option
241
- label="One"
242
- selected
243
- ></glide-core-dropdown-option>
244
-
245
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
246
- </glide-core-dropdown>`);
247
- const option = component.querySelector('glide-core-dropdown-option');
248
- option?.focus();
249
- await sendKeys({ press: ' ' });
250
- expect(component.open).to.be.true;
251
- });
252
- it('activates Select All on "mouseover"', async () => {
253
- const component = await fixture(html `<glide-core-dropdown open multiple select-all>
254
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
255
-
256
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
257
- </glide-core-dropdown>`);
258
- const options = component.querySelectorAll('glide-core-dropdown-option');
259
- options[0]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
260
- expect(options[0]?.privateActive).to.be.true;
261
- });
262
- it('does not activate the next option on ArrowDown when a tag is focused', async () => {
263
- // This test only accounts for when ArrowDown is pressed. Other keys like
264
- // ArrowUp and Home are left untested to avoid an additional seven or so
265
- // tests. Only testing ArrowDown is hopefully sufficient.
266
- const component = await fixture(html `<glide-core-dropdown
267
- label="Label"
268
- placeholder="Placeholder"
269
- open
270
- multiple
271
- >
272
- <glide-core-dropdown-option
273
- label="One"
274
- selected
275
- ></glide-core-dropdown-option>
276
-
277
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
278
- </glide-core-dropdown>`);
279
- // Wait for it to open.
280
- await aTimeout(0);
281
- const options = component.querySelectorAll('glide-core-dropdown-option');
282
- component.shadowRoot
283
- ?.querySelector('[data-test="tag"]')
284
- ?.focus();
285
- await sendKeys({ press: 'ArrowDown' });
286
- expect(options[0]?.privateActive).to.be.true;
287
- });
288
- it('updates its tag when `label` of a selected option is changed programmatically', async () => {
289
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
290
- <glide-core-dropdown-option
291
- label="One"
292
- selected
293
- ></glide-core-dropdown-option>
294
-
295
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
296
- </glide-core-dropdown>`);
297
- const option = component.querySelector('glide-core-dropdown-option');
298
- assert(option);
299
- option.label = 'Three';
300
- await elementUpdated(component);
301
- const tag = component.shadowRoot?.querySelector('[data-test="tag"]');
302
- expect(tag?.label).to.equal('Three');
303
- });
304
- it('makes its tag editable when `editable` of a selected option is changed programmatically', async () => {
305
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
306
- <glide-core-dropdown-option
307
- label="One"
308
- selected
309
- ></glide-core-dropdown-option>
310
-
311
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
312
- </glide-core-dropdown>`);
313
- const option = component.querySelector('glide-core-dropdown-option');
314
- assert(option);
315
- option.editable = true;
316
- await elementUpdated(component);
317
- const tag = component.shadowRoot?.querySelector('[data-test="tag"]');
318
- expect(tag?.privateEditable).to.be.true;
319
- });
320
- it('selects and deselects options when `value` is changed programmatically', async () => {
321
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
322
- <glide-core-dropdown-option
323
- label="One"
324
- value="one"
325
- selected
326
- ></glide-core-dropdown-option>
327
-
328
- <glide-core-dropdown-option
329
- label="Two"
330
- value="two"
331
- ></glide-core-dropdown-option>
332
-
333
- <glide-core-dropdown-option
334
- label="Three"
335
- value="three"
336
- ></glide-core-dropdown-option>
337
- </glide-core-dropdown>`);
338
- component.value = ['two', 'three'];
339
- const options = component.querySelectorAll('glide-core-dropdown-option');
340
- expect(options[0].selected).to.be.false;
341
- expect(options[1].selected).to.be.true;
342
- expect(options[2].selected).to.be.true;
343
- });
344
- it('selects no options when `value` is changed programmatically to an empty string and some options have no `value`', async () => {
345
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
346
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
347
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
348
-
349
- <glide-core-dropdown-option
350
- label="Three"
351
- value="three"
352
- ></glide-core-dropdown-option>
353
- </glide-core-dropdown>`);
354
- component.value = [''];
355
- const options = component.querySelectorAll('glide-core-dropdown-option');
356
- expect(options[0].selected).to.be.false;
357
- expect(options[1].selected).to.be.false;
358
- expect(options[2].selected).to.be.false;
359
- });
360
- it('updates `value` when an option is selected or deselected via click', async () => {
361
- const component = await fixture(html `<glide-core-dropdown
362
- label="Label"
363
- placeholder="Placeholder"
364
- open
365
- multiple
366
- >
367
- <glide-core-dropdown-option
368
- label="One"
369
- value="one"
370
- selected
371
- ></glide-core-dropdown-option>
372
-
373
- <glide-core-dropdown-option
374
- label="Two"
375
- value="two"
376
- ></glide-core-dropdown-option>
377
-
378
- <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
379
- </glide-core-dropdown>`);
380
- const options = component.querySelectorAll('glide-core-dropdown-option');
381
- options[1].click();
382
- expect(component.value).to.deep.equal(['one', 'two']);
383
- options[1].click();
384
- expect(component.value).to.deep.equal(['one']);
385
- options[2].click();
386
- expect(component.value).to.deep.equal(['one']);
387
- });
388
- it('updates `value` when a option is selected or deselected via Enter', async () => {
389
- const component = await fixture(html `<glide-core-dropdown open multiple>
390
- <glide-core-dropdown-option
391
- label="One"
392
- value="one"
393
- selected
394
- ></glide-core-dropdown-option>
395
-
396
- <glide-core-dropdown-option
397
- label="Two"
398
- value="two"
399
- ></glide-core-dropdown-option>
400
-
401
- <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
402
- </glide-core-dropdown>`);
403
- // Wait for it to open.
404
- await aTimeout(0);
405
- component.focus();
406
- await sendKeys({ press: 'ArrowDown' });
407
- await sendKeys({ press: 'Enter' });
408
- expect(component.value).to.deep.equal(['one', 'two']);
409
- await sendKeys({ press: 'Enter' });
410
- expect(component.value).to.deep.equal(['one']);
411
- await sendKeys({ press: 'ArrowDown' });
412
- await sendKeys({ press: 'Enter' });
413
- expect(component.value).to.deep.equal(['one']);
414
- });
415
- it('updates `value` when an option is selected or deselected via Space', async () => {
416
- const component = await fixture(html `<glide-core-dropdown open multiple>
417
- <glide-core-dropdown-option
418
- label="One"
419
- value="one"
420
- selected
421
- ></glide-core-dropdown-option>
422
-
423
- <glide-core-dropdown-option
424
- label="Two"
425
- value="two"
426
- ></glide-core-dropdown-option>
427
-
428
- <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
429
- </glide-core-dropdown>`);
430
- // Wait for it to open.
431
- await aTimeout(0);
432
- component.focus();
433
- await sendKeys({ press: 'ArrowDown' });
434
- await sendKeys({ press: ' ' });
435
- expect(component.value).to.deep.equal(['one', 'two']);
436
- await sendKeys({ press: ' ' });
437
- expect(component.value).to.deep.equal(['one']);
438
- await sendKeys({ press: 'ArrowDown' });
439
- await sendKeys({ press: ' ' });
440
- expect(component.value).to.deep.equal(['one']);
441
- });
442
- it('updates `value` when multiselect is changed to `true` programmatically', async () => {
443
- const component = await fixture(html `<glide-core-dropdown open>
444
- <glide-core-dropdown-option
445
- label="One"
446
- value="one"
447
- ></glide-core-dropdown-option>
448
-
449
- <glide-core-dropdown-option
450
- label="Two"
451
- value="two"
452
- selected
453
- ></glide-core-dropdown-option>
454
- </glide-core-dropdown>`);
455
- component.multiple = true;
456
- const options = component.querySelectorAll('glide-core-dropdown-option');
457
- expect(component.value).to.deep.equal(['two']);
458
- expect(options[0].selected).to.be.false;
459
- expect(options[1].selected).to.be.true;
460
- await elementUpdated(options[1]);
461
- const checkbox = options[1].shadowRoot?.querySelector('[data-test="checkbox"]');
462
- expect(checkbox?.checked).to.be.true;
463
- });
464
- it('updates `value` when the `value` of a selected option is changed programmatically', async () => {
465
- const component = await fixture(html `<glide-core-dropdown open multiple>
466
- <glide-core-dropdown-option
467
- label="One"
468
- value="one"
469
- selected
470
- ></glide-core-dropdown-option>
471
-
472
- <glide-core-dropdown-option
473
- label="Two"
474
- value="two"
475
- selected
476
- ></glide-core-dropdown-option>
477
- </glide-core-dropdown>`);
478
- const option = component.querySelector('glide-core-dropdown-option');
479
- assert(option);
480
- option.value = 'three';
481
- expect(component.value).to.deep.equal(['three', 'two']);
482
- });
483
- it('updates `value` when the `value` of a selected option is emptied programmatically', async () => {
484
- const component = await fixture(html `<glide-core-dropdown open multiple>
485
- <glide-core-dropdown-option
486
- label="One"
487
- value="one"
488
- selected
489
- ></glide-core-dropdown-option>
490
-
491
- <glide-core-dropdown-option
492
- label="Two"
493
- value="two"
494
- selected
495
- ></glide-core-dropdown-option>
496
- </glide-core-dropdown>`);
497
- const option = component.querySelector('glide-core-dropdown-option');
498
- assert(option);
499
- option.value = '';
500
- expect(component.value).to.deep.equal(['two']);
501
- });
502
- it('updates `value` a tag is removed', async () => {
503
- const component = await fixture(html `<glide-core-dropdown open multiple>
504
- <glide-core-dropdown-option
505
- label="One"
506
- value="one"
507
- selected
508
- ></glide-core-dropdown-option>
509
-
510
- <glide-core-dropdown-option
511
- label="Two"
512
- value="two"
513
- selected
514
- ></glide-core-dropdown-option>
515
- </glide-core-dropdown>`);
516
- component.shadowRoot
517
- ?.querySelector('[data-test="tag"]')
518
- ?.click();
519
- expect(component.value).to.deep.equal(['two']);
520
- });
521
- it('has no internal label when an option is newly selected', async () => {
522
- const component = await fixture(html `<glide-core-dropdown
523
- label="Label"
524
- placeholder="Placeholder"
525
- open
526
- multiple
527
- >
528
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
529
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
530
- </glide-core-dropdown>`);
531
- component
532
- .querySelector('glide-core-dropdown-option:last-of-type')
533
- ?.click();
534
- await elementUpdated(component);
535
- const label = component.shadowRoot?.querySelector('[data-test="internal-label"]');
536
- expect(label?.checkVisibility()).to.not.be.ok;
537
- });
538
- it('hides tags to prevent overflow', async () => {
539
- const component = await fixture(html `<glide-core-dropdown
540
- label="Label"
541
- placeholder="Placeholder"
542
- multiple
543
- style="display: block; max-width: 20rem;"
544
- >
545
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
546
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
547
- <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
548
- <glide-core-dropdown-option label="Four"></glide-core-dropdown-option>
549
- </glide-core-dropdown>`);
550
- const options = component.querySelectorAll('glide-core-dropdown-option');
551
- options[0].selected = true;
552
- options[1].selected = true;
553
- options[2].selected = true;
554
- options[3].selected = true;
555
- // Wait for the Resize Observer to do its thing.
556
- await aTimeout(0);
557
- const tagContainers = [
558
- ...(component.shadowRoot?.querySelectorAll('[data-test="tag-container"]') ?? []),
559
- ].filter((element) => element.checkVisibility());
560
- expect(tagContainers?.length).to.equal(2);
561
- });
562
- it('has overflow text when its tags are overflowing', async () => {
563
- const component = await fixture(html `<glide-core-dropdown
564
- label="Label"
565
- placeholder="Placeholder"
566
- multiple
567
- style="display: block; max-width: 20rem;"
568
- >
569
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
570
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
571
- <glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
572
- <glide-core-dropdown-option label="Four"></glide-core-dropdown-option>
573
- </glide-core-dropdown>`);
574
- const options = component.querySelectorAll('glide-core-dropdown-option');
575
- options[0].selected = true;
576
- options[1].selected = true;
577
- options[2].selected = true;
578
- options[3].selected = true;
579
- // Wait for the Resize Observer to do its thing.
580
- await aTimeout(0);
581
- const tagOverflow = component.shadowRoot?.querySelector('[data-test="tag-overflow-count"]');
582
- expect(tagOverflow?.textContent?.trim()).to.equal('2');
583
- });
584
- it('deselects the option when its tag is removed', async () => {
585
- const component = await fixture(html `<glide-core-dropdown
586
- label="Label"
587
- placeholder="Placeholder"
588
- open
589
- multiple
590
- >
591
- <glide-core-dropdown-option
592
- label="One"
593
- selected
594
- ></glide-core-dropdown-option>
595
-
596
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
597
- </glide-core-dropdown>`);
598
- component.shadowRoot
599
- ?.querySelector('[data-test="tag"]')
600
- ?.click();
601
- const option = component.querySelector('glide-core-dropdown-option');
602
- expect(option?.selected).to.be.false;
603
- });
604
- it('deselects all but the last selected option when `multiple` is changed to `false` programmatically', async () => {
605
- const component = await fixture(html `<glide-core-dropdown open multiple>
606
- <glide-core-dropdown-option
607
- label="One"
608
- selected
609
- ></glide-core-dropdown-option>
610
-
611
- <glide-core-dropdown-option
612
- label="Two"
613
- selected
614
- ></glide-core-dropdown-option>
615
- </glide-core-dropdown>`);
616
- component.multiple = false;
617
- const options = component.querySelectorAll('glide-core-dropdown-option');
618
- expect(options[0].selected).be.false;
619
- expect(options[1].selected).be.true;
620
- });
621
- it('selects all options when none are selected and Select All is selected via click', async () => {
622
- const component = await fixture(html `<glide-core-dropdown
623
- label="Label"
624
- placeholder="Placeholder"
625
- multiple
626
- select-all
627
- >
628
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
629
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
630
- </glide-core-dropdown>`);
631
- component.shadowRoot
632
- ?.querySelector('[data-test="select-all"]')
633
- ?.click();
634
- const options = component.querySelectorAll('glide-core-dropdown-option');
635
- expect(options[0].selected).to.be.true;
636
- expect(options[1].selected).to.be.true;
637
- });
638
- it('selects all options when some are selected and Select All is selected via click', async () => {
639
- const component = await fixture(html `<glide-core-dropdown
640
- label="Label"
641
- placeholder="Placeholder"
642
- multiple
643
- select-all
644
- >
645
- <glide-core-dropdown-option
646
- label="One"
647
- selected
648
- ></glide-core-dropdown-option>
649
-
650
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
651
- </glide-core-dropdown>`);
652
- component.shadowRoot
653
- ?.querySelector('[data-test="select-all"]')
654
- ?.click();
655
- const options = component.querySelectorAll('glide-core-dropdown-option');
656
- expect(options[0].selected).to.be.true;
657
- expect(options[1].selected).to.be.true;
658
- });
659
- it('deselects all options when all are selected and Select All is selected via click', async () => {
660
- const component = await fixture(html `<glide-core-dropdown
661
- label="Label"
662
- placeholder="Placeholder"
663
- multiple
664
- select-all
665
- >
666
- <glide-core-dropdown-option
667
- label="One"
668
- selected
669
- ></glide-core-dropdown-option>
670
-
671
- <glide-core-dropdown-option
672
- label="Two"
673
- selected
674
- ></glide-core-dropdown-option>
675
- </glide-core-dropdown>`);
676
- component.shadowRoot
677
- ?.querySelector('[data-test="select-all"]')
678
- ?.click();
679
- const options = component.querySelectorAll('glide-core-dropdown-option');
680
- expect(options[0].selected).to.be.false;
681
- expect(options[1].selected).to.be.false;
682
- });
683
- it('selects all options when none are selected and Select All is selected via Space', async () => {
684
- const component = await fixture(html `<glide-core-dropdown
685
- label="Label"
686
- placeholder="Placeholder"
687
- multiple
688
- open
689
- select-all
690
- >
691
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
692
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
693
- </glide-core-dropdown>`);
694
- component?.shadowRoot
695
- ?.querySelector('[data-test="select-all"]')
696
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
697
- component.focus();
698
- await sendKeys({ press: ' ' });
699
- const options = component.querySelectorAll('glide-core-dropdown-option');
700
- expect(options[0].selected).to.be.true;
701
- expect(options[1].selected).to.be.true;
702
- });
703
- it('selects all options when some are selected and Select All is selected via Space', async () => {
704
- const component = await fixture(html `<glide-core-dropdown
705
- label="Label"
706
- placeholder="Placeholder"
707
- multiple
708
- open
709
- select-all
710
- >
711
- <glide-core-dropdown-option
712
- label="One"
713
- selected
714
- ></glide-core-dropdown-option>
715
-
716
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
717
- </glide-core-dropdown>`);
718
- component?.shadowRoot
719
- ?.querySelector('[data-test="select-all"]')
720
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
721
- component.focus();
722
- await sendKeys({ press: ' ' });
723
- const options = component.querySelectorAll('glide-core-dropdown-option');
724
- expect(options[0].selected).to.be.true;
725
- expect(options[1].selected).to.be.true;
726
- });
727
- it('deselects all options when all are selected and Select All is selected via Space', async () => {
728
- const component = await fixture(html `<glide-core-dropdown
729
- label="Label"
730
- placeholder="Placeholder"
731
- multiple
732
- open
733
- select-all
734
- >
735
- <glide-core-dropdown-option
736
- label="One"
737
- selected
738
- ></glide-core-dropdown-option>
739
-
740
- <glide-core-dropdown-option
741
- label="Two"
742
- selected
743
- ></glide-core-dropdown-option>
744
- </glide-core-dropdown>`);
745
- component?.shadowRoot
746
- ?.querySelector('[data-test="select-all"]')
747
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
748
- component.focus();
749
- await sendKeys({ press: ' ' });
750
- const options = component.querySelectorAll('glide-core-dropdown-option');
751
- expect(options[0].selected).to.be.false;
752
- expect(options[1].selected).to.be.false;
753
- });
754
- it('selects all options when none are selected and Select All is selected via Enter', async () => {
755
- const component = await fixture(html `<glide-core-dropdown
756
- label="Label"
757
- placeholder="Placeholder"
758
- multiple
759
- open
760
- select-all
761
- >
762
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
763
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
764
- </glide-core-dropdown>`);
765
- component?.shadowRoot
766
- ?.querySelector('[data-test="select-all"]')
767
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
768
- component.focus();
769
- await sendKeys({ press: 'Enter' });
770
- const options = component.querySelectorAll('glide-core-dropdown-option');
771
- expect(options[0].selected).to.be.true;
772
- expect(options[1].selected).to.be.true;
773
- });
774
- it('selects all options when some are selected and Select All is selected via Enter', async () => {
775
- const component = await fixture(html `<glide-core-dropdown
776
- label="Label"
777
- placeholder="Placeholder"
778
- multiple
779
- open
780
- select-all
781
- >
782
- <glide-core-dropdown-option
783
- label="One"
784
- selected
785
- ></glide-core-dropdown-option>
786
-
787
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
788
- </glide-core-dropdown>`);
789
- component?.shadowRoot
790
- ?.querySelector('[data-test="select-all"]')
791
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
792
- component.focus();
793
- await sendKeys({ press: 'Enter' });
794
- const options = component.querySelectorAll('glide-core-dropdown-option');
795
- expect(options[0].selected).to.be.true;
796
- expect(options[1].selected).to.be.true;
797
- });
798
- it('deselects all options when all are selected and Select All is selected via Enter', async () => {
799
- const component = await fixture(html `<glide-core-dropdown
800
- label="Label"
801
- placeholder="Placeholder"
802
- multiple
803
- open
804
- select-all
805
- >
806
- <glide-core-dropdown-option
807
- label="One"
808
- selected
809
- ></glide-core-dropdown-option>
810
-
811
- <glide-core-dropdown-option
812
- label="Two"
813
- selected
814
- ></glide-core-dropdown-option>
815
- </glide-core-dropdown>`);
816
- component?.shadowRoot
817
- ?.querySelector('[data-test="select-all"]')
818
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
819
- component.focus();
820
- await sendKeys({ press: 'Enter' });
821
- const options = component.querySelectorAll('glide-core-dropdown-option');
822
- expect(options[0].selected).to.be.false;
823
- expect(options[1].selected).to.be.false;
824
- });
825
- it('shows Select All', async () => {
826
- const component = await fixture(html `<glide-core-dropdown
827
- label="Label"
828
- placeholder="Placeholder"
829
- open
830
- multiple
831
- >
832
- <glide-core-dropdown-option
833
- label="One"
834
- selected
835
- ></glide-core-dropdown-option>
836
-
837
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
838
- </glide-core-dropdown>`);
839
- // Wait for it to open.
840
- await aTimeout(0);
841
- component.selectAll = true;
842
- await elementUpdated(component);
843
- const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
844
- expect(selectAll?.checkVisibility()).to.be.true;
845
- });
846
- it('sets Select All as selected when all options are selected', async () => {
847
- const component = await fixture(html `<glide-core-dropdown
848
- label="Label"
849
- placeholder="Placeholder"
850
- multiple
851
- select-all
852
- >
853
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
854
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
855
- </glide-core-dropdown>`);
856
- const options = component.querySelectorAll('glide-core-dropdown-option');
857
- options[0].click();
858
- options[1].click();
859
- const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
860
- expect(selectAll?.selected).to.be.true;
861
- });
862
- it('sets Select All as deselected when no options are selected', async () => {
863
- const component = await fixture(html `<glide-core-dropdown
864
- label="Label"
865
- placeholder="Placeholder"
866
- multiple
867
- select-all
868
- >
869
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
870
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
871
- </glide-core-dropdown>`);
872
- const options = component.querySelectorAll('glide-core-dropdown-option');
873
- options[0].click();
874
- options[1].click();
875
- options[0].click();
876
- options[1].click();
877
- const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
878
- expect(selectAll?.selected).to.be.false;
879
- });
880
- it('sets Select All as indeterminate when not all options are selected', async () => {
881
- const component = await fixture(html `<glide-core-dropdown
882
- label="Label"
883
- placeholder="Placeholder"
884
- multiple
885
- select-all
886
- >
887
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
888
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
889
- </glide-core-dropdown>`);
890
- const options = component.querySelectorAll('glide-core-dropdown-option');
891
- options[0].click();
892
- await elementUpdated(component);
893
- const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
894
- expect(selectAll?.privateIndeterminate).to.be.true;
895
- });
896
- it('does not set Select All as indeterminate when no options are selected', async () => {
897
- const component = await fixture(html `<glide-core-dropdown
898
- label="Label"
899
- placeholder="Placeholder"
900
- multiple
901
- select-all
902
- >
903
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
904
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
905
- </glide-core-dropdown>`);
906
- const options = component.querySelectorAll('glide-core-dropdown-option');
907
- options[0].click();
908
- options[0].click();
909
- const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
910
- expect(selectAll?.privateIndeterminate).to.be.false;
911
- });
912
- it('does not set Select All as indeterminate when all options are selected', async () => {
913
- const component = await fixture(html `<glide-core-dropdown
914
- label="Label"
915
- placeholder="Placeholder"
916
- multiple
917
- select-all
918
- >
919
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
920
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
921
- </glide-core-dropdown>`);
922
- const options = component.querySelectorAll('glide-core-dropdown-option');
923
- options[0].click();
924
- options[1].click();
925
- const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
926
- expect(selectAll?.privateIndeterminate).to.be.false;
927
- });
928
- it('closes when a tag is clicked', async () => {
929
- const component = await fixture(html `<glide-core-dropdown open multiple>
930
- <glide-core-dropdown-option
931
- label="One"
932
- selected
933
- ></glide-core-dropdown-option>
934
-
935
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
936
- </glide-core-dropdown>`);
937
- const tag = component.shadowRoot?.querySelector('[data-test="tag"]');
938
- assert(tag);
939
- const { x, y } = tag.getBoundingClientRect();
940
- // A simple `tag.click()` won't do because it would remove the tag. We want to
941
- // click elsewhere on the tag so focus is moved to `document.body`. This ensures
942
- // Dropdown's "focusout" handler doesn't cause Dropdown to close.
943
- await sendMouse({
944
- type: 'click',
945
- position: [Math.ceil(x), Math.ceil(y)],
946
- });
947
- await elementUpdated(component);
948
- expect(component.open).to.be.false;
949
- });
950
- it('closes on edit via click', async () => {
951
- const component = await fixture(html `<glide-core-dropdown open multiple>
952
- <glide-core-dropdown-option
953
- label="One"
954
- editable
955
- selected
956
- ></glide-core-dropdown-option>
957
-
958
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
959
- </glide-core-dropdown>`);
960
- component.shadowRoot
961
- ?.querySelector('glide-core-tag')
962
- ?.shadowRoot?.querySelector('[data-test="edit-button"]')
963
- ?.click();
964
- await elementUpdated(component);
965
- expect(component.open).to.be.false;
966
- });
967
- it('closes on edit via Enter', async () => {
968
- const component = await fixture(html `<glide-core-dropdown open multiple>
969
- <glide-core-dropdown-option
970
- label="One"
971
- editable
972
- selected
973
- ></glide-core-dropdown-option>
974
-
975
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
976
- </glide-core-dropdown>`);
977
- component.shadowRoot
978
- ?.querySelector('glide-core-tag')
979
- ?.shadowRoot?.querySelector('[data-test="edit-button"]')
980
- ?.focus();
981
- await sendKeys({ press: 'Enter' });
982
- expect(component.open).to.be.false;
983
- });
984
- it('closes on edit via Space', async () => {
985
- const component = await fixture(html `<glide-core-dropdown open multiple>
986
- <glide-core-dropdown-option
987
- label="One"
988
- editable
989
- selected
990
- ></glide-core-dropdown-option>
991
-
992
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
993
- </glide-core-dropdown>`);
994
- component.shadowRoot
995
- ?.querySelector('glide-core-tag')
996
- ?.shadowRoot?.querySelector('[data-test="edit-button"]')
997
- ?.focus();
998
- await sendKeys({ press: ' ' });
999
- expect(component.open).to.be.false;
1000
- });
1001
- it('cannot be tabbed to when `disabled`', async () => {
1002
- await fixture(html `<glide-core-dropdown
1003
- label="Label"
1004
- placeholder="Placeholder"
1005
- disabled
1006
- multiple
1007
- >
1008
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
1009
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
1010
- </glide-core-dropdown>`);
1011
- await sendKeys({ press: 'Tab' });
1012
- expect(document.activeElement).to.equal(document.body);
1013
- });
1014
- it('clicks the primary button when `click()` is called', async () => {
1015
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
1016
- <glide-core-dropdown-option label="One"></glide-core-dropdown-option>
1017
- <glide-core-dropdown-option label="Two"></glide-core-dropdown-option>
1018
- </glide-core-dropdown>`);
1019
- const button = component.shadowRoot?.querySelector('[data-test="primary-button"]');
1020
- assert(button);
1021
- setTimeout(() => {
1022
- component.click();
1023
- });
1024
- const event = await oneEvent(button, 'click');
1025
- expect(event instanceof PointerEvent).to.be.true;
1026
- });