Skip to content

Commit 18ef7b5

Browse files
committed
add error for multiple missing when; add basic test back in for lib/table
1 parent 77ecbe6 commit 18ef7b5

File tree

4 files changed

+131
-17
lines changed

4 files changed

+131
-17
lines changed

src/cdk/table/table-errors.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,19 @@ export function getTableUnknownColumnError(id: string) {
2222
export function getTableDuplicateColumnNameError(name: string) {
2323
return Error(`cdk-table: Duplicate column definition name provided: "${name}".`);
2424
}
25+
26+
/**
27+
* Returns an error to be thrown when there are multiple rows that are missing a when function.
28+
* @docs-private
29+
*/
30+
export function getTableMultipleDefaultRowDefsError() {
31+
return Error(`cdk-table: There can only be one default row without a when predicate function.`);
32+
}
33+
34+
/**
35+
* Returns an error to be thrown when there are no matching row defs for a particular set of data.
36+
* @docs-private
37+
*/
38+
export function getTableMissingMatchingRowDefError() {
39+
return Error(`cdk-table: Could not find a matching row definition for the provided row data.`);
40+
}

src/cdk/table/table.spec.ts

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ import {Observable} from 'rxjs/Observable';
77
import {combineLatest} from 'rxjs/observable/combineLatest';
88
import {CdkTableModule} from './index';
99
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';
1116

1217
describe('CdkTable', () => {
1318
let fixture: ComponentFixture<SimpleCdkTableApp>;
@@ -31,7 +36,8 @@ describe('CdkTable', () => {
3136
MissingColumnDefCdkTableApp,
3237
CrazyColumnNameCdkTableApp,
3338
WhenRowCdkTableApp,
34-
WhenRowWithoutDefaultCdkTableApp
39+
WhenRowWithoutDefaultCdkTableApp,
40+
WhenRowMultipleDefaultsCdkTableApp
3541
],
3642
}).compileComponents();
3743
}));
@@ -206,7 +212,13 @@ describe('CdkTable', () => {
206212
it('should error if there is row data that does not have a matching row template', () => {
207213
let whenFixture = TestBed.createComponent(WhenRowWithoutDefaultCdkTableApp);
208214
expect(() => whenFixture.detectChanges())
209-
.toThrowError('Could not find a matching row definition for the provided row data');
215+
.toThrowError(getTableMissingMatchingRowDefError().message);
216+
});
217+
218+
it('should error if there are multiple rows that do not have a when function', () => {
219+
let whenFixture = TestBed.createComponent(WhenRowMultipleDefaultsCdkTableApp);
220+
expect(() => whenFixture.detectChanges())
221+
.toThrowError(getTableMultipleDefaultRowDefsError().message);
210222
});
211223
});
212224

@@ -712,6 +724,50 @@ class WhenRowWithoutDefaultCdkTableApp {
712724
@ViewChild(CdkTable) table: CdkTable<TestData>;
713725
}
714726

727+
@Component({
728+
template: `
729+
<cdk-table [dataSource]="dataSource">
730+
<ng-container cdkColumnDef="column_a">
731+
<cdk-header-cell *cdkHeaderCellDef> Column A</cdk-header-cell>
732+
<cdk-cell *cdkCellDef="let row"> {{row.a}}</cdk-cell>
733+
</ng-container>
734+
735+
<ng-container cdkColumnDef="column_b">
736+
<cdk-header-cell *cdkHeaderCellDef> Column B</cdk-header-cell>
737+
<cdk-cell *cdkCellDef="let row"> {{row.b}}</cdk-cell>
738+
</ng-container>
739+
740+
<ng-container cdkColumnDef="column_c">
741+
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
742+
<cdk-cell *cdkCellDef="let row"> {{row.c}}</cdk-cell>
743+
</ng-container>
744+
745+
<ng-container cdkColumnDef="index1Column">
746+
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
747+
<cdk-cell *cdkCellDef="let row"> index_1_special_row </cdk-cell>
748+
</ng-container>
749+
750+
<ng-container cdkColumnDef="c3Column">
751+
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
752+
<cdk-cell *cdkCellDef="let row"> c3_special_row </cdk-cell>
753+
</ng-container>
754+
755+
<cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
756+
<cdk-row *cdkRowDef="let row; columns: columnsToRender"></cdk-row>
757+
<cdk-row *cdkRowDef="let row; columns: ['index1Column']"></cdk-row>
758+
<cdk-row *cdkRowDef="let row; columns: ['c3Column']; when: hasC3"></cdk-row>
759+
</cdk-table>
760+
`
761+
})
762+
class WhenRowMultipleDefaultsCdkTableApp {
763+
dataSource: FakeDataSource = new FakeDataSource();
764+
columnsToRender = ['column_a', 'column_b', 'column_c'];
765+
isIndex1 = (_rowData: TestData, index: number) => index == 1;
766+
hasC3 = (rowData: TestData) => rowData.c == 'c_3';
767+
768+
@ViewChild(CdkTable) table: CdkTable<TestData>;
769+
}
770+
715771
@Component({
716772
template: `
717773
<cdk-table [dataSource]="dataSource">

src/cdk/table/table.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ import {BehaviorSubject} from 'rxjs/BehaviorSubject';
3636
import {Subscription} from 'rxjs/Subscription';
3737
import {Subject} from 'rxjs/Subject';
3838
import {CdkCellDef, CdkColumnDef, CdkHeaderCellDef} from './cell';
39-
import {getTableDuplicateColumnNameError, getTableUnknownColumnError} from './table-errors';
39+
import {
40+
getTableDuplicateColumnNameError, getTableMissingMatchingRowDefError,
41+
getTableMultipleDefaultRowDefsError,
42+
getTableUnknownColumnError
43+
} from './table-errors';
4044

4145
/**
4246
* Provides a handle for the table to grab the view container's ng-container to insert data rows.
@@ -175,7 +179,11 @@ export class CdkTable<T> implements CollectionViewer {
175179

176180
ngAfterContentChecked() {
177181
this._renderUpdatedColumns();
178-
this._defaultRowDef = this._rowDefs.find(def => !def.when) || null;
182+
183+
const defaultRowDefs = this._rowDefs.filter(def => !def.when);
184+
if (defaultRowDefs.length > 1) { throw getTableMultipleDefaultRowDefsError(); }
185+
this._defaultRowDef = defaultRowDefs[0];
186+
179187
if (this.dataSource && !this._renderChangeSubscription) {
180188
this._observeRenderChanges();
181189
}
@@ -312,9 +320,7 @@ export class CdkTable<T> implements CollectionViewer {
312320
if (this._rowDefs.length == 1) { return this._rowDefs.first; }
313321

314322
let rowDef = this._rowDefs.find(def => def.when && def.when(data, i)) || this._defaultRowDef;
315-
if (!rowDef) {
316-
throw Error('Could not find a matching row definition for the provided row data');
317-
}
323+
if (!rowDef) { throw getTableMissingMatchingRowDefError(); }
318324

319325
return rowDef;
320326
}

src/lib/table/table.spec.ts

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
1+
import {async, TestBed} from '@angular/core/testing';
22
import {Component, ViewChild} from '@angular/core';
33
import {DataSource} from '@angular/cdk/collections';
44
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
@@ -7,22 +7,17 @@ import {MdTableModule} from './index';
77
import {MdTable} from './table';
88

99
describe('MdTable', () => {
10-
let fixture: ComponentFixture<MdTableApp>;
11-
1210
beforeEach(async(() => {
1311
TestBed.configureTestingModule({
1412
imports: [MdTableModule],
15-
declarations: [MdTableApp],
13+
declarations: [MdTableApp, MdTableWithWhenRowApp],
1614
}).compileComponents();
1715
}));
1816

19-
beforeEach(() => {
20-
fixture = TestBed.createComponent(MdTableApp);
21-
fixture.detectChanges();
17+
it('should be able to create a table with the right content and without when row', () => {
18+
let fixture = TestBed.createComponent(MdTableApp);
2219
fixture.detectChanges();
23-
});
2420

25-
it('should create a table with the right content', () => {
2621
const tableElement = fixture.nativeElement.querySelector('.mat-table');
2722
const headerRow = tableElement.querySelectorAll('.mat-header-cell');
2823
expectTextContent(headerRow[0], 'Column A');
@@ -42,6 +37,21 @@ describe('MdTable', () => {
4237
// Fourth row uses a special when predicate to show a different colummn
4338
expect(rows[3].textContent.trim()).toBe('fourth_row');
4439
});
40+
41+
it('should create a table with special when row', () => {
42+
let fixture = TestBed.createComponent(MdTableWithWhenRowApp);
43+
fixture.detectChanges();
44+
45+
const tableElement = fixture.nativeElement.querySelector('.mat-table');
46+
const headerRow = tableElement.querySelectorAll('.mat-header-cell');
47+
expectTextContent(headerRow[0], 'Column A');
48+
49+
const rows = tableElement.querySelectorAll('.mat-row');
50+
expect(rows[0].textContent.trim()).toBe('a_1');
51+
expect(rows[1].textContent.trim()).toBe('a_2');
52+
expect(rows[2].textContent.trim()).toBe('a_3');
53+
expect(rows[3].textContent.trim()).toBe('fourth_row');
54+
});
4555
});
4656

4757
function expectTextContent(el, text) {
@@ -123,3 +133,29 @@ class MdTableApp {
123133

124134
@ViewChild(MdTable) table: MdTable<TestData>;
125135
}
136+
137+
138+
@Component({
139+
template: `
140+
<md-table [dataSource]="dataSource">
141+
<ng-container mdColumnDef="column_a">
142+
<md-header-cell *mdHeaderCellDef> Column A</md-header-cell>
143+
<md-cell *mdCellDef="let row"> {{row.a}}</md-cell>
144+
</ng-container>
145+
146+
<ng-container mdColumnDef="special_column">
147+
<md-cell *mdCellDef="let row"> fourth_row </md-cell>
148+
</ng-container>
149+
150+
<md-header-row *mdHeaderRowDef="['column_a']"></md-header-row>
151+
<md-row *mdRowDef="let row; columns: ['column_a']"></md-row>
152+
<md-row *mdRowDef="let row; columns: ['special_column']; when: isFourthRow"></md-row>
153+
</md-table>
154+
`
155+
})
156+
class MdTableWithWhenRowApp {
157+
dataSource: FakeDataSource | null = new FakeDataSource();
158+
isFourthRow = (_rowData: TestData, i: number) => i == 3;
159+
160+
@ViewChild(MdTable) table: MdTable<TestData>;
161+
}

0 commit comments

Comments
 (0)