Skip to content

Commit 99657e1

Browse files
committed
add error for multiple missing when; add basic test back in for lib/table
1 parent 9b9b0a1 commit 99657e1

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>;
@@ -32,7 +37,8 @@ describe('CdkTable', () => {
3237
CrazyColumnNameCdkTableApp,
3338
UndefinedColumnsCdkTableApp,
3439
WhenRowCdkTableApp,
35-
WhenRowWithoutDefaultCdkTableApp
40+
WhenRowWithoutDefaultCdkTableApp,
41+
WhenRowMultipleDefaultsCdkTableApp
3642
],
3743
}).compileComponents();
3844
}));
@@ -222,7 +228,13 @@ describe('CdkTable', () => {
222228
it('should error if there is row data that does not have a matching row template', () => {
223229
let whenFixture = TestBed.createComponent(WhenRowWithoutDefaultCdkTableApp);
224230
expect(() => whenFixture.detectChanges())
225-
.toThrowError('Could not find a matching row definition for the provided row data');
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);
226238
});
227239
});
228240

@@ -728,6 +740,50 @@ class WhenRowWithoutDefaultCdkTableApp {
728740
@ViewChild(CdkTable) table: CdkTable<TestData>;
729741
}
730742

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+
731787
@Component({
732788
template: `
733789
<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.
@@ -177,7 +181,11 @@ export class CdkTable<T> implements CollectionViewer {
177181

178182
ngAfterContentChecked() {
179183
this._renderUpdatedColumns();
180-
this._defaultRowDef = this._rowDefs.find(def => !def.when) || null;
184+
185+
const defaultRowDefs = this._rowDefs.filter(def => !def.when);
186+
if (defaultRowDefs.length > 1) { throw getTableMultipleDefaultRowDefsError(); }
187+
this._defaultRowDef = defaultRowDefs[0];
188+
181189
if (this.dataSource && !this._renderChangeSubscription) {
182190
this._observeRenderChanges();
183191
}
@@ -314,9 +322,7 @@ export class CdkTable<T> implements CollectionViewer {
314322
if (this._rowDefs.length == 1) { return this._rowDefs.first; }
315323

316324
let rowDef = this._rowDefs.find(def => def.when && def.when(data, i)) || this._defaultRowDef;
317-
if (!rowDef) {
318-
throw Error('Could not find a matching row definition for the provided row data');
319-
}
325+
if (!rowDef) { throw getTableMissingMatchingRowDefError(); }
320326

321327
return rowDef;
322328
}

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)