From 81293bd712c7908cbabfa0ba6022b29963d50b96 Mon Sep 17 00:00:00 2001 From: georgianastasov Date: Thu, 28 May 2026 16:35:08 +0300 Subject: [PATCH 1/3] fix(hierarchical-grid): align selected data with expanded row indexes --- .../src/lib/grids/grid-base.directive.ts | 2 +- .../hierarchical-grid.component.ts | 14 ++++++++ .../hierarchical-grid.integration.spec.ts | 34 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) 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 79525377ed6..c9d96785aec 100644 --- a/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts +++ b/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts @@ -7498,7 +7498,7 @@ export abstract class IgxGridBaseDirective implements GridType, const keysAndData = []; const activeEl = this.selectionService.activeElement; - if (this.type === 'hierarchical') { + if (this.type === 'hierarchical' && source === this.filteredSortedData) { const expansionRowIndexes = []; for (const [key, value] of this.expansionStates.entries()) { if (value) { diff --git a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts index 393432f0a96..a5e43c95658 100644 --- a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts +++ b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts @@ -1181,6 +1181,20 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti super.initColumns(collection, cb); } + /** + * @hidden @internal + */ + public override getSelectedData(formatters = false, headers = false): any[] { + const source: any[] = []; + this.dataView.forEach((record) => { + if (this.isChildGridRecord(record)) { + source.push(null); + return; + } + source.push(record); + }); + return this.extractDataFromSelection(source, formatters, headers); + } protected override setupColumns() { if (this.parentIsland && this.parentIsland.childColumns.length > 0 && !this.autoGenerate) { 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 9b0937c4fcc..2e07e49d579 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 @@ -9,6 +9,7 @@ import { IgxHierarchicalRowComponent } from './hierarchical-row.component'; import { IgxStringFilteringOperand } from '../../data-operations/filtering-condition'; import { take } from 'rxjs/operators'; import { + IgxHierarchicalGridEmptyDataExportComponent, IgxHierarchicalGridTestBaseComponent, IgxHierarchicalGridTestCustomToolbarComponent, IgxHierarchicalGridTestInputPaginatorComponent, @@ -36,6 +37,7 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => { TestBed.configureTestingModule({ imports: [ NoopAnimationsModule, + IgxHierarchicalGridEmptyDataExportComponent, IgxHierarchicalGridTestBaseComponent, IgxHierarchicalGridTestCustomToolbarComponent, IgxHierarchicalGridWithTransactionProviderComponent, @@ -160,6 +162,38 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => { expect(fChildCell.selected).toBeFalsy(); expect(fCell.selected).toBeTruthy(); })); + + it('should not copy the previous row value from an expanded parent row', fakeAsync(() => { + const singersFixture = TestBed.createComponent(IgxHierarchicalGridEmptyDataExportComponent); + const singersData = SampleTestData.hierarchicalGridSingersFullData(); + (singersFixture.componentInstance as { data: unknown[] }).data = singersData; + singersFixture.detectChanges(); + + const grid = singersFixture.componentInstance.hGrid; + + const previousArtist = singersData[1].Artist; + const targetArtist = singersData[2].Artist; + const targetRow = grid.dataRowList.toArray() + .find(row => row.data.Artist === targetArtist) as IgxHierarchicalRowComponent; + + targetRow.toggle(); + tick(DEBOUNCE_TIME); + singersFixture.detectChanges(); + + grid.selectRange({ + rowStart: targetRow.index, + rowEnd: targetRow.index, + columnStart: 'Artist', + columnEnd: 'Artist' + }); + singersFixture.detectChanges(); + + expect(targetRow.expanded).toBeTruthy(); + + const selectedData = grid.getSelectedData(); + expect(selectedData).toEqual([{ Artist: targetArtist }]); + expect(selectedData[0].Artist).not.toBe(previousArtist); + })); }); describe('Updating', () => { From 40254e6251de712a333419c7bc0ee0a040c8fbe8 Mon Sep 17 00:00:00 2001 From: georgianastasov Date: Thu, 28 May 2026 20:09:45 +0300 Subject: [PATCH 2/3] fix(hierarchical-grid): copy selected data from expanded parent rows correctly --- .../hierarchical-grid.component.ts | 31 ++++++++++--------- .../hierarchical-grid.integration.spec.ts | 11 ++++--- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts index a5e43c95658..4dd9932dd08 100644 --- a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts +++ b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts @@ -818,6 +818,22 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti .reduce((a, b) => a.concat(b), []); } + /** + * Returns an array of the current cell selection. + */ + public override getSelectedData(formatters = false, headers = false): any[] { + const source: any[] = []; + this.dataView.forEach((record) => { + if (this.isChildGridRecord(record)) { + source.push(null); + return; + } + const rowData = record as any; + source.push(this.isGhostRecord(rowData) || this.isRecordMerged(rowData) ? rowData.recordRef : rowData); + }); + return this.extractDataFromSelection(source, formatters, headers); + } + /** * Returns a `CellType` object that matches the conditions. * @@ -1181,21 +1197,6 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti super.initColumns(collection, cb); } - /** - * @hidden @internal - */ - public override getSelectedData(formatters = false, headers = false): any[] { - const source: any[] = []; - this.dataView.forEach((record) => { - if (this.isChildGridRecord(record)) { - source.push(null); - return; - } - source.push(record); - }); - return this.extractDataFromSelection(source, formatters, headers); - } - protected override setupColumns() { if (this.parentIsland && this.parentIsland.childColumns.length > 0 && !this.autoGenerate) { this.createColumnsList(this.parentIsland.childColumns.toArray()); 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 2e07e49d579..bb026d7b7c6 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 @@ -174,21 +174,22 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => { const previousArtist = singersData[1].Artist; const targetArtist = singersData[2].Artist; const targetRow = grid.dataRowList.toArray() - .find(row => row.data.Artist === targetArtist) as IgxHierarchicalRowComponent; + .find(row => row.data.Artist === targetArtist) as IgxHierarchicalRowComponent | undefined; - targetRow.toggle(); + expect(targetRow).toBeDefined(); + targetRow!.toggle(); tick(DEBOUNCE_TIME); singersFixture.detectChanges(); grid.selectRange({ - rowStart: targetRow.index, - rowEnd: targetRow.index, + rowStart: targetRow!.index, + rowEnd: targetRow!.index, columnStart: 'Artist', columnEnd: 'Artist' }); singersFixture.detectChanges(); - expect(targetRow.expanded).toBeTruthy(); + expect(targetRow!.expanded).toBeTruthy(); const selectedData = grid.getSelectedData(); expect(selectedData).toEqual([{ Artist: targetArtist }]); From 3fbc47d600ac87e38bba4a01c1adf8f880857de7 Mon Sep 17 00:00:00 2001 From: georgianastasov Date: Thu, 28 May 2026 20:20:46 +0300 Subject: [PATCH 3/3] chore(elements): update generated config --- .../igniteui-angular-elements/src/analyzer/elements.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/igniteui-angular-elements/src/analyzer/elements.config.ts b/projects/igniteui-angular-elements/src/analyzer/elements.config.ts index 67721fde02f..db336f4728c 100644 --- a/projects/igniteui-angular-elements/src/analyzer/elements.config.ts +++ b/projects/igniteui-angular-elements/src/analyzer/elements.config.ts @@ -582,6 +582,7 @@ export var registerConfig = [ methods: [ "getRowByIndex", "getRowByKey", + "getSelectedData", "getCellByColumn", "getCellByKey", "pinRow", @@ -628,7 +629,6 @@ export var registerConfig = [ "clearCellSelection", "selectRange", "getSelectedRanges", - "getSelectedData", "selectedColumns", "selectColumns", "deselectColumns",