Skip to content

Commit c651342

Browse files
authored
fix(h-grid): add null checks for child data - 20.0.x (#15930)
* fix(h-grid): add null checks for child data
1 parent fe6d9d0 commit c651342

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

projects/igniteui-angular/src/lib/grids/grid/grid-filtering-advanced.spec.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { QueryBuilderFunctions } from '../../query-builder/query-builder-functio
2727
import { By } from '@angular/platform-browser';
2828
import { IgxDateTimeEditorDirective } from '../../directives/date-time-editor/date-time-editor.directive';
2929
import { QueryBuilderSelectors } from '../../query-builder/query-builder.common';
30-
import { IgxHGridRemoteOnDemandComponent } from '../hierarchical-grid/hierarchical-grid.spec';
30+
import { IgxHGridRemoteOnDemandComponent, IgxHierarchicalGridMissingChildDataComponent } from '../hierarchical-grid/hierarchical-grid.spec';
3131
import { IGridResourceStrings } from '../../core/i18n/grid-resources';
3232

3333
describe('IgxGrid - Advanced Filtering #grid - ', () => {
@@ -1898,6 +1898,19 @@ describe('IgxGrid - Advanced Filtering #grid - ', () => {
18981898
expect(operatorSelect.querySelector('input').value).toBe('My In');
18991899
expect(Array.from(operatorSelect.querySelectorAll('igx-select-item')).pop().textContent).toBe('My Not In');
19001900
}));
1901+
1902+
it('Should not throw an error when some child data is missing.', fakeAsync(() => {
1903+
const fixture = TestBed.createComponent(IgxHierarchicalGridMissingChildDataComponent);
1904+
const hierarchicalGrid = fixture.componentInstance.hGrid;
1905+
hierarchicalGrid.allowAdvancedFiltering = true;
1906+
fixture.detectChanges();
1907+
1908+
// Open Advanced Filtering dialog.
1909+
expect(() => {
1910+
hierarchicalGrid.openAdvancedFilteringDialog();
1911+
fixture.detectChanges();
1912+
}).not.toThrow();
1913+
}));
19011914
});
19021915
});
19031916

projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,9 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti
12561256
];
12571257

12581258
entities[0].childEntities = this.childLayoutList.reduce((acc, rowIsland) => {
1259-
return acc.concat(this.generateChildEntity(rowIsland, this.data[0][rowIsland.key][0]));
1259+
const childFirstRowData = this.data?.length > 0 && this.data[0][rowIsland.key]?.length > 0 ?
1260+
this.data[0][rowIsland.key][0] : null;
1261+
return acc.concat(this.generateChildEntity(rowIsland, childFirstRowData));
12601262
}
12611263
, []);
12621264
}
@@ -1289,7 +1291,9 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti
12891291
if (!firstRowData) {
12901292
return null;
12911293
}
1292-
return acc.concat(this.generateChildEntity(childRowIsland, firstRowData[childRowIsland.key][0]));
1294+
const childFirstRowData = firstRowData.length > 0 && firstRowData[childRowIsland.key]?.length > 0 ?
1295+
firstRowData[childRowIsland.key][0] : null;
1296+
return acc.concat(this.generateChildEntity(childRowIsland, childFirstRowData));
12931297
}, []);
12941298

12951299
if (rowIslandChildEntities?.length > 0) {

projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2509,3 +2509,31 @@ export class IgxHierarchicalGridEmptyTemplateComponent extends IgxHierarchicalGr
25092509
this.childGridRef = grid;
25102510
}
25112511
}
2512+
2513+
@Component({
2514+
template: `
2515+
<igx-hierarchical-grid #hGrid [data]="data" [autoGenerate]="false"
2516+
[height]="'400px'" [width]="'500px'">
2517+
<igx-column field="root1" [dataType]="'number'"></igx-column>
2518+
<igx-column field="root2" [dataType]="'number'"></igx-column>
2519+
<igx-row-island [key]="'level1data'" [autoGenerate]="false">
2520+
<igx-column field="level1child1" [dataType]="'number'"></igx-column>
2521+
<igx-column field="level1child2" [dataType]="'number'"></igx-column>
2522+
<igx-row-island [key]="'level2data'" [autoGenerate]="false">
2523+
<igx-column field="level2child1" [dataType]="'number'"></igx-column>
2524+
<igx-column field="level2child2" [dataType]="'number'"></igx-column>
2525+
</igx-row-island>
2526+
</igx-row-island>
2527+
</igx-hierarchical-grid>`,
2528+
imports: [IgxHierarchicalGridComponent, IgxColumnComponent, IgxRowIslandComponent]
2529+
})
2530+
export class IgxHierarchicalGridMissingChildDataComponent {
2531+
@ViewChild('hGrid', { read: IgxHierarchicalGridComponent, static: true })
2532+
public hGrid: IgxHierarchicalGridComponent;
2533+
2534+
public data = [
2535+
{ root1: 1, root2: 1, level1data: [{ level1child1: 11, level1child2: 12 }] }, // missing level2data
2536+
{ root1: 2, root2: 2, level1data: [{ level1child1: 21, level1child2: 22, level2data: [{ level2child1: 31, level2child2: 32 }] }] },
2537+
{ root1: 3, root2: 3, level1data: [] }
2538+
];
2539+
}

0 commit comments

Comments
 (0)