@spectrum-web-components/picker 0.35.0 → 0.35.1-rc.15
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 +268 -376
- package/package.json +13 -13
- package/src/Picker.d.ts +32 -40
- package/src/Picker.dev.js +181 -187
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +44 -28
- package/src/Picker.js.map +3 -3
- package/src/picker.css.dev.js +1 -1
- package/src/picker.css.dev.js.map +1 -1
- package/src/picker.css.js +1 -1
- package/src/picker.css.js.map +1 -1
- 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 +204 -153
- package/test/index.js.map +2 -2
- package/test/picker-reparenting.test.js +13 -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";
|
|
@@ -32,21 +32,20 @@ import {
|
|
|
32
32
|
} from "../stories/picker.stories.js";
|
|
33
33
|
import { sendMouse } from "../../../test/plugins/browser.js";
|
|
34
34
|
import { ignoreResizeObserverLoopError } from "../../../test/testing-helpers.js";
|
|
35
|
-
import {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
} from "@spectrum-web-components/shared/src/platform.js";
|
|
35
|
+
import { isFirefox } from "@spectrum-web-components/shared/src/platform.js";
|
|
36
|
+
import "@spectrum-web-components/theme/sp-theme.js";
|
|
37
|
+
import "@spectrum-web-components/theme/src/themes.js";
|
|
39
38
|
ignoreResizeObserverLoopError(before, after);
|
|
40
|
-
const isMenuActiveElement = function() {
|
|
39
|
+
const isMenuActiveElement = function(el) {
|
|
41
40
|
var _a;
|
|
42
|
-
return ((_a =
|
|
41
|
+
return ((_a = el.shadowRoot.activeElement) == null ? void 0 : _a.localName) === "sp-menu";
|
|
43
42
|
};
|
|
44
43
|
export function runPickerTests() {
|
|
45
44
|
let el;
|
|
46
45
|
const pickerFixture = async () => {
|
|
47
46
|
const test = await fixture(
|
|
48
47
|
html`
|
|
49
|
-
<
|
|
48
|
+
<sp-theme scale="medium" color="light">
|
|
50
49
|
<sp-field-label for="picker">
|
|
51
50
|
Where do you live?
|
|
52
51
|
</sp-field-label>
|
|
@@ -64,7 +63,7 @@ export function runPickerTests() {
|
|
|
64
63
|
<sp-menu-item>Save Selection</sp-menu-item>
|
|
65
64
|
<sp-menu-item disabled>Make Work Path</sp-menu-item>
|
|
66
65
|
</sp-picker>
|
|
67
|
-
</
|
|
66
|
+
</sp-theme>
|
|
68
67
|
`
|
|
69
68
|
);
|
|
70
69
|
return test.querySelector("sp-picker");
|
|
@@ -91,6 +90,8 @@ export function runPickerTests() {
|
|
|
91
90
|
).to.not.be.null;
|
|
92
91
|
el2.value = "option-2";
|
|
93
92
|
await elementUpdated(el2);
|
|
93
|
+
await nextFrame();
|
|
94
|
+
await nextFrame();
|
|
94
95
|
snapshot = await a11ySnapshot({});
|
|
95
96
|
expect(
|
|
96
97
|
findAccessibilityNode(
|
|
@@ -121,6 +122,8 @@ export function runPickerTests() {
|
|
|
121
122
|
).to.not.be.null;
|
|
122
123
|
el2.value = "option-2";
|
|
123
124
|
await elementUpdated(el2);
|
|
125
|
+
await nextFrame();
|
|
126
|
+
await nextFrame();
|
|
124
127
|
snapshot = await a11ySnapshot({});
|
|
125
128
|
expect(
|
|
126
129
|
findAccessibilityNode(
|
|
@@ -151,6 +154,8 @@ export function runPickerTests() {
|
|
|
151
154
|
).to.not.be.null;
|
|
152
155
|
el2.value = "option-2";
|
|
153
156
|
await elementUpdated(el2);
|
|
157
|
+
await nextFrame();
|
|
158
|
+
await nextFrame();
|
|
154
159
|
snapshot = await a11ySnapshot({});
|
|
155
160
|
if (isFirefox()) {
|
|
156
161
|
expect(
|
|
@@ -176,13 +181,6 @@ export function runPickerTests() {
|
|
|
176
181
|
el = await pickerFixture();
|
|
177
182
|
await elementUpdated(el);
|
|
178
183
|
});
|
|
179
|
-
afterEach(async () => {
|
|
180
|
-
if (el.open) {
|
|
181
|
-
const closed = oneEvent(el, "sp-closed");
|
|
182
|
-
el.open = false;
|
|
183
|
-
await closed;
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
184
|
it("loads accessibly", async () => {
|
|
187
185
|
await expect(el).to.be.accessible();
|
|
188
186
|
});
|
|
@@ -194,7 +192,7 @@ export function runPickerTests() {
|
|
|
194
192
|
el.open = true;
|
|
195
193
|
await opened;
|
|
196
194
|
expect(el.open).to.be.true;
|
|
197
|
-
const accessibleCloseButton =
|
|
195
|
+
const accessibleCloseButton = el.shadowRoot.querySelector(
|
|
198
196
|
".visually-hidden button"
|
|
199
197
|
);
|
|
200
198
|
expect(accessibleCloseButton).to.have.attribute(
|
|
@@ -210,10 +208,13 @@ export function runPickerTests() {
|
|
|
210
208
|
expect(document.activeElement).to.eq(el);
|
|
211
209
|
});
|
|
212
210
|
it("accepts new selected item content", async () => {
|
|
211
|
+
await nextFrame();
|
|
212
|
+
await nextFrame();
|
|
213
213
|
const option2 = el.querySelector('[value="option-2"');
|
|
214
214
|
el.value = "option-2";
|
|
215
215
|
await elementUpdated(option2);
|
|
216
216
|
await elementUpdated(el);
|
|
217
|
+
await aTimeout(150);
|
|
217
218
|
expect(el.value).to.equal("option-2");
|
|
218
219
|
expect((el.button.textContent || "").trim()).to.include(
|
|
219
220
|
"Select Inverse"
|
|
@@ -234,9 +235,11 @@ export function runPickerTests() {
|
|
|
234
235
|
expect((el.button.textContent || "").trim()).to.include(newLabel2);
|
|
235
236
|
});
|
|
236
237
|
it("accepts new selected item content when open", async () => {
|
|
238
|
+
await nextFrame();
|
|
237
239
|
const option2 = el.querySelector('[value="option-2"');
|
|
238
240
|
el.value = "option-2";
|
|
239
241
|
await elementUpdated(el);
|
|
242
|
+
await aTimeout(150);
|
|
240
243
|
expect(el.value).to.equal("option-2");
|
|
241
244
|
expect((el.button.textContent || "").trim()).to.include(
|
|
242
245
|
"Select Inverse"
|
|
@@ -257,21 +260,27 @@ export function runPickerTests() {
|
|
|
257
260
|
);
|
|
258
261
|
});
|
|
259
262
|
it("unsets value when children removed", async () => {
|
|
263
|
+
await nextFrame();
|
|
260
264
|
el.value = "option-2";
|
|
261
265
|
await elementUpdated(el);
|
|
266
|
+
await aTimeout(150);
|
|
262
267
|
expect(el.value).to.equal("option-2");
|
|
263
268
|
expect((el.button.textContent || "").trim()).to.include(
|
|
264
269
|
"Select Inverse"
|
|
265
270
|
);
|
|
266
271
|
const items = el.querySelectorAll("sp-menu-item");
|
|
267
|
-
const removals = [];
|
|
268
272
|
items.forEach((item) => {
|
|
269
|
-
const removal = oneEvent(el, "sp-menu-item-removed");
|
|
270
273
|
item.remove();
|
|
271
|
-
removals.push(removal);
|
|
272
274
|
});
|
|
273
|
-
await Promise.all(removals);
|
|
274
275
|
await elementUpdated(el);
|
|
276
|
+
await nextFrame();
|
|
277
|
+
await aTimeout(150);
|
|
278
|
+
expect(
|
|
279
|
+
el.optionsMenu.childItems.length
|
|
280
|
+
).to.equal(0);
|
|
281
|
+
if ("showPopover" in document.createElement("div")) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
275
284
|
expect(el.value).to.equal("");
|
|
276
285
|
expect((el.button.textContent || "").trim()).to.not.include(
|
|
277
286
|
"Select Inverse"
|
|
@@ -298,7 +307,7 @@ export function runPickerTests() {
|
|
|
298
307
|
item.value = "option-new";
|
|
299
308
|
item.textContent = "New Option";
|
|
300
309
|
el.append(item);
|
|
301
|
-
await
|
|
310
|
+
await nextFrame();
|
|
302
311
|
await elementUpdated(el);
|
|
303
312
|
let opened = oneEvent(el, "sp-opened");
|
|
304
313
|
el.open = true;
|
|
@@ -316,6 +325,7 @@ export function runPickerTests() {
|
|
|
316
325
|
expect(el.value, "second time").to.equal("option-new");
|
|
317
326
|
});
|
|
318
327
|
it('manages its "name" value in the accessibility tree', async () => {
|
|
328
|
+
await nextFrame();
|
|
319
329
|
let snapshot = await a11ySnapshot({});
|
|
320
330
|
expect(
|
|
321
331
|
findAccessibilityNode(
|
|
@@ -326,6 +336,8 @@ export function runPickerTests() {
|
|
|
326
336
|
).to.not.be.null;
|
|
327
337
|
el.value = "option-2";
|
|
328
338
|
await elementUpdated(el);
|
|
339
|
+
await nextFrame();
|
|
340
|
+
await nextFrame();
|
|
329
341
|
snapshot = await a11ySnapshot({});
|
|
330
342
|
expect(
|
|
331
343
|
findAccessibilityNode(
|
|
@@ -342,12 +354,16 @@ export function runPickerTests() {
|
|
|
342
354
|
el.open = true;
|
|
343
355
|
await opened;
|
|
344
356
|
expect(
|
|
345
|
-
el.optionsMenu.getAttribute(
|
|
357
|
+
el.optionsMenu.getAttribute(
|
|
358
|
+
"aria-activedescendant"
|
|
359
|
+
)
|
|
346
360
|
).to.equal(firstItem == null ? void 0 : firstItem.id);
|
|
347
361
|
await sendKeys({ press: "ArrowDown" });
|
|
348
362
|
await elementUpdated(el);
|
|
349
363
|
expect(
|
|
350
|
-
el.optionsMenu.getAttribute(
|
|
364
|
+
el.optionsMenu.getAttribute(
|
|
365
|
+
"aria-activedescendant"
|
|
366
|
+
)
|
|
351
367
|
).to.equal(secondItem == null ? void 0 : secondItem.id);
|
|
352
368
|
});
|
|
353
369
|
it("renders invalid accessibly", async () => {
|
|
@@ -362,6 +378,7 @@ export function runPickerTests() {
|
|
|
362
378
|
await expect(el).to.be.accessible();
|
|
363
379
|
});
|
|
364
380
|
it("opens with visible focus on a menu item on `DownArrow`", async () => {
|
|
381
|
+
var _a, _b;
|
|
365
382
|
const firstItem = el.querySelector("sp-menu-item");
|
|
366
383
|
await elementUpdated(el);
|
|
367
384
|
expect(firstItem.focused, "should not visually focused").to.be.false;
|
|
@@ -380,12 +397,24 @@ export function runPickerTests() {
|
|
|
380
397
|
});
|
|
381
398
|
await closed;
|
|
382
399
|
expect(el.open).to.be.false;
|
|
383
|
-
|
|
400
|
+
expect(
|
|
401
|
+
document.activeElement === el,
|
|
402
|
+
`focused ${(_a = document.activeElement) == null ? void 0 : _a.localName} instead of back on Picker`
|
|
403
|
+
).to.be.true;
|
|
404
|
+
expect(
|
|
405
|
+
el.shadowRoot.activeElement === el.button,
|
|
406
|
+
`focused ${(_b = el.shadowRoot.activeElement) == null ? void 0 : _b.localName} instead of back on button`
|
|
407
|
+
).to.be.true;
|
|
408
|
+
await waitUntil(
|
|
409
|
+
() => !firstItem.focused,
|
|
410
|
+
"finally, not visually focused"
|
|
411
|
+
);
|
|
384
412
|
});
|
|
385
|
-
it("opens without visible focus on a menu item
|
|
413
|
+
it("opens, on click, without visible focus on a menu item", async () => {
|
|
414
|
+
await nextFrame();
|
|
415
|
+
await nextFrame();
|
|
386
416
|
const firstItem = el.querySelector("sp-menu-item");
|
|
387
|
-
|
|
388
|
-
const boundingRect = el.getBoundingClientRect();
|
|
417
|
+
const boundingRect = el.button.getBoundingClientRect();
|
|
389
418
|
expect(firstItem.focused, "not visually focused").to.be.false;
|
|
390
419
|
const opened = oneEvent(el, "sp-opened");
|
|
391
420
|
sendMouse({
|
|
@@ -400,10 +429,69 @@ export function runPickerTests() {
|
|
|
400
429
|
]
|
|
401
430
|
});
|
|
402
431
|
await opened;
|
|
403
|
-
await elementUpdated(el);
|
|
404
432
|
expect(el.open).to.be.true;
|
|
405
433
|
expect(firstItem.focused, "still not visually focused").to.be.false;
|
|
406
434
|
});
|
|
435
|
+
it("opens/closes multiple times", async () => {
|
|
436
|
+
expect(el.open).to.be.false;
|
|
437
|
+
const boundingRect = el.button.getBoundingClientRect();
|
|
438
|
+
let opened = oneEvent(el, "sp-opened");
|
|
439
|
+
sendMouse({
|
|
440
|
+
steps: [
|
|
441
|
+
{
|
|
442
|
+
type: "click",
|
|
443
|
+
position: [
|
|
444
|
+
boundingRect.x + boundingRect.width / 2,
|
|
445
|
+
boundingRect.y + boundingRect.height / 2
|
|
446
|
+
]
|
|
447
|
+
}
|
|
448
|
+
]
|
|
449
|
+
});
|
|
450
|
+
await opened;
|
|
451
|
+
expect(el.open).to.be.true;
|
|
452
|
+
let closed = oneEvent(el, "sp-closed");
|
|
453
|
+
sendMouse({
|
|
454
|
+
steps: [
|
|
455
|
+
{
|
|
456
|
+
type: "click",
|
|
457
|
+
position: [
|
|
458
|
+
boundingRect.x + boundingRect.width / 2,
|
|
459
|
+
boundingRect.y + boundingRect.height / 2
|
|
460
|
+
]
|
|
461
|
+
}
|
|
462
|
+
]
|
|
463
|
+
});
|
|
464
|
+
await closed;
|
|
465
|
+
expect(el.open).to.be.false;
|
|
466
|
+
opened = oneEvent(el, "sp-opened");
|
|
467
|
+
sendMouse({
|
|
468
|
+
steps: [
|
|
469
|
+
{
|
|
470
|
+
type: "click",
|
|
471
|
+
position: [
|
|
472
|
+
boundingRect.x + boundingRect.width / 2,
|
|
473
|
+
boundingRect.y + boundingRect.height / 2
|
|
474
|
+
]
|
|
475
|
+
}
|
|
476
|
+
]
|
|
477
|
+
});
|
|
478
|
+
await opened;
|
|
479
|
+
expect(el.open).to.be.true;
|
|
480
|
+
closed = oneEvent(el, "sp-closed");
|
|
481
|
+
sendMouse({
|
|
482
|
+
steps: [
|
|
483
|
+
{
|
|
484
|
+
type: "click",
|
|
485
|
+
position: [
|
|
486
|
+
boundingRect.x + boundingRect.width / 2,
|
|
487
|
+
boundingRect.y + boundingRect.height / 2
|
|
488
|
+
]
|
|
489
|
+
}
|
|
490
|
+
]
|
|
491
|
+
});
|
|
492
|
+
await closed;
|
|
493
|
+
expect(el.open).to.be.false;
|
|
494
|
+
});
|
|
407
495
|
it("closes when becoming disabled", async () => {
|
|
408
496
|
expect(el.open).to.be.false;
|
|
409
497
|
el.click();
|
|
@@ -419,11 +507,15 @@ export function runPickerTests() {
|
|
|
419
507
|
document.body.append(other);
|
|
420
508
|
await elementUpdated(el);
|
|
421
509
|
expect(el.open).to.be.false;
|
|
510
|
+
const opened = oneEvent(el, "sp-opened");
|
|
422
511
|
el.click();
|
|
512
|
+
await opened;
|
|
423
513
|
await elementUpdated(el);
|
|
424
514
|
expect(el.open).to.be.true;
|
|
515
|
+
const closed = oneEvent(el, "sp-closed");
|
|
425
516
|
other.click();
|
|
426
|
-
|
|
517
|
+
closed;
|
|
518
|
+
await elementUpdated(el);
|
|
427
519
|
other.remove();
|
|
428
520
|
});
|
|
429
521
|
it("selects", async () => {
|
|
@@ -435,7 +527,6 @@ export function runPickerTests() {
|
|
|
435
527
|
const opened = oneEvent(el, "sp-opened");
|
|
436
528
|
button.click();
|
|
437
529
|
await opened;
|
|
438
|
-
await elementUpdated(el);
|
|
439
530
|
expect(el.open).to.be.true;
|
|
440
531
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
441
532
|
expect(el.value).to.equal("");
|
|
@@ -455,31 +546,27 @@ export function runPickerTests() {
|
|
|
455
546
|
"sp-menu-item:nth-of-type(2)"
|
|
456
547
|
);
|
|
457
548
|
const button = el.button;
|
|
458
|
-
|
|
549
|
+
let opened = oneEvent(el, "sp-opened");
|
|
459
550
|
button.click();
|
|
460
551
|
await opened;
|
|
461
|
-
await nextFrame();
|
|
462
552
|
expect(el.open).to.be.true;
|
|
463
553
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
464
554
|
expect(el.value).to.equal("");
|
|
465
|
-
|
|
555
|
+
let closed = oneEvent(el, "sp-closed");
|
|
466
556
|
secondItem.click();
|
|
467
557
|
await closed;
|
|
468
|
-
await nextFrame();
|
|
469
558
|
expect(el.open).to.be.false;
|
|
470
559
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Select Inverse");
|
|
471
560
|
expect(el.value).to.equal("option-2");
|
|
472
|
-
|
|
561
|
+
opened = oneEvent(el, "sp-opened");
|
|
473
562
|
button.click();
|
|
474
|
-
await
|
|
475
|
-
await nextFrame();
|
|
563
|
+
await opened;
|
|
476
564
|
expect(el.open).to.be.true;
|
|
477
565
|
expect((_c = el.selectedItem) == null ? void 0 : _c.itemText).to.equal("Select Inverse");
|
|
478
566
|
expect(el.value).to.equal("option-2");
|
|
479
|
-
|
|
567
|
+
closed = oneEvent(el, "sp-closed");
|
|
480
568
|
firstItem.click();
|
|
481
|
-
await
|
|
482
|
-
await nextFrame();
|
|
569
|
+
await closed;
|
|
483
570
|
expect(el.open).to.be.false;
|
|
484
571
|
expect((_d = el.selectedItem) == null ? void 0 : _d.itemText).to.equal("Deselect");
|
|
485
572
|
expect(el.value).to.equal("Deselect");
|
|
@@ -487,7 +574,6 @@ export function runPickerTests() {
|
|
|
487
574
|
it("dispatches bubbling and composed events", async () => {
|
|
488
575
|
const changeSpy = spy();
|
|
489
576
|
const parent = el.parentElement;
|
|
490
|
-
parent.attachShadow({ mode: "open" });
|
|
491
577
|
parent.shadowRoot.append(el);
|
|
492
578
|
const secondItem = el.querySelector(
|
|
493
579
|
"sp-menu-item:nth-of-type(2)"
|
|
@@ -497,11 +583,9 @@ export function runPickerTests() {
|
|
|
497
583
|
const opened = oneEvent(el, "sp-opened");
|
|
498
584
|
el.open = true;
|
|
499
585
|
await opened;
|
|
500
|
-
await elementUpdated(el);
|
|
501
586
|
const closed = oneEvent(el, "sp-closed");
|
|
502
587
|
secondItem.click();
|
|
503
588
|
await closed;
|
|
504
|
-
await elementUpdated(el);
|
|
505
589
|
expect(el.value).to.equal(secondItem.value);
|
|
506
590
|
expect(changeSpy.calledOnce).to.be.true;
|
|
507
591
|
});
|
|
@@ -512,10 +596,9 @@ export function runPickerTests() {
|
|
|
512
596
|
"sp-menu-item:nth-of-type(2)"
|
|
513
597
|
);
|
|
514
598
|
const button = el.button;
|
|
515
|
-
|
|
599
|
+
const opened = oneEvent(el, "sp-opened");
|
|
516
600
|
button.click();
|
|
517
601
|
await opened;
|
|
518
|
-
await elementUpdated(el);
|
|
519
602
|
expect(el.open).to.be.true;
|
|
520
603
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
521
604
|
expect(el.value).to.equal("");
|
|
@@ -524,14 +607,12 @@ export function runPickerTests() {
|
|
|
524
607
|
event.preventDefault();
|
|
525
608
|
preventChangeSpy();
|
|
526
609
|
});
|
|
527
|
-
const closed = oneEvent(el, "sp-closed");
|
|
528
|
-
opened = oneEvent(el, "sp-opened");
|
|
529
610
|
secondItem.click();
|
|
530
|
-
await
|
|
531
|
-
await
|
|
532
|
-
await elementUpdated(el);
|
|
611
|
+
await nextFrame();
|
|
612
|
+
await nextFrame();
|
|
533
613
|
expect(preventChangeSpy.calledOnce).to.be.true;
|
|
534
614
|
expect(secondItem.selected, "selection prevented").to.be.false;
|
|
615
|
+
expect(el.open).to.be.true;
|
|
535
616
|
});
|
|
536
617
|
it("can throw focus after `change`", async () => {
|
|
537
618
|
var _a;
|
|
@@ -574,20 +655,17 @@ export function runPickerTests() {
|
|
|
574
655
|
button.dispatchEvent(tEvent());
|
|
575
656
|
await elementUpdated(el);
|
|
576
657
|
expect(el.open, "still closed").to.be.false;
|
|
658
|
+
const opened = oneEvent(el, "sp-opened");
|
|
577
659
|
button.dispatchEvent(arrowUpEvent());
|
|
578
660
|
await elementUpdated(el);
|
|
579
661
|
expect(el.open, "open by ArrowUp").to.be.true;
|
|
580
|
-
await
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
await
|
|
586
|
-
|
|
587
|
-
await waitUntil(
|
|
588
|
-
() => document.querySelector("active-overlay") === null,
|
|
589
|
-
"an active-overlay has been inserted on the page"
|
|
590
|
-
);
|
|
662
|
+
await opened;
|
|
663
|
+
const closed = oneEvent(el, "sp-closed");
|
|
664
|
+
sendKeys({
|
|
665
|
+
press: "Escape"
|
|
666
|
+
});
|
|
667
|
+
await closed;
|
|
668
|
+
expect(el.open).to.be.false;
|
|
591
669
|
});
|
|
592
670
|
it("opens on ArrowDown", async () => {
|
|
593
671
|
var _a, _b;
|
|
@@ -601,19 +679,18 @@ export function runPickerTests() {
|
|
|
601
679
|
const opened = oneEvent(el, "sp-opened");
|
|
602
680
|
button.dispatchEvent(arrowDownEvent());
|
|
603
681
|
await opened;
|
|
604
|
-
await elementUpdated(el);
|
|
605
682
|
expect(el.open, "open by ArrowDown").to.be.true;
|
|
606
683
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
607
684
|
expect(el.value).to.equal("");
|
|
608
685
|
const closed = oneEvent(el, "sp-closed");
|
|
609
686
|
firstItem.click();
|
|
610
687
|
await closed;
|
|
611
|
-
await elementUpdated(el);
|
|
612
688
|
expect(el.open).to.be.false;
|
|
613
689
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Deselect");
|
|
614
690
|
expect(el.value).to.equal("Deselect");
|
|
615
691
|
});
|
|
616
692
|
it("quick selects on ArrowLeft/Right", async () => {
|
|
693
|
+
await nextFrame();
|
|
617
694
|
const selectionSpy = spy();
|
|
618
695
|
el.addEventListener("change", (event) => {
|
|
619
696
|
const { value } = event.target;
|
|
@@ -641,6 +718,7 @@ export function runPickerTests() {
|
|
|
641
718
|
expect(selectionSpy.calledWith("Make Work Path")).to.be.false;
|
|
642
719
|
});
|
|
643
720
|
it("quick selects first item on ArrowRight when no value", async () => {
|
|
721
|
+
await nextFrame();
|
|
644
722
|
const selectionSpy = spy();
|
|
645
723
|
el.addEventListener("change", (event) => {
|
|
646
724
|
const { value } = event.target;
|
|
@@ -658,6 +736,10 @@ export function runPickerTests() {
|
|
|
658
736
|
});
|
|
659
737
|
it("refocuses on list when open", async () => {
|
|
660
738
|
const firstItem = el.querySelector("sp-menu-item");
|
|
739
|
+
const thirdItem = el.querySelector(
|
|
740
|
+
"sp-menu-item:nth-of-type(3)"
|
|
741
|
+
);
|
|
742
|
+
const button = el.button;
|
|
661
743
|
const input = document.createElement("input");
|
|
662
744
|
el.insertAdjacentElement("afterend", input);
|
|
663
745
|
el.focus();
|
|
@@ -665,44 +747,41 @@ export function runPickerTests() {
|
|
|
665
747
|
expect(document.activeElement === input).to.be.true;
|
|
666
748
|
await sendKeys({ press: "Shift+Tab" });
|
|
667
749
|
expect(document.activeElement === el).to.be.true;
|
|
668
|
-
await sendKeys({ press: "Enter" });
|
|
669
750
|
const opened = oneEvent(el, "sp-opened");
|
|
670
|
-
|
|
751
|
+
sendKeys({ press: "Enter" });
|
|
671
752
|
await opened;
|
|
672
753
|
await elementUpdated(el);
|
|
673
754
|
await waitUntil(
|
|
674
755
|
() => firstItem.focused,
|
|
675
756
|
"The first items should have become focused visually."
|
|
676
757
|
);
|
|
677
|
-
|
|
678
|
-
await
|
|
679
|
-
expect(
|
|
758
|
+
await sendKeys({ press: "ArrowDown" });
|
|
759
|
+
await sendKeys({ press: "ArrowDown" });
|
|
760
|
+
expect(thirdItem.focused).to.be.true;
|
|
761
|
+
button.focus();
|
|
762
|
+
expect(isMenuActiveElement(el)).to.be.false;
|
|
680
763
|
el.focus();
|
|
681
764
|
await elementUpdated(el);
|
|
682
765
|
await waitUntil(
|
|
683
|
-
() => isMenuActiveElement(),
|
|
766
|
+
() => isMenuActiveElement(el),
|
|
684
767
|
"first item refocused"
|
|
685
768
|
);
|
|
686
|
-
expect(el
|
|
687
|
-
expect(
|
|
688
|
-
await sendKeys({ press: "ArrowDown" });
|
|
689
|
-
await sendKeys({ press: "ArrowUp" });
|
|
690
|
-
expect(firstItem.focused).to.be.true;
|
|
769
|
+
expect(isMenuActiveElement(el)).to.be.true;
|
|
770
|
+
expect(thirdItem.focused).to.be.true;
|
|
691
771
|
});
|
|
692
|
-
it("
|
|
772
|
+
it("allows tabing to close", async () => {
|
|
773
|
+
const input = document.createElement("input");
|
|
774
|
+
el.insertAdjacentElement("afterend", input);
|
|
775
|
+
const opened = oneEvent(el, "sp-opened");
|
|
693
776
|
el.open = true;
|
|
694
|
-
await
|
|
777
|
+
await opened;
|
|
778
|
+
await nextFrame();
|
|
695
779
|
expect(el.open).to.be.true;
|
|
696
780
|
el.focus();
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
);
|
|
702
|
-
expect(el.open).to.be.true;
|
|
703
|
-
expect(isMenuActiveElement()).to.be.true;
|
|
704
|
-
await sendKeys({ press: "Tab" });
|
|
705
|
-
expect(el.open, "stays open").to.be.true;
|
|
781
|
+
const closed = oneEvent(el, "sp-closed");
|
|
782
|
+
sendKeys({ press: "Tab" });
|
|
783
|
+
await closed;
|
|
784
|
+
expect(el.open, "closes").to.be.false;
|
|
706
785
|
});
|
|
707
786
|
describe("tab order", () => {
|
|
708
787
|
let input1;
|
|
@@ -757,51 +836,7 @@ export function runPickerTests() {
|
|
|
757
836
|
input1
|
|
758
837
|
);
|
|
759
838
|
});
|
|
760
|
-
it(
|
|
761
|
-
el.focus();
|
|
762
|
-
await nextFrame();
|
|
763
|
-
expect(document.activeElement, "focuses el").to.equal(el);
|
|
764
|
-
const opened = oneEvent(el, "sp-opened");
|
|
765
|
-
sendKeys({ press: "ArrowDown" });
|
|
766
|
-
await opened;
|
|
767
|
-
expect(el.open, "opened").to.be.true;
|
|
768
|
-
await waitUntil(
|
|
769
|
-
() => isMenuActiveElement(),
|
|
770
|
-
"first item focused"
|
|
771
|
-
);
|
|
772
|
-
const activeElement = document.activeElement;
|
|
773
|
-
if (!isWebKit()) {
|
|
774
|
-
const blured = oneEvent(activeElement, "blur");
|
|
775
|
-
sendKeys({ press: "Tab" });
|
|
776
|
-
await blured;
|
|
777
|
-
expect(el.open, "picker still open").to.be.true;
|
|
778
|
-
expect(document.activeElement === input1).to.be.false;
|
|
779
|
-
expect(document.activeElement === input2).to.be.false;
|
|
780
|
-
}
|
|
781
|
-
});
|
|
782
|
-
it('traps tab in the menu as a `type="modal"` overlay backwards', async () => {
|
|
783
|
-
el.focus();
|
|
784
|
-
await nextFrame();
|
|
785
|
-
expect(document.activeElement, "focuses el").to.equal(el);
|
|
786
|
-
const opened = oneEvent(el, "sp-opened");
|
|
787
|
-
await sendKeys({ press: "ArrowDown" });
|
|
788
|
-
await opened;
|
|
789
|
-
expect(el.open, "opened").to.be.true;
|
|
790
|
-
await waitUntil(
|
|
791
|
-
() => isMenuActiveElement(),
|
|
792
|
-
"first item focused"
|
|
793
|
-
);
|
|
794
|
-
const activeElement = document.activeElement;
|
|
795
|
-
if (!isWebKit()) {
|
|
796
|
-
const blured = oneEvent(activeElement, "blur");
|
|
797
|
-
sendKeys({ press: "Shift+Tab" });
|
|
798
|
-
await blured;
|
|
799
|
-
expect(el.open, "picker still open").to.be.true;
|
|
800
|
-
expect(document.activeElement === input1).to.be.false;
|
|
801
|
-
expect(document.activeElement === input2).to.be.false;
|
|
802
|
-
}
|
|
803
|
-
});
|
|
804
|
-
it("can close and immediate tab to the next tab stop", async () => {
|
|
839
|
+
it("can close and immediately tab to the next tab stop", async () => {
|
|
805
840
|
el.focus();
|
|
806
841
|
await nextFrame();
|
|
807
842
|
expect(document.activeElement, "focuses el").to.equal(el);
|
|
@@ -810,7 +845,7 @@ export function runPickerTests() {
|
|
|
810
845
|
await opened;
|
|
811
846
|
expect(el.open, "opened").to.be.true;
|
|
812
847
|
await waitUntil(
|
|
813
|
-
() => isMenuActiveElement(),
|
|
848
|
+
() => isMenuActiveElement(el),
|
|
814
849
|
"first item focused"
|
|
815
850
|
);
|
|
816
851
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -827,13 +862,13 @@ export function runPickerTests() {
|
|
|
827
862
|
it("can close and immediate shift+tab to the previous tab stop", async () => {
|
|
828
863
|
el.focus();
|
|
829
864
|
await nextFrame();
|
|
830
|
-
expect(document.activeElement, "focuses el").to.
|
|
865
|
+
expect(document.activeElement === el, "focuses el").to.be.true;
|
|
831
866
|
const opened = oneEvent(el, "sp-opened");
|
|
832
867
|
await sendKeys({ press: "ArrowUp" });
|
|
833
868
|
await opened;
|
|
834
869
|
expect(el.open, "opened").to.be.true;
|
|
835
870
|
await waitUntil(
|
|
836
|
-
() => isMenuActiveElement(),
|
|
871
|
+
() => isMenuActiveElement(el),
|
|
837
872
|
"first item focused"
|
|
838
873
|
);
|
|
839
874
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -842,7 +877,7 @@ export function runPickerTests() {
|
|
|
842
877
|
expect(el.open).to.be.false;
|
|
843
878
|
expect(document.activeElement === el).to.be.true;
|
|
844
879
|
const focused = oneEvent(input1, "focus");
|
|
845
|
-
|
|
880
|
+
sendKeys({ press: "Shift+Tab" });
|
|
846
881
|
await focused;
|
|
847
882
|
expect(el.open).to.be.false;
|
|
848
883
|
expect(document.activeElement === input1).to.be.true;
|
|
@@ -857,8 +892,7 @@ export function runPickerTests() {
|
|
|
857
892
|
expect(el.open).to.be.false;
|
|
858
893
|
});
|
|
859
894
|
it("scrolls selected into view on open", async () => {
|
|
860
|
-
|
|
861
|
-
el.popoverEl.style.height = "40px";
|
|
895
|
+
el.shadowRoot.querySelector("sp-popover").style.height = "40px";
|
|
862
896
|
const firstItem = el.querySelector(
|
|
863
897
|
"sp-menu-item:first-child"
|
|
864
898
|
);
|
|
@@ -868,11 +902,15 @@ export function runPickerTests() {
|
|
|
868
902
|
lastItem.disabled = false;
|
|
869
903
|
el.value = lastItem.value;
|
|
870
904
|
await elementUpdated(el);
|
|
905
|
+
const opened = oneEvent(el, "sp-opened");
|
|
871
906
|
el.open = true;
|
|
872
|
-
await
|
|
873
|
-
await waitUntil(
|
|
907
|
+
await opened;
|
|
908
|
+
await waitUntil(
|
|
909
|
+
() => isMenuActiveElement(el),
|
|
910
|
+
"first item focused"
|
|
911
|
+
);
|
|
874
912
|
const getParentOffset = (el2) => {
|
|
875
|
-
const parentScroll = el2.parentElement.scrollTop;
|
|
913
|
+
const parentScroll = el2.assignedSlot.parentElement.scrollTop;
|
|
876
914
|
const parentOffset = el2.offsetTop - parentScroll;
|
|
877
915
|
return parentOffset;
|
|
878
916
|
};
|
|
@@ -881,7 +919,9 @@ export function runPickerTests() {
|
|
|
881
919
|
lastItem.dispatchEvent(
|
|
882
920
|
new FocusEvent("focusin", { bubbles: true })
|
|
883
921
|
);
|
|
884
|
-
|
|
922
|
+
await sendKeys({
|
|
923
|
+
press: "ArrowDown"
|
|
924
|
+
});
|
|
885
925
|
await elementUpdated(el);
|
|
886
926
|
await nextFrame();
|
|
887
927
|
expect(getParentOffset(lastItem)).to.be.greaterThan(40);
|
|
@@ -919,6 +959,8 @@ export function runPickerTests() {
|
|
|
919
959
|
beforeEach(async () => {
|
|
920
960
|
el = await groupedFixture();
|
|
921
961
|
await elementUpdated(el);
|
|
962
|
+
await nextFrame();
|
|
963
|
+
await nextFrame();
|
|
922
964
|
});
|
|
923
965
|
it("selects the item with a matching value in a group", async () => {
|
|
924
966
|
const item = el.querySelector("#should-be-selected");
|
|
@@ -956,6 +998,7 @@ export function runPickerTests() {
|
|
|
956
998
|
beforeEach(async () => {
|
|
957
999
|
el = await pickerFixture2();
|
|
958
1000
|
await elementUpdated(el);
|
|
1001
|
+
await nextFrame();
|
|
959
1002
|
});
|
|
960
1003
|
afterEach(async () => {
|
|
961
1004
|
if (el.open) {
|
|
@@ -1041,6 +1084,7 @@ export function runPickerTests() {
|
|
|
1041
1084
|
beforeEach(async () => {
|
|
1042
1085
|
el = await pickerFixture2();
|
|
1043
1086
|
await elementUpdated(el);
|
|
1087
|
+
await nextFrame();
|
|
1044
1088
|
});
|
|
1045
1089
|
afterEach(async () => {
|
|
1046
1090
|
if (el.open) {
|
|
@@ -1057,7 +1101,6 @@ export function runPickerTests() {
|
|
|
1057
1101
|
const opened = oneEvent(el, "sp-opened");
|
|
1058
1102
|
el.button.click();
|
|
1059
1103
|
await opened;
|
|
1060
|
-
await elementUpdated(el);
|
|
1061
1104
|
expect(el.open).to.be.true;
|
|
1062
1105
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
1063
1106
|
expect(el.value).to.equal("");
|
|
@@ -1077,6 +1120,7 @@ export function runPickerTests() {
|
|
|
1077
1120
|
`);
|
|
1078
1121
|
const el2 = test.querySelector("sp-picker");
|
|
1079
1122
|
await elementUpdated(el2);
|
|
1123
|
+
await nextFrame();
|
|
1080
1124
|
let snapshot = await a11ySnapshot({});
|
|
1081
1125
|
expect(
|
|
1082
1126
|
findAccessibilityNode(
|
|
@@ -1087,6 +1131,9 @@ export function runPickerTests() {
|
|
|
1087
1131
|
).to.not.be.null;
|
|
1088
1132
|
el2.value = "2";
|
|
1089
1133
|
await elementUpdated(el2);
|
|
1134
|
+
await nextFrame();
|
|
1135
|
+
await nextFrame();
|
|
1136
|
+
expect(el2.value).to.equal("2");
|
|
1090
1137
|
snapshot = await a11ySnapshot({});
|
|
1091
1138
|
expect(
|
|
1092
1139
|
findAccessibilityNode(
|
|
@@ -1099,6 +1146,8 @@ export function runPickerTests() {
|
|
|
1099
1146
|
it("toggles between pickers", async () => {
|
|
1100
1147
|
const el2 = await pickerFixture();
|
|
1101
1148
|
const el1 = await pickerFixture();
|
|
1149
|
+
el1.parentElement.style.float = "left";
|
|
1150
|
+
el2.parentElement.style.float = "left";
|
|
1102
1151
|
el1.id = "away";
|
|
1103
1152
|
el2.id = "other";
|
|
1104
1153
|
await Promise.all([elementUpdated(el1), elementUpdated(el2)]);
|
|
@@ -1119,8 +1168,8 @@ export function runPickerTests() {
|
|
|
1119
1168
|
closed = oneEvent(el2, "sp-closed");
|
|
1120
1169
|
el1.click();
|
|
1121
1170
|
await Promise.all([open, closed]);
|
|
1122
|
-
expect(el1.open).to.be.true;
|
|
1123
1171
|
expect(el2.open).to.be.false;
|
|
1172
|
+
expect(el1.open).to.be.true;
|
|
1124
1173
|
closed = oneEvent(el1, "sp-closed");
|
|
1125
1174
|
sendKeys({
|
|
1126
1175
|
press: "Escape"
|
|
@@ -1129,7 +1178,7 @@ export function runPickerTests() {
|
|
|
1129
1178
|
expect(el1.open).to.be.false;
|
|
1130
1179
|
});
|
|
1131
1180
|
it("displays selected item text by default", async () => {
|
|
1132
|
-
var _a, _b, _c, _d;
|
|
1181
|
+
var _a, _b, _c, _d, _e;
|
|
1133
1182
|
const el2 = await fixture(
|
|
1134
1183
|
html`
|
|
1135
1184
|
<sp-picker
|
|
@@ -1146,6 +1195,7 @@ export function runPickerTests() {
|
|
|
1146
1195
|
</sp-picker>
|
|
1147
1196
|
`
|
|
1148
1197
|
);
|
|
1198
|
+
await nextFrame();
|
|
1149
1199
|
await elementUpdated(el2);
|
|
1150
1200
|
await waitUntil(
|
|
1151
1201
|
() => {
|
|
@@ -1171,16 +1221,21 @@ export function runPickerTests() {
|
|
|
1171
1221
|
const opened = oneEvent(el2, "sp-opened");
|
|
1172
1222
|
sendKeys({ press: "Enter" });
|
|
1173
1223
|
await opened;
|
|
1174
|
-
await elementUpdated(el2.optionsMenu);
|
|
1175
1224
|
expect(
|
|
1176
|
-
el2
|
|
1225
|
+
el2 === document.activeElement,
|
|
1177
1226
|
`activeElement is ${(_d = document.activeElement) == null ? void 0 : _d.localName}`
|
|
1178
1227
|
).to.be.true;
|
|
1228
|
+
expect(
|
|
1229
|
+
el2.optionsMenu === el2.shadowRoot.activeElement,
|
|
1230
|
+
`activeElement is ${(_e = el2.shadowRoot.activeElement) == null ? void 0 : _e.localName}`
|
|
1231
|
+
).to.be.true;
|
|
1179
1232
|
expect(firstItem.focused, 'firstItem NOT "focused"').to.be.false;
|
|
1180
1233
|
expect(secondItem.focused, 'secondItem "focused"').to.be.true;
|
|
1181
|
-
expect(
|
|
1182
|
-
|
|
1183
|
-
|
|
1234
|
+
expect(
|
|
1235
|
+
el2.optionsMenu.getAttribute(
|
|
1236
|
+
"aria-activedescendant"
|
|
1237
|
+
)
|
|
1238
|
+
).to.equal(secondItem.id);
|
|
1184
1239
|
});
|
|
1185
1240
|
it("resets value when item not available", async () => {
|
|
1186
1241
|
var _a;
|
|
@@ -1262,15 +1317,11 @@ export function runPickerTests() {
|
|
|
1262
1317
|
await elementUpdated(el2);
|
|
1263
1318
|
expect(openedSpy.calledOnce).to.be.true;
|
|
1264
1319
|
expect(closedSpy.calledOnce).to.be.false;
|
|
1265
|
-
const openedEvent = openedSpy.args[0][0];
|
|
1266
|
-
expect(openedEvent.detail.interaction).to.equal("modal");
|
|
1267
1320
|
const closed = oneEvent(el2, "sp-closed");
|
|
1268
1321
|
el2.open = false;
|
|
1269
1322
|
await closed;
|
|
1270
1323
|
await elementUpdated(el2);
|
|
1271
1324
|
expect(closedSpy.calledOnce).to.be.true;
|
|
1272
|
-
const closedEvent = closedSpy.args[0][0];
|
|
1273
|
-
expect(closedEvent.detail.interaction).to.equal("modal");
|
|
1274
1325
|
});
|
|
1275
1326
|
}
|
|
1276
1327
|
//# sourceMappingURL=index.js.map
|