@crowdstrike/glide-core 0.7.0 → 0.9.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/README.md +44 -5
- package/dist/accordion.test.basics.js +1 -0
- package/dist/accordion.test.events.js +1 -0
- package/dist/button-group.button.d.ts +14 -15
- package/dist/button-group.button.js +1 -1
- package/dist/button-group.button.styles.js +75 -52
- package/dist/button-group.button.test.basics.d.ts +1 -1
- package/dist/button-group.button.test.basics.js +84 -147
- package/dist/button-group.button.test.events.js +9 -67
- package/dist/button-group.button.test.focus.js +13 -0
- package/dist/button-group.button.test.interactions.d.ts +1 -0
- package/dist/button-group.button.test.interactions.js +42 -0
- package/dist/button-group.d.ts +7 -10
- package/dist/button-group.js +1 -1
- package/dist/button-group.stories.d.ts +1 -5
- package/dist/button-group.styles.js +18 -6
- package/dist/button-group.test.basics.js +114 -234
- package/dist/button-group.test.events.js +211 -263
- package/dist/button-group.test.focus.d.ts +1 -0
- package/dist/button-group.test.focus.js +39 -0
- package/dist/button-group.test.interactions.d.ts +1 -0
- package/dist/button-group.test.interactions.js +91 -0
- package/dist/button.test.basics.js +2 -1
- package/dist/button.test.events.js +1 -0
- package/dist/button.test.form.js +1 -0
- package/dist/checkbox-group.js +1 -1
- package/dist/checkbox-group.styles.js +1 -1
- package/dist/checkbox-group.test.basics.js +2 -1
- package/dist/checkbox-group.test.events.js +5 -4
- package/dist/checkbox-group.test.focus.js +5 -3
- package/dist/checkbox-group.test.form.js +1 -0
- package/dist/checkbox-group.test.validity.js +1 -0
- package/dist/checkbox.d.ts +7 -1
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.styles.js +11 -3
- package/dist/checkbox.test.basics.js +1 -0
- package/dist/checkbox.test.events.js +5 -4
- package/dist/checkbox.test.focus.js +2 -2
- package/dist/checkbox.test.form.js +1 -0
- package/dist/{checkbox.test.states.js → checkbox.test.interactions.js} +25 -1
- package/dist/checkbox.test.validity.js +1 -0
- package/dist/drawer.js +1 -1
- package/dist/drawer.test.basics.js +1 -0
- package/dist/drawer.test.closing.js +1 -0
- package/dist/drawer.test.events.js +1 -0
- package/dist/drawer.test.methods.js +1 -0
- package/dist/dropdown.d.ts +6 -4
- package/dist/dropdown.js +1 -1
- package/dist/dropdown.option.d.ts +7 -2
- package/dist/dropdown.option.js +1 -1
- package/dist/dropdown.option.styles.js +13 -0
- package/dist/dropdown.option.test.basics.js +7 -3
- package/dist/dropdown.option.test.basics.multiple.js +1 -0
- package/dist/dropdown.option.test.basics.single.js +1 -0
- package/dist/dropdown.option.test.events.js +2 -1
- package/dist/dropdown.option.test.focus.js +1 -1
- package/dist/dropdown.option.test.interactions.multiple.js +2 -54
- package/dist/dropdown.option.test.interactions.single.js +52 -9
- package/dist/dropdown.styles.js +20 -19
- package/dist/dropdown.test.basics.filterable.js +1 -0
- package/dist/dropdown.test.basics.js +144 -2
- package/dist/dropdown.test.basics.multiple.js +6 -3
- package/dist/dropdown.test.basics.single.js +1 -1
- package/dist/dropdown.test.events.filterable.js +74 -0
- package/dist/dropdown.test.events.js +50 -160
- package/dist/dropdown.test.events.multiple.js +268 -10
- package/dist/dropdown.test.events.single.js +202 -4
- package/dist/dropdown.test.focus.filterable.js +9 -5
- package/dist/dropdown.test.focus.js +2 -1
- package/dist/dropdown.test.focus.multiple.js +1 -2
- package/dist/dropdown.test.focus.single.js +1 -1
- package/dist/dropdown.test.form.js +1 -0
- package/dist/dropdown.test.form.multiple.js +1 -0
- package/dist/dropdown.test.form.single.js +1 -0
- package/dist/dropdown.test.interactions.filterable.js +69 -11
- package/dist/dropdown.test.interactions.js +95 -5
- package/dist/dropdown.test.interactions.multiple.js +203 -6
- package/dist/dropdown.test.interactions.single.js +69 -6
- package/dist/dropdown.test.validity.js +1 -0
- package/dist/form-controls-layout.test.basics.js +2 -1
- package/dist/icon-button.test.basics.js +2 -1
- package/dist/icons/checked.d.ts +1 -1
- package/dist/icons/checked.js +1 -1
- package/dist/icons/magnifying-glass.js +1 -1
- package/dist/input.d.ts +0 -6
- package/dist/input.js +1 -1
- package/dist/input.styles.js +7 -2
- package/dist/input.test.basics.js +20 -5
- package/dist/input.test.events.js +5 -4
- package/dist/input.test.focus.js +5 -4
- package/dist/input.test.form.js +1 -0
- package/dist/input.test.translations.d.ts +1 -0
- package/dist/input.test.translations.js +38 -0
- package/dist/input.test.validity.js +134 -4
- package/dist/label.d.ts +1 -1
- package/dist/label.js +1 -1
- package/dist/label.styles.js +29 -20
- package/dist/label.test.basics.js +27 -24
- package/dist/library/expect-argument-error.js +1 -1
- package/dist/library/localize.d.ts +5 -1
- package/dist/library/ow.test.d.ts +2 -1
- package/dist/library/ow.test.js +8 -3
- package/dist/menu.button.test.basics.js +1 -0
- package/dist/menu.d.ts +3 -5
- package/dist/menu.js +1 -1
- package/dist/menu.link.test.basics.js +1 -0
- package/dist/menu.options.test.basics.js +3 -2
- package/dist/menu.styles.js +1 -15
- package/dist/menu.test.basics.d.ts +1 -2
- package/dist/menu.test.basics.js +23 -6
- package/dist/menu.test.events.d.ts +1 -0
- package/dist/menu.test.events.js +2 -1
- package/dist/menu.test.focus.d.ts +1 -0
- package/dist/menu.test.focus.js +14 -6
- package/dist/menu.test.interactions.js +213 -56
- package/dist/modal.icon-button.test.basics.js +2 -1
- package/dist/modal.js +1 -1
- package/dist/modal.styles.js +18 -13
- package/dist/modal.tertiary-icon.d.ts +0 -1
- package/dist/modal.tertiary-icon.js +1 -1
- package/dist/modal.tertiary-icon.test.basics.js +2 -1
- package/dist/modal.test.accessibility.js +1 -0
- package/dist/modal.test.basics.js +2 -1
- package/dist/modal.test.close.js +1 -0
- package/dist/modal.test.events.js +11 -10
- package/dist/modal.test.lock-scroll.js +1 -0
- package/dist/modal.test.methods.js +1 -0
- package/dist/modal.test.scrollbars.js +1 -0
- package/dist/radio-group.js +1 -1
- package/dist/radio-group.styles.js +1 -1
- package/dist/radio-group.test.basics.js +1 -0
- package/dist/radio-group.test.events.js +1 -0
- package/dist/radio-group.test.focus.js +4 -3
- package/dist/radio-group.test.form.js +1 -0
- package/dist/radio-group.test.validity.js +1 -0
- package/dist/radio.d.ts +1 -0
- package/dist/radio.js +1 -1
- package/dist/radio.styles.js +33 -0
- package/dist/split-button.test.basics.js +1 -0
- package/dist/split-container.test.basics.js +5 -0
- package/dist/split-link.test.basics.js +1 -0
- package/dist/split-link.test.interactions.js +2 -1
- package/dist/styles/variables.css +1 -1
- package/dist/tab.d.ts +1 -3
- package/dist/tab.group.d.ts +3 -5
- package/dist/tab.group.js +1 -1
- package/dist/tab.group.styles.js +27 -13
- package/dist/tab.group.test.basics.js +8 -57
- package/dist/tab.group.test.interactions.d.ts +3 -0
- package/dist/tab.group.test.interactions.js +454 -0
- package/dist/tab.js +1 -1
- package/dist/tab.panel.d.ts +1 -0
- package/dist/tab.panel.js +1 -1
- package/dist/tab.panel.styles.js +11 -1
- package/dist/tab.styles.js +7 -68
- package/dist/tab.test.basics.js +0 -20
- package/dist/tabs.stories.d.ts +1 -2
- package/dist/tag.test.basics.js +3 -2
- package/dist/textarea.d.ts +0 -1
- package/dist/textarea.js +2 -2
- package/dist/textarea.stories.d.ts +3 -4
- package/dist/textarea.styles.js +14 -3
- package/dist/textarea.test.basics.js +81 -44
- package/dist/textarea.test.events.js +57 -41
- package/dist/textarea.test.form.js +1 -0
- package/dist/textarea.test.translations.d.ts +1 -0
- package/dist/textarea.test.translations.js +34 -0
- package/dist/textarea.test.validity.js +105 -20
- package/dist/toasts.js +1 -1
- package/dist/toasts.styles.js +8 -1
- package/dist/toasts.test.basics.js +20 -0
- package/dist/toggle.js +1 -1
- package/dist/toggle.test.basics.js +1 -0
- package/dist/toggle.test.events.js +1 -0
- package/dist/toggle.test.focus.js +1 -1
- package/dist/toggle.test.interactions.d.ts +1 -0
- package/dist/{toggle.test.states.js → toggle.test.interactions.js} +1 -0
- package/dist/tooltip.d.ts +7 -5
- package/dist/tooltip.js +1 -1
- package/dist/tooltip.styles.js +90 -25
- package/dist/tooltip.test.basics.js +39 -3
- package/dist/tooltip.test.interactions.js +137 -34
- package/dist/translations/en.js +1 -1
- package/dist/translations/fr.js +1 -1
- package/dist/translations/ja.js +1 -1
- package/dist/tree.d.ts +0 -1
- package/dist/tree.item.d.ts +2 -3
- package/dist/tree.item.js +1 -1
- package/dist/tree.item.menu.d.ts +0 -1
- package/dist/tree.item.menu.js +1 -1
- package/dist/tree.item.test.basics.js +1 -0
- package/dist/tree.js +1 -1
- package/dist/tree.test.basics.js +2 -1
- package/dist/tree.test.events.js +1 -1
- package/package.json +40 -29
- package/dist/drawer.test.floating-components.d.ts +0 -1
- package/dist/drawer.test.floating-components.js +0 -51
- package/dist/library/set-containing-block.d.ts +0 -15
- package/dist/library/set-containing-block.js +0 -1
- package/dist/modal.test.floating-components.js +0 -62
- /package/dist/{checkbox.test.states.d.ts → button-group.button.test.focus.d.ts} +0 -0
- /package/dist/{modal.test.floating-components.d.ts → checkbox.test.interactions.d.ts} +0 -0
- /package/dist/{toggle.test.states.d.ts → dropdown.test.events.filterable.d.ts} +0 -0
@@ -1,9 +1,22 @@
|
|
1
|
-
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import { aTimeout, assert, expect, fixture, html } from '@open-wc/testing';
|
2
3
|
import { sendKeys, sendMouse } from '@web/test-runner-commands';
|
3
4
|
import GlideCoreDropdown from './dropdown.js';
|
4
5
|
import GlideCoreDropdownOption from './dropdown.option.js';
|
5
6
|
GlideCoreDropdown.shadowRootOptions.mode = 'open';
|
6
7
|
GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
|
8
|
+
it('opens when opened programmatically', async () => {
|
9
|
+
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
|
10
|
+
<glide-core-dropdown-option
|
11
|
+
label="Label"
|
12
|
+
value="value"
|
13
|
+
></glide-core-dropdown-option>
|
14
|
+
</glide-core-dropdown>`);
|
15
|
+
component.open = true;
|
16
|
+
await aTimeout(0);
|
17
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
18
|
+
expect(options?.checkVisibility()).to.be.true;
|
19
|
+
});
|
7
20
|
it('opens on ArrowUp', async () => {
|
8
21
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
|
9
22
|
<glide-core-dropdown-option
|
@@ -13,9 +26,9 @@ it('opens on ArrowUp', async () => {
|
|
13
26
|
</glide-core-dropdown>`);
|
14
27
|
component.focus();
|
15
28
|
await sendKeys({ press: 'ArrowUp' });
|
16
|
-
const
|
29
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
17
30
|
expect(component.open).to.be.true;
|
18
|
-
expect(
|
31
|
+
expect(options?.checkVisibility()).to.be.true;
|
19
32
|
});
|
20
33
|
it('does not open on ArrowUp when `disabled`', async () => {
|
21
34
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
|
@@ -26,7 +39,9 @@ it('does not open on ArrowUp when `disabled`', async () => {
|
|
26
39
|
</glide-core-dropdown>`);
|
27
40
|
component.focus();
|
28
41
|
await sendKeys({ press: 'ArrowUp' });
|
42
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
29
43
|
expect(component.open).to.be.false;
|
44
|
+
expect(options?.checkVisibility()).to.be.false;
|
30
45
|
});
|
31
46
|
it('does not open on ArrowUp when `readonly`', async () => {
|
32
47
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
|
@@ -37,7 +52,9 @@ it('does not open on ArrowUp when `readonly`', async () => {
|
|
37
52
|
</glide-core-dropdown>`);
|
38
53
|
component.focus();
|
39
54
|
await sendKeys({ press: 'ArrowUp' });
|
55
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
40
56
|
expect(component.open).to.be.false;
|
57
|
+
expect(options?.checkVisibility()).to.be.false;
|
41
58
|
});
|
42
59
|
it('opens on ArrowDown', async () => {
|
43
60
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
|
@@ -53,9 +70,9 @@ it('opens on ArrowDown', async () => {
|
|
53
70
|
</glide-core-dropdown>`);
|
54
71
|
component.focus();
|
55
72
|
await sendKeys({ press: 'ArrowDown' });
|
56
|
-
const
|
73
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
57
74
|
expect(component.open).to.be.true;
|
58
|
-
expect(
|
75
|
+
expect(options?.checkVisibility()).to.be.true;
|
59
76
|
});
|
60
77
|
it('does not open on ArrowDown when `disabled`', async () => {
|
61
78
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
|
@@ -71,7 +88,9 @@ it('does not open on ArrowDown when `disabled`', async () => {
|
|
71
88
|
</glide-core-dropdown>`);
|
72
89
|
component.focus();
|
73
90
|
await sendKeys({ press: 'ArrowDown' });
|
91
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
74
92
|
expect(component.open).to.be.false;
|
93
|
+
expect(options?.checkVisibility()).to.be.false;
|
75
94
|
});
|
76
95
|
it('does not open on ArrowDown when `readonly`', async () => {
|
77
96
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
|
@@ -87,7 +106,9 @@ it('does not open on ArrowDown when `readonly`', async () => {
|
|
87
106
|
</glide-core-dropdown>`);
|
88
107
|
component.focus();
|
89
108
|
await sendKeys({ press: 'ArrowDown' });
|
109
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
90
110
|
expect(component.open).to.be.false;
|
111
|
+
expect(options?.checkVisibility()).to.be.false;
|
91
112
|
});
|
92
113
|
it('opens on Space', async () => {
|
93
114
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder">
|
@@ -98,7 +119,9 @@ it('opens on Space', async () => {
|
|
98
119
|
</glide-core-dropdown>`);
|
99
120
|
component.focus();
|
100
121
|
await sendKeys({ press: ' ' });
|
122
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
101
123
|
expect(component.open).to.be.true;
|
124
|
+
expect(options?.checkVisibility()).to.be.true;
|
102
125
|
});
|
103
126
|
it('does not open on Space when `disabled`', async () => {
|
104
127
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" disabled>
|
@@ -109,7 +132,9 @@ it('does not open on Space when `disabled`', async () => {
|
|
109
132
|
</glide-core-dropdown>`);
|
110
133
|
component.focus();
|
111
134
|
await sendKeys({ press: ' ' });
|
135
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
112
136
|
expect(component.open).to.be.false;
|
137
|
+
expect(options?.checkVisibility()).to.be.false;
|
113
138
|
});
|
114
139
|
it('does not open on Space when `readonly`', async () => {
|
115
140
|
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" readonly>
|
@@ -120,7 +145,9 @@ it('does not open on Space when `readonly`', async () => {
|
|
120
145
|
</glide-core-dropdown>`);
|
121
146
|
component.focus();
|
122
147
|
await sendKeys({ press: ' ' });
|
148
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
123
149
|
expect(component.open).to.be.false;
|
150
|
+
expect(options?.checkVisibility()).to.be.false;
|
124
151
|
});
|
125
152
|
// See the `document` click listener comment in `dropdown.ts` for an explanation.
|
126
153
|
it('opens when opened programmatically via the click handler of another element', async () => {
|
@@ -135,7 +162,11 @@ it('opens when opened programmatically via the click handler of another element'
|
|
135
162
|
button.addEventListener('click', () => (component.open = true));
|
136
163
|
div.append(button);
|
137
164
|
button.click();
|
165
|
+
// Wait for it to open.
|
166
|
+
await aTimeout(0);
|
167
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
138
168
|
expect(component.open).to.be.true;
|
169
|
+
expect(options?.checkVisibility()).to.be.true;
|
139
170
|
});
|
140
171
|
it('closes when something outside of it is clicked', async () => {
|
141
172
|
const component = await fixture(html `<glide-core-dropdown
|
@@ -180,6 +211,49 @@ it('closes on Escape', async () => {
|
|
180
211
|
await sendKeys({ press: 'Escape' });
|
181
212
|
expect(component.open).to.be.false;
|
182
213
|
});
|
214
|
+
it('opens when open and enabled programmatically', async () => {
|
215
|
+
const component = await fixture(html `<glide-core-dropdown
|
216
|
+
label="Label"
|
217
|
+
placeholder="Placeholder"
|
218
|
+
open
|
219
|
+
disabled
|
220
|
+
>
|
221
|
+
<glide-core-dropdown-option
|
222
|
+
label="One"
|
223
|
+
value="one"
|
224
|
+
selected
|
225
|
+
></glide-core-dropdown-option>
|
226
|
+
|
227
|
+
<glide-core-dropdown-option
|
228
|
+
label="Two"
|
229
|
+
value="two"
|
230
|
+
></glide-core-dropdown-option>
|
231
|
+
</glide-core-dropdown>`);
|
232
|
+
component.disabled = false;
|
233
|
+
// Wait for it to open.
|
234
|
+
await aTimeout(0);
|
235
|
+
const options = component?.shadowRoot?.querySelector('[data-test="options"]');
|
236
|
+
expect(options?.checkVisibility()).to.be.true;
|
237
|
+
});
|
238
|
+
it('closes when open and disabled programmatically', async () => {
|
239
|
+
const component = await fixture(html `<glide-core-dropdown label="Label" placeholder="Placeholder" open>
|
240
|
+
<glide-core-dropdown-option
|
241
|
+
label="One"
|
242
|
+
value="one"
|
243
|
+
selected
|
244
|
+
></glide-core-dropdown-option>
|
245
|
+
|
246
|
+
<glide-core-dropdown-option
|
247
|
+
label="Two"
|
248
|
+
value="two"
|
249
|
+
></glide-core-dropdown-option>
|
250
|
+
</glide-core-dropdown>`);
|
251
|
+
// Wait for it to open.
|
252
|
+
await aTimeout(0);
|
253
|
+
component.disabled = true;
|
254
|
+
const options = component?.shadowRoot?.querySelector('[data-test="options"]');
|
255
|
+
expect(options?.checkVisibility()).to.be.false;
|
256
|
+
});
|
183
257
|
it('activates an option on "mouseover"', async () => {
|
184
258
|
const component = await fixture(html `<glide-core-dropdown open>
|
185
259
|
<glide-core-dropdown-option
|
@@ -208,6 +282,8 @@ it('activates the next option on ArrowDown', async () => {
|
|
208
282
|
value="two"
|
209
283
|
></glide-core-dropdown-option>
|
210
284
|
</glide-core-dropdown>`);
|
285
|
+
// Wait for it to open.
|
286
|
+
await aTimeout(0);
|
211
287
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
212
288
|
options[0]?.focus();
|
213
289
|
await sendKeys({ press: 'ArrowDown' });
|
@@ -226,6 +302,8 @@ it('activates the previous option on ArrowUp', async () => {
|
|
226
302
|
value="two"
|
227
303
|
></glide-core-dropdown-option>
|
228
304
|
</glide-core-dropdown>`);
|
305
|
+
// Wait for it to open.
|
306
|
+
await aTimeout(0);
|
229
307
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
230
308
|
options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
231
309
|
options[1]?.focus();
|
@@ -246,6 +324,8 @@ it('activates the first option on Home', async () => {
|
|
246
324
|
value="two"
|
247
325
|
></glide-core-dropdown-option>
|
248
326
|
</glide-core-dropdown>`);
|
327
|
+
// Wait for it to open.
|
328
|
+
await aTimeout(0);
|
249
329
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
250
330
|
options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
251
331
|
expect(options[1].privateActive).to.be.true;
|
@@ -266,6 +346,8 @@ it('activates the first option on PageUp', async () => {
|
|
266
346
|
value="two"
|
267
347
|
></glide-core-dropdown-option>
|
268
348
|
</glide-core-dropdown>`);
|
349
|
+
// Wait for it to open.
|
350
|
+
await aTimeout(0);
|
269
351
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
270
352
|
options[1].dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
271
353
|
options[1].focus();
|
@@ -286,6 +368,8 @@ it('activates the first option on ArrowUp + Meta', async () => {
|
|
286
368
|
value="two"
|
287
369
|
></glide-core-dropdown-option>
|
288
370
|
</glide-core-dropdown>`);
|
371
|
+
// Wait for it to open.
|
372
|
+
await aTimeout(0);
|
289
373
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
290
374
|
options[1]?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
291
375
|
expect(options[1]?.privateActive).to.be.true;
|
@@ -308,6 +392,8 @@ it('activates the last option on End', async () => {
|
|
308
392
|
value="two"
|
309
393
|
></glide-core-dropdown-option>
|
310
394
|
</glide-core-dropdown>`);
|
395
|
+
// Wait for it to open.
|
396
|
+
await aTimeout(0);
|
311
397
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
312
398
|
options[0]?.focus();
|
313
399
|
await sendKeys({ press: 'End' });
|
@@ -326,6 +412,8 @@ it('activates the last option on PageDown', async () => {
|
|
326
412
|
value="two"
|
327
413
|
></glide-core-dropdown-option>
|
328
414
|
</glide-core-dropdown>`);
|
415
|
+
// Wait for it to open.
|
416
|
+
await aTimeout(0);
|
329
417
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
330
418
|
options[0]?.focus();
|
331
419
|
await sendKeys({ press: 'PageDown' });
|
@@ -344,6 +432,8 @@ it('activates the last option on Meta + ArrowDown', async () => {
|
|
344
432
|
value="two"
|
345
433
|
></glide-core-dropdown-option>
|
346
434
|
</glide-core-dropdown>`);
|
435
|
+
// Wait for it to open.
|
436
|
+
await aTimeout(0);
|
347
437
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
348
438
|
options[0]?.focus();
|
349
439
|
await sendKeys({ down: 'Meta' });
|
@@ -1,9 +1,9 @@
|
|
1
|
-
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
2
|
+
import { aTimeout, assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
|
2
3
|
import { sendKeys } from '@web/test-runner-commands';
|
3
4
|
import { sendMouse } from '@web/test-runner-commands';
|
4
5
|
import GlideCoreDropdown from './dropdown.js';
|
5
6
|
import GlideCoreDropdownOption from './dropdown.option.js';
|
6
|
-
import GlideCoreTag from './tag.js';
|
7
7
|
GlideCoreDropdown.shadowRootOptions.mode = 'open';
|
8
8
|
GlideCoreDropdownOption.shadowRootOptions.mode = 'open';
|
9
9
|
it('opens on click', async () => {
|
@@ -25,7 +25,11 @@ it('opens on click', async () => {
|
|
25
25
|
component.shadowRoot
|
26
26
|
?.querySelector('[data-test="button"]')
|
27
27
|
?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
|
28
|
+
// Wait for it to open.
|
29
|
+
await aTimeout(0);
|
30
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
28
31
|
expect(component.open).to.be.true;
|
32
|
+
expect(options?.checkVisibility()).to.be.true;
|
29
33
|
});
|
30
34
|
it('toggles open and closed when the button is clicked', async () => {
|
31
35
|
const component = await fixture(html `<glide-core-dropdown
|
@@ -51,7 +55,10 @@ it('toggles open and closed when the button is clicked', async () => {
|
|
51
55
|
component.shadowRoot
|
52
56
|
?.querySelector('[data-test="button"]')
|
53
57
|
?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
|
58
|
+
await elementUpdated(component);
|
59
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
54
60
|
expect(component.open).to.be.false;
|
61
|
+
expect(options?.checkVisibility()).to.be.false;
|
55
62
|
});
|
56
63
|
it('does not toggle open and closed when the button overflow text is clicked', async () => {
|
57
64
|
const component = await fixture(html `<glide-core-dropdown
|
@@ -77,7 +84,11 @@ it('does not toggle open and closed when the button overflow text is clicked', a
|
|
77
84
|
component.shadowRoot
|
78
85
|
?.querySelector('[data-test="tag-overflow-text"]')
|
79
86
|
?.dispatchEvent(new CustomEvent('click', { bubbles: true, detail: 1 }));
|
87
|
+
// Wait for it to open.
|
88
|
+
await aTimeout(0);
|
89
|
+
const options = component.shadowRoot?.querySelector('[data-test="options"]');
|
80
90
|
expect(component.open).to.be.true;
|
91
|
+
expect(options?.checkVisibility()).to.be.true;
|
81
92
|
});
|
82
93
|
it('selects options on click', async () => {
|
83
94
|
const component = await fixture(html `<glide-core-dropdown
|
@@ -123,6 +134,8 @@ it('selects options on Space', async () => {
|
|
123
134
|
value="two"
|
124
135
|
></glide-core-dropdown-option>
|
125
136
|
</glide-core-dropdown>`);
|
137
|
+
// Wait for it to open.
|
138
|
+
await aTimeout(0);
|
126
139
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
127
140
|
options[0]?.focus();
|
128
141
|
await sendKeys({ press: ' ' });
|
@@ -153,6 +166,8 @@ it('selects options on Enter', async () => {
|
|
153
166
|
value="two"
|
154
167
|
></glide-core-dropdown-option>
|
155
168
|
</glide-core-dropdown>`);
|
169
|
+
// Wait for it to open.
|
170
|
+
await aTimeout(0);
|
156
171
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
157
172
|
options[0]?.focus();
|
158
173
|
await sendKeys({ press: 'Enter' });
|
@@ -398,6 +413,8 @@ it('updates `value` when a option is selected or deselected via Enter', async ()
|
|
398
413
|
|
399
414
|
<glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
|
400
415
|
</glide-core-dropdown>`);
|
416
|
+
// Wait for it to open.
|
417
|
+
await aTimeout(0);
|
401
418
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
402
419
|
options[1].focus();
|
403
420
|
await sendKeys({ press: 'Enter' });
|
@@ -424,6 +441,8 @@ it('updates `value` when an option is selected or deselected via Space', async (
|
|
424
441
|
|
425
442
|
<glide-core-dropdown-option label="Three"></glide-core-dropdown-option>
|
426
443
|
</glide-core-dropdown>`);
|
444
|
+
// Wait for it to open.
|
445
|
+
await aTimeout(0);
|
427
446
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
428
447
|
options[1].focus();
|
429
448
|
await sendKeys({ press: ' ' });
|
@@ -626,7 +645,7 @@ it('deselects all but the last selected option when `multiple` is changed to `fa
|
|
626
645
|
expect(options[0].selected).be.false;
|
627
646
|
expect(options[1].selected).be.true;
|
628
647
|
});
|
629
|
-
it('selects all options when none are selected and Select All is
|
648
|
+
it('selects all options when none are selected and Select All is selected via click', async () => {
|
630
649
|
const component = await fixture(html `<glide-core-dropdown
|
631
650
|
label="Label"
|
632
651
|
placeholder="Placeholder"
|
@@ -650,7 +669,7 @@ it('selects all options when none are selected and Select All is clicked', async
|
|
650
669
|
expect(options[0].selected).to.be.true;
|
651
670
|
expect(options[1].selected).to.be.true;
|
652
671
|
});
|
653
|
-
it('selects all options when some are selected and Select All is
|
672
|
+
it('selects all options when some are selected and Select All is selected via click', async () => {
|
654
673
|
const component = await fixture(html `<glide-core-dropdown
|
655
674
|
label="Label"
|
656
675
|
placeholder="Placeholder"
|
@@ -675,7 +694,7 @@ it('selects all options when some are selected and Select All is clicked', async
|
|
675
694
|
expect(options[0].selected).to.be.true;
|
676
695
|
expect(options[1].selected).to.be.true;
|
677
696
|
});
|
678
|
-
it('
|
697
|
+
it('deselects all options when all are selected and Select All is selected via click', async () => {
|
679
698
|
const component = await fixture(html `<glide-core-dropdown
|
680
699
|
label="Label"
|
681
700
|
placeholder="Placeholder"
|
@@ -701,8 +720,181 @@ it('deelects all options when all are selected and Select All is clicked', async
|
|
701
720
|
expect(options[0].selected).to.be.false;
|
702
721
|
expect(options[1].selected).to.be.false;
|
703
722
|
});
|
723
|
+
it('selects all options when none are selected and Select All is selected via Space', async () => {
|
724
|
+
const component = await fixture(html `<glide-core-dropdown
|
725
|
+
label="Label"
|
726
|
+
placeholder="Placeholder"
|
727
|
+
multiple
|
728
|
+
open
|
729
|
+
select-all
|
730
|
+
>
|
731
|
+
<glide-core-dropdown-option
|
732
|
+
label="One"
|
733
|
+
value="one"
|
734
|
+
></glide-core-dropdown-option>
|
735
|
+
|
736
|
+
<glide-core-dropdown-option
|
737
|
+
label="Two"
|
738
|
+
value="two"
|
739
|
+
></glide-core-dropdown-option>
|
740
|
+
</glide-core-dropdown>`);
|
741
|
+
component?.shadowRoot
|
742
|
+
?.querySelector('[data-test="select-all"]')
|
743
|
+
?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
744
|
+
component.focus();
|
745
|
+
await sendKeys({ press: ' ' });
|
746
|
+
const options = component.querySelectorAll('glide-core-dropdown-option');
|
747
|
+
expect(options[0].selected).to.be.true;
|
748
|
+
expect(options[1].selected).to.be.true;
|
749
|
+
});
|
750
|
+
it('selects all options when some are selected and Select All is selected via Space', async () => {
|
751
|
+
const component = await fixture(html `<glide-core-dropdown
|
752
|
+
label="Label"
|
753
|
+
placeholder="Placeholder"
|
754
|
+
multiple
|
755
|
+
open
|
756
|
+
select-all
|
757
|
+
>
|
758
|
+
<glide-core-dropdown-option
|
759
|
+
label="One"
|
760
|
+
value="one"
|
761
|
+
selected
|
762
|
+
></glide-core-dropdown-option>
|
763
|
+
|
764
|
+
<glide-core-dropdown-option
|
765
|
+
label="Two"
|
766
|
+
value="two"
|
767
|
+
></glide-core-dropdown-option>
|
768
|
+
</glide-core-dropdown>`);
|
769
|
+
component?.shadowRoot
|
770
|
+
?.querySelector('[data-test="select-all"]')
|
771
|
+
?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
772
|
+
component.focus();
|
773
|
+
await sendKeys({ press: ' ' });
|
774
|
+
const options = component.querySelectorAll('glide-core-dropdown-option');
|
775
|
+
expect(options[0].selected).to.be.true;
|
776
|
+
expect(options[1].selected).to.be.true;
|
777
|
+
});
|
778
|
+
it('deselects all options when all are selected and Select All is selected via Space', async () => {
|
779
|
+
const component = await fixture(html `<glide-core-dropdown
|
780
|
+
label="Label"
|
781
|
+
placeholder="Placeholder"
|
782
|
+
multiple
|
783
|
+
open
|
784
|
+
select-all
|
785
|
+
>
|
786
|
+
<glide-core-dropdown-option
|
787
|
+
label="One"
|
788
|
+
value="one"
|
789
|
+
selected
|
790
|
+
></glide-core-dropdown-option>
|
791
|
+
|
792
|
+
<glide-core-dropdown-option
|
793
|
+
label="Two"
|
794
|
+
value="two"
|
795
|
+
selected
|
796
|
+
></glide-core-dropdown-option>
|
797
|
+
</glide-core-dropdown>`);
|
798
|
+
component?.shadowRoot
|
799
|
+
?.querySelector('[data-test="select-all"]')
|
800
|
+
?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
801
|
+
component.focus();
|
802
|
+
await sendKeys({ press: ' ' });
|
803
|
+
const options = component.querySelectorAll('glide-core-dropdown-option');
|
804
|
+
expect(options[0].selected).to.be.false;
|
805
|
+
expect(options[1].selected).to.be.false;
|
806
|
+
});
|
807
|
+
it('selects all options when none are selected and Select All is selected via Enter', async () => {
|
808
|
+
const component = await fixture(html `<glide-core-dropdown
|
809
|
+
label="Label"
|
810
|
+
placeholder="Placeholder"
|
811
|
+
multiple
|
812
|
+
open
|
813
|
+
select-all
|
814
|
+
>
|
815
|
+
<glide-core-dropdown-option
|
816
|
+
label="One"
|
817
|
+
value="one"
|
818
|
+
></glide-core-dropdown-option>
|
819
|
+
|
820
|
+
<glide-core-dropdown-option
|
821
|
+
label="Two"
|
822
|
+
value="two"
|
823
|
+
></glide-core-dropdown-option>
|
824
|
+
</glide-core-dropdown>`);
|
825
|
+
component?.shadowRoot
|
826
|
+
?.querySelector('[data-test="select-all"]')
|
827
|
+
?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
828
|
+
component.focus();
|
829
|
+
await sendKeys({ press: 'Enter' });
|
830
|
+
const options = component.querySelectorAll('glide-core-dropdown-option');
|
831
|
+
expect(options[0].selected).to.be.true;
|
832
|
+
expect(options[1].selected).to.be.true;
|
833
|
+
});
|
834
|
+
it('selects all options when some are selected and Select All is selected via Enter', async () => {
|
835
|
+
const component = await fixture(html `<glide-core-dropdown
|
836
|
+
label="Label"
|
837
|
+
placeholder="Placeholder"
|
838
|
+
multiple
|
839
|
+
open
|
840
|
+
select-all
|
841
|
+
>
|
842
|
+
<glide-core-dropdown-option
|
843
|
+
label="One"
|
844
|
+
value="one"
|
845
|
+
selected
|
846
|
+
></glide-core-dropdown-option>
|
847
|
+
|
848
|
+
<glide-core-dropdown-option
|
849
|
+
label="Two"
|
850
|
+
value="two"
|
851
|
+
></glide-core-dropdown-option>
|
852
|
+
</glide-core-dropdown>`);
|
853
|
+
component?.shadowRoot
|
854
|
+
?.querySelector('[data-test="select-all"]')
|
855
|
+
?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
856
|
+
component.focus();
|
857
|
+
await sendKeys({ press: 'Enter' });
|
858
|
+
const options = component.querySelectorAll('glide-core-dropdown-option');
|
859
|
+
expect(options[0].selected).to.be.true;
|
860
|
+
expect(options[1].selected).to.be.true;
|
861
|
+
});
|
862
|
+
it('deselects all options when all are selected and Select All is selected via Enter', async () => {
|
863
|
+
const component = await fixture(html `<glide-core-dropdown
|
864
|
+
label="Label"
|
865
|
+
placeholder="Placeholder"
|
866
|
+
multiple
|
867
|
+
open
|
868
|
+
select-all
|
869
|
+
>
|
870
|
+
<glide-core-dropdown-option
|
871
|
+
label="One"
|
872
|
+
value="one"
|
873
|
+
selected
|
874
|
+
></glide-core-dropdown-option>
|
875
|
+
|
876
|
+
<glide-core-dropdown-option
|
877
|
+
label="Two"
|
878
|
+
value="two"
|
879
|
+
selected
|
880
|
+
></glide-core-dropdown-option>
|
881
|
+
</glide-core-dropdown>`);
|
882
|
+
component?.shadowRoot
|
883
|
+
?.querySelector('[data-test="select-all"]')
|
884
|
+
?.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
885
|
+
component.focus();
|
886
|
+
await sendKeys({ press: 'Enter' });
|
887
|
+
const options = component.querySelectorAll('glide-core-dropdown-option');
|
888
|
+
expect(options[0].selected).to.be.false;
|
889
|
+
expect(options[1].selected).to.be.false;
|
890
|
+
});
|
704
891
|
it('shows Select All', async () => {
|
705
|
-
const component = await fixture(html `<glide-core-dropdown
|
892
|
+
const component = await fixture(html `<glide-core-dropdown
|
893
|
+
label="Label"
|
894
|
+
placeholder="Placeholder"
|
895
|
+
open
|
896
|
+
multiple
|
897
|
+
>
|
706
898
|
<glide-core-dropdown-option
|
707
899
|
label="One"
|
708
900
|
value="one"
|
@@ -714,6 +906,8 @@ it('shows Select All', async () => {
|
|
714
906
|
value="two"
|
715
907
|
></glide-core-dropdown-option>
|
716
908
|
</glide-core-dropdown>`);
|
909
|
+
// Wait for it to open.
|
910
|
+
await aTimeout(0);
|
717
911
|
component.selectAll = true;
|
718
912
|
await elementUpdated(component);
|
719
913
|
const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
|
@@ -786,6 +980,7 @@ it('sets Select All as indeterminate when not all options are selected', async (
|
|
786
980
|
</glide-core-dropdown>`);
|
787
981
|
const options = component.querySelectorAll('glide-core-dropdown-option');
|
788
982
|
options[0].click();
|
983
|
+
await elementUpdated(component);
|
789
984
|
const selectAll = component.shadowRoot?.querySelector('[data-test="select-all"]');
|
790
985
|
expect(selectAll?.privateIndeterminate).to.be.true;
|
791
986
|
});
|
@@ -878,6 +1073,8 @@ it('does not select an option on Enter when the option is not focused', async ()
|
|
878
1073
|
value="two"
|
879
1074
|
></glide-core-dropdown-option>
|
880
1075
|
</glide-core-dropdown>`);
|
1076
|
+
// Wait for it to open.
|
1077
|
+
await aTimeout(0);
|
881
1078
|
const option = component.querySelector('glide-core-dropdown-option');
|
882
1079
|
option?.focus();
|
883
1080
|
await sendKeys({ down: 'Tab' });
|