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