@@ -21,9 +21,16 @@ describe('CdkTable', () => {
21
21
22
22
TestBed . configureTestingModule ( {
23
23
imports : [ CdkDataTableModule ] ,
24
- declarations : [ SimpleCdkTableApp , DynamicDataSourceCdkTableApp , CustomRoleCdkTableApp ] ,
24
+ declarations : [
25
+ SimpleCdkTableApp ,
26
+ DynamicDataSourceCdkTableApp ,
27
+ CustomRoleCdkTableApp ,
28
+ RowContextCdkTableApp
29
+ ] ,
25
30
} ) . compileComponents ( ) ;
31
+ } ) ) ;
26
32
33
+ beforeEach ( ( ) => {
27
34
fixture = TestBed . createComponent ( SimpleCdkTableApp ) ;
28
35
29
36
component = fixture . componentInstance ;
@@ -33,7 +40,7 @@ describe('CdkTable', () => {
33
40
34
41
fixture . detectChanges ( ) ; // Let the component and table create embedded views
35
42
fixture . detectChanges ( ) ; // Let the cells render
36
- } ) ) ;
43
+ } ) ;
37
44
38
45
describe ( 'should initialize' , ( ) => {
39
46
it ( 'with a connected data source' , ( ) => {
@@ -153,6 +160,7 @@ describe('CdkTable', () => {
153
160
// Add data to the table and recreate what the rendered output should be.
154
161
dataSource . addData ( ) ;
155
162
expect ( dataSource . data . length ) . toBe ( initialDataLength + 1 ) ; // Make sure data was added
163
+ fixture . detectChanges ( ) ;
156
164
157
165
data = dataSource . data ;
158
166
expect ( tableElement ) . toMatchTableContent ( [
@@ -198,6 +206,88 @@ describe('CdkTable', () => {
198
206
] ) ;
199
207
} ) ;
200
208
209
+ it ( 'should be able to apply classes to rows based on their context' , ( ) => {
210
+ const contextFixture = TestBed . createComponent ( RowContextCdkTableApp ) ;
211
+ const contextComponent = contextFixture . componentInstance ;
212
+ tableElement = contextFixture . nativeElement . querySelector ( 'cdk-table' ) ;
213
+
214
+ contextFixture . detectChanges ( ) ; // Let the table initialize its view
215
+ contextFixture . detectChanges ( ) ; // Let the table render the rows and cells
216
+
217
+ const rowElements = contextFixture . nativeElement . querySelectorAll ( 'cdk-row' ) ;
218
+
219
+ // Rows should not have any context classes
220
+ for ( let i = 0 ; i < rowElements . length ; i ++ ) {
221
+ expect ( rowElements [ i ] . classList . contains ( 'custom-row-class-first' ) ) . toBe ( false ) ;
222
+ expect ( rowElements [ i ] . classList . contains ( 'custom-row-class-last' ) ) . toBe ( false ) ;
223
+ expect ( rowElements [ i ] . classList . contains ( 'custom-row-class-even' ) ) . toBe ( false ) ;
224
+ expect ( rowElements [ i ] . classList . contains ( 'custom-row-class-odd' ) ) . toBe ( false ) ;
225
+ }
226
+
227
+ // Enable all the context classes
228
+ contextComponent . enableRowContextClasses = true ;
229
+ contextFixture . detectChanges ( ) ;
230
+
231
+ expect ( rowElements [ 0 ] . classList . contains ( 'custom-row-class-first' ) ) . toBe ( true ) ;
232
+ expect ( rowElements [ 0 ] . classList . contains ( 'custom-row-class-last' ) ) . toBe ( false ) ;
233
+ expect ( rowElements [ 0 ] . classList . contains ( 'custom-row-class-even' ) ) . toBe ( true ) ;
234
+ expect ( rowElements [ 0 ] . classList . contains ( 'custom-row-class-odd' ) ) . toBe ( false ) ;
235
+
236
+ expect ( rowElements [ 1 ] . classList . contains ( 'custom-row-class-first' ) ) . toBe ( false ) ;
237
+ expect ( rowElements [ 1 ] . classList . contains ( 'custom-row-class-last' ) ) . toBe ( false ) ;
238
+ expect ( rowElements [ 1 ] . classList . contains ( 'custom-row-class-even' ) ) . toBe ( false ) ;
239
+ expect ( rowElements [ 1 ] . classList . contains ( 'custom-row-class-odd' ) ) . toBe ( true ) ;
240
+
241
+ expect ( rowElements [ 2 ] . classList . contains ( 'custom-row-class-first' ) ) . toBe ( false ) ;
242
+ expect ( rowElements [ 2 ] . classList . contains ( 'custom-row-class-last' ) ) . toBe ( true ) ;
243
+ expect ( rowElements [ 2 ] . classList . contains ( 'custom-row-class-even' ) ) . toBe ( true ) ;
244
+ expect ( rowElements [ 2 ] . classList . contains ( 'custom-row-class-odd' ) ) . toBe ( false ) ;
245
+ } ) ;
246
+
247
+ it ( 'should be able to apply classes to cells based on their row context' , ( ) => {
248
+ const contextFixture = TestBed . createComponent ( RowContextCdkTableApp ) ;
249
+ const contextComponent = contextFixture . componentInstance ;
250
+ tableElement = contextFixture . nativeElement . querySelector ( 'cdk-table' ) ;
251
+
252
+ contextFixture . detectChanges ( ) ; // Let the table initialize its view
253
+ contextFixture . detectChanges ( ) ; // Let the table render the rows and cells
254
+
255
+ const rowElements = contextFixture . nativeElement . querySelectorAll ( 'cdk-row' ) ;
256
+
257
+ for ( let i = 0 ; i < rowElements . length ; i ++ ) {
258
+ // Cells should not have any context classes
259
+ const cellElements = rowElements [ i ] . querySelectorAll ( 'cdk-cell' ) ;
260
+ for ( let j = 0 ; j < cellElements . length ; j ++ ) {
261
+ expect ( cellElements [ j ] . classList . contains ( 'custom-cell-class-first' ) ) . toBe ( false ) ;
262
+ expect ( cellElements [ j ] . classList . contains ( 'custom-cell-class-last' ) ) . toBe ( false ) ;
263
+ expect ( cellElements [ j ] . classList . contains ( 'custom-cell-class-even' ) ) . toBe ( false ) ;
264
+ expect ( cellElements [ j ] . classList . contains ( 'custom-cell-class-odd' ) ) . toBe ( false ) ;
265
+ }
266
+ }
267
+
268
+ // Enable the context classes
269
+ contextComponent . enableCellContextClasses = true ;
270
+ contextFixture . detectChanges ( ) ;
271
+
272
+ let cellElement = rowElements [ 0 ] . querySelectorAll ( 'cdk-cell' ) [ 0 ] ;
273
+ expect ( cellElement . classList . contains ( 'custom-cell-class-first' ) ) . toBe ( true ) ;
274
+ expect ( cellElement . classList . contains ( 'custom-cell-class-last' ) ) . toBe ( false ) ;
275
+ expect ( cellElement . classList . contains ( 'custom-cell-class-even' ) ) . toBe ( true ) ;
276
+ expect ( cellElement . classList . contains ( 'custom-cell-class-odd' ) ) . toBe ( false ) ;
277
+
278
+ cellElement = rowElements [ 1 ] . querySelectorAll ( 'cdk-cell' ) [ 0 ] ;
279
+ expect ( cellElement . classList . contains ( 'custom-cell-class-first' ) ) . toBe ( false ) ;
280
+ expect ( cellElement . classList . contains ( 'custom-cell-class-last' ) ) . toBe ( false ) ;
281
+ expect ( cellElement . classList . contains ( 'custom-cell-class-even' ) ) . toBe ( false ) ;
282
+ expect ( cellElement . classList . contains ( 'custom-cell-class-odd' ) ) . toBe ( true ) ;
283
+
284
+ cellElement = rowElements [ 2 ] . querySelectorAll ( 'cdk-cell' ) [ 0 ] ;
285
+ expect ( cellElement . classList . contains ( 'custom-cell-class-first' ) ) . toBe ( false ) ;
286
+ expect ( cellElement . classList . contains ( 'custom-cell-class-last' ) ) . toBe ( true ) ;
287
+ expect ( cellElement . classList . contains ( 'custom-cell-class-even' ) ) . toBe ( true ) ;
288
+ expect ( cellElement . classList . contains ( 'custom-cell-class-odd' ) ) . toBe ( false ) ;
289
+ } ) ;
290
+
201
291
it ( 'should be able to dynamically change the columns for header and rows' , ( ) => {
202
292
expect ( dataSource . data . length ) . toBe ( 3 ) ;
203
293
@@ -336,6 +426,42 @@ class CustomRoleCdkTableApp {
336
426
@ViewChild ( CdkTable ) table : CdkTable < TestData > ;
337
427
}
338
428
429
+ @Component ( {
430
+ template : `
431
+ <cdk-table [dataSource]="dataSource">
432
+ <ng-container cdkColumnDef="column_a">
433
+ <cdk-header-cell *cdkHeaderCellDef> Column A</cdk-header-cell>
434
+ <cdk-cell *cdkCellDef="let row; let first = first;
435
+ let last = last; let even = even; let odd = odd"
436
+ [ngClass]="{
437
+ 'custom-cell-class-first': enableCellContextClasses && first,
438
+ 'custom-cell-class-last': enableCellContextClasses && last,
439
+ 'custom-cell-class-even': enableCellContextClasses && even,
440
+ 'custom-cell-class-odd': enableCellContextClasses && odd
441
+ }">
442
+ {{row.a}}
443
+ </cdk-cell>
444
+ </ng-container>
445
+ <cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
446
+ <cdk-row *cdkRowDef="let row; columns: columnsToRender;
447
+ let first = first; let last = last; let even = even; let odd = odd"
448
+ [ngClass]="{
449
+ 'custom-row-class-first': enableRowContextClasses && first,
450
+ 'custom-row-class-last': enableRowContextClasses && last,
451
+ 'custom-row-class-even': enableRowContextClasses && even,
452
+ 'custom-row-class-odd': enableRowContextClasses && odd
453
+ }">
454
+ </cdk-row>
455
+ </cdk-table>
456
+ `
457
+ } )
458
+ class RowContextCdkTableApp {
459
+ dataSource : FakeDataSource = new FakeDataSource ( ) ;
460
+ columnsToRender = [ 'column_a' ] ;
461
+ enableRowContextClasses = false ;
462
+ enableCellContextClasses = false ;
463
+ }
464
+
339
465
function getElements ( element : Element , query : string ) : Element [ ] {
340
466
return [ ] . slice . call ( element . querySelectorAll ( query ) ) ;
341
467
}
0 commit comments