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