@spectrum-web-components/picker 0.30.0 → 0.30.1-overlay.31
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/package.json +13 -13
- package/src/Picker.d.ts +27 -40
- package/src/Picker.dev.js +124 -170
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +30 -16
- 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 +125 -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/custom-elements.json +0 -1730
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,13 +67,6 @@ 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
|
});
|
|
@@ -81,7 +75,7 @@ export function runPickerTests() {
|
|
|
81
75
|
el.open = true;
|
|
82
76
|
await opened;
|
|
83
77
|
expect(el.open).to.be.true;
|
|
84
|
-
const accessibleCloseButton =
|
|
78
|
+
const accessibleCloseButton = el.shadowRoot.querySelector(
|
|
85
79
|
".visually-hidden button"
|
|
86
80
|
);
|
|
87
81
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -90,10 +84,13 @@ export function runPickerTests() {
|
|
|
90
84
|
expect(el.open).to.be.false;
|
|
91
85
|
});
|
|
92
86
|
it("accepts new selected item content", async () => {
|
|
87
|
+
await nextFrame();
|
|
88
|
+
await nextFrame();
|
|
93
89
|
const option2 = el.querySelector('[value="option-2"');
|
|
94
90
|
el.value = "option-2";
|
|
95
91
|
await elementUpdated(option2);
|
|
96
92
|
await elementUpdated(el);
|
|
93
|
+
await aTimeout(150);
|
|
97
94
|
expect(el.value).to.equal("option-2");
|
|
98
95
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
99
96
|
"Select Inverse"
|
|
@@ -114,9 +111,11 @@ export function runPickerTests() {
|
|
|
114
111
|
expect((el.button.textContent || "").trim()).to.equal(newLabel2);
|
|
115
112
|
});
|
|
116
113
|
it("accepts new selected item content when open", async () => {
|
|
114
|
+
await nextFrame();
|
|
117
115
|
const option2 = el.querySelector('[value="option-2"');
|
|
118
116
|
el.value = "option-2";
|
|
119
117
|
await elementUpdated(el);
|
|
118
|
+
await aTimeout(150);
|
|
120
119
|
expect(el.value).to.equal("option-2");
|
|
121
120
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
122
121
|
"Select Inverse"
|
|
@@ -137,8 +136,10 @@ export function runPickerTests() {
|
|
|
137
136
|
);
|
|
138
137
|
});
|
|
139
138
|
it("unsets value when children removed", async () => {
|
|
139
|
+
await nextFrame();
|
|
140
140
|
el.value = "option-2";
|
|
141
141
|
await elementUpdated(el);
|
|
142
|
+
await aTimeout(150);
|
|
142
143
|
expect(el.value).to.equal("option-2");
|
|
143
144
|
expect((el.button.textContent || "").trim()).to.equal(
|
|
144
145
|
"Select Inverse"
|
|
@@ -152,8 +153,14 @@ export function runPickerTests() {
|
|
|
152
153
|
});
|
|
153
154
|
await Promise.all(removals);
|
|
154
155
|
await elementUpdated(el);
|
|
155
|
-
|
|
156
|
+
await nextFrame();
|
|
157
|
+
await aTimeout(150);
|
|
158
|
+
expect(el.optionsMenu.childItems.length).to.equal(0);
|
|
159
|
+
if ("showPopover" in document.createElement("div")) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
156
162
|
expect((el.button.textContent || "").trim()).to.equal("");
|
|
163
|
+
expect(el.value).to.equal("");
|
|
157
164
|
});
|
|
158
165
|
it("accepts a new item and value at the same time", async () => {
|
|
159
166
|
el.value = "option-2";
|
|
@@ -176,7 +183,7 @@ export function runPickerTests() {
|
|
|
176
183
|
item.value = "option-new";
|
|
177
184
|
item.textContent = "New Option";
|
|
178
185
|
el.append(item);
|
|
179
|
-
await
|
|
186
|
+
await nextFrame();
|
|
180
187
|
await elementUpdated(el);
|
|
181
188
|
let opened = oneEvent(el, "sp-opened");
|
|
182
189
|
el.open = true;
|
|
@@ -194,6 +201,7 @@ export function runPickerTests() {
|
|
|
194
201
|
expect(el.value, "second time").to.equal("option-new");
|
|
195
202
|
});
|
|
196
203
|
it('manages its "name" value in the accessibility tree', async () => {
|
|
204
|
+
await nextFrame();
|
|
197
205
|
let snapshot = await a11ySnapshot({});
|
|
198
206
|
expect(
|
|
199
207
|
findAccessibilityNode(
|
|
@@ -204,6 +212,8 @@ export function runPickerTests() {
|
|
|
204
212
|
).to.not.be.null;
|
|
205
213
|
el.value = "option-2";
|
|
206
214
|
await elementUpdated(el);
|
|
215
|
+
await nextFrame();
|
|
216
|
+
await nextFrame();
|
|
207
217
|
snapshot = await a11ySnapshot({});
|
|
208
218
|
expect(
|
|
209
219
|
findAccessibilityNode(
|
|
@@ -240,6 +250,7 @@ export function runPickerTests() {
|
|
|
240
250
|
await expect(el).to.be.accessible();
|
|
241
251
|
});
|
|
242
252
|
it("opens with visible focus on a menu item on `DownArrow`", async () => {
|
|
253
|
+
var _a, _b;
|
|
243
254
|
const firstItem = el.querySelector("sp-menu-item");
|
|
244
255
|
await elementUpdated(el);
|
|
245
256
|
expect(firstItem.focused, "should not visually focused").to.be.false;
|
|
@@ -258,12 +269,24 @@ export function runPickerTests() {
|
|
|
258
269
|
});
|
|
259
270
|
await closed;
|
|
260
271
|
expect(el.open).to.be.false;
|
|
261
|
-
|
|
272
|
+
expect(
|
|
273
|
+
document.activeElement === el,
|
|
274
|
+
`focused ${(_a = document.activeElement) == null ? void 0 : _a.localName} instead of back on Picker`
|
|
275
|
+
).to.be.true;
|
|
276
|
+
expect(
|
|
277
|
+
el.shadowRoot.activeElement === el.button,
|
|
278
|
+
`focused ${(_b = el.shadowRoot.activeElement) == null ? void 0 : _b.localName} instead of back on button`
|
|
279
|
+
).to.be.true;
|
|
280
|
+
await waitUntil(
|
|
281
|
+
() => !firstItem.focused,
|
|
282
|
+
"finally, not visually focused"
|
|
283
|
+
);
|
|
262
284
|
});
|
|
263
|
-
it("opens without visible focus on a menu item
|
|
285
|
+
it("opens, on click, without visible focus on a menu item", async () => {
|
|
286
|
+
await nextFrame();
|
|
287
|
+
await nextFrame();
|
|
264
288
|
const firstItem = el.querySelector("sp-menu-item");
|
|
265
|
-
|
|
266
|
-
const boundingRect = el.getBoundingClientRect();
|
|
289
|
+
const boundingRect = el.button.getBoundingClientRect();
|
|
267
290
|
expect(firstItem.focused, "not visually focused").to.be.false;
|
|
268
291
|
const opened = oneEvent(el, "sp-opened");
|
|
269
292
|
sendMouse({
|
|
@@ -278,7 +301,6 @@ export function runPickerTests() {
|
|
|
278
301
|
]
|
|
279
302
|
});
|
|
280
303
|
await opened;
|
|
281
|
-
await elementUpdated(el);
|
|
282
304
|
expect(el.open).to.be.true;
|
|
283
305
|
expect(firstItem.focused, "still not visually focused").to.be.false;
|
|
284
306
|
});
|
|
@@ -297,11 +319,15 @@ export function runPickerTests() {
|
|
|
297
319
|
document.body.append(other);
|
|
298
320
|
await elementUpdated(el);
|
|
299
321
|
expect(el.open).to.be.false;
|
|
322
|
+
const opened = oneEvent(el, "sp-opened");
|
|
300
323
|
el.click();
|
|
324
|
+
await opened;
|
|
301
325
|
await elementUpdated(el);
|
|
302
326
|
expect(el.open).to.be.true;
|
|
327
|
+
const closed = oneEvent(el, "sp-closed");
|
|
303
328
|
other.click();
|
|
304
|
-
|
|
329
|
+
closed;
|
|
330
|
+
await elementUpdated(el);
|
|
305
331
|
other.remove();
|
|
306
332
|
});
|
|
307
333
|
it("selects", async () => {
|
|
@@ -313,7 +339,6 @@ export function runPickerTests() {
|
|
|
313
339
|
const opened = oneEvent(el, "sp-opened");
|
|
314
340
|
button.click();
|
|
315
341
|
await opened;
|
|
316
|
-
await elementUpdated(el);
|
|
317
342
|
expect(el.open).to.be.true;
|
|
318
343
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
319
344
|
expect(el.value).to.equal("");
|
|
@@ -333,31 +358,27 @@ export function runPickerTests() {
|
|
|
333
358
|
"sp-menu-item:nth-of-type(2)"
|
|
334
359
|
);
|
|
335
360
|
const button = el.button;
|
|
336
|
-
|
|
361
|
+
let opened = oneEvent(el, "sp-opened");
|
|
337
362
|
button.click();
|
|
338
363
|
await opened;
|
|
339
|
-
await nextFrame();
|
|
340
364
|
expect(el.open).to.be.true;
|
|
341
365
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
342
366
|
expect(el.value).to.equal("");
|
|
343
|
-
|
|
367
|
+
let closed = oneEvent(el, "sp-closed");
|
|
344
368
|
secondItem.click();
|
|
345
369
|
await closed;
|
|
346
|
-
await nextFrame();
|
|
347
370
|
expect(el.open).to.be.false;
|
|
348
371
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Select Inverse");
|
|
349
372
|
expect(el.value).to.equal("option-2");
|
|
350
|
-
|
|
373
|
+
opened = oneEvent(el, "sp-opened");
|
|
351
374
|
button.click();
|
|
352
|
-
await
|
|
353
|
-
await nextFrame();
|
|
375
|
+
await opened;
|
|
354
376
|
expect(el.open).to.be.true;
|
|
355
377
|
expect((_c = el.selectedItem) == null ? void 0 : _c.itemText).to.equal("Select Inverse");
|
|
356
378
|
expect(el.value).to.equal("option-2");
|
|
357
|
-
|
|
379
|
+
closed = oneEvent(el, "sp-closed");
|
|
358
380
|
firstItem.click();
|
|
359
|
-
await
|
|
360
|
-
await nextFrame();
|
|
381
|
+
await closed;
|
|
361
382
|
expect(el.open).to.be.false;
|
|
362
383
|
expect((_d = el.selectedItem) == null ? void 0 : _d.itemText).to.equal("Deselect");
|
|
363
384
|
expect(el.value).to.equal("Deselect");
|
|
@@ -365,7 +386,6 @@ export function runPickerTests() {
|
|
|
365
386
|
it("dispatches bubbling and composed events", async () => {
|
|
366
387
|
const changeSpy = spy();
|
|
367
388
|
const parent = el.parentElement;
|
|
368
|
-
parent.attachShadow({ mode: "open" });
|
|
369
389
|
parent.shadowRoot.append(el);
|
|
370
390
|
const secondItem = el.querySelector(
|
|
371
391
|
"sp-menu-item:nth-of-type(2)"
|
|
@@ -375,11 +395,9 @@ export function runPickerTests() {
|
|
|
375
395
|
const opened = oneEvent(el, "sp-opened");
|
|
376
396
|
el.open = true;
|
|
377
397
|
await opened;
|
|
378
|
-
await elementUpdated(el);
|
|
379
398
|
const closed = oneEvent(el, "sp-closed");
|
|
380
399
|
secondItem.click();
|
|
381
400
|
await closed;
|
|
382
|
-
await elementUpdated(el);
|
|
383
401
|
expect(el.value).to.equal(secondItem.value);
|
|
384
402
|
expect(changeSpy.calledOnce).to.be.true;
|
|
385
403
|
});
|
|
@@ -390,10 +408,9 @@ export function runPickerTests() {
|
|
|
390
408
|
"sp-menu-item:nth-of-type(2)"
|
|
391
409
|
);
|
|
392
410
|
const button = el.button;
|
|
393
|
-
|
|
411
|
+
const opened = oneEvent(el, "sp-opened");
|
|
394
412
|
button.click();
|
|
395
413
|
await opened;
|
|
396
|
-
await elementUpdated(el);
|
|
397
414
|
expect(el.open).to.be.true;
|
|
398
415
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
399
416
|
expect(el.value).to.equal("");
|
|
@@ -402,14 +419,12 @@ export function runPickerTests() {
|
|
|
402
419
|
event.preventDefault();
|
|
403
420
|
preventChangeSpy();
|
|
404
421
|
});
|
|
405
|
-
const closed = oneEvent(el, "sp-closed");
|
|
406
|
-
opened = oneEvent(el, "sp-opened");
|
|
407
422
|
secondItem.click();
|
|
408
|
-
await
|
|
409
|
-
await
|
|
410
|
-
await elementUpdated(el);
|
|
423
|
+
await nextFrame();
|
|
424
|
+
await nextFrame();
|
|
411
425
|
expect(preventChangeSpy.calledOnce).to.be.true;
|
|
412
426
|
expect(secondItem.selected, "selection prevented").to.be.false;
|
|
427
|
+
expect(el.open).to.be.true;
|
|
413
428
|
});
|
|
414
429
|
it("can throw focus after `change`", async () => {
|
|
415
430
|
var _a;
|
|
@@ -452,20 +467,17 @@ export function runPickerTests() {
|
|
|
452
467
|
button.dispatchEvent(tEvent());
|
|
453
468
|
await elementUpdated(el);
|
|
454
469
|
expect(el.open, "still closed").to.be.false;
|
|
470
|
+
const opened = oneEvent(el, "sp-opened");
|
|
455
471
|
button.dispatchEvent(arrowUpEvent());
|
|
456
472
|
await elementUpdated(el);
|
|
457
473
|
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
|
-
);
|
|
474
|
+
await opened;
|
|
475
|
+
const closed = oneEvent(el, "sp-closed");
|
|
476
|
+
sendKeys({
|
|
477
|
+
press: "Escape"
|
|
478
|
+
});
|
|
479
|
+
await closed;
|
|
480
|
+
expect(el.open).to.be.false;
|
|
469
481
|
});
|
|
470
482
|
it("opens on ArrowDown", async () => {
|
|
471
483
|
var _a, _b;
|
|
@@ -479,19 +491,18 @@ export function runPickerTests() {
|
|
|
479
491
|
const opened = oneEvent(el, "sp-opened");
|
|
480
492
|
button.dispatchEvent(arrowDownEvent());
|
|
481
493
|
await opened;
|
|
482
|
-
await elementUpdated(el);
|
|
483
494
|
expect(el.open, "open by ArrowDown").to.be.true;
|
|
484
495
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
485
496
|
expect(el.value).to.equal("");
|
|
486
497
|
const closed = oneEvent(el, "sp-closed");
|
|
487
498
|
firstItem.click();
|
|
488
499
|
await closed;
|
|
489
|
-
await elementUpdated(el);
|
|
490
500
|
expect(el.open).to.be.false;
|
|
491
501
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Deselect");
|
|
492
502
|
expect(el.value).to.equal("Deselect");
|
|
493
503
|
});
|
|
494
504
|
it("quick selects on ArrowLeft/Right", async () => {
|
|
505
|
+
await nextFrame();
|
|
495
506
|
const selectionSpy = spy();
|
|
496
507
|
el.addEventListener("change", (event) => {
|
|
497
508
|
const { value } = event.target;
|
|
@@ -519,6 +530,7 @@ export function runPickerTests() {
|
|
|
519
530
|
expect(selectionSpy.calledWith("Make Work Path")).to.be.false;
|
|
520
531
|
});
|
|
521
532
|
it("quick selects first item on ArrowRight when no value", async () => {
|
|
533
|
+
await nextFrame();
|
|
522
534
|
const selectionSpy = spy();
|
|
523
535
|
el.addEventListener("change", (event) => {
|
|
524
536
|
const { value } = event.target;
|
|
@@ -536,6 +548,10 @@ export function runPickerTests() {
|
|
|
536
548
|
});
|
|
537
549
|
it("refocuses on list when open", async () => {
|
|
538
550
|
const firstItem = el.querySelector("sp-menu-item");
|
|
551
|
+
const thirdItem = el.querySelector(
|
|
552
|
+
"sp-menu-item:nth-of-type(3)"
|
|
553
|
+
);
|
|
554
|
+
const button = el.button;
|
|
539
555
|
const input = document.createElement("input");
|
|
540
556
|
el.insertAdjacentElement("afterend", input);
|
|
541
557
|
el.focus();
|
|
@@ -543,44 +559,41 @@ export function runPickerTests() {
|
|
|
543
559
|
expect(document.activeElement === input).to.be.true;
|
|
544
560
|
await sendKeys({ press: "Shift+Tab" });
|
|
545
561
|
expect(document.activeElement === el).to.be.true;
|
|
546
|
-
await sendKeys({ press: "Enter" });
|
|
547
562
|
const opened = oneEvent(el, "sp-opened");
|
|
548
|
-
|
|
563
|
+
sendKeys({ press: "Enter" });
|
|
549
564
|
await opened;
|
|
550
565
|
await elementUpdated(el);
|
|
551
566
|
await waitUntil(
|
|
552
567
|
() => firstItem.focused,
|
|
553
568
|
"The first items should have become focused visually."
|
|
554
569
|
);
|
|
555
|
-
|
|
556
|
-
await
|
|
557
|
-
expect(
|
|
570
|
+
await sendKeys({ press: "ArrowDown" });
|
|
571
|
+
await sendKeys({ press: "ArrowDown" });
|
|
572
|
+
expect(thirdItem.focused).to.be.true;
|
|
573
|
+
button.focus();
|
|
574
|
+
expect(isMenuActiveElement(el)).to.be.false;
|
|
558
575
|
el.focus();
|
|
559
576
|
await elementUpdated(el);
|
|
560
577
|
await waitUntil(
|
|
561
|
-
() => isMenuActiveElement(),
|
|
578
|
+
() => isMenuActiveElement(el),
|
|
562
579
|
"first item refocused"
|
|
563
580
|
);
|
|
564
|
-
expect(el
|
|
565
|
-
expect(
|
|
566
|
-
await sendKeys({ press: "ArrowDown" });
|
|
567
|
-
await sendKeys({ press: "ArrowUp" });
|
|
568
|
-
expect(firstItem.focused).to.be.true;
|
|
581
|
+
expect(isMenuActiveElement(el)).to.be.true;
|
|
582
|
+
expect(thirdItem.focused).to.be.true;
|
|
569
583
|
});
|
|
570
|
-
it("
|
|
584
|
+
it("allows tabing to close", async () => {
|
|
585
|
+
const input = document.createElement("input");
|
|
586
|
+
el.insertAdjacentElement("afterend", input);
|
|
587
|
+
const opened = oneEvent(el, "sp-opened");
|
|
571
588
|
el.open = true;
|
|
572
|
-
await
|
|
589
|
+
await opened;
|
|
590
|
+
await nextFrame();
|
|
573
591
|
expect(el.open).to.be.true;
|
|
574
592
|
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;
|
|
593
|
+
const closed = oneEvent(el, "sp-closed");
|
|
594
|
+
sendKeys({ press: "Tab" });
|
|
595
|
+
await closed;
|
|
596
|
+
expect(el.open, "closes").to.be.false;
|
|
584
597
|
});
|
|
585
598
|
describe("tab order", () => {
|
|
586
599
|
let input1;
|
|
@@ -635,51 +648,7 @@ export function runPickerTests() {
|
|
|
635
648
|
input1
|
|
636
649
|
);
|
|
637
650
|
});
|
|
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 () => {
|
|
651
|
+
it("can close and immediately tab to the next tab stop", async () => {
|
|
683
652
|
el.focus();
|
|
684
653
|
await nextFrame();
|
|
685
654
|
expect(document.activeElement, "focuses el").to.equal(el);
|
|
@@ -688,7 +657,7 @@ export function runPickerTests() {
|
|
|
688
657
|
await opened;
|
|
689
658
|
expect(el.open, "opened").to.be.true;
|
|
690
659
|
await waitUntil(
|
|
691
|
-
() => isMenuActiveElement(),
|
|
660
|
+
() => isMenuActiveElement(el),
|
|
692
661
|
"first item focused"
|
|
693
662
|
);
|
|
694
663
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -705,13 +674,13 @@ export function runPickerTests() {
|
|
|
705
674
|
it("can close and immediate shift+tab to the previous tab stop", async () => {
|
|
706
675
|
el.focus();
|
|
707
676
|
await nextFrame();
|
|
708
|
-
expect(document.activeElement, "focuses el").to.
|
|
677
|
+
expect(document.activeElement === el, "focuses el").to.be.true;
|
|
709
678
|
const opened = oneEvent(el, "sp-opened");
|
|
710
679
|
await sendKeys({ press: "ArrowUp" });
|
|
711
680
|
await opened;
|
|
712
681
|
expect(el.open, "opened").to.be.true;
|
|
713
682
|
await waitUntil(
|
|
714
|
-
() => isMenuActiveElement(),
|
|
683
|
+
() => isMenuActiveElement(el),
|
|
715
684
|
"first item focused"
|
|
716
685
|
);
|
|
717
686
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -720,7 +689,7 @@ export function runPickerTests() {
|
|
|
720
689
|
expect(el.open).to.be.false;
|
|
721
690
|
expect(document.activeElement === el).to.be.true;
|
|
722
691
|
const focused = oneEvent(input1, "focus");
|
|
723
|
-
|
|
692
|
+
sendKeys({ press: "Shift+Tab" });
|
|
724
693
|
await focused;
|
|
725
694
|
expect(el.open).to.be.false;
|
|
726
695
|
expect(document.activeElement === input1).to.be.true;
|
|
@@ -735,8 +704,7 @@ export function runPickerTests() {
|
|
|
735
704
|
expect(el.open).to.be.false;
|
|
736
705
|
});
|
|
737
706
|
it("scrolls selected into view on open", async () => {
|
|
738
|
-
|
|
739
|
-
el.popoverEl.style.height = "40px";
|
|
707
|
+
el.shadowRoot.querySelector("sp-popover").style.height = "40px";
|
|
740
708
|
const firstItem = el.querySelector(
|
|
741
709
|
"sp-menu-item:first-child"
|
|
742
710
|
);
|
|
@@ -746,11 +714,15 @@ export function runPickerTests() {
|
|
|
746
714
|
lastItem.disabled = false;
|
|
747
715
|
el.value = lastItem.value;
|
|
748
716
|
await elementUpdated(el);
|
|
717
|
+
const opened = oneEvent(el, "sp-opened");
|
|
749
718
|
el.open = true;
|
|
750
|
-
await
|
|
751
|
-
await waitUntil(
|
|
719
|
+
await opened;
|
|
720
|
+
await waitUntil(
|
|
721
|
+
() => isMenuActiveElement(el),
|
|
722
|
+
"first item focused"
|
|
723
|
+
);
|
|
752
724
|
const getParentOffset = (el2) => {
|
|
753
|
-
const parentScroll = el2.parentElement.scrollTop;
|
|
725
|
+
const parentScroll = el2.assignedSlot.parentElement.scrollTop;
|
|
754
726
|
const parentOffset = el2.offsetTop - parentScroll;
|
|
755
727
|
return parentOffset;
|
|
756
728
|
};
|
|
@@ -759,7 +731,9 @@ export function runPickerTests() {
|
|
|
759
731
|
lastItem.dispatchEvent(
|
|
760
732
|
new FocusEvent("focusin", { bubbles: true })
|
|
761
733
|
);
|
|
762
|
-
|
|
734
|
+
await sendKeys({
|
|
735
|
+
press: "ArrowDown"
|
|
736
|
+
});
|
|
763
737
|
await elementUpdated(el);
|
|
764
738
|
await nextFrame();
|
|
765
739
|
expect(getParentOffset(lastItem)).to.be.greaterThan(40);
|
|
@@ -797,6 +771,8 @@ export function runPickerTests() {
|
|
|
797
771
|
beforeEach(async () => {
|
|
798
772
|
el = await groupedFixture();
|
|
799
773
|
await elementUpdated(el);
|
|
774
|
+
await nextFrame();
|
|
775
|
+
await nextFrame();
|
|
800
776
|
});
|
|
801
777
|
it("selects the item with a matching value in a group", async () => {
|
|
802
778
|
const item = el.querySelector("#should-be-selected");
|
|
@@ -834,6 +810,7 @@ export function runPickerTests() {
|
|
|
834
810
|
beforeEach(async () => {
|
|
835
811
|
el = await pickerFixture2();
|
|
836
812
|
await elementUpdated(el);
|
|
813
|
+
await nextFrame();
|
|
837
814
|
});
|
|
838
815
|
afterEach(async () => {
|
|
839
816
|
if (el.open) {
|
|
@@ -919,6 +896,7 @@ export function runPickerTests() {
|
|
|
919
896
|
beforeEach(async () => {
|
|
920
897
|
el = await pickerFixture2();
|
|
921
898
|
await elementUpdated(el);
|
|
899
|
+
await nextFrame();
|
|
922
900
|
});
|
|
923
901
|
afterEach(async () => {
|
|
924
902
|
if (el.open) {
|
|
@@ -935,7 +913,6 @@ export function runPickerTests() {
|
|
|
935
913
|
const opened = oneEvent(el, "sp-opened");
|
|
936
914
|
el.button.click();
|
|
937
915
|
await opened;
|
|
938
|
-
await elementUpdated(el);
|
|
939
916
|
expect(el.open).to.be.true;
|
|
940
917
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
941
918
|
expect(el.value).to.equal("");
|
|
@@ -955,6 +932,7 @@ export function runPickerTests() {
|
|
|
955
932
|
`);
|
|
956
933
|
const el2 = test.querySelector("sp-picker");
|
|
957
934
|
await elementUpdated(el2);
|
|
935
|
+
await nextFrame();
|
|
958
936
|
let snapshot = await a11ySnapshot({});
|
|
959
937
|
expect(
|
|
960
938
|
findAccessibilityNode(
|
|
@@ -965,6 +943,9 @@ export function runPickerTests() {
|
|
|
965
943
|
).to.not.be.null;
|
|
966
944
|
el2.value = "2";
|
|
967
945
|
await elementUpdated(el2);
|
|
946
|
+
await nextFrame();
|
|
947
|
+
await nextFrame();
|
|
948
|
+
expect(el2.value).to.equal("2");
|
|
968
949
|
snapshot = await a11ySnapshot({});
|
|
969
950
|
expect(
|
|
970
951
|
findAccessibilityNode(
|
|
@@ -977,6 +958,8 @@ export function runPickerTests() {
|
|
|
977
958
|
it("toggles between pickers", async () => {
|
|
978
959
|
const el2 = await pickerFixture();
|
|
979
960
|
const el1 = await pickerFixture();
|
|
961
|
+
el1.parentElement.style.float = "left";
|
|
962
|
+
el2.parentElement.style.float = "left";
|
|
980
963
|
el1.id = "away";
|
|
981
964
|
el2.id = "other";
|
|
982
965
|
await Promise.all([elementUpdated(el1), elementUpdated(el2)]);
|
|
@@ -997,8 +980,8 @@ export function runPickerTests() {
|
|
|
997
980
|
closed = oneEvent(el2, "sp-closed");
|
|
998
981
|
el1.click();
|
|
999
982
|
await Promise.all([open, closed]);
|
|
1000
|
-
expect(el1.open).to.be.true;
|
|
1001
983
|
expect(el2.open).to.be.false;
|
|
984
|
+
expect(el1.open).to.be.true;
|
|
1002
985
|
closed = oneEvent(el1, "sp-closed");
|
|
1003
986
|
sendKeys({
|
|
1004
987
|
press: "Escape"
|
|
@@ -1007,7 +990,7 @@ export function runPickerTests() {
|
|
|
1007
990
|
expect(el1.open).to.be.false;
|
|
1008
991
|
});
|
|
1009
992
|
it("displays selected item text by default", async () => {
|
|
1010
|
-
var _a, _b, _c, _d;
|
|
993
|
+
var _a, _b, _c, _d, _e;
|
|
1011
994
|
const el2 = await fixture(
|
|
1012
995
|
html`
|
|
1013
996
|
<sp-picker
|
|
@@ -1024,6 +1007,7 @@ export function runPickerTests() {
|
|
|
1024
1007
|
</sp-picker>
|
|
1025
1008
|
`
|
|
1026
1009
|
);
|
|
1010
|
+
await nextFrame();
|
|
1027
1011
|
await elementUpdated(el2);
|
|
1028
1012
|
await waitUntil(
|
|
1029
1013
|
() => {
|
|
@@ -1049,11 +1033,14 @@ export function runPickerTests() {
|
|
|
1049
1033
|
const opened = oneEvent(el2, "sp-opened");
|
|
1050
1034
|
sendKeys({ press: "Enter" });
|
|
1051
1035
|
await opened;
|
|
1052
|
-
await elementUpdated(el2.optionsMenu);
|
|
1053
1036
|
expect(
|
|
1054
|
-
el2
|
|
1037
|
+
el2 === document.activeElement,
|
|
1055
1038
|
`activeElement is ${(_d = document.activeElement) == null ? void 0 : _d.localName}`
|
|
1056
1039
|
).to.be.true;
|
|
1040
|
+
expect(
|
|
1041
|
+
el2.optionsMenu === el2.shadowRoot.activeElement,
|
|
1042
|
+
`activeElement is ${(_e = el2.shadowRoot.activeElement) == null ? void 0 : _e.localName}`
|
|
1043
|
+
).to.be.true;
|
|
1057
1044
|
expect(firstItem.focused, 'firstItem NOT "focused"').to.be.false;
|
|
1058
1045
|
expect(secondItem.focused, 'secondItem "focused"').to.be.true;
|
|
1059
1046
|
expect(el2.optionsMenu.getAttribute("aria-activedescendant")).to.equal(
|
|
@@ -1140,15 +1127,11 @@ export function runPickerTests() {
|
|
|
1140
1127
|
await elementUpdated(el2);
|
|
1141
1128
|
expect(openedSpy.calledOnce).to.be.true;
|
|
1142
1129
|
expect(closedSpy.calledOnce).to.be.false;
|
|
1143
|
-
const openedEvent = openedSpy.args[0][0];
|
|
1144
|
-
expect(openedEvent.detail.interaction).to.equal("modal");
|
|
1145
1130
|
const closed = oneEvent(el2, "sp-closed");
|
|
1146
1131
|
el2.open = false;
|
|
1147
1132
|
await closed;
|
|
1148
1133
|
await elementUpdated(el2);
|
|
1149
1134
|
expect(closedSpy.calledOnce).to.be.true;
|
|
1150
|
-
const closedEvent = closedSpy.args[0][0];
|
|
1151
|
-
expect(closedEvent.detail.interaction).to.equal("modal");
|
|
1152
1135
|
});
|
|
1153
1136
|
}
|
|
1154
1137
|
//# sourceMappingURL=index.js.map
|