From ecef883cc2e0f329683f3c65fa89c6c42866ede9 Mon Sep 17 00:00:00 2001 From: igdmdimitrov Date: Thu, 12 Jun 2025 14:13:04 +0300 Subject: [PATCH 1/3] fix(h-grid): add null checks for child data --- .../grids/grid/grid-filtering-advanced.spec.ts | 15 ++++++++++++++- .../hierarchical-grid.component.ts | 8 ++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/projects/igniteui-angular/src/lib/grids/grid/grid-filtering-advanced.spec.ts b/projects/igniteui-angular/src/lib/grids/grid/grid-filtering-advanced.spec.ts index fce5caf5528..285ae6e7bd1 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid-filtering-advanced.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/grid/grid-filtering-advanced.spec.ts @@ -27,7 +27,7 @@ import { QueryBuilderFunctions } from '../../query-builder/query-builder-functio import { By } from '@angular/platform-browser'; import { IgxDateTimeEditorDirective } from '../../directives/date-time-editor/date-time-editor.directive'; import { QueryBuilderSelectors } from '../../query-builder/query-builder.common'; -import { IgxHGridRemoteOnDemandComponent } from '../hierarchical-grid/hierarchical-grid.spec'; +import { IgxHGridRemoteOnDemandComponent, IgxHierarchicalGridMissingChildDataComponent } from '../hierarchical-grid/hierarchical-grid.spec'; import { IGridResourceStrings } from '../../core/i18n/grid-resources'; describe('IgxGrid - Advanced Filtering #grid - ', () => { @@ -1898,6 +1898,19 @@ describe('IgxGrid - Advanced Filtering #grid - ', () => { expect(operatorSelect.querySelector('input').value).toBe('My In'); expect(Array.from(operatorSelect.querySelectorAll('igx-select-item')).pop().textContent).toBe('My Not In'); })); + + it('Should not throw an error when some child data is missing.', fakeAsync(() => { + const fixture = TestBed.createComponent(IgxHierarchicalGridMissingChildDataComponent); + const hierarchicalGrid = fixture.componentInstance.hGrid; + hierarchicalGrid.allowAdvancedFiltering = true; + fixture.detectChanges(); + + // Open Advanced Filtering dialog. + expect(() => { + hierarchicalGrid.openAdvancedFilteringDialog(); + fixture.detectChanges(); + }).not.toThrow(); + })); }); }); 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 69695e21ee2..368b007545d 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 @@ -1256,7 +1256,9 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti ]; entities[0].childEntities = this.childLayoutList.reduce((acc, rowIsland) => { - return acc.concat(this.generateChildEntity(rowIsland, this.data[0][rowIsland.key][0])); + const childFirstRowData = this.data?.length > 0 && this.data[0][rowIsland.key]?.length > 0 ? + this.data[0][rowIsland.key][0] : null; + return acc.concat(this.generateChildEntity(rowIsland, childFirstRowData)); } , []); } @@ -1289,7 +1291,9 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti if (!firstRowData) { return null; } - return acc.concat(this.generateChildEntity(childRowIsland, firstRowData[childRowIsland.key][0])); + const childFirstRowData = firstRowData?.length > 0 && firstRowData[childRowIsland.key]?.length > 0 ? + firstRowData[childRowIsland.key][0] : null; + return acc.concat(this.generateChildEntity(childRowIsland, childFirstRowData)); }, []); if (rowIslandChildEntities?.length > 0) { From f6d726389e54fac51db766b698a6d530ac608eb1 Mon Sep 17 00:00:00 2001 From: igdmdimitrov Date: Thu, 12 Jun 2025 14:15:21 +0300 Subject: [PATCH 2/3] chore(*): add test component --- .../hierarchical-grid.spec.ts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.spec.ts b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.spec.ts index c4186f15c9f..8d8512ae4f5 100644 --- a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.spec.ts @@ -2477,3 +2477,31 @@ export class IgxHierarchicalGridEmptyTemplateComponent extends IgxHierarchicalGr this.childGridRef = grid; } } + +@Component({ + template: ` + + + + + + + + + + + + `, + imports: [IgxHierarchicalGridComponent, IgxColumnComponent, IgxRowIslandComponent] +}) +export class IgxHierarchicalGridMissingChildDataComponent { + @ViewChild('hGrid', { read: IgxHierarchicalGridComponent, static: true }) + public hGrid: IgxHierarchicalGridComponent; + + public data = [ + { root1: 1, root2: 1, level1data: [{ level1child1: 11, level1child2: 12 }] }, // missing level2data + { root1: 2, root2: 2, level1data: [{ level1child1: 21, level1child2: 22, level2data: [{ level2child1: 31, level2child2: 32 }] }] }, + { root1: 3, root2: 3, level1data: [] } + ]; +} From 5f58b9b7d39dd79f3a743143f9e857a3e788e670 Mon Sep 17 00:00:00 2001 From: igdmdimitrov <49060557+igdmdimitrov@users.noreply.github.com> Date: Tue, 17 Jun 2025 10:14:47 +0300 Subject: [PATCH 3/3] Update projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts Co-authored-by: Galina Edinakova --- .../lib/grids/hierarchical-grid/hierarchical-grid.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 368b007545d..2ce0f166cb2 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 @@ -1291,7 +1291,7 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti if (!firstRowData) { return null; } - const childFirstRowData = firstRowData?.length > 0 && firstRowData[childRowIsland.key]?.length > 0 ? + const childFirstRowData = firstRowData.length > 0 && firstRowData[childRowIsland.key]?.length > 0 ? firstRowData[childRowIsland.key][0] : null; return acc.concat(this.generateChildEntity(childRowIsland, childFirstRowData)); }, []);