@crowdstrike/glide-core 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/dist/accordion.d.ts +7 -3
  2. package/dist/button-group.button.d.ts +12 -16
  3. package/dist/button-group.button.js +1 -1
  4. package/dist/button-group.button.styles.js +76 -52
  5. package/dist/button-group.button.test.basics.d.ts +1 -1
  6. package/dist/button-group.button.test.basics.js +83 -147
  7. package/dist/button-group.button.test.events.js +8 -67
  8. package/dist/button-group.button.test.focus.js +13 -0
  9. package/dist/button-group.button.test.interactions.d.ts +1 -0
  10. package/dist/button-group.button.test.interactions.js +42 -0
  11. package/dist/button-group.d.ts +10 -10
  12. package/dist/button-group.js +1 -1
  13. package/dist/button-group.stories.d.ts +1 -5
  14. package/dist/button-group.styles.js +18 -6
  15. package/dist/button-group.test.basics.js +113 -234
  16. package/dist/button-group.test.events.js +210 -263
  17. package/dist/button-group.test.focus.d.ts +1 -0
  18. package/dist/button-group.test.focus.js +39 -0
  19. package/dist/button-group.test.interactions.d.ts +1 -0
  20. package/dist/button-group.test.interactions.js +91 -0
  21. package/dist/button.d.ts +3 -0
  22. package/dist/button.test.basics.js +1 -1
  23. package/dist/checkbox-group.d.ts +6 -2
  24. package/dist/checkbox-group.js +1 -1
  25. package/dist/checkbox-group.stories.d.ts +1 -1
  26. package/dist/checkbox-group.styles.js +1 -1
  27. package/dist/checkbox-group.test.basics.js +1 -1
  28. package/dist/checkbox-group.test.events.js +4 -4
  29. package/dist/checkbox-group.test.focus.js +4 -3
  30. package/dist/checkbox.d.ts +12 -5
  31. package/dist/checkbox.js +1 -1
  32. package/dist/checkbox.stories.d.ts +1 -1
  33. package/dist/checkbox.styles.js +10 -0
  34. package/dist/checkbox.test.basics.js +15 -6
  35. package/dist/checkbox.test.events.js +16 -8
  36. package/dist/checkbox.test.focus.js +3 -3
  37. package/dist/checkbox.test.form.js +1 -0
  38. package/dist/checkbox.test.interactions.js +123 -0
  39. package/dist/drawer.d.ts +5 -5
  40. package/dist/drawer.js +1 -1
  41. package/dist/drawer.stories.d.ts +0 -1
  42. package/dist/dropdown.d.ts +9 -6
  43. package/dist/dropdown.js +1 -1
  44. package/dist/dropdown.option.d.ts +6 -2
  45. package/dist/dropdown.option.js +1 -1
  46. package/dist/dropdown.option.styles.js +13 -0
  47. package/dist/dropdown.option.test.basics.js +6 -3
  48. package/dist/dropdown.option.test.events.js +1 -1
  49. package/dist/dropdown.option.test.focus.js +1 -1
  50. package/dist/dropdown.option.test.interactions.multiple.js +1 -54
  51. package/dist/dropdown.option.test.interactions.single.js +51 -9
  52. package/dist/dropdown.styles.js +20 -19
  53. package/dist/dropdown.test.basics.js +143 -2
  54. package/dist/dropdown.test.basics.multiple.js +5 -2
  55. package/dist/dropdown.test.events.filterable.js +74 -0
  56. package/dist/dropdown.test.events.js +49 -160
  57. package/dist/dropdown.test.events.multiple.js +265 -8
  58. package/dist/dropdown.test.events.single.js +199 -2
  59. package/dist/dropdown.test.focus.filterable.js +9 -5
  60. package/dist/dropdown.test.focus.js +1 -1
  61. package/dist/dropdown.test.focus.multiple.js +1 -1
  62. package/dist/dropdown.test.focus.single.js +1 -1
  63. package/dist/dropdown.test.interactions.filterable.js +68 -11
  64. package/dist/dropdown.test.interactions.js +94 -5
  65. package/dist/dropdown.test.interactions.multiple.js +202 -5
  66. package/dist/dropdown.test.interactions.single.js +68 -6
  67. package/dist/form-controls-layout.test.basics.js +1 -1
  68. package/dist/icon-button.d.ts +2 -0
  69. package/dist/icon-button.test.basics.js +1 -1
  70. package/dist/icons/checked.d.ts +1 -1
  71. package/dist/icons/checked.js +1 -1
  72. package/dist/icons/magnifying-glass.js +1 -1
  73. package/dist/input.d.ts +4 -9
  74. package/dist/input.js +1 -1
  75. package/dist/input.styles.js +7 -2
  76. package/dist/input.test.basics.js +19 -5
  77. package/dist/input.test.events.js +4 -4
  78. package/dist/input.test.focus.js +4 -4
  79. package/dist/input.test.translations.d.ts +1 -0
  80. package/dist/input.test.translations.js +38 -0
  81. package/dist/input.test.validity.js +133 -4
  82. package/dist/label.d.ts +1 -1
  83. package/dist/label.js +1 -1
  84. package/dist/label.styles.js +25 -13
  85. package/dist/label.test.basics.js +26 -24
  86. package/dist/library/expect-argument-error.js +1 -1
  87. package/dist/library/localize.d.ts +4 -1
  88. package/dist/menu.d.ts +3 -5
  89. package/dist/menu.js +1 -1
  90. package/dist/menu.options.test.basics.js +2 -2
  91. package/dist/menu.styles.js +1 -15
  92. package/dist/menu.test.basics.d.ts +1 -2
  93. package/dist/menu.test.basics.js +22 -6
  94. package/dist/menu.test.events.js +197 -7
  95. package/dist/menu.test.focus.d.ts +1 -0
  96. package/dist/menu.test.focus.js +13 -6
  97. package/dist/menu.test.interactions.js +214 -58
  98. package/dist/modal.icon-button.test.basics.js +1 -1
  99. package/dist/modal.js +1 -1
  100. package/dist/modal.stories.d.ts +1 -0
  101. package/dist/modal.styles.js +18 -13
  102. package/dist/modal.tertiary-icon.d.ts +0 -1
  103. package/dist/modal.tertiary-icon.js +1 -1
  104. package/dist/modal.tertiary-icon.test.basics.js +3 -3
  105. package/dist/modal.test.basics.js +1 -1
  106. package/dist/modal.test.events.js +10 -10
  107. package/dist/radio-group.d.ts +4 -3
  108. package/dist/radio-group.js +1 -1
  109. package/dist/radio-group.stories.d.ts +1 -1
  110. package/dist/radio-group.styles.js +1 -1
  111. package/dist/radio-group.test.focus.js +3 -3
  112. package/dist/radio.d.ts +2 -2
  113. package/dist/radio.js +1 -1
  114. package/dist/radio.styles.js +33 -0
  115. package/dist/split-container.d.ts +1 -1
  116. package/dist/split-container.test.basics.js +4 -0
  117. package/dist/split-link.test.interactions.js +1 -1
  118. package/dist/status-indicator.d.ts +1 -1
  119. package/dist/styles/variables.css +1 -1
  120. package/dist/tab.d.ts +1 -1
  121. package/dist/tab.group.js +1 -1
  122. package/dist/tab.group.test.basics.js +1 -1
  123. package/dist/tab.group.test.interactions.js +198 -2
  124. package/dist/tab.js +1 -1
  125. package/dist/tab.panel.d.ts +1 -0
  126. package/dist/tab.panel.js +1 -1
  127. package/dist/tab.panel.styles.js +11 -1
  128. package/dist/tabs.stories.d.ts +1 -0
  129. package/dist/tag.d.ts +3 -6
  130. package/dist/tag.test.basics.js +2 -2
  131. package/dist/textarea.d.ts +4 -4
  132. package/dist/textarea.js +2 -2
  133. package/dist/textarea.stories.d.ts +3 -4
  134. package/dist/textarea.styles.js +14 -3
  135. package/dist/textarea.test.basics.js +80 -44
  136. package/dist/textarea.test.events.js +56 -41
  137. package/dist/textarea.test.translations.d.ts +1 -0
  138. package/dist/textarea.test.translations.js +34 -0
  139. package/dist/textarea.test.validity.js +104 -20
  140. package/dist/toasts.js +1 -1
  141. package/dist/toasts.styles.js +8 -1
  142. package/dist/toasts.test.basics.js +20 -0
  143. package/dist/toggle.d.ts +3 -3
  144. package/dist/toggle.js +1 -1
  145. package/dist/toggle.stories.d.ts +1 -1
  146. package/dist/toggle.test.focus.js +1 -1
  147. package/dist/toggle.test.interactions.d.ts +1 -0
  148. package/dist/{toggle.test.states.js → toggle.test.interactions.js} +26 -0
  149. package/dist/tooltip.d.ts +9 -7
  150. package/dist/tooltip.js +1 -1
  151. package/dist/tooltip.styles.js +90 -25
  152. package/dist/tooltip.test.basics.js +38 -3
  153. package/dist/tooltip.test.interactions.js +136 -34
  154. package/dist/translations/en.js +1 -1
  155. package/dist/translations/fr.js +1 -1
  156. package/dist/translations/ja.js +1 -1
  157. package/dist/tree.d.ts +1 -2
  158. package/dist/tree.item.d.ts +1 -5
  159. package/dist/tree.item.icon-button.d.ts +1 -0
  160. package/dist/tree.item.icon-button.js +1 -1
  161. package/dist/tree.item.icon-button.test.basics.js +9 -0
  162. package/dist/tree.item.js +1 -1
  163. package/dist/tree.item.menu.d.ts +2 -1
  164. package/dist/tree.item.menu.js +1 -1
  165. package/dist/tree.item.menu.test.basics.js +15 -0
  166. package/dist/tree.item.styles.js +2 -0
  167. package/dist/tree.item.test.basics.d.ts +2 -1
  168. package/dist/tree.item.test.basics.js +46 -4
  169. package/dist/tree.js +1 -1
  170. package/dist/tree.test.basics.js +1 -1
  171. package/dist/tree.test.focus.js +91 -4
  172. package/package.json +3 -4
  173. package/dist/checkbox.test.states.js +0 -63
  174. package/dist/drawer.test.floating-components.d.ts +0 -1
  175. package/dist/drawer.test.floating-components.js +0 -52
  176. package/dist/library/set-containing-block.d.ts +0 -15
  177. package/dist/library/set-containing-block.js +0 -1
  178. package/dist/modal.test.floating-components.js +0 -63
  179. /package/dist/{checkbox.test.states.d.ts → button-group.button.test.focus.d.ts} +0 -0
  180. /package/dist/{modal.test.floating-components.d.ts → checkbox.test.interactions.d.ts} +0 -0
  181. /package/dist/{toggle.test.states.d.ts → dropdown.test.events.filterable.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-expressions */
2
2
  import './dropdown.option.js';
3
3
  import { ArgumentError } from 'ow';
4
- import { expect, fixture, html } from '@open-wc/testing';
4
+ import { aTimeout, assert, expect, fixture, html } from '@open-wc/testing';
5
5
  import { repeat } from 'lit/directives/repeat.js';
6
6
  import GlideCoreDropdown from './dropdown.js';
7
7
  import expectArgumentError from './library/expect-argument-error.js';
@@ -42,6 +42,36 @@ it('has defaults', async () => {
42
42
  // Not reflected, so no attribute assertion is necessary.
43
43
  expect(component.value).to.deep.equal([]);
44
44
  });
45
+ it('can be open', async () => {
46
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
47
+ <glide-core-dropdown-option
48
+ label="Label"
49
+ value="value"
50
+ selected
51
+ ></glide-core-dropdown-option>
52
+ </glide-core-dropdown>`);
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(component.hasAttribute('open')).to.be.true;
58
+ expect(options?.checkVisibility()).to.be.true;
59
+ });
60
+ it('cannot be open when disabled', async () => {
61
+ const component = await fixture(html `<glide-core-dropdown
62
+ label="Label"
63
+ placeholder="Placeholder"
64
+ open
65
+ disabled
66
+ >
67
+ <glide-core-dropdown-option
68
+ label="Label"
69
+ value="value"
70
+ ></glide-core-dropdown-option>
71
+ </glide-core-dropdown>`);
72
+ const options = component?.shadowRoot?.querySelector('[data-test="options"]');
73
+ expect(options?.checkVisibility()).to.be.false;
74
+ });
45
75
  it('can have a label', async () => {
46
76
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
47
77
  <glide-core-dropdown-option
@@ -208,6 +238,117 @@ it('activates the last selected option when options are initially selected', asy
208
238
  expect(options[1]?.privateActive).to.be.false;
209
239
  expect(options[2]?.privateActive).to.be.true;
210
240
  });
241
+ it('is scrollable', async () => {
242
+ const component = await fixture(html `<glide-core-dropdown open>
243
+ <glide-core-dropdown-option
244
+ label="One"
245
+ value="one"
246
+ ></glide-core-dropdown-option>
247
+
248
+ <glide-core-dropdown-option
249
+ label="Two"
250
+ value="two"
251
+ ></glide-core-dropdown-option>
252
+
253
+ <glide-core-dropdown-option
254
+ label="Three"
255
+ value="three"
256
+ ></glide-core-dropdown-option>
257
+
258
+ <glide-core-dropdown-option
259
+ label="Four"
260
+ value="four"
261
+ ></glide-core-dropdown-option>
262
+
263
+ <glide-core-dropdown-option
264
+ label="Five"
265
+ value="five"
266
+ ></glide-core-dropdown-option>
267
+
268
+ <glide-core-dropdown-option
269
+ label="Six"
270
+ value="six"
271
+ ></glide-core-dropdown-option>
272
+
273
+ <glide-core-dropdown-option
274
+ label="Seven"
275
+ value="seven"
276
+ ></glide-core-dropdown-option>
277
+
278
+ <glide-core-dropdown-option
279
+ label="Eight"
280
+ value="eight"
281
+ ></glide-core-dropdown-option>
282
+
283
+ <glide-core-dropdown-option
284
+ label="Nine"
285
+ value="nine"
286
+ ></glide-core-dropdown-option>
287
+
288
+ <glide-core-dropdown-option
289
+ label="Ten"
290
+ value="ten"
291
+ ></glide-core-dropdown-option>
292
+ </glide-core-dropdown>`);
293
+ // Wait for it to open.
294
+ await aTimeout(0);
295
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
296
+ assert(options);
297
+ expect(options.scrollHeight).to.be.greaterThan(options.clientHeight);
298
+ });
299
+ it('is not scrollable', async () => {
300
+ const component = await fixture(html `<glide-core-dropdown open>
301
+ <glide-core-dropdown-option
302
+ label="One"
303
+ value="one"
304
+ ></glide-core-dropdown-option>
305
+
306
+ <glide-core-dropdown-option
307
+ label="Two"
308
+ value="two"
309
+ ></glide-core-dropdown-option>
310
+
311
+ <glide-core-dropdown-option
312
+ label="Three"
313
+ value="three"
314
+ ></glide-core-dropdown-option>
315
+
316
+ <glide-core-dropdown-option
317
+ label="Four"
318
+ value="four"
319
+ ></glide-core-dropdown-option>
320
+
321
+ <glide-core-dropdown-option
322
+ label="Five"
323
+ value="five"
324
+ ></glide-core-dropdown-option>
325
+
326
+ <glide-core-dropdown-option
327
+ label="Six"
328
+ value="six"
329
+ ></glide-core-dropdown-option>
330
+
331
+ <glide-core-dropdown-option
332
+ label="Seven"
333
+ value="seven"
334
+ ></glide-core-dropdown-option>
335
+
336
+ <glide-core-dropdown-option
337
+ label="Eight"
338
+ value="eight"
339
+ ></glide-core-dropdown-option>
340
+
341
+ <glide-core-dropdown-option
342
+ label="Nine"
343
+ value="nine"
344
+ ></glide-core-dropdown-option>
345
+ </glide-core-dropdown>`);
346
+ // Wait for it to open.
347
+ await aTimeout(0);
348
+ const options = component.shadowRoot?.querySelector('[data-test="options"]');
349
+ assert(options);
350
+ expect(options.scrollHeight).to.equal(options.clientHeight);
351
+ });
211
352
  it('throws if the default slot is the incorrect type', async () => {
212
353
  await expectArgumentError(() => {
213
354
  return fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
@@ -230,5 +371,5 @@ it('does not throw if the default slot only contains whitespace', async () => {
230
371
  spy();
231
372
  }
232
373
  }
233
- expect(spy.notCalled).to.be.true;
374
+ expect(spy.callCount).to.equal(0);
234
375
  });
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-expressions */
2
2
  import './dropdown.option.js';
3
- import { expect, fixture, html } from '@open-wc/testing';
3
+ import { aTimeout, expect, fixture, html } from '@open-wc/testing';
4
4
  import GlideCoreDropdown from './dropdown.js';
5
5
  GlideCoreDropdown.shadowRootOptions.mode = 'open';
6
6
  it('is accessible', async () => {
@@ -112,6 +112,7 @@ it('shows Select All', async () => {
112
112
  placeholder="Placeholder"
113
113
  multiple
114
114
  select-all
115
+ open
115
116
  >
116
117
  <glide-core-dropdown-option
117
118
  label="One"
@@ -124,8 +125,10 @@ it('shows Select All', async () => {
124
125
  value="two"
125
126
  ></glide-core-dropdown-option>
126
127
  </glide-core-dropdown>`);
128
+ // Wait for it to open.
129
+ await aTimeout(0);
127
130
  const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
128
- expect(selectAll?.checkVisibility()).to.be.ok;
131
+ expect(selectAll?.checkVisibility()).to.be.true;
129
132
  });
130
133
  it('sets Select All as selected when all options are initially selected', async () => {
131
134
  const component = await fixture(html `<glide-core-dropdown
@@ -0,0 +1,74 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
2
+ import * as sinon from 'sinon';
3
+ import { expect, fixture, html } from '@open-wc/testing';
4
+ import { sendKeys } from '@web/test-runner-commands';
5
+ import GlideCoreDropdown from './dropdown.js';
6
+ import GlideCoreDropdownOption from './dropdown.option.js';
7
+ GlideCoreDropdown.shadowRootOptions.mode = 'open';
8
+ GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
9
+ const defaultSlot = html `
10
+ <glide-core-dropdown-option
11
+ label="One"
12
+ value="one"
13
+ ></glide-core-dropdown-option>
14
+
15
+ <glide-core-dropdown-option
16
+ label="Two"
17
+ value="two"
18
+ ></glide-core-dropdown-option>
19
+
20
+ <glide-core-dropdown-option
21
+ label="Three"
22
+ value="three"
23
+ ></glide-core-dropdown-option>
24
+
25
+ <glide-core-dropdown-option
26
+ label="Four"
27
+ value="four"
28
+ ></glide-core-dropdown-option>
29
+
30
+ <glide-core-dropdown-option
31
+ label="Five"
32
+ value="five"
33
+ ></glide-core-dropdown-option>
34
+
35
+ <glide-core-dropdown-option
36
+ label="Six"
37
+ value="six"
38
+ ></glide-core-dropdown-option>
39
+
40
+ <glide-core-dropdown-option
41
+ label="Seven"
42
+ value="seven"
43
+ ></glide-core-dropdown-option>
44
+
45
+ <glide-core-dropdown-option
46
+ label="Eight"
47
+ value="eight"
48
+ ></glide-core-dropdown-option>
49
+
50
+ <glide-core-dropdown-option
51
+ label="Nine"
52
+ value="nine"
53
+ ></glide-core-dropdown-option>
54
+
55
+ <glide-core-dropdown-option
56
+ label="Ten"
57
+ value="ten"
58
+ ></glide-core-dropdown-option>
59
+
60
+ <glide-core-dropdown-option
61
+ label="Eleven"
62
+ value="eleven"
63
+ ></glide-core-dropdown-option>
64
+ `;
65
+ it('does not dispatch "input" events on input', async () => {
66
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
67
+ ${defaultSlot}
68
+ </glide-core-dropdown>`);
69
+ const spy = sinon.spy();
70
+ component.addEventListener('input', spy);
71
+ component.focus();
72
+ await sendKeys({ type: ' one ' });
73
+ expect(spy.callCount).to.equal(0);
74
+ });
@@ -1,7 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-expressions */
2
2
  import * as sinon from 'sinon';
3
- import { aTimeout, expect, fixture, html, oneEvent } from '@open-wc/testing';
4
- import { sendKeys } from '@web/test-runner-commands';
3
+ import { aTimeout, assert, expect, fixture, html, oneEvent, } from '@open-wc/testing';
5
4
  import GlideCoreDropdown from './dropdown.js';
6
5
  import GlideCoreDropdownOption from './dropdown.option.js';
7
6
  GlideCoreDropdown.shadowRootOptions.mode = 'open';
@@ -11,160 +10,6 @@ GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
11
10
  // timeout, which would make for a slow test. Its timeout can likely be
12
11
  // configured. But waiting a turn of the event loop, when which the event
13
12
  // will have been dispatched, gets the job done as well.
14
- it('dispatches a "change" event when an option is selected via click', async () => {
15
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
16
- <glide-core-dropdown-option
17
- label="One"
18
- value="one"
19
- ></glide-core-dropdown-option>
20
-
21
- <glide-core-dropdown-option
22
- label="Two"
23
- value="two"
24
- selected
25
- ></glide-core-dropdown-option>
26
- </glide-core-dropdown>`);
27
- const spy = sinon.spy();
28
- component.addEventListener('change', spy);
29
- setTimeout(() => {
30
- component.querySelector('glide-core-dropdown-option')?.click();
31
- });
32
- const event = await oneEvent(component, 'change');
33
- expect(event instanceof Event).to.be.true;
34
- expect(event.bubbles).to.be.true;
35
- expect(spy.calledOnce).to.be.true;
36
- });
37
- it('dispatches a "change" event when an option is selected via Enter', async () => {
38
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
39
- <glide-core-dropdown-option
40
- label="One"
41
- value="one"
42
- ></glide-core-dropdown-option>
43
-
44
- <glide-core-dropdown-option
45
- label="Two"
46
- value="two"
47
- selected
48
- ></glide-core-dropdown-option>
49
- </glide-core-dropdown>`);
50
- const spy = sinon.spy();
51
- component.addEventListener('change', spy);
52
- // Activate the first option before selecting it. The second option is
53
- // currently active because it's selected.
54
- component
55
- .querySelector('glide-core-dropdown-option')
56
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
57
- component.focus();
58
- sendKeys({ press: 'Enter' });
59
- const event = await oneEvent(component, 'change');
60
- expect(event instanceof Event).to.be.true;
61
- expect(event.bubbles).to.be.true;
62
- expect(spy.calledOnce).to.be.true;
63
- });
64
- it('dispatches a "change" event when an option is selected via Space', async () => {
65
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
66
- <glide-core-dropdown-option
67
- label="One"
68
- value="one"
69
- ></glide-core-dropdown-option>
70
-
71
- <glide-core-dropdown-option
72
- label="Two"
73
- value="two"
74
- selected
75
- ></glide-core-dropdown-option>
76
- </glide-core-dropdown>`);
77
- const spy = sinon.spy();
78
- component.addEventListener('change', spy);
79
- // Activate the first option before selecting it. The second option is
80
- // currently active because it's selected.
81
- component
82
- .querySelector('glide-core-dropdown-option')
83
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
84
- component.focus();
85
- sendKeys({ press: ' ' });
86
- const event = await oneEvent(component, 'change');
87
- expect(event instanceof Event).to.be.true;
88
- expect(event.bubbles).to.be.true;
89
- expect(spy.calledOnce).to.be.true;
90
- });
91
- it('dispatches an "input" event when an option is selected via click', async () => {
92
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
93
- <glide-core-dropdown-option
94
- label="One"
95
- value="one"
96
- ></glide-core-dropdown-option>
97
-
98
- <glide-core-dropdown-option
99
- label="Two"
100
- value="two"
101
- selected
102
- ></glide-core-dropdown-option>
103
- </glide-core-dropdown>`);
104
- const spy = sinon.spy();
105
- component.addEventListener('input', spy);
106
- setTimeout(() => {
107
- component.querySelector('glide-core-dropdown-option')?.click();
108
- });
109
- const event = await oneEvent(component, 'input');
110
- expect(event instanceof Event).to.be.true;
111
- expect(event.bubbles).to.be.true;
112
- expect(spy.calledOnce).to.be.true;
113
- });
114
- it('dispatches an "input" event when an option is selected via Enter', async () => {
115
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
116
- <glide-core-dropdown-option
117
- label="One"
118
- value="one"
119
- ></glide-core-dropdown-option>
120
-
121
- <glide-core-dropdown-option
122
- label="Two"
123
- value="two"
124
- selected
125
- ></glide-core-dropdown-option>
126
- </glide-core-dropdown>`);
127
- const spy = sinon.spy();
128
- component.addEventListener('input', spy);
129
- // Activate the first option before selecting it. The second option is
130
- // currently active because it's selected.
131
- component
132
- .querySelector('glide-core-dropdown-option')
133
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
134
- component.focus();
135
- sendKeys({ press: 'Enter' });
136
- const event = await oneEvent(component, 'input');
137
- expect(event instanceof Event).to.be.true;
138
- expect(event.bubbles).to.be.true;
139
- expect(spy.calledOnce).to.be.true;
140
- });
141
- it('dispatches an "input" event when an option is selected via Space', async () => {
142
- const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
143
- <glide-core-dropdown-option
144
- label="One"
145
- value="one"
146
- ></glide-core-dropdown-option>
147
-
148
- <glide-core-dropdown-option
149
- label="Two"
150
- value="two"
151
- selected
152
- ></glide-core-dropdown-option>
153
- </glide-core-dropdown>`);
154
- const spy = sinon.spy();
155
- component.addEventListener('input', spy);
156
- // Activate the first option before selecting it. The second option is
157
- // currently active because it's selected.
158
- component
159
- .querySelector('glide-core-dropdown-option')
160
- ?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
161
- component.focus();
162
- sendKeys({ press: ' ' });
163
- const event = await oneEvent(component, 'input');
164
- expect(event instanceof Event).to.be.true;
165
- expect(event.bubbles).to.be.true;
166
- expect(spy.calledOnce).to.be.true;
167
- });
168
13
  it('dispatches an "invalid" event on submit when required and no option is selected', async () => {
169
14
  const form = document.createElement('form');
170
15
  const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" required>
@@ -213,7 +58,7 @@ it('does not dispatch an "invalid" event when `checkValidity` is called when not
213
58
  component.addEventListener('invalid', spy);
214
59
  component.checkValidity();
215
60
  await aTimeout(0);
216
- expect(spy.notCalled).to.be.true;
61
+ expect(spy.callCount).to.equal(0);
217
62
  });
218
63
  it('does not dispatch an "invalid" event when `checkValidity` is called when required, disabled, and no option is selected', async () => {
219
64
  const form = document.createElement('form');
@@ -232,7 +77,7 @@ it('does not dispatch an "invalid" event when `checkValidity` is called when req
232
77
  component.addEventListener('invalid', spy);
233
78
  component.checkValidity();
234
79
  await aTimeout(0);
235
- expect(spy.notCalled).to.be.true;
80
+ expect(spy.callCount).to.equal(0);
236
81
  });
237
82
  it('does not dispatch an "invalid" event when `reportValidity` is called when not required,', async () => {
238
83
  const form = document.createElement('form');
@@ -246,7 +91,7 @@ it('does not dispatch an "invalid" event when `reportValidity` is called when no
246
91
  component.addEventListener('invalid', spy);
247
92
  component.reportValidity();
248
93
  await aTimeout(0);
249
- expect(spy.notCalled).to.be.true;
94
+ expect(spy.callCount).to.equal(0);
250
95
  });
251
96
  it('does not dispatch an "invalid" event when `reportValidity` is called when required, disabled, and no option is selected', async () => {
252
97
  const form = document.createElement('form');
@@ -265,5 +110,49 @@ it('does not dispatch an "invalid" event when `reportValidity` is called when re
265
110
  component.addEventListener('invalid', spy);
266
111
  component.reportValidity();
267
112
  await aTimeout(0);
268
- expect(spy.notCalled).to.be.true;
113
+ expect(spy.callCount).to.equal(0);
114
+ });
115
+ it('does not dispatch a "change" event when an option is selected programmatically', async () => {
116
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
117
+ <glide-core-dropdown-option
118
+ label="One"
119
+ value="one"
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 spy = sinon.spy();
128
+ component.addEventListener('change', spy);
129
+ setTimeout(() => {
130
+ const option = component?.querySelector('glide-core-dropdown-option');
131
+ assert(option);
132
+ option.selected = true;
133
+ });
134
+ await aTimeout(0);
135
+ expect(spy.callCount).to.equal(0);
136
+ });
137
+ it('does not dispatch a "input" event when an option is selected programmatically', async () => {
138
+ const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
139
+ <glide-core-dropdown-option
140
+ label="One"
141
+ value="one"
142
+ ></glide-core-dropdown-option>
143
+
144
+ <glide-core-dropdown-option
145
+ label="Two"
146
+ value="two"
147
+ ></glide-core-dropdown-option>
148
+ </glide-core-dropdown>`);
149
+ const spy = sinon.spy();
150
+ component.addEventListener('input', spy);
151
+ setTimeout(() => {
152
+ const option = component?.querySelector('glide-core-dropdown-option');
153
+ assert(option);
154
+ option.selected = true;
155
+ });
156
+ await aTimeout(0);
157
+ expect(spy.callCount).to.equal(0);
269
158
  });