Skip to content

Commit 8116194

Browse files
committed
feat(tree): Use tabindex for tree node (#9042)
1 parent 5a3a653 commit 8116194

File tree

10 files changed

+55
-26
lines changed

10 files changed

+55
-26
lines changed

src/cdk/tree/control/flat-tree-control.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ export class FlatTreeControl<T> extends BaseTreeControl<T> {
2929

3030
// Goes through flattened tree nodes in the `dataNodes` array, and get all descendants.
3131
// The level of descendants of a tree node must be greater than the level of the given
32-
// tree node.
32+
// tree node.
3333
// If we reach a node whose level is equal to the level of the tree node, we hit a sibling.
34-
// If we reach a node whose level is greater than the level of the tree node, we hit a
35-
// sibling of an ancestor.
34+
// If we reach a node whose level is greater than the level of the tree node, we hit a
35+
// sibling of an ancestor.
3636
for (let i = startIndex + 1;
3737
i < this.dataNodes.length && this.getLevel(dataNode) < this.getLevel(this.dataNodes[i]);
3838
i++) {

src/cdk/tree/nested-node.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import {CdkTreeNode} from './node';
4242
host: {
4343
'[attr.role]': 'role',
4444
'class': 'cdk-tree-node cdk-nested-tree-node',
45-
'tabindex': '0',
4645
},
4746
providers: [{provide: CdkTreeNode, useExisting: CdkNestedTreeNode}]
4847
})

src/cdk/tree/tree.spec.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
1+
/**
2+
* @license
3+
* Copyright Google LLC All Rights Reserved.
4+
*
5+
* Use of this source code is governed by an MIT-style license that can be
6+
* found in the LICENSE file at https://angular.io/license
7+
*/
8+
import {ComponentFixture, TestBed} from '@angular/core/testing';
29
import {Component, ViewChild} from '@angular/core';
310

411
import {CollectionViewer, DataSource} from '@angular/cdk/collections';
@@ -269,7 +276,7 @@ describe('CdkTree', () => {
269276
[`topping_1 - cheese_1 + base_1`],
270277
[`topping_2 - cheese_2 + base_2`],
271278
[_, `topping_4 - cheese_4 + base_4`],
272-
[`topping_3 - cheese_3 + base_3`])
279+
[`topping_3 - cheese_3 + base_3`]);
273280
});
274281

275282
it('with nested child data', () => {
@@ -427,7 +434,7 @@ describe('CdkTree', () => {
427434
[`topping_2 - cheese_2 + base_2`],
428435
[`topping_3 - cheese_3 + base_3`]);
429436
});
430-
})
437+
});
431438
});
432439
});
433440

src/cdk/tree/tree.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ export class CdkTree<T> implements CollectionViewer, OnInit, OnDestroy {
139139
* clearing the node outlet. Otherwise start listening for new data.
140140
*/
141141
private _switchDataSource(dataSource: DataSource<T>) {
142-
this._data = new Array<T>();;
142+
this._data = new Array<T>();
143143

144144
if (this.dataSource) {
145145
this.dataSource.disconnect(this);

src/demo-app/demo-app/demo-module.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ import {TableDemoModule} from '../table/table-demo-module';
126126
],
127127
providers: [
128128
{provide: OverlayContainer, useClass: FullscreenOverlayContainer},
129-
PeopleDatabase,
130129
JsonDatabase
131130
],
132131
entryComponents: [

src/demo-app/tree/json-database.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export class JsonNode {
1515
value: any;
1616
}
1717

18-
const TREE_DATA = `{"Tina":
18+
const TREE_DATA = `{"Tina":
1919
{
2020
"Documents": {
2121
"angular": {
@@ -37,7 +37,7 @@ const TREE_DATA = `{"Tina":
3737
"November": "pdf",
3838
"October": "pdf"
3939
},
40-
"Pictures": {
40+
"Pictures": {
4141
"Sun": "png",
4242
"Woods": "jpg",
4343
"Photo Booth Library": {
@@ -50,8 +50,7 @@ const TREE_DATA = `{"Tina":
5050
"Calendar": "app",
5151
"Webstorm": "app"
5252
}
53-
}}
54-
`;
53+
}}`;
5554

5655
@Injectable()
5756
export class JsonDatabase {
@@ -86,5 +85,4 @@ export class JsonDatabase {
8685
}
8786
return data;
8887
}
89-
9088
}

src/demo-app/tree/tree-demo.scss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
}
55

66
ul, li {
7-
-webkit-margin-before: 0px;
8-
-webkit-margin-after: 0px;
7+
-webkit-margin-before: 0;
8+
-webkit-margin-after: 0;
99
list-style-type: none;
1010
}
1111

src/demo-app/tree/tree-demo.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ export class TreeDemo {
4444
this.nestedDataSource = new JsonNestedDataSource(database);
4545
}
4646

47-
getLevel = (node: JsonFlatNode) => { return node.level };
47+
getLevel = (node: JsonFlatNode) => { return node.level; };
4848

49-
isExpandable = (node: JsonFlatNode) => { return node.expandable; }
49+
isExpandable = (node: JsonFlatNode) => { return node.expandable; };
5050

51-
getChildren = (node: JsonNode) => { return ofObservable(node.children); }
51+
getChildren = (node: JsonNode) => { return ofObservable(node.children); };
5252

53-
hasChild = (_: number, _nodeData: JsonFlatNode) => { return _nodeData.expandable; }
53+
hasChild = (_: number, _nodeData: JsonFlatNode) => { return _nodeData.expandable; };
5454

55-
hasNestedChild = (_: number, nodeData: JsonNode) => {return !(nodeData.value); }
55+
hasNestedChild = (_: number, nodeData: JsonNode) => {return !(nodeData.value); };
5656
}

src/lib/tree/node.ts

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,49 @@
77
*/
88

99
import {
10+
Attribute,
1011
ContentChildren,
1112
Directive,
13+
ElementRef,
1214
Input,
1315
QueryList
1416
} from '@angular/core';
1517
import {
1618
CdkNestedTreeNode,
19+
CdkTree,
1720
CdkTreeNodeDef,
1821
CdkTreeNode,
1922
} from '@angular/cdk/tree';
2023
import {MatTreeNodeOutlet} from './outlet';
24+
import {mixinTabIndex, mixinDisabled, CanDisable, HasTabIndex} from '@angular/material/core';
25+
26+
27+
export const _MatTreeNodeMixinBase = mixinTabIndex(mixinDisabled(CdkTreeNode));
28+
export const _MatNestedTreeNodeMixinBase = mixinTabIndex(mixinDisabled(CdkNestedTreeNode));
2129

2230
/**
2331
* Wrapper for the CdkTree node with Material design styles.
2432
*/
25-
// TODO(tinayuangao): use mixinTabIndex
2633
@Directive({
2734
selector: 'mat-tree-node',
2835
exportAs: 'matTreeNode',
36+
inputs: ['disabled', 'tabIndex'],
2937
host: {
3038
'[attr.role]': 'role',
31-
'class': 'mat-tree-node',
32-
'tabindex': '0',
39+
'class': 'mat-tree-node'
3340
},
3441
providers: [{provide: CdkTreeNode, useExisting: MatTreeNode}]
3542
})
36-
export class MatTreeNode<T> extends CdkTreeNode<T> {
43+
export class MatTreeNode<T> extends _MatTreeNodeMixinBase<T> implements HasTabIndex, CanDisable {
3744
@Input() role: 'treeitem' | 'group' = 'treeitem';
45+
46+
constructor(protected _elementRef: ElementRef,
47+
protected _tree: CdkTree<T>,
48+
@Attribute('tabindex') tabIndex: string) {
49+
super(_elementRef, _tree);
50+
51+
this.tabIndex = Number(tabIndex) || 0;
52+
}
3853
}
3954

4055
/**
@@ -61,13 +76,24 @@ export class MatTreeNodeDef<T> extends CdkTreeNodeDef<T> {
6176
'[attr.role]': 'role',
6277
'class': 'mat-nested-tree-node',
6378
},
79+
inputs: ['disabled', 'tabIndex'],
6480
providers: [
6581
{provide: CdkNestedTreeNode, useExisting: MatNestedTreeNode},
6682
{provide: CdkTreeNode, useExisting: MatNestedTreeNode}
6783
]
6884
})
69-
export class MatNestedTreeNode<T> extends CdkNestedTreeNode<T> {
85+
export class MatNestedTreeNode<T> extends _MatNestedTreeNodeMixinBase<T>
86+
implements HasTabIndex, CanDisable {
87+
7088
@Input('matNestedTreeNode') node: T;
7189

7290
@ContentChildren(MatTreeNodeOutlet) nodeOutlet: QueryList<MatTreeNodeOutlet>;
91+
92+
constructor(protected _elementRef: ElementRef,
93+
protected _tree: CdkTree<T>,
94+
@Attribute('tabindex') tabIndex: string) {
95+
super(_elementRef, _tree);
96+
97+
this.tabIndex = Number(tabIndex) || 0;
98+
}
7399
}

src/lib/tree/tree-data-source.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)