@@ -505,6 +505,32 @@ describe('CdkTable', () => {
505
505
] ) ;
506
506
} ) ;
507
507
508
+ it ( 'should apply correct roles for native table elements' , ( ) => {
509
+ const thisFixture = createComponent ( NativeHtmlTableApp ) ;
510
+ const thisTableElement : HTMLTableElement = thisFixture . nativeElement . querySelector ( 'table' ) ;
511
+ thisFixture . detectChanges ( ) ;
512
+
513
+ const rowGroups = Array . from ( thisTableElement . querySelectorAll ( 'thead, tbody, tfoot' ) ) ;
514
+ expect ( rowGroups . length ) . toBe ( 3 , 'Expected table to have a thead, tbody, and tfoot' ) ;
515
+ for ( const group of rowGroups ) {
516
+ expect ( group . getAttribute ( 'role' ) )
517
+ . toBe ( 'rowgroup' , 'Expected thead, tbody, and tfoot to have role="rowgroup"' ) ;
518
+ }
519
+ } ) ;
520
+
521
+ it ( 'should hide thead/tfoot when there are no header/footer rows' , ( ) => {
522
+ const thisFixture = createComponent ( NativeTableWithNoHeaderOrFooterRows ) ;
523
+ const thisTableElement : HTMLTableElement = thisFixture . nativeElement . querySelector ( 'table' ) ;
524
+ thisFixture . detectChanges ( ) ;
525
+
526
+ const rowGroups : HTMLElement [ ] = Array . from ( thisTableElement . querySelectorAll ( 'thead, tfoot' ) ) ;
527
+ expect ( rowGroups . length ) . toBe ( 2 , 'Expected table to have a thead and tfoot' ) ;
528
+ for ( const group of rowGroups ) {
529
+ expect ( group . style . display )
530
+ . toBe ( 'none' , 'Expected thead and tfoot to be `display: none`' ) ;
531
+ }
532
+ } ) ;
533
+
508
534
it ( 'should render cells even if row data is falsy' , ( ) => {
509
535
setupTableTestApp ( BooleanRowCdkTableApp ) ;
510
536
expectTableToMatchContent ( tableElement , [
@@ -1591,27 +1617,27 @@ class MultipleHeaderFooterRowsCdkTableApp {
1591
1617
1592
1618
<ng-container cdkColumnDef="index1Column">
1593
1619
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1594
- <cdk-cell *cdkCellDef="let row" > index_1_special_row</cdk-cell>
1620
+ <cdk-cell *cdkCellDef> index_1_special_row</cdk-cell>
1595
1621
</ng-container>
1596
1622
1597
1623
<ng-container cdkColumnDef="c3Column">
1598
1624
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1599
- <cdk-cell *cdkCellDef="let row" > c3_special_row</cdk-cell>
1625
+ <cdk-cell *cdkCellDef> c3_special_row</cdk-cell>
1600
1626
</ng-container>
1601
1627
1602
1628
<ng-container cdkColumnDef="index">
1603
1629
<cdk-header-cell *cdkHeaderCellDef> Index</cdk-header-cell>
1604
- <cdk-cell *cdkCellDef="let row; let index = index"> {{index}}</cdk-cell>
1630
+ <cdk-cell *cdkCellDef="let index = index"> {{index}}</cdk-cell>
1605
1631
</ng-container>
1606
1632
1607
1633
<ng-container cdkColumnDef="dataIndex">
1608
1634
<cdk-header-cell *cdkHeaderCellDef> Data Index</cdk-header-cell>
1609
- <cdk-cell *cdkCellDef="let row; let dataIndex = dataIndex"> {{dataIndex}}</cdk-cell>
1635
+ <cdk-cell *cdkCellDef="let dataIndex = dataIndex"> {{dataIndex}}</cdk-cell>
1610
1636
</ng-container>
1611
1637
1612
1638
<ng-container cdkColumnDef="renderIndex">
1613
1639
<cdk-header-cell *cdkHeaderCellDef> Render Index</cdk-header-cell>
1614
- <cdk-cell *cdkCellDef="let row; let renderIndex = renderIndex"> {{renderIndex}}</cdk-cell>
1640
+ <cdk-cell *cdkCellDef="let renderIndex = renderIndex"> {{renderIndex}}</cdk-cell>
1615
1641
</ng-container>
1616
1642
1617
1643
<cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
@@ -1662,12 +1688,12 @@ class WhenRowCdkTableApp {
1662
1688
1663
1689
<ng-container cdkColumnDef="index1Column">
1664
1690
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1665
- <cdk-cell *cdkCellDef="let row" > index_1_special_row </cdk-cell>
1691
+ <cdk-cell *cdkCellDef> index_1_special_row </cdk-cell>
1666
1692
</ng-container>
1667
1693
1668
1694
<ng-container cdkColumnDef="c3Column">
1669
1695
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1670
- <cdk-cell *cdkCellDef="let row" > c3_special_row </cdk-cell>
1696
+ <cdk-cell *cdkCellDef> c3_special_row </cdk-cell>
1671
1697
</ng-container>
1672
1698
1673
1699
<cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
@@ -1705,12 +1731,12 @@ class WhenRowWithoutDefaultCdkTableApp {
1705
1731
1706
1732
<ng-container cdkColumnDef="index1Column">
1707
1733
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1708
- <cdk-cell *cdkCellDef="let row" > index_1_special_row </cdk-cell>
1734
+ <cdk-cell *cdkCellDef> index_1_special_row </cdk-cell>
1709
1735
</ng-container>
1710
1736
1711
1737
<ng-container cdkColumnDef="c3Column">
1712
1738
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1713
- <cdk-cell *cdkCellDef="let row" > c3_special_row </cdk-cell>
1739
+ <cdk-cell *cdkCellDef> c3_special_row </cdk-cell>
1714
1740
</ng-container>
1715
1741
1716
1742
<cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
@@ -1790,7 +1816,7 @@ class TrackByCdkTableApp {
1790
1816
[sticky]="isStuck(stickyStartColumns, column)"
1791
1817
[stickyEnd]="isStuck(stickyEndColumns, column)">
1792
1818
<cdk-header-cell *cdkHeaderCellDef> Header {{column}} </cdk-header-cell>
1793
- <cdk-cell *cdkCellDef="let row"> {{column}} </cdk-cell>
1819
+ <cdk-cell *cdkCellDef> {{column}}</cdk-cell>
1794
1820
<cdk-footer-cell *cdkFooterCellDef> Footer {{column}} </cdk-footer-cell>
1795
1821
</ng-container>
1796
1822
@@ -2226,6 +2252,35 @@ class NativeHtmlTableApp {
2226
2252
@ViewChild ( CdkTable ) table : CdkTable < TestData > ;
2227
2253
}
2228
2254
2255
+ @Component ( {
2256
+ template : `
2257
+ <table cdk-table [dataSource]="dataSource">
2258
+ <ng-container cdkColumnDef="column_a">
2259
+ <th cdk-header-cell *cdkHeaderCellDef> Column A</th>
2260
+ <td cdk-cell *cdkCellDef="let row"> {{row.a}}</td>
2261
+ </ng-container>
2262
+
2263
+ <ng-container cdkColumnDef="column_b">
2264
+ <th cdk-header-cell *cdkHeaderCellDef> Column B</th>
2265
+ <td cdk-cell *cdkCellDef="let row"> {{row.b}}</td>
2266
+ </ng-container>
2267
+
2268
+ <ng-container cdkColumnDef="column_c">
2269
+ <th cdk-header-cell *cdkHeaderCellDef> Column C</th>
2270
+ <td cdk-cell *cdkCellDef="let row"> {{row.c}}</td>
2271
+ </ng-container>
2272
+
2273
+ <tr cdk-row *cdkRowDef="let row; columns: columnsToRender" class="customRowClass"></tr>
2274
+ </table>
2275
+ `
2276
+ } )
2277
+ class NativeTableWithNoHeaderOrFooterRows {
2278
+ dataSource : FakeDataSource | undefined = new FakeDataSource ( ) ;
2279
+ columnsToRender = [ 'column_a' , 'column_b' , 'column_c' ] ;
2280
+
2281
+ @ViewChild ( CdkTable ) table : CdkTable < TestData > ;
2282
+ }
2283
+
2229
2284
@Component ( {
2230
2285
template : `
2231
2286
<table cdk-table [dataSource]="dataSource">
0 commit comments