Skip to content

Commit 8fa7726

Browse files
authored
feat(data-table): allow custom roles (#4988)
* feat(data-table): allow custom roles * change to treegrid
1 parent a647c52 commit 8fa7726

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

src/lib/core/data-table/data-table.spec.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ describe('CdkTable', () => {
2121

2222
TestBed.configureTestingModule({
2323
imports: [CdkDataTableModule],
24-
declarations: [SimpleCdkTableApp],
24+
declarations: [SimpleCdkTableApp, CustomRoleCdkTableApp],
2525
}).compileComponents();
2626

2727
fixture = TestBed.createComponent(SimpleCdkTableApp);
@@ -84,6 +84,13 @@ describe('CdkTable', () => {
8484
});
8585
});
8686

87+
it('should not clobber an existing table role', () => {
88+
fixture = TestBed.createComponent(CustomRoleCdkTableApp);
89+
fixture.detectChanges();
90+
91+
expect(fixture.nativeElement.querySelector('cdk-table')).toBeRole('treegrid');
92+
});
93+
8794
it('should re-render the rows when the data changes', () => {
8895
dataSource.addData();
8996
fixture.detectChanges();
@@ -255,6 +262,26 @@ class SimpleCdkTableApp {
255262
@ViewChild(CdkTable) table: CdkTable<TestData>;
256263
}
257264

265+
@Component({
266+
template: `
267+
<cdk-table [dataSource]="dataSource" role="treegrid">
268+
<ng-container cdkColumnDef="column_a">
269+
<cdk-header-cell *cdkHeaderCellDef> Column A</cdk-header-cell>
270+
<cdk-cell *cdkCellDef="let row"> {{row.a}}</cdk-cell>
271+
</ng-container>
272+
273+
<cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
274+
<cdk-row *cdkRowDef="let row; columns: columnsToRender"></cdk-row>
275+
</cdk-table>
276+
`
277+
})
278+
class CustomRoleCdkTableApp {
279+
dataSource: FakeDataSource = new FakeDataSource();
280+
columnsToRender = ['column_a'];
281+
282+
@ViewChild(CdkTable) table: CdkTable<TestData>;
283+
}
284+
258285
function getElements(element: Element, query: string): Element[] {
259286
return [].slice.call(element.querySelectorAll(query));
260287
}

src/lib/core/data-table/data-table.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import {
2+
Attribute,
23
ChangeDetectionStrategy,
34
ChangeDetectorRef,
45
Component,
56
ContentChild,
67
ContentChildren,
78
Directive,
9+
ElementRef,
810
Input,
911
IterableChangeRecord,
1012
IterableDiffer,
1113
IterableDiffers,
1214
NgIterable,
1315
QueryList,
16+
Renderer2,
1417
ViewChild,
1518
ViewContainerRef,
1619
ViewEncapsulation
@@ -54,7 +57,6 @@ export class HeaderRowPlaceholder {
5457
`,
5558
host: {
5659
'class': 'cdk-table',
57-
'role': 'grid' // TODO(andrewseguin): Allow the user to choose either grid or treegrid
5860
},
5961
encapsulation: ViewEncapsulation.None,
6062
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -104,12 +106,19 @@ export class CdkTable<T> implements CollectionViewer {
104106
@ContentChildren(CdkRowDef) _rowDefinitions: QueryList<CdkRowDef>;
105107

106108
constructor(private readonly _differs: IterableDiffers,
107-
private readonly _changeDetectorRef: ChangeDetectorRef) {
109+
private readonly _changeDetectorRef: ChangeDetectorRef,
110+
elementRef: ElementRef,
111+
renderer: Renderer2,
112+
@Attribute('role') role: string) {
108113
// Show the stability warning of the data-table only if it doesn't run inside of jasmine.
109114
// This is just temporary and should reduce warnings when running the tests.
110115
if (!(typeof window !== 'undefined' && window['jasmine'])) {
111116
console.warn('The data table is still in active development ' +
112-
'and should be considered unstable.');
117+
'and should be considered unstable.');
118+
}
119+
120+
if (!role) {
121+
renderer.setAttribute(elementRef.nativeElement, 'role', 'grid');
113122
}
114123

115124
// TODO(andrewseguin): Add trackby function input.

src/lib/core/testing/jasmine-matchers.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ export const customMatchers: jasmine.CustomMatcherFactories = {
66
return {
77
compare: function (element: Element, expectedRole: string) {
88
const result: jasmine.CustomMatcherResult = {pass: false};
9-
result.pass = element.getAttribute('role') === expectedRole;
9+
const actualRole = element.getAttribute('role');
10+
11+
result.pass = actualRole === expectedRole;
1012
result.message = `Expected role for ${element.tagName} to be ${expectedRole}`;
1113

1214
if (!result.pass) {
13-
result.message += ` but was ${expectedRole}`;
15+
result.message += ` but was ${actualRole}`;
1416
}
1517

1618
return result;

0 commit comments

Comments
 (0)