@crowdstrike/glide-core 0.5.1 → 0.5.2

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 (208) hide show
  1. package/dist/accordion.js +1 -1
  2. package/dist/accordion.styles.js +4 -4
  3. package/dist/accordion.test.basics.js +109 -0
  4. package/dist/accordion.test.events.js +39 -0
  5. package/dist/button-group.button.js +1 -1
  6. package/dist/button-group.button.styles.js +4 -4
  7. package/dist/button-group.button.test.basics.js +169 -0
  8. package/dist/button-group.button.test.events.js +73 -0
  9. package/dist/button-group.js +1 -1
  10. package/dist/button-group.styles.js +3 -3
  11. package/dist/button-group.test.basics.js +268 -0
  12. package/dist/button-group.test.events.js +291 -0
  13. package/dist/button.js +1 -1
  14. package/dist/button.styles.js +4 -4
  15. package/dist/button.test.basics.js +196 -0
  16. package/dist/button.test.events.js +25 -0
  17. package/dist/button.test.form.js +49 -0
  18. package/dist/checkbox-group.js +1 -1
  19. package/dist/checkbox-group.styles.js +2 -2
  20. package/dist/checkbox-group.test.basics.js +119 -0
  21. package/dist/checkbox-group.test.events.js +110 -0
  22. package/dist/checkbox-group.test.focus.js +45 -0
  23. package/dist/checkbox-group.test.form.js +130 -0
  24. package/dist/checkbox-group.test.validity.js +75 -0
  25. package/dist/checkbox.js +1 -1
  26. package/dist/checkbox.styles.js +3 -3
  27. package/dist/checkbox.test.basics.js +89 -0
  28. package/dist/checkbox.test.events.js +87 -0
  29. package/dist/checkbox.test.focus.js +38 -0
  30. package/dist/checkbox.test.form.js +115 -0
  31. package/dist/checkbox.test.states.js +62 -0
  32. package/dist/checkbox.test.validity.js +51 -0
  33. package/dist/drawer.d.ts +2 -2
  34. package/dist/drawer.js +1 -15
  35. package/dist/drawer.styles.js +18 -4
  36. package/dist/drawer.test.accessibility.js +22 -0
  37. package/dist/drawer.test.basics.js +43 -0
  38. package/dist/drawer.test.closing.js +37 -0
  39. package/dist/drawer.test.events.js +52 -0
  40. package/dist/drawer.test.methods.js +34 -0
  41. package/dist/dropdown.d.ts +4 -2
  42. package/dist/dropdown.js +1 -1
  43. package/dist/dropdown.option.d.ts +0 -2
  44. package/dist/dropdown.option.js +1 -1
  45. package/dist/dropdown.option.styles.js +2 -2
  46. package/dist/dropdown.option.test.basics.js +59 -0
  47. package/dist/dropdown.option.test.basics.multiple.js +26 -0
  48. package/dist/dropdown.option.test.basics.single.js +20 -0
  49. package/dist/dropdown.option.test.events.js +27 -0
  50. package/dist/dropdown.option.test.focus.js +11 -0
  51. package/dist/dropdown.option.test.interactions.multiple.js +87 -0
  52. package/dist/dropdown.option.test.interactions.single.js +22 -0
  53. package/dist/dropdown.styles.js +25 -6
  54. package/dist/dropdown.test.basics.filterable.js +84 -0
  55. package/dist/dropdown.test.basics.js +233 -0
  56. package/dist/dropdown.test.basics.multiple.js +270 -0
  57. package/dist/dropdown.test.basics.single.js +79 -0
  58. package/dist/dropdown.test.events.js +268 -0
  59. package/dist/dropdown.test.events.multiple.js +130 -0
  60. package/dist/dropdown.test.focus.d.ts +1 -0
  61. package/dist/dropdown.test.focus.filterable.js +154 -0
  62. package/dist/dropdown.test.focus.js +18 -0
  63. package/dist/dropdown.test.focus.multiple.js +181 -0
  64. package/dist/dropdown.test.focus.single.js +53 -0
  65. package/dist/dropdown.test.form.js +140 -0
  66. package/dist/dropdown.test.form.multiple.js +149 -0
  67. package/dist/dropdown.test.form.single.js +128 -0
  68. package/dist/dropdown.test.interactions.filterable.js +385 -0
  69. package/dist/dropdown.test.interactions.js +446 -0
  70. package/dist/dropdown.test.interactions.multiple.js +908 -0
  71. package/dist/dropdown.test.interactions.single.js +466 -0
  72. package/dist/dropdown.test.validity.js +46 -0
  73. package/dist/icon-button.js +1 -1
  74. package/dist/icon-button.styles.js +3 -3
  75. package/dist/icon-button.test.basics.js +103 -0
  76. package/dist/icons/checked.js +1 -1
  77. package/dist/icons/magnifying-glass.js +1 -1
  78. package/dist/input.js +1 -1
  79. package/dist/input.styles.js +3 -3
  80. package/dist/input.test.basics.js +169 -0
  81. package/dist/input.test.events.js +97 -0
  82. package/dist/input.test.focus.js +54 -0
  83. package/dist/input.test.form.js +56 -0
  84. package/dist/input.test.validity.js +50 -0
  85. package/dist/label.js +1 -1
  86. package/dist/label.styles.js +3 -3
  87. package/dist/label.test.basics.js +129 -0
  88. package/dist/library/expect-argument-error.js +1 -1
  89. package/dist/library/ow.js +1 -1
  90. package/dist/library/ow.test.js +55 -0
  91. package/dist/menu.button.d.ts +1 -2
  92. package/dist/menu.button.js +1 -1
  93. package/dist/menu.button.styles.js +3 -3
  94. package/dist/menu.button.test.basics.js +42 -0
  95. package/dist/menu.d.ts +4 -0
  96. package/dist/menu.js +1 -1
  97. package/dist/menu.link.d.ts +1 -2
  98. package/dist/menu.link.js +1 -1
  99. package/dist/menu.link.styles.js +3 -3
  100. package/dist/menu.link.test.basics.js +46 -0
  101. package/dist/menu.styles.js +6 -6
  102. package/dist/menu.test.basics.js +161 -0
  103. package/dist/menu.test.focus.d.ts +0 -1
  104. package/dist/menu.test.focus.js +66 -0
  105. package/dist/menu.test.interactions.d.ts +0 -1
  106. package/dist/menu.test.interactions.js +522 -0
  107. package/dist/modal.icon-button.js +1 -1
  108. package/dist/modal.icon-button.styles.js +2 -2
  109. package/dist/modal.icon-button.test.basics.js +45 -0
  110. package/dist/modal.js +1 -15
  111. package/dist/modal.styles.js +4 -4
  112. package/dist/modal.tertiary-icon.js +1 -1
  113. package/dist/modal.tertiary-icon.test.basics.js +59 -0
  114. package/dist/modal.test.accessibility.js +48 -0
  115. package/dist/modal.test.basics.js +203 -0
  116. package/dist/modal.test.close.js +38 -0
  117. package/dist/modal.test.events.js +110 -0
  118. package/dist/modal.test.lock-scroll.js +76 -0
  119. package/dist/modal.test.methods.js +23 -0
  120. package/dist/modal.test.scrollbars.js +19 -0
  121. package/dist/radio-group.js +1 -1
  122. package/dist/radio-group.styles.js +2 -2
  123. package/dist/radio-group.test.basics.js +323 -0
  124. package/dist/radio-group.test.events.js +277 -0
  125. package/dist/radio-group.test.focus.js +75 -0
  126. package/dist/radio-group.test.form.js +104 -0
  127. package/dist/radio-group.test.validity.js +228 -0
  128. package/dist/radio.js +1 -1
  129. package/dist/radio.styles.js +4 -4
  130. package/dist/split-button.d.ts +24 -0
  131. package/dist/split-button.js +1 -0
  132. package/dist/split-button.stories.d.ts +17 -0
  133. package/dist/split-button.styles.d.ts +2 -0
  134. package/dist/split-button.styles.js +103 -0
  135. package/dist/split-button.test.basics.d.ts +1 -0
  136. package/dist/split-button.test.basics.js +84 -0
  137. package/dist/split-container.d.ts +30 -0
  138. package/dist/split-container.js +1 -0
  139. package/dist/split-container.styles.d.ts +2 -0
  140. package/dist/split-container.styles.js +132 -0
  141. package/dist/split-container.test.basics.d.ts +3 -0
  142. package/dist/split-container.test.basics.js +445 -0
  143. package/dist/split-container.test.interactions.d.ts +1 -0
  144. package/dist/split-container.test.interactions.js +20 -0
  145. package/dist/split-link.d.ts +25 -0
  146. package/dist/split-link.js +1 -0
  147. package/dist/split-link.test.basics.d.ts +1 -0
  148. package/dist/split-link.test.basics.js +92 -0
  149. package/dist/split-link.test.interactions.d.ts +1 -0
  150. package/dist/split-link.test.interactions.js +19 -0
  151. package/dist/status-indicator.js +1 -1
  152. package/dist/status-indicator.styles.js +2 -2
  153. package/dist/status-indicator.test.basics.js +102 -0
  154. package/dist/styles/focus-outline.js +1 -4
  155. package/dist/styles/visually-hidden.js +1 -11
  156. package/dist/tab.group.js +1 -1
  157. package/dist/tab.group.styles.js +2 -2
  158. package/dist/tab.group.test.basics.js +185 -0
  159. package/dist/tab.js +1 -1
  160. package/dist/tab.panel.js +1 -1
  161. package/dist/tab.panel.styles.js +3 -3
  162. package/dist/tab.styles.js +2 -2
  163. package/dist/tab.test.basics.js +71 -0
  164. package/dist/tag.js +1 -1
  165. package/dist/tag.styles.js +3 -3
  166. package/dist/tag.test.basics.js +118 -0
  167. package/dist/tag.test.events.js +16 -0
  168. package/dist/tag.test.focus.js +11 -0
  169. package/dist/textarea.js +2 -2
  170. package/dist/textarea.styles.js +3 -3
  171. package/dist/textarea.test.basics.js +140 -0
  172. package/dist/textarea.test.events.js +204 -0
  173. package/dist/textarea.test.form.js +70 -0
  174. package/dist/textarea.test.validity.js +83 -0
  175. package/dist/toasts.js +1 -1
  176. package/dist/toasts.styles.js +2 -2
  177. package/dist/toasts.test.basics.js +94 -0
  178. package/dist/toasts.toast.js +1 -1
  179. package/dist/toasts.toast.styles.js +5 -2
  180. package/dist/toasts.toast.test.basics.js +139 -0
  181. package/dist/toggle.js +1 -1
  182. package/dist/toggle.styles.js +3 -3
  183. package/dist/toggle.test.basics.js +64 -0
  184. package/dist/toggle.test.events.js +29 -0
  185. package/dist/toggle.test.focus.js +9 -0
  186. package/dist/toggle.test.states.js +35 -0
  187. package/dist/tooltip.js +1 -1
  188. package/dist/tooltip.styles.js +3 -3
  189. package/dist/tooltip.test.basics.js +64 -0
  190. package/dist/tooltip.test.interactions.js +78 -0
  191. package/dist/tree.item.icon-button.js +1 -1
  192. package/dist/tree.item.icon-button.styles.js +2 -2
  193. package/dist/tree.item.icon-button.test.basics.js +13 -0
  194. package/dist/tree.item.js +1 -1
  195. package/dist/tree.item.menu.js +1 -1
  196. package/dist/tree.item.menu.styles.js +2 -2
  197. package/dist/tree.item.menu.test.basics.js +34 -0
  198. package/dist/tree.item.styles.js +2 -2
  199. package/dist/tree.item.test.basics.js +102 -0
  200. package/dist/tree.js +1 -1
  201. package/dist/tree.styles.js +2 -2
  202. package/dist/tree.test.aria.js +86 -0
  203. package/dist/tree.test.basics.js +123 -0
  204. package/dist/tree.test.events.js +19 -0
  205. package/dist/tree.test.focus.js +261 -0
  206. package/package.json +18 -16
  207. /package/dist/{dropdown.option.test.focus.multiple.d.ts → dropdown.option.test.focus.d.ts} +0 -0
  208. /package/dist/{dropdown.option.test.focus.single.d.ts → dropdown.test.events.multiple.d.ts} +0 -0
@@ -0,0 +1,270 @@
1
+ import './dropdown.option.js';
2
+ import { expect, fixture, html } from '@open-wc/testing';
3
+ import GlideCoreDropdown from './dropdown.js';
4
+ import GlideCoreDropdownOption from './dropdown.option.js';
5
+ GlideCoreDropdown.shadowRootOptions.mode = 'open';
6
+ it('is accessible', async () => {
7
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
8
+ <glide-core-dropdown-option
9
+ label="One"
10
+ value="one"
11
+ ></glide-core-dropdown-option>
12
+
13
+ <glide-core-dropdown-option
14
+ label="Two"
15
+ value="two"
16
+ selected
17
+ ></glide-core-dropdown-option>
18
+ </glide-core-dropdown>`);
19
+ await expect(component).to.be.accessible();
20
+ });
21
+ it('sets `value` to that of the initially selected options', async () => {
22
+ const component = await fixture(html `<glide-core-dropdown open multiple>
23
+ <glide-core-dropdown-option
24
+ label="One"
25
+ value="one"
26
+ ></glide-core-dropdown-option>
27
+
28
+ <glide-core-dropdown-option
29
+ label="Two"
30
+ value="two"
31
+ selected
32
+ ></glide-core-dropdown-option>
33
+
34
+ <glide-core-dropdown-option
35
+ label="Three"
36
+ value="three"
37
+ selected
38
+ ></glide-core-dropdown-option>
39
+ </glide-core-dropdown>`);
40
+ expect(component.value).to.deep.equal(['two', 'three']);
41
+ });
42
+ it('has selected option labels when options are initially selected', async () => {
43
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
44
+ <glide-core-dropdown-option
45
+ label="One"
46
+ value="one"
47
+ selected
48
+ ></glide-core-dropdown-option>
49
+
50
+ <glide-core-dropdown-option
51
+ label="Two"
52
+ value="two"
53
+ selected
54
+ ></glide-core-dropdown-option>
55
+ </glide-core-dropdown>`);
56
+ const labels = component.shadowRoot?.querySelectorAll('[data-test="selected-option-label"]');
57
+ expect(labels?.length).to.equal(2);
58
+ expect(labels?.[0]?.textContent?.trim()).to.equal('One,');
59
+ expect(labels?.[1]?.textContent?.trim()).to.equal('Two,');
60
+ });
61
+ it('has a tag when an option is initially selected', async () => {
62
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
63
+ <glide-core-dropdown-option
64
+ label="One"
65
+ value="one"
66
+ selected
67
+ ></glide-core-dropdown-option>
68
+
69
+ <glide-core-dropdown-option
70
+ label="Two"
71
+ value="two"
72
+ ></glide-core-dropdown-option>
73
+ </glide-core-dropdown>`);
74
+ const tag = component.shadowRoot?.querySelector('[data-test="tag"]');
75
+ expect(tag?.checkVisibility()).to.be.true;
76
+ expect(tag?.textContent?.trim()).to.equal('One');
77
+ });
78
+ it('only has so many tags when many options are initially selected', async () => {
79
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
80
+ <glide-core-dropdown-option
81
+ label="One"
82
+ value="one"
83
+ selected
84
+ ></glide-core-dropdown-option>
85
+
86
+ <glide-core-dropdown-option
87
+ label="Two"
88
+ value="two"
89
+ selected
90
+ ></glide-core-dropdown-option>
91
+
92
+ <glide-core-dropdown-option
93
+ label="Three"
94
+ value="three"
95
+ selected
96
+ ></glide-core-dropdown-option>
97
+
98
+ <glide-core-dropdown-option
99
+ label="Four"
100
+ value="four"
101
+ selected
102
+ ></glide-core-dropdown-option>
103
+ </glide-core-dropdown>`);
104
+ const tagContainers = [
105
+ ...(component.shadowRoot?.querySelectorAll('[data-test="tag-container"]') ?? []),
106
+ ].filter((element) => element.checkVisibility());
107
+ expect(tagContainers?.length).to.equal(3);
108
+ });
109
+ it('shows Select All', async () => {
110
+ const component = await fixture(html `<glide-core-dropdown
111
+ label="Label"
112
+ placeholder="Placeholder"
113
+ multiple
114
+ select-all
115
+ >
116
+ <glide-core-dropdown-option
117
+ label="One"
118
+ value="one"
119
+ selected
120
+ ></glide-core-dropdown-option>
121
+
122
+ <glide-core-dropdown-option
123
+ label="Two"
124
+ value="two"
125
+ ></glide-core-dropdown-option>
126
+ </glide-core-dropdown>`);
127
+ const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
128
+ expect(selectAll?.checkVisibility()).to.be.ok;
129
+ });
130
+ it('sets Select All as selected when all options are initially selected', async () => {
131
+ const component = await fixture(html `<glide-core-dropdown
132
+ label="Label"
133
+ placeholder="Placeholder"
134
+ multiple
135
+ select-all
136
+ >
137
+ <glide-core-dropdown-option
138
+ label="One"
139
+ value="one"
140
+ selected
141
+ ></glide-core-dropdown-option>
142
+
143
+ <glide-core-dropdown-option
144
+ label="Two"
145
+ value="two"
146
+ selected
147
+ ></glide-core-dropdown-option>
148
+ </glide-core-dropdown>`);
149
+ const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
150
+ expect(selectAll?.selected).to.be.true;
151
+ });
152
+ it('sets Select All as deselected when no options are initially selected', async () => {
153
+ const component = await fixture(html `<glide-core-dropdown
154
+ label="Label"
155
+ placeholder="Placeholder"
156
+ multiple
157
+ select-all
158
+ >
159
+ <glide-core-dropdown-option
160
+ label="One"
161
+ value="one"
162
+ ></glide-core-dropdown-option>
163
+
164
+ <glide-core-dropdown-option
165
+ label="Two"
166
+ value="two"
167
+ ></glide-core-dropdown-option>
168
+ </glide-core-dropdown>`);
169
+ const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
170
+ expect(selectAll?.selected).to.be.false;
171
+ });
172
+ it('sets Select All as indeterminate when not all options are initially selected', async () => {
173
+ const component = await fixture(html `<glide-core-dropdown
174
+ label="Label"
175
+ placeholder="Placeholder"
176
+ multiple
177
+ select-all
178
+ >
179
+ <glide-core-dropdown-option
180
+ label="One"
181
+ value="one"
182
+ selected
183
+ ></glide-core-dropdown-option>
184
+
185
+ <glide-core-dropdown-option
186
+ label="Two"
187
+ value="two"
188
+ ></glide-core-dropdown-option>
189
+ </glide-core-dropdown>`);
190
+ const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
191
+ expect(selectAll?.privateIndeterminate).to.be.true;
192
+ });
193
+ it('does not set Select All as indeterminate when no options are initially selected', async () => {
194
+ const component = await fixture(html `<glide-core-dropdown
195
+ label="Label"
196
+ placeholder="Placeholder"
197
+ multiple
198
+ select-all
199
+ >
200
+ <glide-core-dropdown-option
201
+ label="One"
202
+ value="one"
203
+ ></glide-core-dropdown-option>
204
+
205
+ <glide-core-dropdown-option
206
+ label="Two"
207
+ value="two"
208
+ ></glide-core-dropdown-option>
209
+ </glide-core-dropdown>`);
210
+ const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
211
+ expect(selectAll?.privateIndeterminate).to.be.false;
212
+ });
213
+ it('does not set Select All as indeterminate when all options are initially selected', async () => {
214
+ const component = await fixture(html `<glide-core-dropdown
215
+ label="Label"
216
+ placeholder="Placeholder"
217
+ multiple
218
+ select-all
219
+ >
220
+ <glide-core-dropdown-option
221
+ label="One"
222
+ value="one"
223
+ selected
224
+ ></glide-core-dropdown-option>
225
+
226
+ <glide-core-dropdown-option
227
+ label="Two"
228
+ value="two"
229
+ selected
230
+ ></glide-core-dropdown-option>
231
+ </glide-core-dropdown>`);
232
+ const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
233
+ expect(selectAll?.privateIndeterminate).to.be.false;
234
+ });
235
+ it('sets its internal label to `placeholder` when no option is initially selected', async () => {
236
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" multiple>
237
+ <glide-core-dropdown-option
238
+ label="One"
239
+ value="one"
240
+ ></glide-core-dropdown-option>
241
+
242
+ <glide-core-dropdown-option
243
+ label="Two"
244
+ value="two"
245
+ ></glide-core-dropdown-option>
246
+ </glide-core-dropdown>`);
247
+ const label = component.shadowRoot?.querySelector('[data-test="internal-label"]');
248
+ expect(label?.textContent?.trim()).to.equal('Placeholder');
249
+ });
250
+ it('has no internal label when an option is initially selected', async () => {
251
+ const component = await fixture(html `<glide-core-dropdown
252
+ label="Label"
253
+ placeholder="Placeholder"
254
+ open
255
+ multiple
256
+ >
257
+ <glide-core-dropdown-option
258
+ label="One"
259
+ value="one"
260
+ selected
261
+ ></glide-core-dropdown-option>
262
+
263
+ <glide-core-dropdown-option
264
+ label="Two"
265
+ value="two"
266
+ ></glide-core-dropdown-option>
267
+ </glide-core-dropdown>`);
268
+ const label = component.shadowRoot?.querySelector('[data-test="internal-label"]');
269
+ expect(label).to.not.exist;
270
+ });
@@ -0,0 +1,79 @@
1
+ import { expect, fixture, html } from '@open-wc/testing';
2
+ import GlideCoreDropdown from './dropdown.js';
3
+ import GlideCoreDropdownOption from './dropdown.option.js';
4
+ GlideCoreDropdown.shadowRootOptions.mode = 'open';
5
+ it('is accessible ', async () => {
6
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
7
+ <glide-core-dropdown-option
8
+ label="Label"
9
+ value="value"
10
+ ></glide-core-dropdown-option>
11
+ </glide-core-dropdown>`);
12
+ await expect(component).to.be.accessible();
13
+ });
14
+ it('has a selected option label when an option is initially selected', async () => {
15
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
16
+ <glide-core-dropdown-option
17
+ label="One"
18
+ value="one"
19
+ selected
20
+ ></glide-core-dropdown-option>
21
+ </glide-core-dropdown>`);
22
+ const labels = component.shadowRoot?.querySelectorAll('[data-test="selected-option-label"]');
23
+ expect(labels?.length).to.equal(1);
24
+ expect(labels?.[0]?.textContent?.trim()).to.equal('One,');
25
+ });
26
+ it('sets its internal label to the last initially selected option', async () => {
27
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
28
+ <glide-core-dropdown-option
29
+ label="One"
30
+ value="one"
31
+ selected
32
+ ></glide-core-dropdown-option>
33
+
34
+ <glide-core-dropdown-option
35
+ label="Two"
36
+ value="two"
37
+ selected
38
+ ></glide-core-dropdown-option>
39
+ </glide-core-dropdown>`);
40
+ const label = component.shadowRoot?.querySelector('[data-test="internal-label"]');
41
+ expect(label?.textContent?.trim()).to.equal('Two');
42
+ });
43
+ it('sets `value` to that of the last initially selected option', async () => {
44
+ const component = await fixture(html `<glide-core-dropdown open>
45
+ <glide-core-dropdown-option
46
+ label="One"
47
+ value="one"
48
+ ></glide-core-dropdown-option>
49
+
50
+ <glide-core-dropdown-option
51
+ label="Two"
52
+ value="two"
53
+ selected
54
+ ></glide-core-dropdown-option>
55
+
56
+ <glide-core-dropdown-option
57
+ label="Three"
58
+ value="three"
59
+ selected
60
+ ></glide-core-dropdown-option>
61
+ </glide-core-dropdown>`);
62
+ expect(component.value).to.deep.equal(['three']);
63
+ });
64
+ it('hides Select All', async () => {
65
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
66
+ <glide-core-dropdown-option
67
+ label="One"
68
+ value="one"
69
+ selected
70
+ ></glide-core-dropdown-option>
71
+
72
+ <glide-core-dropdown-option
73
+ label="Two"
74
+ value="two"
75
+ ></glide-core-dropdown-option>
76
+ </glide-core-dropdown>`);
77
+ const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
78
+ expect(selectAll?.checkVisibility()).to.not.be.ok;
79
+ });
@@ -0,0 +1,268 @@
1
+ import * as sinon from 'sinon';
2
+ import { aTimeout, 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
+ // `await aTimeout(0)` is used throughout. Using `oneEvent` instead and
9
+ // expecting it to throw would work. But it wouldn't throw until its
10
+ // timeout, which would make for a slow test. Its timeout can likely be
11
+ // configured. But waiting a turn of the event loop, when which the event
12
+ // will have been dispatched, gets the job done as well.
13
+ it('dispatches a "change" event when an option is selected via click', async () => {
14
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
15
+ <glide-core-dropdown-option
16
+ label="One"
17
+ value="one"
18
+ ></glide-core-dropdown-option>
19
+
20
+ <glide-core-dropdown-option
21
+ label="Two"
22
+ value="two"
23
+ selected
24
+ ></glide-core-dropdown-option>
25
+ </glide-core-dropdown>`);
26
+ const spy = sinon.spy();
27
+ component.addEventListener('change', spy);
28
+ setTimeout(() => {
29
+ component.querySelector('glide-core-dropdown-option')?.click();
30
+ });
31
+ const event = await oneEvent(component, 'change');
32
+ expect(event instanceof Event).to.be.true;
33
+ expect(event.bubbles).to.be.true;
34
+ expect(spy.calledOnce).to.be.true;
35
+ });
36
+ it('dispatches a "change" event when an option is selected via Enter', async () => {
37
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
38
+ <glide-core-dropdown-option
39
+ label="One"
40
+ value="one"
41
+ ></glide-core-dropdown-option>
42
+
43
+ <glide-core-dropdown-option
44
+ label="Two"
45
+ value="two"
46
+ selected
47
+ ></glide-core-dropdown-option>
48
+ </glide-core-dropdown>`);
49
+ const spy = sinon.spy();
50
+ component.addEventListener('change', spy);
51
+ // Activate the first option before selecting it. The second option is
52
+ // currently active because it's selected.
53
+ component
54
+ .querySelector('glide-core-dropdown-option')
55
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
56
+ component.focus();
57
+ sendKeys({ press: 'Enter' });
58
+ const event = await oneEvent(component, 'change');
59
+ expect(event instanceof Event).to.be.true;
60
+ expect(event.bubbles).to.be.true;
61
+ expect(spy.calledOnce).to.be.true;
62
+ });
63
+ it('dispatches a "change" event when an option is selected via Space', async () => {
64
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
65
+ <glide-core-dropdown-option
66
+ label="One"
67
+ value="one"
68
+ ></glide-core-dropdown-option>
69
+
70
+ <glide-core-dropdown-option
71
+ label="Two"
72
+ value="two"
73
+ selected
74
+ ></glide-core-dropdown-option>
75
+ </glide-core-dropdown>`);
76
+ const spy = sinon.spy();
77
+ component.addEventListener('change', spy);
78
+ // Activate the first option before selecting it. The second option is
79
+ // currently active because it's selected.
80
+ component
81
+ .querySelector('glide-core-dropdown-option')
82
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
83
+ component.focus();
84
+ sendKeys({ press: ' ' });
85
+ const event = await oneEvent(component, 'change');
86
+ expect(event instanceof Event).to.be.true;
87
+ expect(event.bubbles).to.be.true;
88
+ expect(spy.calledOnce).to.be.true;
89
+ });
90
+ it('dispatches an "input" event when an option is selected via click', async () => {
91
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
92
+ <glide-core-dropdown-option
93
+ label="One"
94
+ value="one"
95
+ ></glide-core-dropdown-option>
96
+
97
+ <glide-core-dropdown-option
98
+ label="Two"
99
+ value="two"
100
+ selected
101
+ ></glide-core-dropdown-option>
102
+ </glide-core-dropdown>`);
103
+ const spy = sinon.spy();
104
+ component.addEventListener('input', spy);
105
+ setTimeout(() => {
106
+ component.querySelector('glide-core-dropdown-option')?.click();
107
+ });
108
+ const event = await oneEvent(component, 'input');
109
+ expect(event instanceof Event).to.be.true;
110
+ expect(event.bubbles).to.be.true;
111
+ expect(spy.calledOnce).to.be.true;
112
+ });
113
+ it('dispatches an "input" event when an option is selected via Enter', async () => {
114
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
115
+ <glide-core-dropdown-option
116
+ label="One"
117
+ value="one"
118
+ ></glide-core-dropdown-option>
119
+
120
+ <glide-core-dropdown-option
121
+ label="Two"
122
+ value="two"
123
+ selected
124
+ ></glide-core-dropdown-option>
125
+ </glide-core-dropdown>`);
126
+ const spy = sinon.spy();
127
+ component.addEventListener('input', spy);
128
+ // Activate the first option before selecting it. The second option is
129
+ // currently active because it's selected.
130
+ component
131
+ .querySelector('glide-core-dropdown-option')
132
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
133
+ component.focus();
134
+ sendKeys({ press: 'Enter' });
135
+ const event = await oneEvent(component, 'input');
136
+ expect(event instanceof Event).to.be.true;
137
+ expect(event.bubbles).to.be.true;
138
+ expect(spy.calledOnce).to.be.true;
139
+ });
140
+ it('dispatches an "input" event when an option is selected via Space', async () => {
141
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
142
+ <glide-core-dropdown-option
143
+ label="One"
144
+ value="one"
145
+ ></glide-core-dropdown-option>
146
+
147
+ <glide-core-dropdown-option
148
+ label="Two"
149
+ value="two"
150
+ selected
151
+ ></glide-core-dropdown-option>
152
+ </glide-core-dropdown>`);
153
+ const spy = sinon.spy();
154
+ component.addEventListener('input', spy);
155
+ // Activate the first option before selecting it. The second option is
156
+ // currently active because it's selected.
157
+ component
158
+ .querySelector('glide-core-dropdown-option')
159
+ ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
160
+ component.focus();
161
+ sendKeys({ press: ' ' });
162
+ const event = await oneEvent(component, 'input');
163
+ expect(event instanceof Event).to.be.true;
164
+ expect(event.bubbles).to.be.true;
165
+ expect(spy.calledOnce).to.be.true;
166
+ });
167
+ it('dispatches an "invalid" event on submit when required and no option is selected', async () => {
168
+ const form = document.createElement('form');
169
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" required>
170
+ <glide-core-dropdown-option
171
+ label="Label"
172
+ value="value"
173
+ ></glide-core-dropdown-option>
174
+ </glide-core-dropdown>`, { parentNode: form });
175
+ setTimeout(() => form.requestSubmit());
176
+ const event = await oneEvent(component, 'invalid');
177
+ expect(event instanceof Event).to.be.true;
178
+ });
179
+ it('dispatches an "invalid" event when `checkValidity` is called when required and no option is selected', async () => {
180
+ const form = document.createElement('form');
181
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" required>
182
+ <glide-core-dropdown-option
183
+ label="Label"
184
+ value="value"
185
+ ></glide-core-dropdown-option>
186
+ </glide-core-dropdown>`, { parentNode: form });
187
+ setTimeout(() => component.checkValidity());
188
+ const event = await oneEvent(component, 'invalid');
189
+ expect(event instanceof Event).to.be.true;
190
+ });
191
+ it('dispatches an "invalid" event when `reportValidity` is called when required and no option is selected', async () => {
192
+ const form = document.createElement('form');
193
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" required>
194
+ <glide-core-dropdown-option
195
+ label="Label"
196
+ value="value"
197
+ ></glide-core-dropdown-option>
198
+ </glide-core-dropdown>`, { parentNode: form });
199
+ setTimeout(() => component.reportValidity());
200
+ const event = await oneEvent(component, 'invalid');
201
+ expect(event instanceof Event).to.be.true;
202
+ });
203
+ it('does not dispatch an "invalid" event when `checkValidity` is called when not required', async () => {
204
+ const form = document.createElement('form');
205
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
206
+ <glide-core-dropdown-option
207
+ label="Label"
208
+ value="value"
209
+ ></glide-core-dropdown-option>
210
+ </glide-core-dropdown>`, { parentNode: form });
211
+ const spy = sinon.spy();
212
+ component.addEventListener('invalid', spy);
213
+ component.checkValidity();
214
+ await aTimeout(0);
215
+ expect(spy.notCalled).to.be.true;
216
+ });
217
+ it('does not dispatch an "invalid" event when `checkValidity` is called when required, disabled, and no option is selected', async () => {
218
+ const form = document.createElement('form');
219
+ const component = await fixture(html `<glide-core-dropdown
220
+ label="Label"
221
+ placeholder="Placeholder"
222
+ disabled
223
+ required
224
+ >
225
+ <glide-core-dropdown-option
226
+ label="Label"
227
+ value="value"
228
+ ></glide-core-dropdown-option>
229
+ </glide-core-dropdown>`, { parentNode: form });
230
+ const spy = sinon.spy();
231
+ component.addEventListener('invalid', spy);
232
+ component.checkValidity();
233
+ await aTimeout(0);
234
+ expect(spy.notCalled).to.be.true;
235
+ });
236
+ it('does not dispatch an "invalid" event when `reportValidity` is called when not required,', async () => {
237
+ const form = document.createElement('form');
238
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
239
+ <glide-core-dropdown-option
240
+ label="Label"
241
+ value="value"
242
+ ></glide-core-dropdown-option>
243
+ </glide-core-dropdown>`, { parentNode: form });
244
+ const spy = sinon.spy();
245
+ component.addEventListener('invalid', spy);
246
+ component.reportValidity();
247
+ await aTimeout(0);
248
+ expect(spy.notCalled).to.be.true;
249
+ });
250
+ it('does not dispatch an "invalid" event when `reportValidity` is called when required, disabled, and no option is selected', async () => {
251
+ const form = document.createElement('form');
252
+ const component = await fixture(html `<glide-core-dropdown
253
+ label="Label"
254
+ placeholder="Placeholder"
255
+ disabled
256
+ required
257
+ >
258
+ <glide-core-dropdown-option
259
+ label="Label"
260
+ value="value"
261
+ ></glide-core-dropdown-option>
262
+ </glide-core-dropdown>`, { parentNode: form });
263
+ const spy = sinon.spy();
264
+ component.addEventListener('invalid', spy);
265
+ component.reportValidity();
266
+ await aTimeout(0);
267
+ expect(spy.notCalled).to.be.true;
268
+ });