@@ -7,7 +7,12 @@ import {Observable} from 'rxjs/Observable';
7
7
import { combineLatest } from 'rxjs/observable/combineLatest' ;
8
8
import { CdkTableModule } from './index' ;
9
9
import { map } from 'rxjs/operator/map' ;
10
- import { getTableDuplicateColumnNameError , getTableUnknownColumnError } from './table-errors' ;
10
+ import {
11
+ getTableDuplicateColumnNameError ,
12
+ getTableMissingMatchingRowDefError ,
13
+ getTableMultipleDefaultRowDefsError ,
14
+ getTableUnknownColumnError
15
+ } from './table-errors' ;
11
16
12
17
describe ( 'CdkTable' , ( ) => {
13
18
let fixture : ComponentFixture < SimpleCdkTableApp > ;
@@ -31,6 +36,9 @@ describe('CdkTable', () => {
31
36
MissingColumnDefCdkTableApp ,
32
37
CrazyColumnNameCdkTableApp ,
33
38
UndefinedColumnsCdkTableApp ,
39
+ WhenRowCdkTableApp ,
40
+ WhenRowWithoutDefaultCdkTableApp ,
41
+ WhenRowMultipleDefaultsCdkTableApp
34
42
] ,
35
43
} ) . compileComponents ( ) ;
36
44
} ) ) ;
@@ -202,6 +210,34 @@ describe('CdkTable', () => {
202
210
} ) ;
203
211
} ) ;
204
212
213
+ describe ( 'using when predicate' , ( ) => {
214
+ it ( 'should be able to display different row templates based on the row data' , ( ) => {
215
+ let whenFixture = TestBed . createComponent ( WhenRowCdkTableApp ) ;
216
+ whenFixture . detectChanges ( ) ;
217
+
218
+ let data = whenFixture . componentInstance . dataSource . data ;
219
+ expectTableToMatchContent ( whenFixture . nativeElement . querySelector ( 'cdk-table' ) , [
220
+ [ 'Column A' , 'Column B' , 'Column C' ] ,
221
+ [ data [ 0 ] . a , data [ 0 ] . b , data [ 0 ] . c ] ,
222
+ [ 'index_1_special_row' ] ,
223
+ [ 'c3_special_row' ] ,
224
+ [ data [ 3 ] . a , data [ 3 ] . b , data [ 3 ] . c ] ,
225
+ ] ) ;
226
+ } ) ;
227
+
228
+ it ( 'should error if there is row data that does not have a matching row template' , ( ) => {
229
+ let whenFixture = TestBed . createComponent ( WhenRowWithoutDefaultCdkTableApp ) ;
230
+ expect ( ( ) => whenFixture . detectChanges ( ) )
231
+ . toThrowError ( getTableMissingMatchingRowDefError ( ) . message ) ;
232
+ } ) ;
233
+
234
+ it ( 'should error if there are multiple rows that do not have a when function' , ( ) => {
235
+ let whenFixture = TestBed . createComponent ( WhenRowMultipleDefaultsCdkTableApp ) ;
236
+ expect ( ( ) => whenFixture . detectChanges ( ) )
237
+ . toThrowError ( getTableMultipleDefaultRowDefsError ( ) . message ) ;
238
+ } ) ;
239
+ } ) ;
240
+
205
241
it ( 'should use differ to add/remove/move rows' , ( ) => {
206
242
// Each row receives an attribute 'initialIndex' the element's original place
207
243
getRows ( tableElement ) . forEach ( ( row : Element , index : number ) => {
@@ -615,6 +651,139 @@ class SimpleCdkTableApp {
615
651
@ViewChild ( CdkTable ) table : CdkTable < TestData > ;
616
652
}
617
653
654
+ @Component ( {
655
+ template : `
656
+ <cdk-table [dataSource]="dataSource">
657
+ <ng-container cdkColumnDef="column_a">
658
+ <cdk-header-cell *cdkHeaderCellDef> Column A</cdk-header-cell>
659
+ <cdk-cell *cdkCellDef="let row"> {{row.a}}</cdk-cell>
660
+ </ng-container>
661
+
662
+ <ng-container cdkColumnDef="column_b">
663
+ <cdk-header-cell *cdkHeaderCellDef> Column B</cdk-header-cell>
664
+ <cdk-cell *cdkCellDef="let row"> {{row.b}}</cdk-cell>
665
+ </ng-container>
666
+
667
+ <ng-container cdkColumnDef="column_c">
668
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
669
+ <cdk-cell *cdkCellDef="let row"> {{row.c}}</cdk-cell>
670
+ </ng-container>
671
+
672
+ <ng-container cdkColumnDef="index1Column">
673
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
674
+ <cdk-cell *cdkCellDef="let row"> index_1_special_row </cdk-cell>
675
+ </ng-container>
676
+
677
+ <ng-container cdkColumnDef="c3Column">
678
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
679
+ <cdk-cell *cdkCellDef="let row"> c3_special_row </cdk-cell>
680
+ </ng-container>
681
+
682
+ <cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
683
+ <cdk-row *cdkRowDef="let row; columns: columnsToRender"></cdk-row>
684
+ <cdk-row *cdkRowDef="let row; columns: ['index1Column']; when: isIndex1"></cdk-row>
685
+ <cdk-row *cdkRowDef="let row; columns: ['c3Column']; when: hasC3"></cdk-row>
686
+ </cdk-table>
687
+ `
688
+ } )
689
+ class WhenRowCdkTableApp {
690
+ dataSource : FakeDataSource = new FakeDataSource ( ) ;
691
+ columnsToRender = [ 'column_a' , 'column_b' , 'column_c' ] ;
692
+ isIndex1 = ( _rowData : TestData , index : number ) => index == 1 ;
693
+ hasC3 = ( rowData : TestData ) => rowData . c == 'c_3' ;
694
+
695
+ constructor ( ) { this . dataSource . addData ( ) ; }
696
+
697
+ @ViewChild ( CdkTable ) table : CdkTable < TestData > ;
698
+ }
699
+
700
+ @Component ( {
701
+ template : `
702
+ <cdk-table [dataSource]="dataSource">
703
+ <ng-container cdkColumnDef="column_a">
704
+ <cdk-header-cell *cdkHeaderCellDef> Column A</cdk-header-cell>
705
+ <cdk-cell *cdkCellDef="let row"> {{row.a}}</cdk-cell>
706
+ </ng-container>
707
+
708
+ <ng-container cdkColumnDef="column_b">
709
+ <cdk-header-cell *cdkHeaderCellDef> Column B</cdk-header-cell>
710
+ <cdk-cell *cdkCellDef="let row"> {{row.b}}</cdk-cell>
711
+ </ng-container>
712
+
713
+ <ng-container cdkColumnDef="column_c">
714
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
715
+ <cdk-cell *cdkCellDef="let row"> {{row.c}}</cdk-cell>
716
+ </ng-container>
717
+
718
+ <ng-container cdkColumnDef="index1Column">
719
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
720
+ <cdk-cell *cdkCellDef="let row"> index_1_special_row </cdk-cell>
721
+ </ng-container>
722
+
723
+ <ng-container cdkColumnDef="c3Column">
724
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
725
+ <cdk-cell *cdkCellDef="let row"> c3_special_row </cdk-cell>
726
+ </ng-container>
727
+
728
+ <cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
729
+ <cdk-row *cdkRowDef="let row; columns: ['index1Column']; when: isIndex1"></cdk-row>
730
+ <cdk-row *cdkRowDef="let row; columns: ['c3Column']; when: hasC3"></cdk-row>
731
+ </cdk-table>
732
+ `
733
+ } )
734
+ class WhenRowWithoutDefaultCdkTableApp {
735
+ dataSource : FakeDataSource = new FakeDataSource ( ) ;
736
+ columnsToRender = [ 'column_a' , 'column_b' , 'column_c' ] ;
737
+ isIndex1 = ( _rowData : TestData , index : number ) => index == 1 ;
738
+ hasC3 = ( rowData : TestData ) => rowData . c == 'c_3' ;
739
+
740
+ @ViewChild ( CdkTable ) table : CdkTable < TestData > ;
741
+ }
742
+
743
+ @Component ( {
744
+ template : `
745
+ <cdk-table [dataSource]="dataSource">
746
+ <ng-container cdkColumnDef="column_a">
747
+ <cdk-header-cell *cdkHeaderCellDef> Column A</cdk-header-cell>
748
+ <cdk-cell *cdkCellDef="let row"> {{row.a}}</cdk-cell>
749
+ </ng-container>
750
+
751
+ <ng-container cdkColumnDef="column_b">
752
+ <cdk-header-cell *cdkHeaderCellDef> Column B</cdk-header-cell>
753
+ <cdk-cell *cdkCellDef="let row"> {{row.b}}</cdk-cell>
754
+ </ng-container>
755
+
756
+ <ng-container cdkColumnDef="column_c">
757
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
758
+ <cdk-cell *cdkCellDef="let row"> {{row.c}}</cdk-cell>
759
+ </ng-container>
760
+
761
+ <ng-container cdkColumnDef="index1Column">
762
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
763
+ <cdk-cell *cdkCellDef="let row"> index_1_special_row </cdk-cell>
764
+ </ng-container>
765
+
766
+ <ng-container cdkColumnDef="c3Column">
767
+ <cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
768
+ <cdk-cell *cdkCellDef="let row"> c3_special_row </cdk-cell>
769
+ </ng-container>
770
+
771
+ <cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
772
+ <cdk-row *cdkRowDef="let row; columns: columnsToRender"></cdk-row>
773
+ <cdk-row *cdkRowDef="let row; columns: ['index1Column']"></cdk-row>
774
+ <cdk-row *cdkRowDef="let row; columns: ['c3Column']; when: hasC3"></cdk-row>
775
+ </cdk-table>
776
+ `
777
+ } )
778
+ class WhenRowMultipleDefaultsCdkTableApp {
779
+ dataSource : FakeDataSource = new FakeDataSource ( ) ;
780
+ columnsToRender = [ 'column_a' , 'column_b' , 'column_c' ] ;
781
+ isIndex1 = ( _rowData : TestData , index : number ) => index == 1 ;
782
+ hasC3 = ( rowData : TestData ) => rowData . c == 'c_3' ;
783
+
784
+ @ViewChild ( CdkTable ) table : CdkTable < TestData > ;
785
+ }
786
+
618
787
@Component ( {
619
788
template : `
620
789
<cdk-table [dataSource]="dataSource">
0 commit comments