@spectrum-web-components/picker 0.31.1-react.3 → 0.32.1-overlay.33
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/custom-elements.json +143 -266
- package/package.json +14 -14
- package/src/Picker.d.ts +19 -31
- package/src/Picker.dev.js +127 -172
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +32 -17
- package/src/Picker.js.map +3 -3
- package/src/picker.css.dev.js +67 -35
- package/src/picker.css.dev.js.map +2 -2
- package/src/picker.css.js +67 -35
- package/src/picker.css.js.map +2 -2
- package/src/spectrum-picker.css.dev.js +66 -34
- package/src/spectrum-picker.css.dev.js.map +2 -2
- package/src/spectrum-picker.css.js +66 -34
- package/src/spectrum-picker.css.js.map +2 -2
- package/sync/index.d.ts +4 -1
- package/sync/index.dev.js +1 -6
- package/sync/index.dev.js.map +2 -2
- package/sync/index.js +1 -1
- package/sync/index.js.map +3 -3
- package/test/index.js +195 -142
- package/test/index.js.map +2 -2
- package/test/picker-reparenting.test.js +10 -17
- package/test/picker-reparenting.test.js.map +2 -2
- package/test/picker-responsive.test.js +3 -2
- package/test/picker-responsive.test.js.map +2 -2
- package/test/picker.test.js +1 -1
- package/test/picker.test.js.map +2 -2
package/test/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import {
|
|
3
|
+
aTimeout,
|
|
3
4
|
elementUpdated,
|
|
4
5
|
expect,
|
|
5
6
|
fixture,
|
|
@@ -15,7 +16,6 @@ import {
|
|
|
15
16
|
arrowLeftEvent,
|
|
16
17
|
arrowRightEvent,
|
|
17
18
|
arrowUpEvent,
|
|
18
|
-
escapeEvent,
|
|
19
19
|
testForLitDevWarnings,
|
|
20
20
|
tEvent
|
|
21
21
|
} from "../../../test/testing-helpers.js";
|
|
@@ -27,18 +27,19 @@ import {
|
|
|
27
27
|
import { iconsOnly } from "../stories/picker.stories.js";
|
|
28
28
|
import { sendMouse } from "../../../test/plugins/browser.js";
|
|
29
29
|
import { ignoreResizeObserverLoopError } from "../../../test/testing-helpers.js";
|
|
30
|
-
import
|
|
30
|
+
import "@spectrum-web-components/theme/sp-theme.js";
|
|
31
|
+
import "@spectrum-web-components/theme/src/themes.js";
|
|
31
32
|
ignoreResizeObserverLoopError(before, after);
|
|
32
|
-
const isMenuActiveElement = function() {
|
|
33
|
+
const isMenuActiveElement = function(el) {
|
|
33
34
|
var _a;
|
|
34
|
-
return ((_a =
|
|
35
|
+
return ((_a = el.shadowRoot.activeElement) == null ? void 0 : _a.localName) === "sp-menu";
|
|
35
36
|
};
|
|
36
37
|
export function runPickerTests() {
|
|
37
38
|
let el;
|
|
38
39
|
const pickerFixture = async () => {
|
|
39
40
|
const test = await fixture(
|
|
40
41
|
html`
|
|
41
|
-
<
|
|
42
|
+
<sp-theme scale="medium" color="light">
|
|
42
43
|
<sp-field-label for="picker">
|
|
43
44
|
Where do you live?
|
|
44
45
|
</sp-field-label>
|
|
@@ -56,7 +57,7 @@ export function runPickerTests() {
|
|
|
56
57
|
<sp-menu-item>Save Selection</sp-menu-item>
|
|
57
58
|
<sp-menu-item disabled>Make Work Path</sp-menu-item>
|
|
58
59
|
</sp-picker>
|
|
59
|
-
</
|
|
60
|
+
</sp-theme>
|
|
60
61
|
`
|
|
61
62
|
);
|
|
62
63
|
return test.querySelector("sp-picker");
|
|
@@ -66,34 +67,40 @@ export function runPickerTests() {
|
|
|
66
67
|
el = await pickerFixture();
|
|
67
68
|
await elementUpdated(el);
|
|
68
69
|
});
|
|
69
|
-
afterEach(async () => {
|
|
70
|
-
if (el.open) {
|
|
71
|
-
const closed = oneEvent(el, "sp-closed");
|
|
72
|
-
el.open = false;
|
|
73
|
-
await closed;
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
70
|
it("loads accessibly", async () => {
|
|
77
71
|
await expect(el).to.be.accessible();
|
|
78
72
|
});
|
|
79
73
|
it("closes accessibly", async () => {
|
|
74
|
+
el.focus();
|
|
75
|
+
await elementUpdated(el);
|
|
76
|
+
expect(el.shadowRoot.activeElement).to.equal(el.button);
|
|
80
77
|
const opened = oneEvent(el, "sp-opened");
|
|
81
78
|
el.open = true;
|
|
82
79
|
await opened;
|
|
83
80
|
expect(el.open).to.be.true;
|
|
84
|
-
const accessibleCloseButton =
|
|
81
|
+
const accessibleCloseButton = el.shadowRoot.querySelector(
|
|
85
82
|
".visually-hidden button"
|
|
86
83
|
);
|
|
84
|
+
expect(accessibleCloseButton).to.have.attribute(
|
|
85
|
+
"aria-label",
|
|
86
|
+
"Dismiss"
|
|
87
|
+
);
|
|
87
88
|
const closed = oneEvent(el, "sp-closed");
|
|
88
89
|
accessibleCloseButton.click();
|
|
89
90
|
await closed;
|
|
91
|
+
await elementUpdated(el);
|
|
90
92
|
expect(el.open).to.be.false;
|
|
93
|
+
expect(el.shadowRoot.activeElement).to.equal(el.button);
|
|
94
|
+
expect(document.activeElement).to.eq(el);
|
|
91
95
|
});
|
|
92
96
|
it("accepts new selected item content", async () => {
|
|
97
|
+
await nextFrame();
|
|
98
|
+
await nextFrame();
|
|
93
99
|
const option2 = el.querySelector('[value="option-2"');
|
|
94
100
|
el.value = "option-2";
|
|
95
101
|
await elementUpdated(option2);
|
|
96
102
|
await elementUpdated(el);
|
|
103
|
+
await aTimeout(150);
|
|
97
104
|
expect(el.value).to.equal("option-2");
|
|
98
105
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
99
106
|
"Select Inverse"
|
|
@@ -114,9 +121,11 @@ export function runPickerTests() {
|
|
|
114
121
|
expect((el.button.textContent || "").trim()).to.equal(newLabel2);
|
|
115
122
|
});
|
|
116
123
|
it("accepts new selected item content when open", async () => {
|
|
124
|
+
await nextFrame();
|
|
117
125
|
const option2 = el.querySelector('[value="option-2"');
|
|
118
126
|
el.value = "option-2";
|
|
119
127
|
await elementUpdated(el);
|
|
128
|
+
await aTimeout(150);
|
|
120
129
|
expect(el.value).to.equal("option-2");
|
|
121
130
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
122
131
|
"Select Inverse"
|
|
@@ -137,8 +146,10 @@ export function runPickerTests() {
|
|
|
137
146
|
);
|
|
138
147
|
});
|
|
139
148
|
it("unsets value when children removed", async () => {
|
|
149
|
+
await nextFrame();
|
|
140
150
|
el.value = "option-2";
|
|
141
151
|
await elementUpdated(el);
|
|
152
|
+
await aTimeout(150);
|
|
142
153
|
expect(el.value).to.equal("option-2");
|
|
143
154
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
144
155
|
"Select Inverse"
|
|
@@ -152,8 +163,14 @@ export function runPickerTests() {
|
|
|
152
163
|
});
|
|
153
164
|
await Promise.all(removals);
|
|
154
165
|
await elementUpdated(el);
|
|
155
|
-
|
|
166
|
+
await nextFrame();
|
|
167
|
+
await aTimeout(150);
|
|
168
|
+
expect(el.optionsMenu.childItems.length).to.equal(0);
|
|
169
|
+
if ("showPopover" in document.createElement("div")) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
156
172
|
expect((el.button.textContent || "").trim()).to.equal("");
|
|
173
|
+
expect(el.value).to.equal("");
|
|
157
174
|
});
|
|
158
175
|
it("accepts a new item and value at the same time", async () => {
|
|
159
176
|
el.value = "option-2";
|
|
@@ -176,7 +193,7 @@ export function runPickerTests() {
|
|
|
176
193
|
item.value = "option-new";
|
|
177
194
|
item.textContent = "New Option";
|
|
178
195
|
el.append(item);
|
|
179
|
-
await
|
|
196
|
+
await nextFrame();
|
|
180
197
|
await elementUpdated(el);
|
|
181
198
|
let opened = oneEvent(el, "sp-opened");
|
|
182
199
|
el.open = true;
|
|
@@ -194,6 +211,7 @@ export function runPickerTests() {
|
|
|
194
211
|
expect(el.value, "second time").to.equal("option-new");
|
|
195
212
|
});
|
|
196
213
|
it('manages its "name" value in the accessibility tree', async () => {
|
|
214
|
+
await nextFrame();
|
|
197
215
|
let snapshot = await a11ySnapshot({});
|
|
198
216
|
expect(
|
|
199
217
|
findAccessibilityNode(
|
|
@@ -204,6 +222,8 @@ export function runPickerTests() {
|
|
|
204
222
|
).to.not.be.null;
|
|
205
223
|
el.value = "option-2";
|
|
206
224
|
await elementUpdated(el);
|
|
225
|
+
await nextFrame();
|
|
226
|
+
await nextFrame();
|
|
207
227
|
snapshot = await a11ySnapshot({});
|
|
208
228
|
expect(
|
|
209
229
|
findAccessibilityNode(
|
|
@@ -240,6 +260,7 @@ export function runPickerTests() {
|
|
|
240
260
|
await expect(el).to.be.accessible();
|
|
241
261
|
});
|
|
242
262
|
it("opens with visible focus on a menu item on `DownArrow`", async () => {
|
|
263
|
+
var _a, _b;
|
|
243
264
|
const firstItem = el.querySelector("sp-menu-item");
|
|
244
265
|
await elementUpdated(el);
|
|
245
266
|
expect(firstItem.focused, "should not visually focused").to.be.false;
|
|
@@ -258,12 +279,24 @@ export function runPickerTests() {
|
|
|
258
279
|
});
|
|
259
280
|
await closed;
|
|
260
281
|
expect(el.open).to.be.false;
|
|
261
|
-
|
|
282
|
+
expect(
|
|
283
|
+
document.activeElement === el,
|
|
284
|
+
`focused ${(_a = document.activeElement) == null ? void 0 : _a.localName} instead of back on Picker`
|
|
285
|
+
).to.be.true;
|
|
286
|
+
expect(
|
|
287
|
+
el.shadowRoot.activeElement === el.button,
|
|
288
|
+
`focused ${(_b = el.shadowRoot.activeElement) == null ? void 0 : _b.localName} instead of back on button`
|
|
289
|
+
).to.be.true;
|
|
290
|
+
await waitUntil(
|
|
291
|
+
() => !firstItem.focused,
|
|
292
|
+
"finally, not visually focused"
|
|
293
|
+
);
|
|
262
294
|
});
|
|
263
|
-
it("opens without visible focus on a menu item
|
|
295
|
+
it("opens, on click, without visible focus on a menu item", async () => {
|
|
296
|
+
await nextFrame();
|
|
297
|
+
await nextFrame();
|
|
264
298
|
const firstItem = el.querySelector("sp-menu-item");
|
|
265
|
-
|
|
266
|
-
const boundingRect = el.getBoundingClientRect();
|
|
299
|
+
const boundingRect = el.button.getBoundingClientRect();
|
|
267
300
|
expect(firstItem.focused, "not visually focused").to.be.false;
|
|
268
301
|
const opened = oneEvent(el, "sp-opened");
|
|
269
302
|
sendMouse({
|
|
@@ -278,10 +311,69 @@ export function runPickerTests() {
|
|
|
278
311
|
]
|
|
279
312
|
});
|
|
280
313
|
await opened;
|
|
281
|
-
await elementUpdated(el);
|
|
282
314
|
expect(el.open).to.be.true;
|
|
283
315
|
expect(firstItem.focused, "still not visually focused").to.be.false;
|
|
284
316
|
});
|
|
317
|
+
it("opens/closes multiple times", async () => {
|
|
318
|
+
expect(el.open).to.be.false;
|
|
319
|
+
const boundingRect = el.button.getBoundingClientRect();
|
|
320
|
+
let opened = oneEvent(el, "sp-opened");
|
|
321
|
+
sendMouse({
|
|
322
|
+
steps: [
|
|
323
|
+
{
|
|
324
|
+
type: "click",
|
|
325
|
+
position: [
|
|
326
|
+
boundingRect.x + boundingRect.width / 2,
|
|
327
|
+
boundingRect.y + boundingRect.height / 2
|
|
328
|
+
]
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
});
|
|
332
|
+
await opened;
|
|
333
|
+
expect(el.open).to.be.true;
|
|
334
|
+
let closed = oneEvent(el, "sp-closed");
|
|
335
|
+
sendMouse({
|
|
336
|
+
steps: [
|
|
337
|
+
{
|
|
338
|
+
type: "click",
|
|
339
|
+
position: [
|
|
340
|
+
boundingRect.x + boundingRect.width / 2,
|
|
341
|
+
boundingRect.y + boundingRect.height / 2
|
|
342
|
+
]
|
|
343
|
+
}
|
|
344
|
+
]
|
|
345
|
+
});
|
|
346
|
+
await closed;
|
|
347
|
+
expect(el.open).to.be.false;
|
|
348
|
+
opened = oneEvent(el, "sp-opened");
|
|
349
|
+
sendMouse({
|
|
350
|
+
steps: [
|
|
351
|
+
{
|
|
352
|
+
type: "click",
|
|
353
|
+
position: [
|
|
354
|
+
boundingRect.x + boundingRect.width / 2,
|
|
355
|
+
boundingRect.y + boundingRect.height / 2
|
|
356
|
+
]
|
|
357
|
+
}
|
|
358
|
+
]
|
|
359
|
+
});
|
|
360
|
+
await opened;
|
|
361
|
+
expect(el.open).to.be.true;
|
|
362
|
+
closed = oneEvent(el, "sp-closed");
|
|
363
|
+
sendMouse({
|
|
364
|
+
steps: [
|
|
365
|
+
{
|
|
366
|
+
type: "click",
|
|
367
|
+
position: [
|
|
368
|
+
boundingRect.x + boundingRect.width / 2,
|
|
369
|
+
boundingRect.y + boundingRect.height / 2
|
|
370
|
+
]
|
|
371
|
+
}
|
|
372
|
+
]
|
|
373
|
+
});
|
|
374
|
+
await closed;
|
|
375
|
+
expect(el.open).to.be.false;
|
|
376
|
+
});
|
|
285
377
|
it("closes when becoming disabled", async () => {
|
|
286
378
|
expect(el.open).to.be.false;
|
|
287
379
|
el.click();
|
|
@@ -297,11 +389,15 @@ export function runPickerTests() {
|
|
|
297
389
|
document.body.append(other);
|
|
298
390
|
await elementUpdated(el);
|
|
299
391
|
expect(el.open).to.be.false;
|
|
392
|
+
const opened = oneEvent(el, "sp-opened");
|
|
300
393
|
el.click();
|
|
394
|
+
await opened;
|
|
301
395
|
await elementUpdated(el);
|
|
302
396
|
expect(el.open).to.be.true;
|
|
397
|
+
const closed = oneEvent(el, "sp-closed");
|
|
303
398
|
other.click();
|
|
304
|
-
|
|
399
|
+
closed;
|
|
400
|
+
await elementUpdated(el);
|
|
305
401
|
other.remove();
|
|
306
402
|
});
|
|
307
403
|
it("selects", async () => {
|
|
@@ -313,7 +409,6 @@ export function runPickerTests() {
|
|
|
313
409
|
const opened = oneEvent(el, "sp-opened");
|
|
314
410
|
button.click();
|
|
315
411
|
await opened;
|
|
316
|
-
await elementUpdated(el);
|
|
317
412
|
expect(el.open).to.be.true;
|
|
318
413
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
319
414
|
expect(el.value).to.equal("");
|
|
@@ -333,31 +428,27 @@ export function runPickerTests() {
|
|
|
333
428
|
"sp-menu-item:nth-of-type(2)"
|
|
334
429
|
);
|
|
335
430
|
const button = el.button;
|
|
336
|
-
|
|
431
|
+
let opened = oneEvent(el, "sp-opened");
|
|
337
432
|
button.click();
|
|
338
433
|
await opened;
|
|
339
|
-
await nextFrame();
|
|
340
434
|
expect(el.open).to.be.true;
|
|
341
435
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
342
436
|
expect(el.value).to.equal("");
|
|
343
|
-
|
|
437
|
+
let closed = oneEvent(el, "sp-closed");
|
|
344
438
|
secondItem.click();
|
|
345
439
|
await closed;
|
|
346
|
-
await nextFrame();
|
|
347
440
|
expect(el.open).to.be.false;
|
|
348
441
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Select Inverse");
|
|
349
442
|
expect(el.value).to.equal("option-2");
|
|
350
|
-
|
|
443
|
+
opened = oneEvent(el, "sp-opened");
|
|
351
444
|
button.click();
|
|
352
|
-
await
|
|
353
|
-
await nextFrame();
|
|
445
|
+
await opened;
|
|
354
446
|
expect(el.open).to.be.true;
|
|
355
447
|
expect((_c = el.selectedItem) == null ? void 0 : _c.itemText).to.equal("Select Inverse");
|
|
356
448
|
expect(el.value).to.equal("option-2");
|
|
357
|
-
|
|
449
|
+
closed = oneEvent(el, "sp-closed");
|
|
358
450
|
firstItem.click();
|
|
359
|
-
await
|
|
360
|
-
await nextFrame();
|
|
451
|
+
await closed;
|
|
361
452
|
expect(el.open).to.be.false;
|
|
362
453
|
expect((_d = el.selectedItem) == null ? void 0 : _d.itemText).to.equal("Deselect");
|
|
363
454
|
expect(el.value).to.equal("Deselect");
|
|
@@ -365,7 +456,6 @@ export function runPickerTests() {
|
|
|
365
456
|
it("dispatches bubbling and composed events", async () => {
|
|
366
457
|
const changeSpy = spy();
|
|
367
458
|
const parent = el.parentElement;
|
|
368
|
-
parent.attachShadow({ mode: "open" });
|
|
369
459
|
parent.shadowRoot.append(el);
|
|
370
460
|
const secondItem = el.querySelector(
|
|
371
461
|
"sp-menu-item:nth-of-type(2)"
|
|
@@ -375,11 +465,9 @@ export function runPickerTests() {
|
|
|
375
465
|
const opened = oneEvent(el, "sp-opened");
|
|
376
466
|
el.open = true;
|
|
377
467
|
await opened;
|
|
378
|
-
await elementUpdated(el);
|
|
379
468
|
const closed = oneEvent(el, "sp-closed");
|
|
380
469
|
secondItem.click();
|
|
381
470
|
await closed;
|
|
382
|
-
await elementUpdated(el);
|
|
383
471
|
expect(el.value).to.equal(secondItem.value);
|
|
384
472
|
expect(changeSpy.calledOnce).to.be.true;
|
|
385
473
|
});
|
|
@@ -390,10 +478,9 @@ export function runPickerTests() {
|
|
|
390
478
|
"sp-menu-item:nth-of-type(2)"
|
|
391
479
|
);
|
|
392
480
|
const button = el.button;
|
|
393
|
-
|
|
481
|
+
const opened = oneEvent(el, "sp-opened");
|
|
394
482
|
button.click();
|
|
395
483
|
await opened;
|
|
396
|
-
await elementUpdated(el);
|
|
397
484
|
expect(el.open).to.be.true;
|
|
398
485
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
399
486
|
expect(el.value).to.equal("");
|
|
@@ -402,14 +489,12 @@ export function runPickerTests() {
|
|
|
402
489
|
event.preventDefault();
|
|
403
490
|
preventChangeSpy();
|
|
404
491
|
});
|
|
405
|
-
const closed = oneEvent(el, "sp-closed");
|
|
406
|
-
opened = oneEvent(el, "sp-opened");
|
|
407
492
|
secondItem.click();
|
|
408
|
-
await
|
|
409
|
-
await
|
|
410
|
-
await elementUpdated(el);
|
|
493
|
+
await nextFrame();
|
|
494
|
+
await nextFrame();
|
|
411
495
|
expect(preventChangeSpy.calledOnce).to.be.true;
|
|
412
496
|
expect(secondItem.selected, "selection prevented").to.be.false;
|
|
497
|
+
expect(el.open).to.be.true;
|
|
413
498
|
});
|
|
414
499
|
it("can throw focus after `change`", async () => {
|
|
415
500
|
var _a;
|
|
@@ -452,20 +537,17 @@ export function runPickerTests() {
|
|
|
452
537
|
button.dispatchEvent(tEvent());
|
|
453
538
|
await elementUpdated(el);
|
|
454
539
|
expect(el.open, "still closed").to.be.false;
|
|
540
|
+
const opened = oneEvent(el, "sp-opened");
|
|
455
541
|
button.dispatchEvent(arrowUpEvent());
|
|
456
542
|
await elementUpdated(el);
|
|
457
543
|
expect(el.open, "open by ArrowUp").to.be.true;
|
|
458
|
-
await
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
await
|
|
464
|
-
|
|
465
|
-
await waitUntil(
|
|
466
|
-
() => document.querySelector("active-overlay") === null,
|
|
467
|
-
"an active-overlay has been inserted on the page"
|
|
468
|
-
);
|
|
544
|
+
await opened;
|
|
545
|
+
const closed = oneEvent(el, "sp-closed");
|
|
546
|
+
sendKeys({
|
|
547
|
+
press: "Escape"
|
|
548
|
+
});
|
|
549
|
+
await closed;
|
|
550
|
+
expect(el.open).to.be.false;
|
|
469
551
|
});
|
|
470
552
|
it("opens on ArrowDown", async () => {
|
|
471
553
|
var _a, _b;
|
|
@@ -479,19 +561,18 @@ export function runPickerTests() {
|
|
|
479
561
|
const opened = oneEvent(el, "sp-opened");
|
|
480
562
|
button.dispatchEvent(arrowDownEvent());
|
|
481
563
|
await opened;
|
|
482
|
-
await elementUpdated(el);
|
|
483
564
|
expect(el.open, "open by ArrowDown").to.be.true;
|
|
484
565
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
485
566
|
expect(el.value).to.equal("");
|
|
486
567
|
const closed = oneEvent(el, "sp-closed");
|
|
487
568
|
firstItem.click();
|
|
488
569
|
await closed;
|
|
489
|
-
await elementUpdated(el);
|
|
490
570
|
expect(el.open).to.be.false;
|
|
491
571
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Deselect");
|
|
492
572
|
expect(el.value).to.equal("Deselect");
|
|
493
573
|
});
|
|
494
574
|
it("quick selects on ArrowLeft/Right", async () => {
|
|
575
|
+
await nextFrame();
|
|
495
576
|
const selectionSpy = spy();
|
|
496
577
|
el.addEventListener("change", (event) => {
|
|
497
578
|
const { value } = event.target;
|
|
@@ -519,6 +600,7 @@ export function runPickerTests() {
|
|
|
519
600
|
expect(selectionSpy.calledWith("Make Work Path")).to.be.false;
|
|
520
601
|
});
|
|
521
602
|
it("quick selects first item on ArrowRight when no value", async () => {
|
|
603
|
+
await nextFrame();
|
|
522
604
|
const selectionSpy = spy();
|
|
523
605
|
el.addEventListener("change", (event) => {
|
|
524
606
|
const { value } = event.target;
|
|
@@ -536,6 +618,10 @@ export function runPickerTests() {
|
|
|
536
618
|
});
|
|
537
619
|
it("refocuses on list when open", async () => {
|
|
538
620
|
const firstItem = el.querySelector("sp-menu-item");
|
|
621
|
+
const thirdItem = el.querySelector(
|
|
622
|
+
"sp-menu-item:nth-of-type(3)"
|
|
623
|
+
);
|
|
624
|
+
const button = el.button;
|
|
539
625
|
const input = document.createElement("input");
|
|
540
626
|
el.insertAdjacentElement("afterend", input);
|
|
541
627
|
el.focus();
|
|
@@ -543,44 +629,41 @@ export function runPickerTests() {
|
|
|
543
629
|
expect(document.activeElement === input).to.be.true;
|
|
544
630
|
await sendKeys({ press: "Shift+Tab" });
|
|
545
631
|
expect(document.activeElement === el).to.be.true;
|
|
546
|
-
await sendKeys({ press: "Enter" });
|
|
547
632
|
const opened = oneEvent(el, "sp-opened");
|
|
548
|
-
|
|
633
|
+
sendKeys({ press: "Enter" });
|
|
549
634
|
await opened;
|
|
550
635
|
await elementUpdated(el);
|
|
551
636
|
await waitUntil(
|
|
552
637
|
() => firstItem.focused,
|
|
553
638
|
"The first items should have become focused visually."
|
|
554
639
|
);
|
|
555
|
-
|
|
556
|
-
await
|
|
557
|
-
expect(
|
|
640
|
+
await sendKeys({ press: "ArrowDown" });
|
|
641
|
+
await sendKeys({ press: "ArrowDown" });
|
|
642
|
+
expect(thirdItem.focused).to.be.true;
|
|
643
|
+
button.focus();
|
|
644
|
+
expect(isMenuActiveElement(el)).to.be.false;
|
|
558
645
|
el.focus();
|
|
559
646
|
await elementUpdated(el);
|
|
560
647
|
await waitUntil(
|
|
561
|
-
() => isMenuActiveElement(),
|
|
648
|
+
() => isMenuActiveElement(el),
|
|
562
649
|
"first item refocused"
|
|
563
650
|
);
|
|
564
|
-
expect(el
|
|
565
|
-
expect(
|
|
566
|
-
await sendKeys({ press: "ArrowDown" });
|
|
567
|
-
await sendKeys({ press: "ArrowUp" });
|
|
568
|
-
expect(firstItem.focused).to.be.true;
|
|
651
|
+
expect(isMenuActiveElement(el)).to.be.true;
|
|
652
|
+
expect(thirdItem.focused).to.be.true;
|
|
569
653
|
});
|
|
570
|
-
it("
|
|
654
|
+
it("allows tabing to close", async () => {
|
|
655
|
+
const input = document.createElement("input");
|
|
656
|
+
el.insertAdjacentElement("afterend", input);
|
|
657
|
+
const opened = oneEvent(el, "sp-opened");
|
|
571
658
|
el.open = true;
|
|
572
|
-
await
|
|
659
|
+
await opened;
|
|
660
|
+
await nextFrame();
|
|
573
661
|
expect(el.open).to.be.true;
|
|
574
662
|
el.focus();
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
);
|
|
580
|
-
expect(el.open).to.be.true;
|
|
581
|
-
expect(isMenuActiveElement()).to.be.true;
|
|
582
|
-
await sendKeys({ press: "Tab" });
|
|
583
|
-
expect(el.open, "stays open").to.be.true;
|
|
663
|
+
const closed = oneEvent(el, "sp-closed");
|
|
664
|
+
sendKeys({ press: "Tab" });
|
|
665
|
+
await closed;
|
|
666
|
+
expect(el.open, "closes").to.be.false;
|
|
584
667
|
});
|
|
585
668
|
describe("tab order", () => {
|
|
586
669
|
let input1;
|
|
@@ -635,51 +718,7 @@ export function runPickerTests() {
|
|
|
635
718
|
input1
|
|
636
719
|
);
|
|
637
720
|
});
|
|
638
|
-
it(
|
|
639
|
-
el.focus();
|
|
640
|
-
await nextFrame();
|
|
641
|
-
expect(document.activeElement, "focuses el").to.equal(el);
|
|
642
|
-
const opened = oneEvent(el, "sp-opened");
|
|
643
|
-
sendKeys({ press: "ArrowDown" });
|
|
644
|
-
await opened;
|
|
645
|
-
expect(el.open, "opened").to.be.true;
|
|
646
|
-
await waitUntil(
|
|
647
|
-
() => isMenuActiveElement(),
|
|
648
|
-
"first item focused"
|
|
649
|
-
);
|
|
650
|
-
const activeElement = document.activeElement;
|
|
651
|
-
if (!isWebKit()) {
|
|
652
|
-
const blured = oneEvent(activeElement, "blur");
|
|
653
|
-
sendKeys({ press: "Tab" });
|
|
654
|
-
await blured;
|
|
655
|
-
expect(el.open, "picker still open").to.be.true;
|
|
656
|
-
expect(document.activeElement === input1).to.be.false;
|
|
657
|
-
expect(document.activeElement === input2).to.be.false;
|
|
658
|
-
}
|
|
659
|
-
});
|
|
660
|
-
it('traps tab in the menu as a `type="modal"` overlay backwards', async () => {
|
|
661
|
-
el.focus();
|
|
662
|
-
await nextFrame();
|
|
663
|
-
expect(document.activeElement, "focuses el").to.equal(el);
|
|
664
|
-
const opened = oneEvent(el, "sp-opened");
|
|
665
|
-
await sendKeys({ press: "ArrowDown" });
|
|
666
|
-
await opened;
|
|
667
|
-
expect(el.open, "opened").to.be.true;
|
|
668
|
-
await waitUntil(
|
|
669
|
-
() => isMenuActiveElement(),
|
|
670
|
-
"first item focused"
|
|
671
|
-
);
|
|
672
|
-
const activeElement = document.activeElement;
|
|
673
|
-
if (!isWebKit()) {
|
|
674
|
-
const blured = oneEvent(activeElement, "blur");
|
|
675
|
-
sendKeys({ press: "Shift+Tab" });
|
|
676
|
-
await blured;
|
|
677
|
-
expect(el.open, "picker still open").to.be.true;
|
|
678
|
-
expect(document.activeElement === input1).to.be.false;
|
|
679
|
-
expect(document.activeElement === input2).to.be.false;
|
|
680
|
-
}
|
|
681
|
-
});
|
|
682
|
-
it("can close and immediate tab to the next tab stop", async () => {
|
|
721
|
+
it("can close and immediately tab to the next tab stop", async () => {
|
|
683
722
|
el.focus();
|
|
684
723
|
await nextFrame();
|
|
685
724
|
expect(document.activeElement, "focuses el").to.equal(el);
|
|
@@ -688,7 +727,7 @@ export function runPickerTests() {
|
|
|
688
727
|
await opened;
|
|
689
728
|
expect(el.open, "opened").to.be.true;
|
|
690
729
|
await waitUntil(
|
|
691
|
-
() => isMenuActiveElement(),
|
|
730
|
+
() => isMenuActiveElement(el),
|
|
692
731
|
"first item focused"
|
|
693
732
|
);
|
|
694
733
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -705,13 +744,13 @@ export function runPickerTests() {
|
|
|
705
744
|
it("can close and immediate shift+tab to the previous tab stop", async () => {
|
|
706
745
|
el.focus();
|
|
707
746
|
await nextFrame();
|
|
708
|
-
expect(document.activeElement, "focuses el").to.
|
|
747
|
+
expect(document.activeElement === el, "focuses el").to.be.true;
|
|
709
748
|
const opened = oneEvent(el, "sp-opened");
|
|
710
749
|
await sendKeys({ press: "ArrowUp" });
|
|
711
750
|
await opened;
|
|
712
751
|
expect(el.open, "opened").to.be.true;
|
|
713
752
|
await waitUntil(
|
|
714
|
-
() => isMenuActiveElement(),
|
|
753
|
+
() => isMenuActiveElement(el),
|
|
715
754
|
"first item focused"
|
|
716
755
|
);
|
|
717
756
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -720,7 +759,7 @@ export function runPickerTests() {
|
|
|
720
759
|
expect(el.open).to.be.false;
|
|
721
760
|
expect(document.activeElement === el).to.be.true;
|
|
722
761
|
const focused = oneEvent(input1, "focus");
|
|
723
|
-
|
|
762
|
+
sendKeys({ press: "Shift+Tab" });
|
|
724
763
|
await focused;
|
|
725
764
|
expect(el.open).to.be.false;
|
|
726
765
|
expect(document.activeElement === input1).to.be.true;
|
|
@@ -735,8 +774,7 @@ export function runPickerTests() {
|
|
|
735
774
|
expect(el.open).to.be.false;
|
|
736
775
|
});
|
|
737
776
|
it("scrolls selected into view on open", async () => {
|
|
738
|
-
|
|
739
|
-
el.popoverEl.style.height = "40px";
|
|
777
|
+
el.shadowRoot.querySelector("sp-popover").style.height = "40px";
|
|
740
778
|
const firstItem = el.querySelector(
|
|
741
779
|
"sp-menu-item:first-child"
|
|
742
780
|
);
|
|
@@ -746,11 +784,15 @@ export function runPickerTests() {
|
|
|
746
784
|
lastItem.disabled = false;
|
|
747
785
|
el.value = lastItem.value;
|
|
748
786
|
await elementUpdated(el);
|
|
787
|
+
const opened = oneEvent(el, "sp-opened");
|
|
749
788
|
el.open = true;
|
|
750
|
-
await
|
|
751
|
-
await waitUntil(
|
|
789
|
+
await opened;
|
|
790
|
+
await waitUntil(
|
|
791
|
+
() => isMenuActiveElement(el),
|
|
792
|
+
"first item focused"
|
|
793
|
+
);
|
|
752
794
|
const getParentOffset = (el2) => {
|
|
753
|
-
const parentScroll = el2.parentElement.scrollTop;
|
|
795
|
+
const parentScroll = el2.assignedSlot.parentElement.scrollTop;
|
|
754
796
|
const parentOffset = el2.offsetTop - parentScroll;
|
|
755
797
|
return parentOffset;
|
|
756
798
|
};
|
|
@@ -759,7 +801,9 @@ export function runPickerTests() {
|
|
|
759
801
|
lastItem.dispatchEvent(
|
|
760
802
|
new FocusEvent("focusin", { bubbles: true })
|
|
761
803
|
);
|
|
762
|
-
|
|
804
|
+
await sendKeys({
|
|
805
|
+
press: "ArrowDown"
|
|
806
|
+
});
|
|
763
807
|
await elementUpdated(el);
|
|
764
808
|
await nextFrame();
|
|
765
809
|
expect(getParentOffset(lastItem)).to.be.greaterThan(40);
|
|
@@ -797,6 +841,8 @@ export function runPickerTests() {
|
|
|
797
841
|
beforeEach(async () => {
|
|
798
842
|
el = await groupedFixture();
|
|
799
843
|
await elementUpdated(el);
|
|
844
|
+
await nextFrame();
|
|
845
|
+
await nextFrame();
|
|
800
846
|
});
|
|
801
847
|
it("selects the item with a matching value in a group", async () => {
|
|
802
848
|
const item = el.querySelector("#should-be-selected");
|
|
@@ -834,6 +880,7 @@ export function runPickerTests() {
|
|
|
834
880
|
beforeEach(async () => {
|
|
835
881
|
el = await pickerFixture2();
|
|
836
882
|
await elementUpdated(el);
|
|
883
|
+
await nextFrame();
|
|
837
884
|
});
|
|
838
885
|
afterEach(async () => {
|
|
839
886
|
if (el.open) {
|
|
@@ -919,6 +966,7 @@ export function runPickerTests() {
|
|
|
919
966
|
beforeEach(async () => {
|
|
920
967
|
el = await pickerFixture2();
|
|
921
968
|
await elementUpdated(el);
|
|
969
|
+
await nextFrame();
|
|
922
970
|
});
|
|
923
971
|
afterEach(async () => {
|
|
924
972
|
if (el.open) {
|
|
@@ -935,7 +983,6 @@ export function runPickerTests() {
|
|
|
935
983
|
const opened = oneEvent(el, "sp-opened");
|
|
936
984
|
el.button.click();
|
|
937
985
|
await opened;
|
|
938
|
-
await elementUpdated(el);
|
|
939
986
|
expect(el.open).to.be.true;
|
|
940
987
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
941
988
|
expect(el.value).to.equal("");
|
|
@@ -955,6 +1002,7 @@ export function runPickerTests() {
|
|
|
955
1002
|
`);
|
|
956
1003
|
const el2 = test.querySelector("sp-picker");
|
|
957
1004
|
await elementUpdated(el2);
|
|
1005
|
+
await nextFrame();
|
|
958
1006
|
let snapshot = await a11ySnapshot({});
|
|
959
1007
|
expect(
|
|
960
1008
|
findAccessibilityNode(
|
|
@@ -965,6 +1013,9 @@ export function runPickerTests() {
|
|
|
965
1013
|
).to.not.be.null;
|
|
966
1014
|
el2.value = "2";
|
|
967
1015
|
await elementUpdated(el2);
|
|
1016
|
+
await nextFrame();
|
|
1017
|
+
await nextFrame();
|
|
1018
|
+
expect(el2.value).to.equal("2");
|
|
968
1019
|
snapshot = await a11ySnapshot({});
|
|
969
1020
|
expect(
|
|
970
1021
|
findAccessibilityNode(
|
|
@@ -977,6 +1028,8 @@ export function runPickerTests() {
|
|
|
977
1028
|
it("toggles between pickers", async () => {
|
|
978
1029
|
const el2 = await pickerFixture();
|
|
979
1030
|
const el1 = await pickerFixture();
|
|
1031
|
+
el1.parentElement.style.float = "left";
|
|
1032
|
+
el2.parentElement.style.float = "left";
|
|
980
1033
|
el1.id = "away";
|
|
981
1034
|
el2.id = "other";
|
|
982
1035
|
await Promise.all([elementUpdated(el1), elementUpdated(el2)]);
|
|
@@ -997,8 +1050,8 @@ export function runPickerTests() {
|
|
|
997
1050
|
closed = oneEvent(el2, "sp-closed");
|
|
998
1051
|
el1.click();
|
|
999
1052
|
await Promise.all([open, closed]);
|
|
1000
|
-
expect(el1.open).to.be.true;
|
|
1001
1053
|
expect(el2.open).to.be.false;
|
|
1054
|
+
expect(el1.open).to.be.true;
|
|
1002
1055
|
closed = oneEvent(el1, "sp-closed");
|
|
1003
1056
|
sendKeys({
|
|
1004
1057
|
press: "Escape"
|
|
@@ -1007,7 +1060,7 @@ export function runPickerTests() {
|
|
|
1007
1060
|
expect(el1.open).to.be.false;
|
|
1008
1061
|
});
|
|
1009
1062
|
it("displays selected item text by default", async () => {
|
|
1010
|
-
var _a, _b, _c, _d;
|
|
1063
|
+
var _a, _b, _c, _d, _e;
|
|
1011
1064
|
const el2 = await fixture(
|
|
1012
1065
|
html`
|
|
1013
1066
|
<sp-picker
|
|
@@ -1024,6 +1077,7 @@ export function runPickerTests() {
|
|
|
1024
1077
|
</sp-picker>
|
|
1025
1078
|
`
|
|
1026
1079
|
);
|
|
1080
|
+
await nextFrame();
|
|
1027
1081
|
await elementUpdated(el2);
|
|
1028
1082
|
await waitUntil(
|
|
1029
1083
|
() => {
|
|
@@ -1049,11 +1103,14 @@ export function runPickerTests() {
|
|
|
1049
1103
|
const opened = oneEvent(el2, "sp-opened");
|
|
1050
1104
|
sendKeys({ press: "Enter" });
|
|
1051
1105
|
await opened;
|
|
1052
|
-
await elementUpdated(el2.optionsMenu);
|
|
1053
1106
|
expect(
|
|
1054
|
-
el2
|
|
1107
|
+
el2 === document.activeElement,
|
|
1055
1108
|
`activeElement is ${(_d = document.activeElement) == null ? void 0 : _d.localName}`
|
|
1056
1109
|
).to.be.true;
|
|
1110
|
+
expect(
|
|
1111
|
+
el2.optionsMenu === el2.shadowRoot.activeElement,
|
|
1112
|
+
`activeElement is ${(_e = el2.shadowRoot.activeElement) == null ? void 0 : _e.localName}`
|
|
1113
|
+
).to.be.true;
|
|
1057
1114
|
expect(firstItem.focused, 'firstItem NOT "focused"').to.be.false;
|
|
1058
1115
|
expect(secondItem.focused, 'secondItem "focused"').to.be.true;
|
|
1059
1116
|
expect(el2.optionsMenu.getAttribute("aria-activedescendant")).to.equal(
|
|
@@ -1140,15 +1197,11 @@ export function runPickerTests() {
|
|
|
1140
1197
|
await elementUpdated(el2);
|
|
1141
1198
|
expect(openedSpy.calledOnce).to.be.true;
|
|
1142
1199
|
expect(closedSpy.calledOnce).to.be.false;
|
|
1143
|
-
const openedEvent = openedSpy.args[0][0];
|
|
1144
|
-
expect(openedEvent.detail.interaction).to.equal("modal");
|
|
1145
1200
|
const closed = oneEvent(el2, "sp-closed");
|
|
1146
1201
|
el2.open = false;
|
|
1147
1202
|
await closed;
|
|
1148
1203
|
await elementUpdated(el2);
|
|
1149
1204
|
expect(closedSpy.calledOnce).to.be.true;
|
|
1150
|
-
const closedEvent = closedSpy.args[0][0];
|
|
1151
|
-
expect(closedEvent.detail.interaction).to.equal("modal");
|
|
1152
1205
|
});
|
|
1153
1206
|
}
|
|
1154
1207
|
//# sourceMappingURL=index.js.map
|