Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
fbfdf93
chore(*): Wrap each row in container w resize observer and update.
Jan 22, 2026
4f1a12d
Merge branch 'master' into mkirova/resize-observer-refactor
Jan 26, 2026
80fdb9f
chore(*): Add cache for view sizes, use when updating caches after sc…
Jan 26, 2026
1080c0f
chore(*): Clean console logs.
Jan 26, 2026
125d464
chore(*): Fix lint error.
Jan 26, 2026
7d66443
chore(*): Make override arg optional too.
Jan 26, 2026
2d96c12
chore(*): Update cache for all views but update size cached only for …
Jan 27, 2026
807ef0b
chore(*): Use resize observer only for measurements.
Jan 27, 2026
2147886
chore(*): Remove unnecessary recalc.
Jan 27, 2026
443310a
chore(*): Add back since it still needs update in some scenarios.
Jan 27, 2026
e7dff9d
chore(*): Add sample with hgrid for measuring perf.
Jan 28, 2026
d3f49c5
chore(*): Fix wrapping container in hgrid. Remove DOM read ops on rec…
Jan 28, 2026
ffd6a83
chore(*): Set null width to skip resize on attach/detach child grids.
Jan 28, 2026
4914468
chore(*): Add container to size in all other grids as well.
Jan 28, 2026
278ebcb
chore(*): Caches only for IgxGridForOfDirective. Retain old logic for…
Jan 28, 2026
9b8c5ad
chore(*): Fix timing so that tests do not disconnect.
Jan 29, 2026
af81bb0
chore(*): Remove zone run since it's unnecessary.
Jan 29, 2026
0633724
chore(*): Check if the await causes a disconnect in tests.
Jan 29, 2026
379aac5
chore(*): Update tests according to new structure.
Jan 29, 2026
e9192e0
chore(*): Remove unnecessary size recalc during scroll position update.
Jan 30, 2026
ab14780
chore(*): Update groupBy tests according to new DOM structure.
Jan 30, 2026
100d904
chore(*): Update test timing.
Jan 30, 2026
6aeb4fe
chore(*): Clean up imports and fix formatting.
Jan 30, 2026
08b034f
chore(*): Fix flicker in test.
Feb 2, 2026
14276fb
chore(*): Remove unnecessary ResizeObserver init in vertical scroll.
Feb 2, 2026
891edaa
chore(*): Clear view sizes cache and disconnect view observer on destroy
Feb 2, 2026
b03054c
chore(*): Add back zone run since otherwise observer does not trigger.
Feb 2, 2026
45b120b
Merge branch 'master' into mkirova/resize-observer-refactor
rkaraivanov Feb 2, 2026
8b2fa8e
chore(*): Remove fake test zone, to prevent disconnects.
Feb 2, 2026
e4e87e6
Merge branch 'mkirova/resize-observer-refactor' of https://github.com…
Feb 2, 2026
4902da5
chore(*): Refactor how size is retrieved for base/ IgxGridForOfDirect…
Feb 2, 2026
e28d09c
test(*): Prevent ResizeObserver loop in tests.
Feb 2, 2026
cf021ba
test(grid): Configure SCROLL_THROTTLE_TIME for summaries tests.
Feb 2, 2026
f7ad651
chore(*): Fix test timings.
Feb 2, 2026
4e08bf2
chore(*): Increase wait times in summaries tests for stability
Feb 2, 2026
c373248
chore(*): Apply review comments.
Feb 3, 2026
3d646be
Merge branch 'master' into mkirova/resize-observer-refactor
rkaraivanov Feb 4, 2026
21cfb85
chore(*): Add null check.
Feb 4, 2026
1f28826
Merge branch 'mkirova/resize-observer-refactor' of https://github.com…
Feb 4, 2026
7222630
Merge branch 'master' into mkirova/resize-observer-refactor
rkaraivanov Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion projects/igniteui-angular-performance/src/app/app.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Routes } from '@angular/router';
import { GridComponent } from './grid/grid.component';
import { TreeGridComponent } from './tree-grid/tree-grid.component';
import { PivotGridComponent } from './pivot-grid/pivot-grid.component';
import { HierarchicalGridComponent } from './hierarchical-grid/hierarchical-grid.component';

export const routes: Routes = [
{
Expand Down Expand Up @@ -45,6 +46,12 @@ export const routes: Routes = [
pathMatch: 'full',
component: GridComponent,
data: { rows: 1000 }
}
},
{
path: "hierarchical-grid-100k",
title: "Hierarchical Grid 100k records",
component: HierarchicalGridComponent,
data: { rows: 100_000 }
},

];
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<div class="grid-wrapper">
<igx-hierarchical-grid
[showExpandAll]="true"
#grid
[data]="data"
[allowFiltering]="false"
[height]="'100%'"
[width]="'100%'"
>
@for (col of columns; track col) {
<igx-column
[field]="col.field"
[header]="col.header"
[sortable]="col.sortable"
[dataType]="col.dataType"
[width]="col.width"
[groupable]="col.groupable"
>
</igx-column>
}
<igx-row-island [height]="null" [width]="null" [key]="'childData'" [autoGenerate]="false">
@for (col of columns; track col) {
<igx-column
[field]="col.field"
[header]="col.header"
[sortable]="col.sortable"
[dataType]="col.dataType"
[width]="col.width"
[groupable]="col.groupable"
>
</igx-column>
}
</igx-row-island>
</igx-hierarchical-grid>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
:host {
display: flex;
flex-direction: column;
height: 100%;
}

.grid-wrapper {
height: 100%;
width: 100%;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { Component, inject, ViewChild } from '@angular/core';
import { GridColumnDataType, IgxColumnComponent, IgxHierarchicalGridComponent, IgxRowIslandComponent } from "igniteui-angular"
import { DataService } from '../services/data.service';
import { ActivatedRoute } from '@angular/router';

@Component({
selector: 'app-hierarchical-grid',
imports: [IgxHierarchicalGridComponent, IgxColumnComponent, IgxRowIslandComponent],
templateUrl: './hierarchical-grid.component.html',
styleUrl: './hierarchical-grid.component.scss'
})
export class HierarchicalGridComponent {
protected columns: any[] = []
protected data: any[] = [];
protected performanceDataList: PerformanceEntryList = [];
private dataService = inject(DataService);
private activatedRoute = inject(ActivatedRoute);

@ViewChild(IgxHierarchicalGridComponent, { static: true })
public grid: IgxHierarchicalGridComponent;

constructor() {
this.data = this.dataService.generateHierarchicalData(this.activatedRoute.snapshot.data.rows)
this.columns = [
{ field: "Id", dataType: GridColumnDataType.Number, sortable: true, width: 'auto', groupable: true },
{ field: "Name", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true },
{ field: "AthleteNumber", dataType: GridColumnDataType.Number, sortable: true, width: 'auto', groupable: true },
{ field: "Registered", dataType: GridColumnDataType.DateTime, sortable: true, width: 'auto', groupable: true },
{ field: "CountryName", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true },
{ field: "FirstAppearance", dataType: GridColumnDataType.Time, sortable: true, width: 'auto', groupable: true },
{ field: "CareerStart", dataType: GridColumnDataType.Date, sortable: true, width: 'auto', groupable: true },
{ field: "Active", dataType: GridColumnDataType.Boolean, sortable: true, width: 'auto', groupable: true },
{ field: "NetWorth", dataType: GridColumnDataType.Currency, sortable: true, width: 'auto', groupable: true },
{ field: "CountryFlag", dataType: GridColumnDataType.Image, sortable: true, width: 'auto', groupable: true },
{ field: "SuccessRate", dataType: GridColumnDataType.Percent, sortable: true, width: 'auto', groupable: true },
{ field: "Position", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true },
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ export class DataService {
return data;
}

public generateHierarchicalData(rows: number): any[] {
const rnd = new Mulberry32(1234);
const data = this.generateAthletesData(rnd, rows, true);
return data;
}

public generateTreeData(rows: number): any[] {
const rnd = new Mulberry32(1234);
const data = this.generateEmployeesData(rnd, rows);
Expand Down Expand Up @@ -114,7 +120,7 @@ export class DataService {
return currData;
}

private generateAthletesData(rnd: Mulberry32, rows: number): any[] {
private generateAthletesData(rnd: Mulberry32, rows: number, children = false): any[] {
const currData = [];
for (let i = 0; i < rows; i++) {
const rand = Math.floor(rnd.random() * Math.floor(athletesData.length));
Expand All @@ -125,6 +131,10 @@ export class DataService {
dataObj["Active"] = this.randomizeBoolean(rnd);
dataObj["SuccessRate"] = this.randomizePercentage(rnd);
dataObj["AthleteNumber"] = this.randomizeAthleteNumber(dataObj["AthleteNumber"], rnd);
if (children) {
const rnd = new Mulberry32(i);
dataObj["childData"] = this.generateAthletesData(rnd, 5);
}
currData.push(dataObj);
}
return currData;
Expand Down
Loading
Loading