diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.spec.ts b/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.spec.ts index 9dbebf8620..e5fb2dcba5 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.spec.ts +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.spec.ts @@ -25,6 +25,7 @@ import { import { DataTableComponent } from './datatable.component'; import { DataRow, + DataColumn, DataSorting } from './../data/datatable-adapter'; import { @@ -82,20 +83,26 @@ describe('DataTable', () => { dataTable.onRowDblClick(row, null); }); - it('should prevent default behavior on row click event', () => { + it('should prevent default behaviour on row click event', () => { let e = jasmine.createSpyObj('event', ['preventDefault']); dataTable.ngOnInit(); dataTable.onRowClick(null, e); expect(e.preventDefault).toHaveBeenCalled(); }); - it('should prevent default behavior on row double-click event', () => { + it('should prevent default behaviour on row double-click event', () => { let e = jasmine.createSpyObj('event', ['preventDefault']); dataTable.ngOnInit(); dataTable.onRowDblClick(null, e); expect(e.preventDefault).toHaveBeenCalled(); }); + it('should prevent default behaviour on select all click', () => { + let e = jasmine.createSpyObj('event', ['preventDefault']); + dataTable.onSelectAllClick(e); + expect(e.preventDefault).toHaveBeenCalled(); + }); + it('should not sort if column is missing', () => { dataTable.ngOnInit(); let adapter = dataTable.data; @@ -140,14 +147,16 @@ describe('DataTable', () => { dataTable.ngOnInit(); let adapter = dataTable.data; + let sorting = new DataSorting('column_1', 'asc'); spyOn(adapter, 'setSorting').and.callThrough(); - spyOn(adapter, 'getSorting').and.returnValue(new DataSorting('column_1', 'asc')); + spyOn(adapter, 'getSorting').and.returnValue(sorting); let column = new ObjectDataColumn({ key: 'column_1', sortable: true }); + // check first click on the header dataTable.onColumnHeaderClick(column); expect(adapter.setSorting).toHaveBeenCalledWith( jasmine.objectContaining({ @@ -156,6 +165,16 @@ describe('DataTable', () => { }) ); + // check second click on the header + sorting.direction = 'desc'; + dataTable.onColumnHeaderClick(column); + expect(adapter.setSorting).toHaveBeenCalledWith( + jasmine.objectContaining({ + key: 'column_1', + direction: 'asc' + }) + ); + }); it('should upgrade MDL components on view checked', () => { @@ -166,4 +185,135 @@ describe('DataTable', () => { expect(handler.upgradeAllRegistered).toHaveBeenCalled(); }); + it('should upgrade MDL components only when component handler present', () => { + expect(window['componentHandler']).toBeNull(); + dataTable.ngAfterViewChecked(); + }); + + + it('should invert "select all" status', () => { + expect(dataTable.isSelectAllChecked).toBeFalsy(); + dataTable.onSelectAllClick(null); + expect(dataTable.isSelectAllChecked).toBeTruthy(); + dataTable.onSelectAllClick(null); + expect(dataTable.isSelectAllChecked).toBeFalsy(); + }); + + + it('should update rows on "select all" click', () => { + let data = new ObjectDataTableAdapter([{}, {}, {}], []); + let rows = data.getRows(); + + dataTable.data = data; + dataTable.multiselect = true; + dataTable.ngOnInit(); + + dataTable.onSelectAllClick(null); + expect(dataTable.isSelectAllChecked).toBe(true); + for (let i = 0; i < rows.length; i++) { + expect(rows[i].isSelected).toBe(true); + } + + dataTable.onSelectAllClick(null); + expect(dataTable.isSelectAllChecked).toBe(false); + for (let i = 0; i < rows.length; i++) { + expect(rows[i].isSelected).toBe(false); + } + }); + + it('should allow "select all" calls with no rows', () => { + dataTable.multiselect = true; + dataTable.ngOnInit(); + + dataTable.onSelectAllClick(null); + expect(dataTable.isSelectAllChecked).toBe(true); + }); + + it('should require multiselect option to toggle row state', () => { + let data = new ObjectDataTableAdapter([{}, {}, {}], []); + let rows = data.getRows(); + + dataTable.data = data; + dataTable.multiselect = false; + dataTable.ngOnInit(); + + dataTable.onSelectAllClick(null); + expect(dataTable.isSelectAllChecked).toBe(true); + for (let i = 0; i < rows.length; i++) { + expect(rows[i].isSelected).toBe(false); + } + }); + + it('should require row and column for icon value check', () => { + expect(dataTable.isIconValue(null, null)).toBeFalsy(); + expect(dataTable.isIconValue( {}, null)).toBeFalsy(); + expect(dataTable.isIconValue(null, {})).toBeFalsy(); + }); + + it('should use special material url scheme', () => { + let column = {}; + + let row = { + getValue: function (key: string) { + return 'material-icons://android'; + } + }; + + expect(dataTable.isIconValue( row, column)).toBeTruthy(); + }); + + it('should not use special material url scheme', () => { + let column = {}; + + let row = { + getValue: function (key: string) { + return 'http://www.google.com'; + } + }; + + expect(dataTable.isIconValue( row, column)).toBeFalsy(); + }); + + it('should parse icon value', () => { + let column = {}; + + let row = { + getValue: function (key: string) { + return 'material-icons://android'; + } + }; + + expect(dataTable.asIconValue( row, column)).toBe('android'); + }); + + it('should not parse icon value', () => { + let column = {}; + + let row = { + getValue: function (key: string) { + return 'http://www.google.com'; + } + }; + + expect(dataTable.asIconValue( row, column)).toBe(null); + }); + + it('should require column and direction to evaluate sorting state', () => { + expect(dataTable.isColumnSorted(null, null)).toBeFalsy(); + expect(dataTable.isColumnSorted( {}, null)).toBeFalsy(); + expect(dataTable.isColumnSorted(null, 'asc')).toBeFalsy(); + }); + + it('should require adapter sorting to evaluate sorting state', () => { + dataTable.ngOnInit(); + spyOn(dataTable.data, 'getSorting').and.returnValue(null); + expect(dataTable.isColumnSorted( {}, 'asc')).toBeFalsy(); + }); + + it('should evaluate column sorting state', () => { + dataTable.ngOnInit(); + spyOn(dataTable.data, 'getSorting').and.returnValue(new DataSorting('column_1', 'asc')); + expect(dataTable.isColumnSorted( {key: 'column_1'}, 'asc')).toBeTruthy(); + expect(dataTable.isColumnSorted( {key: 'column_2'}, 'desc')).toBeFalsy(); + }); }); diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.ts b/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.ts index b374e937a5..9921e00288 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.ts +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.ts @@ -61,6 +61,7 @@ export class DataTableComponent implements OnInit, AfterViewChecked { isSelectAllChecked: boolean = false; + // TODO: left for reference, will be removed during future revisions constructor(/*private _ngZone?: NgZone*/) { } @@ -117,27 +118,39 @@ export class DataTableComponent implements OnInit, AfterViewChecked { if (this.multiselect) { let rows = this.data.getRows(); - for (let i = 0; i < rows.length; i++) { - rows[i].isSelected = this.isSelectAllChecked; + if (rows && rows.length > 0) { + for (let i = 0; i < rows.length; i++) { + rows[i].isSelected = this.isSelectAllChecked; + } + // TODO: left for reference, will be removed during future revisions + /* + this._ngZone.run(() => { + this.data.getRows()[1].isSelected = true; + }); + */ } - /* - this._ngZone.run(() => { - this.data.getRows()[1].isSelected = true; - }); - */ } } isIconValue(row: DataRow, col: DataColumn) { - return row.getValue(col.key).startsWith('material-icons://'); + if (row && col) { + return row.getValue(col.key).startsWith('material-icons://'); + } + return false; } asIconValue(row: DataRow, col: DataColumn) { - return row.getValue(col.key).replace('material-icons://', ''); + if (this.isIconValue(row, col)) { + return row.getValue(col.key).replace('material-icons://', ''); + } + return null; } isColumnSorted(col: DataColumn, direction: string) { - let sorting = this.data.getSorting(); - return sorting.key === col.key && sorting.direction === direction; + if (col && direction) { + let sorting = this.data.getSorting(); + return sorting && sorting.key === col.key && sorting.direction === direction; + } + return false; } }