From cdaade7cc5f4cea257b0b9cced1d15d15fdbf9a2 Mon Sep 17 00:00:00 2001 From: ddaribo Date: Mon, 22 Jan 2024 16:21:19 +0200 Subject: [PATCH] fix(tree-grid): get newSelection from all data --- .../tree-grid/tree-grid-selection.service.ts | 2 +- .../tree-grid/tree-grid-selection.spec.ts | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-selection.service.ts b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-selection.service.ts index b76e0a9c829..516d04fadb6 100644 --- a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-selection.service.ts +++ b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-selection.service.ts @@ -118,7 +118,7 @@ export class IgxTreeGridSelectionService extends IgxGridSelectionService { }; this.calculateRowsNewSelectionState(args, !!this.grid.primaryKey); - args.newSelection = Array.from(this.allData.filter(r => this.rowsToBeSelected.has(this.grid.primaryKey ? r[this.grid.primaryKey] : r))); + args.newSelection = Array.from(this.grid.gridAPI.get_all_data().filter(r => this.rowsToBeSelected.has(this.grid.primaryKey ? r[this.grid.primaryKey] : r))); // retrieve rows/parents/children which has been added/removed from the selection this.handleAddedAndRemovedArgs(args); diff --git a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-selection.spec.ts b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-selection.spec.ts index 90b1d221d89..a4b764972c2 100644 --- a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-selection.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-selection.spec.ts @@ -1488,6 +1488,47 @@ describe('IgxTreeGrid - Selection #tGrid', () => { TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 3, true, true); }); + it(`Parent with two or more children. Select parent. Filter out one of the children. Deselect all the others -> children + and parent checkbox state becomes deselected. Filter the other child back in. This child should remain selected. + Parent checkbox state should be indeterminate.`, fakeAsync(() => { + treeGrid.selectRows([147], true); + fix.detectChanges(); + + expect(getVisibleSelectedRows(fix).length).toBe(7); + + const expressionTree = new FilteringExpressionsTree(FilteringLogic.And, 'ID'); + expressionTree.filteringOperands = [ + { + condition: IgxNumberFilteringOperand.instance().condition('doesNotEqual'), + fieldName: 'ID', + searchVal: 957 + }, + ]; + treeGrid.filter('ID', null, expressionTree); + + fix.detectChanges(); + tick(100); + + expect(getVisibleSelectedRows(fix).length).toBe(6); + + treeGrid.deselectRows([475, 317]); + fix.detectChanges(); + + expect(getVisibleSelectedRows(fix).length).toBe(0); + TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 0, false, false); + + treeGrid.clearFilter(); + + tick(1000); + fix.detectChanges(); + + expect(getVisibleSelectedRows(fix).length).toBe(1); + expect(treeGrid.selectionService.indeterminateRows.size).toBe(1); + TreeGridFunctions.verifyHeaderCheckboxSelection(fix, null); + TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 2, true, true); + TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 0, null, null); + })); + it(`Parent in indeterminate state. Filter out its children -> parent not selected. Select parent and add new child. Parent -> not selected. Revert filtering so that previous records are back in the view and parent should become in indeterminate state because one of it children is selected`, fakeAsync(() => {