From 99657e1f8a52cbe32582cdee72f1dc94534970c4 Mon Sep 17 00:00:00 2001 From: Andrew Seguin Date: Tue, 5 Sep 2017 15:01:54 -0700 Subject: [PATCH] add error for multiple missing when; add basic test back in for lib/table --- src/cdk/table/table-errors.ts | 16 +++++++++ src/cdk/table/table.spec.ts | 62 +++++++++++++++++++++++++++++++++-- src/cdk/table/table.ts | 16 ++++++--- src/lib/table/table.spec.ts | 54 +++++++++++++++++++++++++----- 4 files changed, 131 insertions(+), 17 deletions(-) diff --git a/src/cdk/table/table-errors.ts b/src/cdk/table/table-errors.ts index 8a667cf926e0..d2b19ef8e075 100644 --- a/src/cdk/table/table-errors.ts +++ b/src/cdk/table/table-errors.ts @@ -22,3 +22,19 @@ export function getTableUnknownColumnError(id: string) { export function getTableDuplicateColumnNameError(name: string) { return Error(`cdk-table: Duplicate column definition name provided: "${name}".`); } + +/** + * Returns an error to be thrown when there are multiple rows that are missing a when function. + * @docs-private + */ +export function getTableMultipleDefaultRowDefsError() { + return Error(`cdk-table: There can only be one default row without a when predicate function.`); +} + +/** + * Returns an error to be thrown when there are no matching row defs for a particular set of data. + * @docs-private + */ +export function getTableMissingMatchingRowDefError() { + return Error(`cdk-table: Could not find a matching row definition for the provided row data.`); +} diff --git a/src/cdk/table/table.spec.ts b/src/cdk/table/table.spec.ts index faef45ffbf8f..72d26ac3d670 100644 --- a/src/cdk/table/table.spec.ts +++ b/src/cdk/table/table.spec.ts @@ -7,7 +7,12 @@ import {Observable} from 'rxjs/Observable'; import {combineLatest} from 'rxjs/observable/combineLatest'; import {CdkTableModule} from './index'; import {map} from 'rxjs/operator/map'; -import {getTableDuplicateColumnNameError, getTableUnknownColumnError} from './table-errors'; +import { + getTableDuplicateColumnNameError, + getTableMissingMatchingRowDefError, + getTableMultipleDefaultRowDefsError, + getTableUnknownColumnError +} from './table-errors'; describe('CdkTable', () => { let fixture: ComponentFixture; @@ -32,7 +37,8 @@ describe('CdkTable', () => { CrazyColumnNameCdkTableApp, UndefinedColumnsCdkTableApp, WhenRowCdkTableApp, - WhenRowWithoutDefaultCdkTableApp + WhenRowWithoutDefaultCdkTableApp, + WhenRowMultipleDefaultsCdkTableApp ], }).compileComponents(); })); @@ -222,7 +228,13 @@ describe('CdkTable', () => { it('should error if there is row data that does not have a matching row template', () => { let whenFixture = TestBed.createComponent(WhenRowWithoutDefaultCdkTableApp); expect(() => whenFixture.detectChanges()) - .toThrowError('Could not find a matching row definition for the provided row data'); + .toThrowError(getTableMissingMatchingRowDefError().message); + }); + + it('should error if there are multiple rows that do not have a when function', () => { + let whenFixture = TestBed.createComponent(WhenRowMultipleDefaultsCdkTableApp); + expect(() => whenFixture.detectChanges()) + .toThrowError(getTableMultipleDefaultRowDefsError().message); }); }); @@ -728,6 +740,50 @@ class WhenRowWithoutDefaultCdkTableApp { @ViewChild(CdkTable) table: CdkTable; } +@Component({ + template: ` + + + Column A + {{row.a}} + + + + Column B + {{row.b}} + + + + Column C + {{row.c}} + + + + Column C + index_1_special_row + + + + Column C + c3_special_row + + + + + + + + ` +}) +class WhenRowMultipleDefaultsCdkTableApp { + dataSource: FakeDataSource = new FakeDataSource(); + columnsToRender = ['column_a', 'column_b', 'column_c']; + isIndex1 = (_rowData: TestData, index: number) => index == 1; + hasC3 = (rowData: TestData) => rowData.c == 'c_3'; + + @ViewChild(CdkTable) table: CdkTable; +} + @Component({ template: ` diff --git a/src/cdk/table/table.ts b/src/cdk/table/table.ts index d0df44d71eb3..7fd54fde6895 100644 --- a/src/cdk/table/table.ts +++ b/src/cdk/table/table.ts @@ -36,7 +36,11 @@ import {BehaviorSubject} from 'rxjs/BehaviorSubject'; import {Subscription} from 'rxjs/Subscription'; import {Subject} from 'rxjs/Subject'; import {CdkCellDef, CdkColumnDef, CdkHeaderCellDef} from './cell'; -import {getTableDuplicateColumnNameError, getTableUnknownColumnError} from './table-errors'; +import { + getTableDuplicateColumnNameError, getTableMissingMatchingRowDefError, + getTableMultipleDefaultRowDefsError, + getTableUnknownColumnError +} from './table-errors'; /** * 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 implements CollectionViewer { ngAfterContentChecked() { this._renderUpdatedColumns(); - this._defaultRowDef = this._rowDefs.find(def => !def.when) || null; + + const defaultRowDefs = this._rowDefs.filter(def => !def.when); + if (defaultRowDefs.length > 1) { throw getTableMultipleDefaultRowDefsError(); } + this._defaultRowDef = defaultRowDefs[0]; + if (this.dataSource && !this._renderChangeSubscription) { this._observeRenderChanges(); } @@ -314,9 +322,7 @@ export class CdkTable implements CollectionViewer { if (this._rowDefs.length == 1) { return this._rowDefs.first; } let rowDef = this._rowDefs.find(def => def.when && def.when(data, i)) || this._defaultRowDef; - if (!rowDef) { - throw Error('Could not find a matching row definition for the provided row data'); - } + if (!rowDef) { throw getTableMissingMatchingRowDefError(); } return rowDef; } diff --git a/src/lib/table/table.spec.ts b/src/lib/table/table.spec.ts index 3a65943070a8..76ac561b0860 100644 --- a/src/lib/table/table.spec.ts +++ b/src/lib/table/table.spec.ts @@ -1,4 +1,4 @@ -import {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {async, TestBed} from '@angular/core/testing'; import {Component, ViewChild} from '@angular/core'; import {DataSource} from '@angular/cdk/collections'; import {BehaviorSubject} from 'rxjs/BehaviorSubject'; @@ -7,22 +7,17 @@ import {MdTableModule} from './index'; import {MdTable} from './table'; describe('MdTable', () => { - let fixture: ComponentFixture; - beforeEach(async(() => { TestBed.configureTestingModule({ imports: [MdTableModule], - declarations: [MdTableApp], + declarations: [MdTableApp, MdTableWithWhenRowApp], }).compileComponents(); })); - beforeEach(() => { - fixture = TestBed.createComponent(MdTableApp); - fixture.detectChanges(); + it('should be able to create a table with the right content and without when row', () => { + let fixture = TestBed.createComponent(MdTableApp); fixture.detectChanges(); - }); - it('should create a table with the right content', () => { const tableElement = fixture.nativeElement.querySelector('.mat-table'); const headerRow = tableElement.querySelectorAll('.mat-header-cell'); expectTextContent(headerRow[0], 'Column A'); @@ -42,6 +37,21 @@ describe('MdTable', () => { // Fourth row uses a special when predicate to show a different colummn expect(rows[3].textContent.trim()).toBe('fourth_row'); }); + + it('should create a table with special when row', () => { + let fixture = TestBed.createComponent(MdTableWithWhenRowApp); + fixture.detectChanges(); + + const tableElement = fixture.nativeElement.querySelector('.mat-table'); + const headerRow = tableElement.querySelectorAll('.mat-header-cell'); + expectTextContent(headerRow[0], 'Column A'); + + const rows = tableElement.querySelectorAll('.mat-row'); + expect(rows[0].textContent.trim()).toBe('a_1'); + expect(rows[1].textContent.trim()).toBe('a_2'); + expect(rows[2].textContent.trim()).toBe('a_3'); + expect(rows[3].textContent.trim()).toBe('fourth_row'); + }); }); function expectTextContent(el, text) { @@ -123,3 +133,29 @@ class MdTableApp { @ViewChild(MdTable) table: MdTable; } + + +@Component({ + template: ` + + + Column A + {{row.a}} + + + + fourth_row + + + + + + + ` +}) +class MdTableWithWhenRowApp { + dataSource: FakeDataSource | null = new FakeDataSource(); + isFourthRow = (_rowData: TestData, i: number) => i == 3; + + @ViewChild(MdTable) table: MdTable; +}