@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,277 @@
|
|
1
|
+
import './radio-group.js';
|
2
|
+
import './radio.js';
|
3
|
+
import { elementUpdated, expect, fixture, html, oneEvent, } from '@open-wc/testing';
|
4
|
+
import { sendKeys } from '@web/test-runner-commands';
|
5
|
+
import GlideCoreRadio from './radio.js';
|
6
|
+
import GlideCoreRadioGroup from './radio-group.js';
|
7
|
+
GlideCoreRadio.shadowRootOptions.mode = 'open';
|
8
|
+
GlideCoreRadioGroup.shadowRootOptions.mode = 'open';
|
9
|
+
it('emits a change event when arrow keys are pressed', async () => {
|
10
|
+
await fixture(html `<glide-core-radio-group name="name">
|
11
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
12
|
+
<glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
|
13
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
14
|
+
</glide-core-radio-group>`);
|
15
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
16
|
+
await sendKeys({ press: 'Tab' });
|
17
|
+
// This pattern is adopted from https://open-wc.org/docs/testing/helpers/#testing-events
|
18
|
+
// Without the setTimeout the test fails. An `await` is used since `sendKeys` returns a
|
19
|
+
// promise, however the test seems to work without it. Keeping `await` here until this can
|
20
|
+
// be investigated further.
|
21
|
+
setTimeout(async () => await sendKeys({ press: 'ArrowLeft' }));
|
22
|
+
const changeEventLeft = await oneEvent(radios[0], 'change');
|
23
|
+
expect(changeEventLeft instanceof Event).to.be.true;
|
24
|
+
expect(changeEventLeft.bubbles).to.be.true;
|
25
|
+
setTimeout(async () => await sendKeys({ press: 'ArrowRight' }));
|
26
|
+
const changeEventRight = await oneEvent(radios[1], 'change');
|
27
|
+
expect(changeEventRight instanceof Event).to.be.true;
|
28
|
+
expect(changeEventRight.bubbles).to.be.true;
|
29
|
+
setTimeout(async () => await sendKeys({ press: 'ArrowUp' }));
|
30
|
+
const changeEventUp = await oneEvent(radios[0], 'change');
|
31
|
+
expect(changeEventUp instanceof Event).to.be.true;
|
32
|
+
expect(changeEventUp.bubbles).to.be.true;
|
33
|
+
setTimeout(async () => await sendKeys({ press: 'ArrowDown' }));
|
34
|
+
const changeEventDown = await oneEvent(radios[1], 'change');
|
35
|
+
expect(changeEventDown instanceof Event).to.be.true;
|
36
|
+
expect(changeEventDown.bubbles).to.be.true;
|
37
|
+
});
|
38
|
+
it('emits an input event when arrow keys are pressed', async () => {
|
39
|
+
await fixture(html `<glide-core-radio-group name="name">
|
40
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
41
|
+
<glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
|
42
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
43
|
+
</glide-core-radio-group>`);
|
44
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
45
|
+
await sendKeys({ press: 'Tab' });
|
46
|
+
setTimeout(async () => await sendKeys({ press: 'ArrowLeft' }));
|
47
|
+
const inputEventLeft = await oneEvent(radios[0], 'input');
|
48
|
+
expect(inputEventLeft instanceof Event).to.be.true;
|
49
|
+
expect(inputEventLeft.bubbles).to.be.true;
|
50
|
+
setTimeout(async () => await sendKeys({ press: 'ArrowRight' }));
|
51
|
+
const inputEventRight = await oneEvent(radios[1], 'input');
|
52
|
+
expect(inputEventRight instanceof Event).to.be.true;
|
53
|
+
expect(inputEventRight.bubbles).to.be.true;
|
54
|
+
setTimeout(async () => await sendKeys({ press: 'ArrowUp' }));
|
55
|
+
const inputEventUp = await oneEvent(radios[0], 'input');
|
56
|
+
expect(inputEventUp instanceof Event).to.be.true;
|
57
|
+
expect(inputEventUp.bubbles).to.be.true;
|
58
|
+
setTimeout(async () => await sendKeys({ press: 'ArrowDown' }));
|
59
|
+
const inputEventDown = await oneEvent(radios[1], 'input');
|
60
|
+
expect(inputEventDown instanceof Event).to.be.true;
|
61
|
+
expect(inputEventDown.bubbles).to.be.true;
|
62
|
+
});
|
63
|
+
it('moves focus to previous radio when left or up arrow keys are pressed', async () => {
|
64
|
+
await fixture(html `<glide-core-radio-group name="name">
|
65
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
66
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
67
|
+
<glide-core-radio
|
68
|
+
value="value-3"
|
69
|
+
checked
|
70
|
+
label="Three"
|
71
|
+
></glide-core-radio>
|
72
|
+
</glide-core-radio-group>`);
|
73
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
74
|
+
await sendKeys({ press: 'Tab' });
|
75
|
+
await sendKeys({ press: 'ArrowLeft' });
|
76
|
+
expect(radios[1]).to.have.focus;
|
77
|
+
await sendKeys({ press: 'ArrowUp' });
|
78
|
+
expect(radios[0]).to.have.focus;
|
79
|
+
});
|
80
|
+
it('moves focus to last radio when left or up arrow keys are pressed on the first radio', async () => {
|
81
|
+
await fixture(html `<glide-core-radio-group name="name">
|
82
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
83
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
84
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
85
|
+
</glide-core-radio-group>`);
|
86
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
87
|
+
await sendKeys({ press: 'Tab' });
|
88
|
+
await sendKeys({ press: 'ArrowLeft' });
|
89
|
+
expect(radios[2]).to.have.focus;
|
90
|
+
radios[0].focus();
|
91
|
+
await sendKeys({ press: ' ' });
|
92
|
+
await sendKeys({ press: 'ArrowUp' });
|
93
|
+
expect(radios[2]).to.have.focus;
|
94
|
+
});
|
95
|
+
it('moves focus to next radio when right or down arrow keys are pressed', async () => {
|
96
|
+
await fixture(html `<glide-core-radio-group name="name">
|
97
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
98
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
99
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
100
|
+
</glide-core-radio-group>`);
|
101
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
102
|
+
await sendKeys({ press: 'Tab' });
|
103
|
+
await sendKeys({ press: 'ArrowRight' });
|
104
|
+
expect(radios[1]).to.have.focus;
|
105
|
+
await sendKeys({ press: 'ArrowDown' });
|
106
|
+
expect(radios[2]).to.have.focus;
|
107
|
+
});
|
108
|
+
it('moves focus to first radio when right or down arrow keys are pressed on the last radio', async () => {
|
109
|
+
await fixture(html `<glide-core-radio-group name="name">
|
110
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
111
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
112
|
+
<glide-core-radio
|
113
|
+
value="value-3"
|
114
|
+
checked
|
115
|
+
label="Three"
|
116
|
+
></glide-core-radio>
|
117
|
+
</glide-core-radio-group>`);
|
118
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
119
|
+
await sendKeys({ press: 'Tab' });
|
120
|
+
await sendKeys({ press: 'ArrowRight' });
|
121
|
+
expect(radios[0]).to.have.focus;
|
122
|
+
radios[2].focus();
|
123
|
+
await sendKeys({ press: ' ' });
|
124
|
+
expect(radios[2]).to.have.focus;
|
125
|
+
await sendKeys({ press: 'ArrowDown' });
|
126
|
+
expect(radios[0]).to.have.focus;
|
127
|
+
});
|
128
|
+
it('moves focus to previous enabled radio when pressing left or up arrow keys', async () => {
|
129
|
+
await fixture(html `<glide-core-radio-group name="name">
|
130
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
131
|
+
<glide-core-radio value="value-2" disabled label="Two"></glide-core-radio>
|
132
|
+
<glide-core-radio
|
133
|
+
value="value-3"
|
134
|
+
checked
|
135
|
+
label="Three"
|
136
|
+
></glide-core-radio>
|
137
|
+
</glide-core-radio-group>`);
|
138
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
139
|
+
await sendKeys({ press: 'Tab' });
|
140
|
+
await sendKeys({ press: 'ArrowLeft' });
|
141
|
+
expect(radios[0]).to.have.focus;
|
142
|
+
radios[2].focus();
|
143
|
+
await sendKeys({ press: ' ' });
|
144
|
+
expect(radios[2]).to.have.focus;
|
145
|
+
await sendKeys({ press: 'ArrowUp' });
|
146
|
+
expect(radios[0]).to.have.focus;
|
147
|
+
});
|
148
|
+
it('moves focus to next enabled radio when pressing right or down arrow keys', async () => {
|
149
|
+
await fixture(html `<glide-core-radio-group name="name">
|
150
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
151
|
+
<glide-core-radio value="value-2" disabled label="Two"></glide-core-radio>
|
152
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
153
|
+
</glide-core-radio-group>`);
|
154
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
155
|
+
await sendKeys({ press: 'Tab' });
|
156
|
+
await sendKeys({ press: 'ArrowRight' });
|
157
|
+
expect(radios[2]).to.have.focus;
|
158
|
+
radios[0].focus();
|
159
|
+
await sendKeys({ press: ' ' });
|
160
|
+
expect(radios[0]).to.have.focus;
|
161
|
+
await sendKeys({ press: 'ArrowDown' });
|
162
|
+
expect(radios[2]).to.have.focus;
|
163
|
+
});
|
164
|
+
it('does not move focus if there is only one button when pressing arrow keys', async () => {
|
165
|
+
await fixture(html `<glide-core-radio-group name="name">
|
166
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
167
|
+
</glide-core-radio-group>`);
|
168
|
+
const radio = document.querySelector('glide-core-radio');
|
169
|
+
await sendKeys({ press: 'Tab' });
|
170
|
+
await sendKeys({ press: 'ArrowLeft' });
|
171
|
+
expect(radio).to.have.focus;
|
172
|
+
await sendKeys({ press: 'ArrowRight' });
|
173
|
+
expect(radio).to.have.focus;
|
174
|
+
await sendKeys({ press: 'ArrowUp' });
|
175
|
+
expect(radio).to.have.focus;
|
176
|
+
await sendKeys({ press: 'ArrowDown' });
|
177
|
+
expect(radio).to.have.focus;
|
178
|
+
});
|
179
|
+
it('changes the "checked" attribute when clicking', async () => {
|
180
|
+
const element = await fixture(html `<glide-core-radio-group name="name">
|
181
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
182
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
183
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
184
|
+
</glide-core-radio-group>`);
|
185
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
186
|
+
expect(radios.length).to.equal(3);
|
187
|
+
radios[2].click();
|
188
|
+
await elementUpdated(element);
|
189
|
+
expect(radios[2]).to.have.focus;
|
190
|
+
expect(radios[2]).to.have.attribute('checked');
|
191
|
+
expect(radios[0]).to.not.have.attribute('checked');
|
192
|
+
});
|
193
|
+
it('does not change focus nor the "checked" attribute when clicking a disabled radio', async () => {
|
194
|
+
const element = await fixture(html `<glide-core-radio-group name="name">
|
195
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
196
|
+
<glide-core-radio value="value-2" disabled label="Two"></glide-core-radio>
|
197
|
+
</glide-core-radio-group>`);
|
198
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
199
|
+
expect(radios.length).to.equal(2);
|
200
|
+
radios[1].click();
|
201
|
+
await elementUpdated(element);
|
202
|
+
expect(radios[0]).to.have.focus;
|
203
|
+
expect(radios[0]).to.have.attribute('checked');
|
204
|
+
expect(radios[1]).to.not.have.attribute('checked');
|
205
|
+
});
|
206
|
+
it('does not change focus nor the "checked" attribute when clicking a disabled group', async () => {
|
207
|
+
const element = await fixture(html `<glide-core-radio-group name="name" disabled>
|
208
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
209
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
210
|
+
</glide-core-radio-group>`);
|
211
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
212
|
+
expect(radios.length).to.equal(2);
|
213
|
+
radios[1].click();
|
214
|
+
await elementUpdated(element);
|
215
|
+
expect(radios[0]).to.not.have.focus;
|
216
|
+
expect(radios[0]).to.have.attribute('checked');
|
217
|
+
expect(radios[1]).to.not.have.attribute('checked');
|
218
|
+
});
|
219
|
+
it('changes the "checked" attribute when pressing arrow and space keys', async () => {
|
220
|
+
await fixture(html `<glide-core-radio-group name="name">
|
221
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
222
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
223
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
224
|
+
</glide-core-radio-group>`);
|
225
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
226
|
+
await sendKeys({ press: 'Tab' });
|
227
|
+
await sendKeys({ press: 'ArrowRight' });
|
228
|
+
expect(radios[1]).to.have.focus;
|
229
|
+
expect(radios[1]).to.have.attribute('checked');
|
230
|
+
expect(radios[0]).to.not.have.attribute('checked');
|
231
|
+
await sendKeys({ press: 'ArrowDown' });
|
232
|
+
expect(radios[2]).to.have.focus;
|
233
|
+
expect(radios[2]).to.have.attribute('checked');
|
234
|
+
expect(radios[1]).to.not.have.attribute('checked');
|
235
|
+
await sendKeys({ press: 'ArrowUp' });
|
236
|
+
expect(radios[1]).to.have.focus;
|
237
|
+
expect(radios[1]).to.have.attribute('checked');
|
238
|
+
expect(radios[2]).to.not.have.attribute('checked');
|
239
|
+
await sendKeys({ press: 'ArrowLeft' });
|
240
|
+
expect(radios[0]).to.have.focus;
|
241
|
+
expect(radios[0]).to.have.attribute('checked');
|
242
|
+
expect(radios[1]).to.not.have.attribute('checked');
|
243
|
+
radios[2].focus();
|
244
|
+
await sendKeys({ press: ' ' });
|
245
|
+
expect(radios[2]).to.have.focus;
|
246
|
+
expect(radios[2]).to.have.attribute('checked');
|
247
|
+
expect(radios[0]).to.not.have.attribute('checked');
|
248
|
+
});
|
249
|
+
it('does not change the "checked" attribute nor focus when pressing arrow and space keys when the group is disabled', async () => {
|
250
|
+
await fixture(html `<glide-core-radio-group name="name" disabled>
|
251
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
252
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
253
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
254
|
+
</glide-core-radio-group>`);
|
255
|
+
const radios = document.querySelectorAll('glide-core-radio');
|
256
|
+
radios[0].focus();
|
257
|
+
await sendKeys({ press: 'ArrowRight' });
|
258
|
+
expect(radios[0]).to.have.focus;
|
259
|
+
expect(radios[0]).to.have.attribute('checked');
|
260
|
+
expect(radios[2]).to.not.have.attribute('checked');
|
261
|
+
await sendKeys({ press: 'ArrowDown' });
|
262
|
+
expect(radios[0]).to.have.focus;
|
263
|
+
expect(radios[0]).to.have.attribute('checked');
|
264
|
+
expect(radios[2]).to.not.have.attribute('checked');
|
265
|
+
await sendKeys({ press: 'ArrowUp' });
|
266
|
+
expect(radios[0]).to.have.focus;
|
267
|
+
expect(radios[0]).to.have.attribute('checked');
|
268
|
+
expect(radios[1]).to.not.have.attribute('checked');
|
269
|
+
await sendKeys({ press: 'ArrowLeft' });
|
270
|
+
expect(radios[0]).to.have.focus;
|
271
|
+
expect(radios[0]).to.have.attribute('checked');
|
272
|
+
expect(radios[1]).to.not.have.attribute('checked');
|
273
|
+
radios[1].focus();
|
274
|
+
await sendKeys({ press: ' ' });
|
275
|
+
expect(radios[0]).to.have.attribute('checked');
|
276
|
+
expect(radios[1]).to.not.have.attribute('checked');
|
277
|
+
});
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import './radio-group.js';
|
2
|
+
import './radio.js';
|
3
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
4
|
+
import GlideCoreRadio from './radio.js';
|
5
|
+
import GlideCoreRadioGroup from './radio-group.js';
|
6
|
+
GlideCoreRadio.shadowRootOptions.mode = 'open';
|
7
|
+
GlideCoreRadioGroup.shadowRootOptions.mode = 'open';
|
8
|
+
it('focuses the first radio when `focus` is called', async () => {
|
9
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name">
|
10
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
11
|
+
</glide-core-radio-group>`);
|
12
|
+
component.focus();
|
13
|
+
expect(document.activeElement).to.equal(component.querySelector('glide-core-radio'));
|
14
|
+
});
|
15
|
+
it('focuses the first radio after submit when the group is "required" and the radio is unchecked', async () => {
|
16
|
+
const form = document.createElement('form');
|
17
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
|
18
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
19
|
+
</glide-core-radio-group>`, {
|
20
|
+
parentNode: form,
|
21
|
+
});
|
22
|
+
form.requestSubmit();
|
23
|
+
const radio = component.querySelector('glide-core-radio');
|
24
|
+
expect(radio).to.have.focus;
|
25
|
+
});
|
26
|
+
it('focuses the first radio after `reportValidity` is called when the group is "required" and the radio is unchecked', async () => {
|
27
|
+
const form = document.createElement('form');
|
28
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
|
29
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
30
|
+
</glide-core-radio-group>`, {
|
31
|
+
parentNode: form,
|
32
|
+
});
|
33
|
+
component.reportValidity();
|
34
|
+
expect(document.activeElement).to.equal(component.querySelector('glide-core-radio'));
|
35
|
+
});
|
36
|
+
it('focuses the first radio after `requestSubmit` is called when the group is "required" and the radio is unchecked', async () => {
|
37
|
+
const form = document.createElement('form');
|
38
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
|
39
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
40
|
+
</glide-core-radio-group>`, {
|
41
|
+
parentNode: form,
|
42
|
+
});
|
43
|
+
form.requestSubmit();
|
44
|
+
expect(document.activeElement).to.equal(component.querySelector('glide-core-radio'));
|
45
|
+
});
|
46
|
+
it('does not focus the a radio after `checkValidity` is called', async () => {
|
47
|
+
const form = document.createElement('form');
|
48
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
|
49
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
50
|
+
</glide-core-radio-group>`, {
|
51
|
+
parentNode: form,
|
52
|
+
});
|
53
|
+
component.checkValidity();
|
54
|
+
expect(document.activeElement).to.not.equal(component.querySelector('glide-core-radio'));
|
55
|
+
});
|
56
|
+
it('focuses the first checked radio when it exists', async () => {
|
57
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
|
58
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
59
|
+
<glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
|
60
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
61
|
+
</glide-core-radio-group>`);
|
62
|
+
component.focus();
|
63
|
+
const radio = component.querySelector('glide-core-radio[value="value-2"]');
|
64
|
+
expect(radio).to.have.focus;
|
65
|
+
});
|
66
|
+
it('focuses the first tabbable radio when none are checked', async () => {
|
67
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name" required>
|
68
|
+
<glide-core-radio value="value-1" disabled label="One"></glide-core-radio>
|
69
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
70
|
+
<glide-core-radio value="value-3" label="Three"></glide-core-radio>
|
71
|
+
</glide-core-radio-group>`);
|
72
|
+
component.focus();
|
73
|
+
const radio = component.querySelector('glide-core-radio[value="value-2"]');
|
74
|
+
expect(radio).to.have.focus;
|
75
|
+
});
|
@@ -0,0 +1,104 @@
|
|
1
|
+
import { assert, elementUpdated, expect, fixture, html, } from '@open-wc/testing';
|
2
|
+
import GlideCoreRadio from './radio.js';
|
3
|
+
import GlideCoreRadioGroup from './radio-group.js';
|
4
|
+
GlideCoreRadio.shadowRootOptions.mode = 'open';
|
5
|
+
GlideCoreRadioGroup.shadowRootOptions.mode = 'open';
|
6
|
+
it('exposes standard form control properties and methods', async () => {
|
7
|
+
const form = document.createElement('form');
|
8
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name">
|
9
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
10
|
+
</glide-core-radio-group>`, { parentNode: form });
|
11
|
+
expect(component.form).to.equal(form);
|
12
|
+
expect(component.validity instanceof ValidityState).to.be.true;
|
13
|
+
expect(component.willValidate).to.be.true;
|
14
|
+
expect(component.checkValidity).to.be.a('function');
|
15
|
+
expect(component.reportValidity).to.be.a('function');
|
16
|
+
});
|
17
|
+
it('can be reset', async () => {
|
18
|
+
const form = document.createElement('form');
|
19
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name">
|
20
|
+
<glide-core-radio value="value-1" checked label="One"></glide-core-radio>
|
21
|
+
</glide-core-radio-group>`, {
|
22
|
+
parentNode: form,
|
23
|
+
});
|
24
|
+
const radio = component.querySelector('glide-core-radio');
|
25
|
+
assert(radio);
|
26
|
+
radio.checked = false;
|
27
|
+
form.reset();
|
28
|
+
expect(component.value).to.equal('value-1');
|
29
|
+
});
|
30
|
+
it('can reset correctly when the checked radios are changed', async () => {
|
31
|
+
const form = document.createElement('form');
|
32
|
+
const component = await fixture(html `<glide-core-radio-group label="label" name="name">
|
33
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
34
|
+
<glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
|
35
|
+
</glide-core-radio-group>`, {
|
36
|
+
parentNode: form,
|
37
|
+
});
|
38
|
+
const radios = component.querySelectorAll('glide-core-radio');
|
39
|
+
radios[0].click();
|
40
|
+
await elementUpdated(component);
|
41
|
+
expect(radios[0]).to.have.attribute('checked');
|
42
|
+
expect(radios[1]).to.not.have.attribute('checked');
|
43
|
+
expect(component.value).to.equal('value-1');
|
44
|
+
form.reset();
|
45
|
+
await elementUpdated(component);
|
46
|
+
expect(radios[0]).to.not.have.attribute('checked');
|
47
|
+
expect(radios[1]).to.have.attribute('checked');
|
48
|
+
expect(component.value).to.equal('value-2');
|
49
|
+
});
|
50
|
+
it('has `formData` when a radio is checked', async () => {
|
51
|
+
const form = document.createElement('form');
|
52
|
+
await fixture(html `<glide-core-radio-group label="label" name="name">
|
53
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
54
|
+
<glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
|
55
|
+
</glide-core-radio-group>`, {
|
56
|
+
parentNode: form,
|
57
|
+
});
|
58
|
+
const formData = new FormData(form);
|
59
|
+
expect(formData.get('name')).to.be.equal('value-2');
|
60
|
+
});
|
61
|
+
it('has no `formData` when no radios are checked', async () => {
|
62
|
+
const form = document.createElement('form');
|
63
|
+
await fixture(html `<glide-core-radio-group label="label" name="name">
|
64
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
65
|
+
<glide-core-radio value="value-2" label="Two"></glide-core-radio>
|
66
|
+
</glide-core-radio-group>`, {
|
67
|
+
parentNode: form,
|
68
|
+
});
|
69
|
+
const formData = new FormData(form);
|
70
|
+
expect(formData.get('name')).to.be.null;
|
71
|
+
});
|
72
|
+
it('has no `formData` when the group is disabled and one radio is checked', async () => {
|
73
|
+
const form = document.createElement('form');
|
74
|
+
await fixture(html `<glide-core-radio-group label="label" name="name" disabled>
|
75
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
76
|
+
<glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
|
77
|
+
</glide-core-radio-group>`, {
|
78
|
+
parentNode: form,
|
79
|
+
});
|
80
|
+
const formData = new FormData(form);
|
81
|
+
expect(formData.get('name')).to.be.null;
|
82
|
+
});
|
83
|
+
it('has no `formData` when without a `name` but a radio is checked', async () => {
|
84
|
+
const form = document.createElement('form');
|
85
|
+
await fixture(html `<glide-core-radio-group label="label">
|
86
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
87
|
+
<glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
|
88
|
+
</glide-core-radio-group>`, {
|
89
|
+
parentNode: form,
|
90
|
+
});
|
91
|
+
const formData = new FormData(form);
|
92
|
+
expect(formData.get('name')).to.be.null;
|
93
|
+
});
|
94
|
+
it('has no `formData` value when a radio is checked but without a "value"', async () => {
|
95
|
+
const form = document.createElement('form');
|
96
|
+
await fixture(html `<glide-core-radio-group label="label">
|
97
|
+
<glide-core-radio value="value-1" label="One"></glide-core-radio>
|
98
|
+
<glide-core-radio value="value-2" checked label="Two"></glide-core-radio>
|
99
|
+
</glide-core-radio-group>`, {
|
100
|
+
parentNode: form,
|
101
|
+
});
|
102
|
+
const formData = new FormData(form);
|
103
|
+
expect(formData.get('name')).to.be.null;
|
104
|
+
});
|