Skip to content

Commit e9cfe0e

Browse files
committed
fix(cdk/a11y): fix tests
1 parent abfa4a3 commit e9cfe0e

File tree

4 files changed

+32
-12
lines changed

4 files changed

+32
-12
lines changed

src/cdk/a11y/key-manager/list-key-manager.spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ describe('Key managers', () => {
150150

151151
keyManager.setActiveItem(0);
152152
itemList.reset([new FakeFocusable('zero'), ...itemList.toArray()]);
153+
itemList.notifyOnChanges();
153154
keyManager.setActiveItem(0);
154155

155156
expect(spy).toHaveBeenCalledTimes(1);
@@ -342,6 +343,7 @@ describe('Key managers', () => {
342343
const items = itemList.toArray();
343344
items[1].disabled = true;
344345
itemList.reset(items);
346+
itemList.notifyOnChanges();
345347

346348
// Next event should skip past disabled item from 0 to 2
347349
keyManager.onKeydown(this.nextKeyEvent);
@@ -367,6 +369,7 @@ describe('Key managers', () => {
367369
items[1].disabled = undefined;
368370
items[2].disabled = undefined;
369371
itemList.reset(items);
372+
itemList.notifyOnChanges();
370373

371374
keyManager.onKeydown(this.nextKeyEvent);
372375
expect(keyManager.activeItemIndex)
@@ -416,6 +419,7 @@ describe('Key managers', () => {
416419
const items = itemList.toArray();
417420
items[2].disabled = true;
418421
itemList.reset(items);
422+
itemList.notifyOnChanges();
419423

420424
keyManager.onKeydown(this.nextKeyEvent);
421425
expect(keyManager.activeItemIndex)
@@ -558,6 +562,7 @@ describe('Key managers', () => {
558562
const items = itemList.toArray();
559563
items[0].disabled = true;
560564
itemList.reset(items);
565+
itemList.notifyOnChanges();
561566

562567
keyManager.setFirstItemActive();
563568
expect(keyManager.activeItemIndex)
@@ -580,6 +585,7 @@ describe('Key managers', () => {
580585
const items = itemList.toArray();
581586
items[2].disabled = true;
582587
itemList.reset(items);
588+
itemList.notifyOnChanges();
583589

584590
keyManager.setLastItemActive();
585591
expect(keyManager.activeItemIndex)
@@ -602,6 +608,7 @@ describe('Key managers', () => {
602608
const items = itemList.toArray();
603609
items[1].disabled = true;
604610
itemList.reset(items);
611+
itemList.notifyOnChanges();
605612

606613
expect(keyManager.activeItemIndex)
607614
.withContext(`Expected first item of the list to be active.`)
@@ -629,6 +636,7 @@ describe('Key managers', () => {
629636
const items = itemList.toArray();
630637
items[1].disabled = true;
631638
itemList.reset(items);
639+
itemList.notifyOnChanges();
632640

633641
keyManager.onKeydown(fakeKeyEvents.downArrow);
634642
keyManager.onKeydown(fakeKeyEvents.downArrow);
@@ -706,6 +714,7 @@ describe('Key managers', () => {
706714
const items = itemList.toArray();
707715
items.forEach(item => (item.disabled = true));
708716
itemList.reset(items);
717+
itemList.notifyOnChanges();
709718

710719
keyManager.onKeydown(fakeKeyEvents.downArrow);
711720
});
@@ -730,6 +739,7 @@ describe('Key managers', () => {
730739
const items = itemList.toArray();
731740
items[1].disabled = true;
732741
itemList.reset(items);
742+
itemList.notifyOnChanges();
733743

734744
expect(keyManager.activeItemIndex).toBe(0);
735745

@@ -744,6 +754,7 @@ describe('Key managers', () => {
744754
const items = itemList.toArray();
745755
items[1].skipItem = true;
746756
itemList.reset(items);
757+
itemList.notifyOnChanges();
747758

748759
expect(keyManager.activeItemIndex).toBe(0);
749760

@@ -839,6 +850,7 @@ describe('Key managers', () => {
839850
new FakeFocusable('две'),
840851
new FakeFocusable('три'),
841852
]);
853+
itemList.notifyOnChanges();
842854

843855
const keyboardEvent = createKeyboardEvent('keydown', 68, 'д');
844856

@@ -854,6 +866,7 @@ describe('Key managers', () => {
854866
new FakeFocusable('321'),
855867
new FakeFocusable('`!?'),
856868
]);
869+
itemList.notifyOnChanges();
857870

858871
keyManager.onKeydown(createKeyboardEvent('keydown', 192, '`')); // types "`"
859872
tick(debounceInterval);
@@ -874,6 +887,7 @@ describe('Key managers', () => {
874887
const items = itemList.toArray();
875888
items[0].disabled = true;
876889
itemList.reset(items);
890+
itemList.notifyOnChanges();
877891

878892
keyManager.onKeydown(createKeyboardEvent('keydown', 79, 'o')); // types "o"
879893
tick(debounceInterval);
@@ -889,6 +903,7 @@ describe('Key managers', () => {
889903
new FakeFocusable('Boromir'),
890904
new FakeFocusable('Aragorn'),
891905
]);
906+
itemList.notifyOnChanges();
892907

893908
keyManager.setActiveItem(1);
894909
keyManager.onKeydown(createKeyboardEvent('keydown', 66, 'b'));
@@ -905,6 +920,7 @@ describe('Key managers', () => {
905920
new FakeFocusable('Boromir'),
906921
new FakeFocusable('Aragorn'),
907922
]);
923+
itemList.notifyOnChanges();
908924

909925
keyManager.setActiveItem(3);
910926
keyManager.onKeydown(createKeyboardEvent('keydown', 66, 'b'));

src/cdk/a11y/key-manager/list-key-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ export class ListKeyManager<T extends ListKeyManagerOption> {
6363
// items aren't being collected via `ViewChildren` or `ContentChildren`).
6464
if (_items instanceof QueryList) {
6565
this._itemChangesSubscription = _items.changes.subscribe((newItems: QueryList<T>) => {
66+
const itemArray = newItems.toArray();
67+
this._typeahead?.setItems(itemArray);
6668
if (this._activeItem) {
67-
const itemArray = newItems.toArray();
6869
const newIndex = itemArray.indexOf(this._activeItem);
69-
this._typeahead?.setItems(itemArray);
7070

7171
if (newIndex > -1 && newIndex !== this._activeItemIndex) {
7272
this._activeItemIndex = newIndex;

src/cdk/a11y/key-manager/typeahead.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ export class Typeahead<T extends TypeaheadItem> {
3636
this._skipPredicateFn = config.skipPredicate;
3737
}
3838

39+
if (
40+
(typeof ngDevMode === 'undefined' || ngDevMode) &&
41+
initialItems.length &&
42+
initialItems.some(item => typeof item.getLabel !== 'function')
43+
) {
44+
console.error('failed', initialItems);
45+
throw new Error('KeyManager items in typeahead mode must implement the `getLabel` method.');
46+
}
47+
3948
this.setItems(initialItems);
4049
this._setupKeyHandler(typeAheadInterval);
4150
}
@@ -51,14 +60,6 @@ export class Typeahead<T extends TypeaheadItem> {
5160
}
5261

5362
setItems(items: T[]) {
54-
if (
55-
(typeof ngDevMode === 'undefined' || ngDevMode) &&
56-
items.length &&
57-
items.some(item => typeof item.getLabel !== 'function')
58-
) {
59-
throw new Error('KeyManager items in typeahead mode must implement the `getLabel` method.');
60-
}
61-
6263
this._items = items;
6364
}
6465

@@ -79,13 +80,12 @@ export class Typeahead<T extends TypeaheadItem> {
7980
return this._pressedLetters.length > 0;
8081
}
8182

82-
// TODO: find a better name?
83+
/** Resets the currently stored sequence of typed letters. */
8384
reset(): void {
8485
this._pressedLetters = [];
8586
}
8687

8788
private _setupKeyHandler(typeAheadInterval: number) {
88-
// TODO: handle unsubscription
8989
// Debounce the presses of non-navigational keys, collect the ones that correspond to letters
9090
// and convert those letters back into a string. Afterwards find the first item that starts
9191
// with that string and select it.

src/components-examples/cdk/tree/cdk-tree-custom-key-manager/cdk-tree-custom-key-manager-example.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ export class VimTreeKeyManager<T extends TreeKeyManagerItem> implements TreeKeyM
132132
}
133133
}
134134

135+
destroy() {
136+
this.change.complete();
137+
}
138+
135139
/** Stream that emits any time the focused item changes. */
136140
readonly change = new Subject<T | null>();
137141

0 commit comments

Comments
 (0)