diff --git a/CHANGELOG.md b/CHANGELOG.md index 23dee2efdc8..ea9fff52d53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,12 @@ All notable changes for each version of this project will be documented in this - `IgxCsvExporterService`, `IgxExcelExporterService` - Exporter services are no longer required to be provided in the application since they are now injected on a root level. +## 12.2.1 + +### New Features +- `igxGrid`, `igxHierarchicalGrid`, `igxTreeGrid` + - new `rowPinned` event is emitted after a row is pinned/unpinned and grid has already refreshed its state to represent the pinned/unpinned rows in the DOM. + ## 12.2.0 ### New Features diff --git a/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts b/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts index b4012b0e432..91e73a53a5d 100644 --- a/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts +++ b/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts @@ -54,7 +54,6 @@ import { Action, } from '../services/public_api'; import { GridBaseAPIService } from './api.service'; -import { IgxGridCellComponent } from './cell.component'; import { ISummaryExpression } from './summaries/grid-summary'; import { RowEditPositionStrategy, IPinningConfig } from './grid.common'; import { IgxGridToolbarComponent } from './toolbar/grid-toolbar.component'; @@ -941,6 +940,17 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements @Output() public rowPinning = new EventEmitter(); + /** + * Emitted when the pinned state of a row is changed. + * + * @example + * ```html + * + * ``` + */ + @Output() + public rowPinned = new EventEmitter(); + /** * Emmited when the active node is changed. * @@ -4826,6 +4836,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements if (this._pinnedRecordIDs.indexOf(rowID) !== -1) { return false; } + const eventArgs: IPinRowEventArgs = { insertAtIndex: index, isPinned: true, @@ -4840,8 +4851,10 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements this._pinnedRecordIDs.splice(insertIndex, 0, rowID); this.pipeTrigger++; if (this.gridAPI.grid) { - this.notifyChanges(); + this.cdr.detectChanges(); + this.rowPinned.emit(eventArgs); } + return true; } @@ -4867,12 +4880,15 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements row }; this.rowPinning.emit(eventArgs); + this.crudService.endEdit(false); this._pinnedRecordIDs.splice(index, 1); this.pipeTrigger++; if (this.gridAPI.grid) { this.cdr.detectChanges(); + this.rowPinned.emit(eventArgs); } + return true; } diff --git a/projects/igniteui-angular/src/lib/grids/grid-public-row.ts b/projects/igniteui-angular/src/lib/grids/grid-public-row.ts index d7ed99a7f71..7f1a38f7fb6 100644 --- a/projects/igniteui-angular/src/lib/grids/grid-public-row.ts +++ b/projects/igniteui-angular/src/lib/grids/grid-public-row.ts @@ -211,7 +211,7 @@ abstract class BaseRow implements RowType { * ``` */ public pin(): boolean { - return this.grid.pinRow(this.key); + return this.grid.pinRow(this.key, this.index); } /** diff --git a/projects/igniteui-angular/src/lib/grids/grid/grid-row-pinning.spec.ts b/projects/igniteui-angular/src/lib/grids/grid/grid-row-pinning.spec.ts index 248514873bd..b3191f761ef 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid-row-pinning.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/grid/grid-row-pinning.spec.ts @@ -155,7 +155,6 @@ describe('Row Pinning #grid', () => { let row = grid.getRowByIndex(0); const rowID = row.key; row.pin(); - fix.detectChanges(); // Check pinned state with getRowByIndex after pin action expect(row.pinned).toBe(true); @@ -163,20 +162,44 @@ describe('Row Pinning #grid', () => { expect(grid.rowPinning.emit).toHaveBeenCalledTimes(1); expect(grid.rowPinning.emit).toHaveBeenCalledWith({ rowID, - insertAtIndex: undefined, + insertAtIndex: 0, isPinned: true, row }); row = grid.getRowByIndex(0); row.unpin(); - fix.detectChanges(); // Check pinned state with getRowByIndex after unpin action expect(row.pinned).toBe(false); expect(grid.rowPinning.emit).toHaveBeenCalledTimes(2); }); + it('should emit rowPinned on pin/unpin.', () => { + spyOn(grid.rowPinned, 'emit').and.callThrough(); + + const row = grid.getRowByIndex(0); + const rowID = row.key; + row.pin(); + + // Check pinned state with getRowByIndex after pin action + expect(row.pinned).toBe(true); + + expect(grid.rowPinned.emit).toHaveBeenCalledTimes(1); + expect(grid.rowPinned.emit).toHaveBeenCalledWith({ + rowID, + insertAtIndex: 0, + isPinned: true, + row + }); + + row.unpin(); + // Check pinned state with getRowByIndex after unpin action + expect(row.pinned).toBe(false); + + expect(grid.rowPinned.emit).toHaveBeenCalledTimes(2); + }); + it('should pin/unpin via grid API methods.', () => { // pin 2nd row grid.pinRow(fix.componentInstance.data[1]); @@ -223,7 +246,6 @@ describe('Row Pinning #grid', () => { // unpin row = grid.gridAPI.get_row_by_index(0); row.unpin(); - fix.detectChanges(); expect(grid.pinnedRows.length).toBe(0); pinRowContainer = fix.debugElement.queryAll(By.css(FIXED_ROW_CONTAINER)); @@ -429,8 +451,7 @@ describe('Row Pinning #grid', () => { it('should apply sorting to both pinned and unpinned rows.', () => { grid.gridAPI.get_row_by_index(1).pin(); - grid.gridAPI.get_row_by_index(5).pin(); - fix.detectChanges(); + grid.gridAPI.get_row_by_index(6).pin(); expect(grid.gridAPI.get_row_by_index(0).rowID).toBe(fix.componentInstance.data[1]); expect(grid.gridAPI.get_row_by_index(1).rowID).toBe(fix.componentInstance.data[5]); @@ -573,7 +594,6 @@ describe('Row Pinning #grid', () => { it('should correctly apply paging state for grid and paginator when there are pinned rows.', () => { // pin the first row grid.gridAPI.get_row_by_index(0).pin(); - fix.detectChanges(); expect(grid.rowList.length).toEqual(6); expect(grid.perPage).toEqual(5); @@ -583,7 +603,6 @@ describe('Row Pinning #grid', () => { // pin the second row grid.gridAPI.get_row_by_index(2).pin(); - fix.detectChanges(); expect(grid.rowList.length).toEqual(7); expect(grid.perPage).toEqual(5); @@ -594,19 +613,17 @@ describe('Row Pinning #grid', () => { it('should have the correct records shown for pages with pinned rows', () => { grid.gridAPI.get_row_by_index(0).pin(); - grid.gridAPI.get_row_by_index(1).pin(); - fix.detectChanges(); let rows = grid.rowList.toArray(); - [1, 2, 1, 2, 3, 4, 5].forEach((x, index) => expect(rows[index].cells.first.value).toEqual(x)); + [1, 1, 2, 3, 4, 5].forEach((x, index) => expect(rows[index].cells.first.value).toEqual(x)); grid.paginate(2); fix.detectChanges(); rows = grid.rowList.toArray(); - [1, 2, 11, 12].forEach((x, index) => expect(rows[index].cells.first.value).toEqual(x)); + [1, 11, 12].forEach((x, index) => expect(rows[index].cells.first.value).toEqual(x)); }); }); @@ -805,10 +822,8 @@ describe('Row Pinning #grid', () => { // Pin/Unpin with the methods firstRow.unpin(); expect(firstRow.pinned).toBe(false); - fix.detectChanges(); firstRow.pin(); expect(firstRow.pinned).toBe(true); - fix.detectChanges(); // Check again pinned row presence pinRowContainer = fix.debugElement.queryAll(By.css(FIXED_ROW_CONTAINER)); @@ -855,7 +870,6 @@ describe('Row Pinning #grid', () => { it('should hide columns in pinned and unpinned area', () => { // pin 2nd data row grid.pinRow(fix.componentInstance.data[1]); - fix.detectChanges(); const hiddenCol = grid.columns[1]; hiddenCol.hidden = true; fix.detectChanges(); @@ -892,14 +906,9 @@ describe('Row Pinning #grid', () => { it('should keep the scrollbar sizes correct when partially filtering out pinned records', () => { grid.gridAPI.get_row_by_index(1).pin(); - fix.detectChanges(); grid.gridAPI.get_row_by_index(3).pin(); - fix.detectChanges(); grid.gridAPI.get_row_by_index(5).pin(); - fix.detectChanges(); grid.gridAPI.get_row_by_index(7).pin(); - fix.detectChanges(); - fix.detectChanges(); // 4 records pinned + 2px border expect(grid.pinnedRowHeight).toBe(4 * grid.renderedRowHeight + 2); @@ -929,9 +938,7 @@ describe('Row Pinning #grid', () => { it('should enter edit mode for the next editable cell when tabbing.', () => { const gridContent = GridFunctions.getGridContent(fix); grid.gridAPI.get_row_by_index(0).pin(); - fix.detectChanges(); grid.gridAPI.get_row_by_index(3).pin(); - fix.detectChanges(); const firstEditable = grid.gridAPI.get_cell_by_index(0, 'CompanyName'); const secondEditable = grid.gridAPI.get_cell_by_index(1, 'CompanyName'); @@ -967,9 +974,7 @@ describe('Row Pinning #grid', () => { it('should enter edit mode for the previous editable cell when shift+tabbing.', () => { const gridContent = GridFunctions.getGridContent(fix); grid.gridAPI.get_row_by_index(0).pin(); - fix.detectChanges(); grid.gridAPI.get_row_by_index(3).pin(); - fix.detectChanges(); const firstEditable = grid.gridAPI.get_cell_by_index(0, 'CompanyName'); const secondEditable = grid.gridAPI.get_cell_by_index(1, 'CompanyName'); @@ -1017,7 +1022,6 @@ describe('Row Pinning #grid', () => { it('should navigate to bottom from top pinned row using Ctrl+ArrowDown', async () => { grid.gridAPI.get_row_by_index(5).pin(); - fix.detectChanges(); const firstRowCell = grid.gridAPI.get_row_by_index(0).cells.toArray()[1]; UIInteractions.simulateClickAndSelectEvent(firstRowCell); @@ -1039,7 +1043,6 @@ describe('Row Pinning #grid', () => { it('should navigate and scroll to first unpinned row from top pinned row using ArrowDown', async () => { grid.gridAPI.get_row_by_index(5).pin(); - fix.detectChanges(); grid.navigateTo(10); await wait(DEBOUNCE_TIME); @@ -1064,7 +1067,6 @@ describe('Row Pinning #grid', () => { it('should navigate to top pinned row from bottom unpinned row without scrolling using Ctrl+ArrowUp', async () => { grid.gridAPI.get_row_by_index(5).pin(); - fix.detectChanges(); grid.navigateTo(27); await wait(DEBOUNCE_TIME); @@ -1095,7 +1097,6 @@ describe('Row Pinning #grid', () => { it('should navigate to top pinned row from first unpinned row using ArrowUp', async () => { grid.gridAPI.get_row_by_index(5).pin(); grid.gridAPI.get_row_by_index(1).pin(); - fix.detectChanges(); const thirdRowCell = grid.gridAPI.get_row_by_index(2).cells.toArray()[1]; UIInteractions.simulateClickAndSelectEvent(thirdRowCell); @@ -1118,7 +1119,6 @@ describe('Row Pinning #grid', () => { it('should navigate and scroll to top from bottom pinned row using Ctrl+ArrowUp', async () => { fix.componentInstance.pinningConfig = { columns: ColumnPinningPosition.Start, rows: RowPinningPosition.Bottom }; grid.gridAPI.get_row_by_index(5).pin(); - fix.detectChanges(); grid.navigateTo(26); await wait(DEBOUNCE_TIME); @@ -1171,7 +1171,6 @@ describe('Row Pinning #grid', () => { it('should navigate to bottom pinned row from top unpinned row without scrolling using Ctrl+ArrowDown', async () => { fix.componentInstance.pinningConfig = { columns: ColumnPinningPosition.Start, rows: RowPinningPosition.Bottom }; grid.gridAPI.get_row_by_index(5).pin(); - fix.detectChanges(); expect(grid.verticalScrollContainer.getScroll().scrollTop).toEqual(0); @@ -1199,7 +1198,6 @@ describe('Row Pinning #grid', () => { grid.gridAPI.get_row_by_index(5).pin(); grid.gridAPI.get_row_by_index(1).pin(); await wait(DEBOUNCE_TIME); - fix.detectChanges(); grid.navigateTo(26); await wait(DEBOUNCE_TIME); @@ -1228,8 +1226,6 @@ describe('Row Pinning #grid', () => { it('should navigate down from pinned to unpinned row when there are filtered out pinned rows', async () => { grid.gridAPI.get_row_by_index(5).pin(); grid.gridAPI.get_row_by_index(1).pin(); - fix.detectChanges(); - grid.filter('ID', 'B', IgxStringFilteringOperand.instance().condition('contains'), false); fix.detectChanges(); diff --git a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.integration.spec.ts b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.integration.spec.ts index 704a0d1beea..e383cb522ec 100644 --- a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.integration.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.integration.spec.ts @@ -866,15 +866,12 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => { it('should pin rows to top ', (() => { hierarchicalGrid.pinRow('0'); - fixture.detectChanges(); expect(hierarchicalGrid.pinnedRows.length).toBe(1); hierarchicalGrid.unpinRow('0'); - fixture.detectChanges(); expect(hierarchicalGrid.pinnedRows.length).toBe(0); hierarchicalGrid.pinRow('0'); - fixture.detectChanges(); expect(hierarchicalGrid.pinnedRows.length).toBe(1); let pinRowContainer = fixture.debugElement.queryAll(By.css(FIXED_ROW_CONTAINER)); @@ -888,7 +885,6 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => { expect(hierarchicalGrid.getRowByIndex(3).key).toBe('2'); hierarchicalGrid.pinRow('2'); - fixture.detectChanges(); pinRowContainer = fixture.debugElement.queryAll(By.css(FIXED_ROW_CONTAINER)); expect(pinRowContainer[0].children.length).toBe(2); @@ -1107,7 +1103,6 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => { const paginator = fixture.debugElement.query(By.directive(IgxPaginatorComponent)).componentInstance; // pin the first row hierarchicalGrid.getRowByIndex(0).pin(); - fixture.detectChanges(); expect(hierarchicalGrid.rowList.length).toEqual(6); expect(hierarchicalGrid.perPage).toEqual(5); @@ -1117,7 +1112,6 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => { // pin the second row hierarchicalGrid.getRowByIndex(2).pin(); - fixture.detectChanges(); expect(hierarchicalGrid.rowList.length).toEqual(7); expect(hierarchicalGrid.perPage).toEqual(5); @@ -1148,19 +1142,17 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => { hierarchicalGrid.height = '700px'; fixture.detectChanges(); hierarchicalGrid.getRowByIndex(0).pin(); - hierarchicalGrid.getRowByIndex(1).pin(); - fixture.detectChanges(); let rows = hierarchicalGrid.rowList.toArray(); - [0, 1, 0, 1, 2, 3, 4].forEach((x, index) => expect(parseInt(rows[index].cells.first.value, 10)).toEqual(x)); + [0, 0, 1, 2, 3, 4, 5].forEach((x, index) => expect(parseInt(rows[index].cells.first.value, 10)).toEqual(x)); hierarchicalGrid.paginate(6); fixture.detectChanges(); rows = hierarchicalGrid.rowList.toArray(); - [0, 1, 36, 37, 38, 39].forEach((x, index) => expect(parseInt(rows[index].cells.first.value, 10)).toEqual(x)); + [0, 36, 37, 38, 39].forEach((x, index) => expect(parseInt(rows[index].cells.first.value, 10)).toEqual(x)); }); }); }); diff --git a/projects/igniteui-angular/src/lib/grids/row.directive.ts b/projects/igniteui-angular/src/lib/grids/row.directive.ts index b9d7d50491e..525ff749bd1 100644 --- a/projects/igniteui-angular/src/lib/grids/row.directive.ts +++ b/projects/igniteui-angular/src/lib/grids/row.directive.ts @@ -500,7 +500,7 @@ export class IgxRowDirective implemen /** * Pins the specified row. - * This method emits `rowPinning` event. + * This method emits `rowPinning`\`rowPinned` event. * * ```typescript * // pin the selected row from the grid @@ -513,7 +513,7 @@ export class IgxRowDirective implemen /** * Unpins the specified row. - * This method emits `rowPinning` event. + * This method emits `rowPinning`\`rowPinned` event. * * ```typescript * // unpin the selected row from the grid diff --git a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-integration.spec.ts b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-integration.spec.ts index a1f679fdf8a..233421a939a 100644 --- a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-integration.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-integration.spec.ts @@ -1470,7 +1470,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { it('should pin/unpin a row', () => { treeGrid.pinRow(711); - fix.detectChanges(); expect(treeGrid.pinnedRecordsCount).toBe(1); expect(treeGrid.getRowByKey(711).pinned).toBe(true); @@ -1482,11 +1481,9 @@ describe('IgxTreeGrid - Integration #tGrid', () => { expect(treeGrid.getRowByKey(711).pinned).toBe(false); treeGrid.getRowByKey(711).pin(); - fix.detectChanges(); expect(treeGrid.pinnedRecordsCount).toBe(1); treeGrid.getRowByKey(711).unpin(); - fix.detectChanges(); expect(treeGrid.pinnedRecordsCount).toBe(0); @@ -1505,7 +1502,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { const visibleRecordsLength = treeGrid.records.size; treeGrid.pinRow(711); - fix.detectChanges(); expect(treeGrid.getRowByIndex(visibleRecordsLength).key).toBe(711); }); @@ -1515,7 +1511,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { const secondRow = treeGrid.getRowByIndex(1); treeGrid.pinRow(711); - fix.detectChanges(); await wait(); @@ -1524,7 +1519,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { expect(treeGrid.getRowByIndex(2).key).toBe(secondRow.key); treeGrid.unpinRow(711); - fix.detectChanges(); await wait(); @@ -1537,13 +1531,11 @@ describe('IgxTreeGrid - Integration #tGrid', () => { const primaryKey = treeGrid.primaryKey; treeGrid.pinRow(rowToPin.data[primaryKey]); - fix.detectChanges(); expect(treeGrid.gridAPI.get_row_by_index(0).disabled).toBe(false); expect(treeGrid.gridAPI.get_row_by_index(1).disabled).toBe(true); treeGrid.unpinRow(rowToPin.data[primaryKey]); - fix.detectChanges(); expect(treeGrid.gridAPI.get_row_by_index(0).disabled).toBe(false); expect(treeGrid.gridAPI.get_row_by_index(1).disabled).toBe(false); @@ -1555,8 +1547,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { const primaryKey = treeGrid.primaryKey; treeGrid.pinRow(rowToPin.data[primaryKey]); - fix.detectChanges(); - fix.detectChanges(); const firstColumnField = treeGrid.columns[0].field; const pinnedChipPosition = treeGrid.gridAPI.get_cell_by_index(1, firstColumnField); @@ -1573,7 +1563,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { const primaryKey = treeGrid.primaryKey; treeGrid.pinRow(rowToPin.data[primaryKey]); - fix.detectChanges(); const thirdColumnField = treeGrid.columns[2].field; @@ -1590,7 +1579,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { const rowToPin = treeGrid.getRowByIndex(0); rowToPin.pin(); - fix.detectChanges(); // collapse pinned row treeGrid.toggleRow(rowToPin.key); @@ -1613,7 +1601,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { const rowToPin = treeGrid.getRowByIndex(0); rowToPin.pin(); - fix.detectChanges(); searchResultsCount = treeGrid.findNext('John'); expect(searchResultsCount).toBe(2); @@ -1622,7 +1609,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { it('should apply filtering to both pinned and unpinned rows', () => { treeGrid.pinRow(147); treeGrid.pinRow(711); - fix.detectChanges(); treeGrid.filter('ID', 147, IgxStringFilteringOperand.instance().condition('contains'), false); fix.detectChanges(); @@ -1635,8 +1621,7 @@ describe('IgxTreeGrid - Integration #tGrid', () => { it('should apply sorting to both pinned and unpinned rows', () => { treeGrid.pinRow(147); - treeGrid.pinRow(711); - fix.detectChanges(); + treeGrid.pinRow(711);; expect(treeGrid.getRowByIndex(0).key).toBe(147); expect(treeGrid.getRowByIndex(1).key).toBe(711); @@ -1652,7 +1637,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { it('should not take into account pinned rows when changing items per page', () => { treeGrid.pinRow(147); - fix.detectChanges(); fix.componentInstance.paging = true; fix.detectChanges(); @@ -1676,8 +1660,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { const paginator = fix.debugElement.query(By.directive(IgxPaginatorComponent)).componentInstance; // pin the first row treeGrid.getRowByIndex(0).pin(); - fix.detectChanges(); - expect(treeGrid.rowList.length).toEqual(4); expect(treeGrid.perPage).toEqual(3); expect(paginator.perPage).toEqual(3); @@ -1686,7 +1668,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { // pin the second row treeGrid.getRowByIndex(2).pin(); - fix.detectChanges(); expect(treeGrid.rowList.length).toEqual(5); expect(treeGrid.perPage).toEqual(3); @@ -1702,24 +1683,21 @@ describe('IgxTreeGrid - Integration #tGrid', () => { treeGrid.height = '700px'; fix.detectChanges(); treeGrid.getRowByIndex(0).pin(); - treeGrid.getRowByIndex(1).pin(); - fix.detectChanges(); let rows = treeGrid.rowList.toArray(); - [147, 475, 147, 475, 957, 317, 711, 998].forEach((x, index) => expect(parseInt(rows[index].cells.first.value, 10)).toEqual(x)); + [147, 147, 475, 957, 317, 711, 998].forEach((x, index) => expect(parseInt(rows[index].cells.first.value, 10)).toEqual(x)); treeGrid.paginate(1); fix.detectChanges(); rows = treeGrid.rowList.toArray(); - [147, 475, 299, 19, 847, 663].forEach((x, index) => expect(parseInt(rows[index].cells.first.value, 10)).toEqual(x)); + [147, 299, 19, 847, 663].forEach((x, index) => expect(parseInt(rows[index].cells.first.value, 10)).toEqual(x)); }); it('should make a correct selection', () => { treeGrid.pinRow(147); - fix.detectChanges(); const range = { rowStart: 0, rowEnd: 2, columnStart: 'ID', columnEnd: 'Name' }; treeGrid.selectRange(range); @@ -1735,7 +1713,6 @@ describe('IgxTreeGrid - Integration #tGrid', () => { it('should remove the pinned chip for filtered out parent', () => { treeGrid.pinRow(147); - fix.detectChanges(); treeGrid.filter('ID', 957, IgxStringFilteringOperand.instance().condition('contains'), false); fix.detectChanges();