Skip to content

Commit 9f65451

Browse files
MayaKirovaMKirovarkaraivanov
authored
Refactor virtualization resize observer to track individual forOf elements. (#16809)
--------- Co-authored-by: MKirova <MKirova@DEV-MKIROVA> Co-authored-by: Radoslav Karaivanov <rkaraivanov@infragistics.com>
1 parent 6d3f592 commit 9f65451

20 files changed

Lines changed: 259 additions & 86 deletions

projects/igniteui-angular-performance/src/app/app.routes.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Routes } from '@angular/router';
22
import { GridComponent } from './grid/grid.component';
33
import { TreeGridComponent } from './tree-grid/tree-grid.component';
44
import { PivotGridComponent } from './pivot-grid/pivot-grid.component';
5+
import { HierarchicalGridComponent } from './hierarchical-grid/hierarchical-grid.component';
56

67
export const routes: Routes = [
78
{
@@ -45,6 +46,12 @@ export const routes: Routes = [
4546
pathMatch: 'full',
4647
component: GridComponent,
4748
data: { rows: 1000 }
48-
}
49+
},
50+
{
51+
path: "hierarchical-grid-100k",
52+
title: "Hierarchical Grid 100k records",
53+
component: HierarchicalGridComponent,
54+
data: { rows: 100_000 }
55+
},
4956

5057
];
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<div class="grid-wrapper">
2+
<igx-hierarchical-grid
3+
[showExpandAll]="true"
4+
#grid
5+
[data]="data"
6+
[allowFiltering]="false"
7+
[height]="'100%'"
8+
[width]="'100%'"
9+
>
10+
@for (col of columns; track col) {
11+
<igx-column
12+
[field]="col.field"
13+
[header]="col.header"
14+
[sortable]="col.sortable"
15+
[dataType]="col.dataType"
16+
[width]="col.width"
17+
[groupable]="col.groupable"
18+
>
19+
</igx-column>
20+
}
21+
<igx-row-island [height]="null" [width]="null" [key]="'childData'" [autoGenerate]="false">
22+
@for (col of columns; track col) {
23+
<igx-column
24+
[field]="col.field"
25+
[header]="col.header"
26+
[sortable]="col.sortable"
27+
[dataType]="col.dataType"
28+
[width]="col.width"
29+
[groupable]="col.groupable"
30+
>
31+
</igx-column>
32+
}
33+
</igx-row-island>
34+
</igx-hierarchical-grid>
35+
</div>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
:host {
2+
display: flex;
3+
flex-direction: column;
4+
height: 100%;
5+
}
6+
7+
.grid-wrapper {
8+
height: 100%;
9+
width: 100%;
10+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Component, inject, ViewChild } from '@angular/core';
2+
import { GridColumnDataType, IgxColumnComponent, IgxHierarchicalGridComponent, IgxRowIslandComponent } from "igniteui-angular"
3+
import { DataService } from '../services/data.service';
4+
import { ActivatedRoute } from '@angular/router';
5+
6+
@Component({
7+
selector: 'app-hierarchical-grid',
8+
imports: [IgxHierarchicalGridComponent, IgxColumnComponent, IgxRowIslandComponent],
9+
templateUrl: './hierarchical-grid.component.html',
10+
styleUrl: './hierarchical-grid.component.scss'
11+
})
12+
export class HierarchicalGridComponent {
13+
protected columns: any[] = []
14+
protected data: any[] = [];
15+
protected performanceDataList: PerformanceEntryList = [];
16+
private dataService = inject(DataService);
17+
private activatedRoute = inject(ActivatedRoute);
18+
19+
@ViewChild(IgxHierarchicalGridComponent, { static: true })
20+
public grid: IgxHierarchicalGridComponent;
21+
22+
constructor() {
23+
this.data = this.dataService.generateHierarchicalData(this.activatedRoute.snapshot.data.rows)
24+
this.columns = [
25+
{ field: "Id", dataType: GridColumnDataType.Number, sortable: true, width: 'auto', groupable: true },
26+
{ field: "Name", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true },
27+
{ field: "AthleteNumber", dataType: GridColumnDataType.Number, sortable: true, width: 'auto', groupable: true },
28+
{ field: "Registered", dataType: GridColumnDataType.DateTime, sortable: true, width: 'auto', groupable: true },
29+
{ field: "CountryName", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true },
30+
{ field: "FirstAppearance", dataType: GridColumnDataType.Time, sortable: true, width: 'auto', groupable: true },
31+
{ field: "CareerStart", dataType: GridColumnDataType.Date, sortable: true, width: 'auto', groupable: true },
32+
{ field: "Active", dataType: GridColumnDataType.Boolean, sortable: true, width: 'auto', groupable: true },
33+
{ field: "NetWorth", dataType: GridColumnDataType.Currency, sortable: true, width: 'auto', groupable: true },
34+
{ field: "CountryFlag", dataType: GridColumnDataType.Image, sortable: true, width: 'auto', groupable: true },
35+
{ field: "SuccessRate", dataType: GridColumnDataType.Percent, sortable: true, width: 'auto', groupable: true },
36+
{ field: "Position", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true },
37+
];
38+
}
39+
}

projects/igniteui-angular-performance/src/app/services/data.service.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ export class DataService {
1616
return data;
1717
}
1818

19+
public generateHierarchicalData(rows: number): any[] {
20+
const rnd = new Mulberry32(1234);
21+
const data = this.generateAthletesData(rnd, rows, true);
22+
return data;
23+
}
24+
1925
public generateTreeData(rows: number): any[] {
2026
const rnd = new Mulberry32(1234);
2127
const data = this.generateEmployeesData(rnd, rows);
@@ -114,7 +120,7 @@ export class DataService {
114120
return currData;
115121
}
116122

117-
private generateAthletesData(rnd: Mulberry32, rows: number): any[] {
123+
private generateAthletesData(rnd: Mulberry32, rows: number, children = false): any[] {
118124
const currData = [];
119125
for (let i = 0; i < rows; i++) {
120126
const rand = Math.floor(rnd.random() * Math.floor(athletesData.length));
@@ -125,6 +131,10 @@ export class DataService {
125131
dataObj["Active"] = this.randomizeBoolean(rnd);
126132
dataObj["SuccessRate"] = this.randomizePercentage(rnd);
127133
dataObj["AthleteNumber"] = this.randomizeAthleteNumber(dataObj["AthleteNumber"], rnd);
134+
if (children) {
135+
const rnd = new Mulberry32(i);
136+
dataObj["childData"] = this.generateAthletesData(rnd, 5);
137+
}
128138
currData.push(dataObj);
129139
}
130140
return currData;

0 commit comments

Comments
 (0)