@igniteui/angular-templates 21.1.14100-alpha.2 → 21.1.14100-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/SKILL.md +68 -0
  2. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/charts.md +457 -0
  3. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/data-display.md +360 -0
  4. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/directives.md +272 -0
  5. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/feedback.md +149 -0
  6. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/form-controls.md +313 -0
  7. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/layout-manager.md +420 -0
  8. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/layout.md +225 -0
  9. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-components/references/setup.md +166 -0
  10. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/SKILL.md +110 -0
  11. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/data-operations.md +445 -0
  12. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/editing.md +491 -0
  13. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/features.md +234 -0
  14. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/paging-remote.md +397 -0
  15. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/state.md +314 -0
  16. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/structure.md +299 -0
  17. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-grids/references/types.md +507 -0
  18. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/SKILL.md +439 -0
  19. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/common-patterns.md +45 -0
  20. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/contributing.md +471 -0
  21. package/igx-ts/projects/_base/files/__dot__claude/skills/igniteui-angular-theming/references/mcp-setup.md +77 -0
  22. package/igx-ts/projects/_base/files/__dot__vscode/mcp.json +2 -2
  23. package/package.json +2 -2
@@ -0,0 +1,507 @@
1
+ # Grid Types — Tree Grid, Hierarchical Grid, Grid Lite & Pivot Grid
2
+
3
+ > **Part of the [`igniteui-angular-grids`](../SKILL.md) skill hub.**
4
+ > For the grid type selection guide and feature availability — see the hub.
5
+ > For shared column config, sorting, filtering, selection — see [`structure.md`](./structure.md).
6
+ > For editing, grouping, toolbar, export — see [`features.md`](./features.md).
7
+
8
+ ## Contents
9
+
10
+ - [Tree Grid](#tree-grid)
11
+ - [Hierarchical Grid](#hierarchical-grid)
12
+ - [Grid Lite](#grid-lite)
13
+ - [Pivot Grid](#pivot-grid)
14
+ - [Key Rules](#key-rules)
15
+
16
+ ## Tree Grid
17
+
18
+ > **Docs:** [Tree Grid](https://www.infragistics.com/products/ignite-ui-angular/angular/components/treegrid/tree-grid)
19
+
20
+ For data with parent-child relationships **within a single schema** (e.g., org charts, file systems, categories).
21
+
22
+ ### Two Data Binding Modes
23
+
24
+ **Mode 1: Flat data with foreign key** — rows reference their parent via a foreign key:
25
+
26
+ ```typescript
27
+ import { Component, ChangeDetectionStrategy, signal, viewChild } from '@angular/core';
28
+ import { IgxTreeGridComponent, IGX_TREE_GRID_DIRECTIVES } from 'igniteui-angular/grids/tree-grid';
29
+
30
+ @Component({
31
+ selector: 'app-org-tree',
32
+ imports: [IGX_TREE_GRID_DIRECTIVES],
33
+ templateUrl: './org-tree.component.html',
34
+ changeDetection: ChangeDetectionStrategy.OnPush
35
+ })
36
+ export class OrgTreeComponent {
37
+ treeGridRef = viewChild.required<IgxTreeGridComponent>('treeGrid');
38
+ employees = signal<Employee[]>([
39
+ { id: 1, name: 'CEO', managerId: -1, title: 'CEO' },
40
+ { id: 2, name: 'VP Engineering', managerId: 1, title: 'VP' },
41
+ { id: 3, name: 'Developer', managerId: 2, title: 'Dev' },
42
+ ]);
43
+ }
44
+ ```
45
+
46
+ ```html
47
+ <igx-tree-grid #treeGrid
48
+ [data]="employees()"
49
+ [primaryKey]="'id'"
50
+ [foreignKey]="'managerId'"
51
+ [autoGenerate]="false"
52
+ [rowSelection]="'multipleCascade'"
53
+ height="600px">
54
+ <igx-column field="name" header="Name" [sortable]="true"></igx-column>
55
+ <igx-column field="title" header="Title"></igx-column>
56
+ </igx-tree-grid>
57
+ ```
58
+
59
+ **Mode 2: Nested object data** — each row contains its children in an array property:
60
+
61
+ ```html
62
+ <igx-tree-grid #treeGrid
63
+ [data]="departments()"
64
+ [primaryKey]="'id'"
65
+ [childDataKey]="'children'"
66
+ [autoGenerate]="false"
67
+ height="600px">
68
+ <igx-column field="name" header="Name"></igx-column>
69
+ <igx-column field="headCount" header="Employees" dataType="number"></igx-column>
70
+ </igx-tree-grid>
71
+ ```
72
+
73
+ ### Tree Grid Unique Features
74
+
75
+ - **Cascade selection**: `[rowSelection]="'multipleCascade'"` — selecting a parent selects all children; indeterminate state propagates up
76
+ - **Cascade delete**: `[cascadeOnDelete]="true"` (default) — deleting a parent removes all descendants
77
+ - **Load on demand**: `[loadChildrenOnDemand]="loadChildren"` — lazy-load children when a row is expanded
78
+ - **Expansion depth**: `[expansionDepth]="2"` — control initial expansion level (`Infinity` by default)
79
+ - **Add child row**: `treeGridRef().addRow(data, parentRowID)` — add a row as a child of a specific parent
80
+
81
+ ### Tree Grid Data Operation Behavior
82
+
83
+ - **Filtering is recursive**: when a child matches, its parent is always shown (even if the parent doesn't match). Matched parents are auto-expanded.
84
+ - **Sorting is per-level**: children are sorted within their parent, not globally flattened
85
+ - **Batch editing** uses `HierarchicalTransactionService` — transactions carry a `path` array tracing the parent hierarchy for proper undo/redo
86
+ - **Summaries** are computed per tree level
87
+
88
+ ---
89
+
90
+ ## Hierarchical Grid
91
+
92
+ > **Docs:** [Hierarchical Grid](https://www.infragistics.com/products/ignite-ui-angular/angular/components/hierarchicalgrid/hierarchical-grid)
93
+
94
+ For master-detail data where **each level has a different schema** (e.g., Companies → Departments → Employees). Each level is defined by a **Row Island** blueprint.
95
+
96
+ ```typescript
97
+ import { Component, ChangeDetectionStrategy, signal, viewChild } from '@angular/core';
98
+ import { IgxHierarchicalGridComponent, IGX_HIERARCHICAL_GRID_DIRECTIVES } from 'igniteui-angular/grids/hierarchical-grid';
99
+
100
+ @Component({
101
+ selector: 'app-company-grid',
102
+ imports: [IGX_HIERARCHICAL_GRID_DIRECTIVES],
103
+ templateUrl: './company-grid.component.html',
104
+ changeDetection: ChangeDetectionStrategy.OnPush
105
+ })
106
+ export class CompanyGridComponent {
107
+ hGridRef = viewChild.required<IgxHierarchicalGridComponent>('hGrid');
108
+ companies = signal<Company[]>([]);
109
+ }
110
+ ```
111
+
112
+ ```html
113
+ <igx-hierarchical-grid #hGrid
114
+ [data]="companies()"
115
+ [primaryKey]="'id'"
116
+ [autoGenerate]="false"
117
+ height="600px">
118
+
119
+ <igx-column field="name" header="Company"></igx-column>
120
+ <igx-column field="industry" header="Industry"></igx-column>
121
+
122
+ <igx-row-island [key]="'departments'" [autoGenerate]="false" [primaryKey]="'deptId'">
123
+ <igx-column field="name" header="Department"></igx-column>
124
+ <igx-column field="headCount" header="Employees" dataType="number"></igx-column>
125
+
126
+ <igx-row-island [key]="'employees'" [autoGenerate]="false" [primaryKey]="'empId'">
127
+ <igx-column field="name" header="Name"></igx-column>
128
+ <igx-column field="role" header="Role"></igx-column>
129
+ </igx-row-island>
130
+ </igx-row-island>
131
+
132
+ </igx-hierarchical-grid>
133
+ ```
134
+
135
+ ### How Row Islands Work
136
+
137
+ - A `<igx-row-island>` defines the **blueprint** (columns, features, templates) for all child grids at that level
138
+ - The `[key]` property specifies which property of the parent row's data holds the child array
139
+ - Row islands can be **nested** — an `igx-row-island` can contain another for deeper levels
140
+ - Each expanded row creates a **full grid instance** — be aware of memory usage with very deep/wide hierarchies
141
+
142
+ ### Accessing Child Grid Instances
143
+
144
+ Use the `(gridCreated)` event on the row island:
145
+
146
+ ```html
147
+ <igx-row-island [key]="'orders'" (gridCreated)="onChildGridCreated($event)">
148
+ <igx-column field="orderId" header="Order"></igx-column>
149
+ </igx-row-island>
150
+ ```
151
+
152
+ ```typescript
153
+ onChildGridCreated(event: IGridCreatedEventArgs) {
154
+ const childGrid = event.grid;
155
+ // Configure the child grid instance, load data, etc.
156
+ }
157
+ ```
158
+
159
+ ### Hierarchical Grid Data Operation Behavior
160
+
161
+ - **Sorting and filtering do NOT cascade** — each grid level is independent with its own state
162
+ - **Configure features on the row island** and all child grids at that level inherit them
163
+ - **Batch editing propagates**: setting `[batchEditing]="true"` on the root automatically enables it on all child grids
164
+ - **State persistence** recursively saves/restores state for each child grid instance, keyed by row island ID + parent row ID
165
+
166
+ ---
167
+
168
+ ## Grid Lite
169
+
170
+ The **lightest grid option** — an open-source (MIT licensed) Web Component with an Angular wrapper. Use it for **read-only data display** with sorting, filtering, column hiding/resizing, and row virtualization. It has **no editing, no selection, no paging, no grouping, no summaries, no export**.
171
+
172
+ > **When to recommend Grid Lite vs. Flat Grid**: If the user only needs to display data with basic sorting/filtering and doesn't need editing, batch operations, paging, grouping, summaries, or export, Grid Lite is the lighter, faster choice. If any of those enterprise features are needed, **upgrade strictly to `igx-grid` (`IgxGridComponent`)** from `igniteui-angular/grids/grid` — do NOT recommend other non-grid components as a substitute.
173
+
174
+ > **AGENT INSTRUCTION — Grid Lite → Grid Upgrade**: When a user is working with `igx-grid-lite` and you identify that their requirements exceed Grid Lite's capabilities (e.g., they need editing, selection, paging, grouping, summaries, export, row operations, or any feature not available in Grid Lite), you MUST recommend upgrading to `igx-grid` (`IgxGridComponent`). Never suggest a different component type — the upgrade path from Grid Lite is always to `igx-grid`. Replace `IgxGridLiteComponent` with `IgxGridComponent`, update imports from `igniteui-angular/grids/lite` to `igniteui-angular/grids/grid`, use `IGX_GRID_DIRECTIVES` instead of individual Grid Lite imports, and remove `CUSTOM_ELEMENTS_SCHEMA`.
175
+
176
+ ### Installation
177
+
178
+ Grid Lite requires a **separate npm package**:
179
+
180
+ ```bash
181
+ npm install igniteui-grid-lite
182
+ ```
183
+
184
+ ### Setup
185
+
186
+ ```typescript
187
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, viewChild } from '@angular/core';
188
+ import {
189
+ IgxGridLiteComponent,
190
+ IgxGridLiteColumnComponent,
191
+ IgxGridLiteCellTemplateDirective,
192
+ IgxGridLiteHeaderTemplateDirective
193
+ } from 'igniteui-angular/grids/lite';
194
+
195
+ @Component({
196
+ selector: 'app-users-lite',
197
+ imports: [
198
+ IgxGridLiteComponent,
199
+ IgxGridLiteColumnComponent,
200
+ IgxGridLiteCellTemplateDirective,
201
+ IgxGridLiteHeaderTemplateDirective
202
+ ],
203
+ schemas: [CUSTOM_ELEMENTS_SCHEMA], // Required — Grid Lite is a Web Component
204
+ templateUrl: './users-lite.component.html',
205
+ changeDetection: ChangeDetectionStrategy.OnPush
206
+ })
207
+ export class UsersLiteComponent {
208
+ gridRef = viewChild<IgxGridLiteComponent<User>>('grid');
209
+ data: User[] = [];
210
+ }
211
+ ```
212
+
213
+ ### Template
214
+
215
+ ```html
216
+ <igx-grid-lite #grid
217
+ [data]="data"
218
+ [autoGenerate]="false"
219
+ [sortingOptions]="{ mode: 'multiple' }">
220
+
221
+ <igx-grid-lite-column
222
+ field="name"
223
+ dataType="string"
224
+ header="Name"
225
+ sortable
226
+ filterable
227
+ resizable>
228
+ </igx-grid-lite-column>
229
+
230
+ <igx-grid-lite-column
231
+ field="age"
232
+ dataType="number"
233
+ header="Age"
234
+ sortable
235
+ filterable>
236
+ </igx-grid-lite-column>
237
+
238
+ <igx-grid-lite-column field="active" dataType="boolean" header="Active">
239
+ <ng-template igxGridLiteCell let-value>
240
+ <span>{{ value ? 'Yes' : 'No' }}</span>
241
+ </ng-template>
242
+ </igx-grid-lite-column>
243
+ </igx-grid-lite>
244
+ ```
245
+
246
+ ### Column Configuration
247
+
248
+ Columns use `<igx-grid-lite-column>` with these inputs:
249
+
250
+ | Input | Type | Description |
251
+ |---|---|---|
252
+ | `field` | `string` | Data property key (required) |
253
+ | `dataType` | `'string' \| 'number' \| 'boolean' \| 'date'` | Column data type |
254
+ | `header` | `string` | Header text |
255
+ | `width` | `string` | CSS width (e.g., `'250px'`) |
256
+ | `hidden` | `boolean` | Hide the column |
257
+ | `resizable` | `boolean` | Allow column resizing |
258
+ | `sortable` | `boolean` | Enable sorting |
259
+ | `filterable` | `boolean` | Enable filtering |
260
+ | `sortingCaseSensitive` | `boolean` | Case-sensitive sorting |
261
+ | `filteringCaseSensitive` | `boolean` | Case-sensitive filtering |
262
+
263
+ ### Templates
264
+
265
+ Cell and header templates use dedicated directives:
266
+
267
+ ```html
268
+ <igx-grid-lite-column field="status" header="Status">
269
+ <!-- Custom cell template -->
270
+ <ng-template igxGridLiteCell let-value let-row="row" let-column="column">
271
+ <span [class]="value">{{ value }}</span>
272
+ </ng-template>
273
+
274
+ <!-- Custom header template -->
275
+ <ng-template igxGridLiteHeader let-column>
276
+ <strong>{{ column.header }}</strong>
277
+ </ng-template>
278
+ </igx-grid-lite-column>
279
+ ```
280
+
281
+ ### Sorting & Filtering API
282
+
283
+ ```typescript
284
+ // Sort programmatically
285
+ this.gridRef().sort({ key: 'name', direction: 'ascending' });
286
+ this.gridRef().sort([
287
+ { key: 'name', direction: 'ascending' },
288
+ { key: 'age', direction: 'descending' }
289
+ ]);
290
+ this.gridRef().clearSort('name');
291
+ this.gridRef().clearSort(); // clear all
292
+
293
+ // Filter programmatically
294
+ this.gridRef().filter({ key: 'age', condition: 'greaterThan', searchTerm: 21 });
295
+ this.gridRef().clearFilter('age');
296
+ this.gridRef().clearFilter(); // clear all
297
+ ```
298
+
299
+ ### Two-Way Binding for Sort/Filter State
300
+
301
+ ```html
302
+ <igx-grid-lite #grid
303
+ [data]="data"
304
+ [(sortingExpressions)]="sortExprs"
305
+ [(filteringExpressions)]="filterExprs"
306
+ (sorting)="onSorting($event)"
307
+ (sorted)="onSorted($event)"
308
+ (filtering)="onFiltering($event)"
309
+ (filtered)="onFiltered($event)">
310
+ </igx-grid-lite>
311
+ ```
312
+
313
+ Events: `(sorting)` (cancelable), `(sorted)`, `(filtering)` (cancelable), `(filtered)`.
314
+
315
+ ### Remote Data Operations
316
+
317
+ Use `dataPipelineConfiguration` to intercept sort/filter and delegate to the server:
318
+
319
+ ```typescript
320
+ import { IgxGridLiteDataPipelineConfiguration } from 'igniteui-angular/grids/lite';
321
+
322
+ dataPipeline: IgxGridLiteDataPipelineConfiguration<Product> = {
323
+ sort: async (params) => {
324
+ // params.grid — the grid instance
325
+ // params.data — current data
326
+ // params.type — 'sort'
327
+ const sorted = await this.dataService.sortRemote(params.grid.sortingExpressions);
328
+ return sorted;
329
+ },
330
+ filter: async (params) => {
331
+ const filtered = await this.dataService.filterRemote(params.grid.filteringExpressions);
332
+ return filtered;
333
+ }
334
+ };
335
+ ```
336
+
337
+ ```html
338
+ <igx-grid-lite #grid
339
+ [data]="data"
340
+ [dataPipelineConfiguration]="dataPipeline">
341
+ </igx-grid-lite>
342
+ ```
343
+
344
+ ### Grid Lite Events
345
+
346
+ | Event | Cancelable | Payload |
347
+ |---|---|---|
348
+ | `(sorting)` | Yes (`event.detail.cancel = true`) | Sorting expression about to be applied |
349
+ | `(sorted)` | No | Sorting completed |
350
+ | `(filtering)` | Yes (`event.detail.cancel = true`) | Filter expression about to be applied |
351
+ | `(filtered)` | No | Filtering completed |
352
+
353
+ ### Grid Lite Limitations
354
+
355
+ These features are **NOT available** in Grid Lite:
356
+ - Editing (cell, row, batch) — no `[editable]`, no `beginEdit()`, no transactions
357
+ - Grouping — no `groupBy()`, no `IgxGroupByRow`
358
+ - Paging — no `IgxPaginatorComponent`
359
+ - Summaries — no `IgxSummaryOperand`
360
+ - Selection — no `rowSelection`, `cellSelection`, or `columnSelection`
361
+ - State persistence — no `IgxGridStateDirective`
362
+ - Export — no `IgxExcelExporterService` or `IgxCsvExporterService`
363
+ - Advanced filtering — no `advancedFilteringExpressionsTree`
364
+
365
+ ### Grid Lite Key Differences from Flat Grid
366
+
367
+ - **Separate package**: `npm install igniteui-grid-lite`
368
+ - **Requires `CUSTOM_ELEMENTS_SCHEMA`** in the component's `schemas`
369
+ - **No directives bundle** — import `IgxGridLiteComponent`, `IgxGridLiteColumnComponent`, and template directives individually
370
+ - **No `[primaryKey]`** — not needed (no editing, selection, or row operations)
371
+ - **No editing** of any kind (cell, row, batch)
372
+ - **No selection** (row, cell, column)
373
+ - **No paging, grouping, summaries, pinning, moving, export**
374
+ - **Column config differs**: uses `field` (not `field` on `<igx-column>`), `sortable`/`filterable` are boolean attributes
375
+ - **Remote data**: uses `dataPipelineConfiguration` (async callback) instead of noop strategies + events
376
+
377
+ ---
378
+
379
+ ## Pivot Grid
380
+
381
+ > **Docs:** [Pivot Grid](https://www.infragistics.com/products/ignite-ui-angular/angular/components/pivotGrid/pivot-grid)
382
+
383
+ For **pivot table analytics** where users reshape data by dragging dimensions between rows, columns, filters, and values.
384
+
385
+ > **IMPORTANT**: The Pivot Grid is fundamentally different from the other three grids. Standard grid features like cell editing, row editing, batch editing, paging, column pinning, column moving, row dragging, and standard filtering/sorting are **disabled**. All data operations are driven by the `pivotConfiguration`.
386
+
387
+ ```typescript
388
+ import { Component } from "@angular/core";
389
+ import { DATA } from '../../data/pivot-data';
390
+
391
+ import { IPivotConfiguration, IgxPivotNumericAggregate } from 'igniteui-angular/grids/core';
392
+ import { IgxPivotGridComponent } from 'igniteui-angular/grids/pivot-grid';
393
+
394
+ @Component({
395
+ selector: 'app-pivot-grid-basic-sample',
396
+ styleUrls: ['./pivot-grid-basic-sample.component.scss'],
397
+ templateUrl: './pivot-grid-basic-sample.component.html',
398
+ imports: [IgxPivotGridComponent]
399
+ })
400
+ export class PivotGridBasicSampleComponent {
401
+ public data = DATA;
402
+ public pivotConfigHierarchy: IPivotConfiguration = {
403
+ columns: [
404
+ {
405
+
406
+ memberName: 'Product',
407
+ memberFunction: (data) => data.Product.Name,
408
+ enabled: true
409
+ }
410
+
411
+ ],
412
+ rows: [
413
+ {
414
+ memberName: 'Seller',
415
+ memberFunction: (data) => data.Seller.Name,
416
+ enabled: true
417
+ }
418
+ ],
419
+ values: [
420
+ {
421
+ member: 'NumberOfUnits',
422
+ aggregate: {
423
+ aggregator: IgxPivotNumericAggregate.sum,
424
+ key: 'sum',
425
+ label: 'Sum'
426
+ },
427
+ enabled: true
428
+
429
+ }
430
+ ],
431
+ filters: null
432
+ };
433
+ }
434
+ ```
435
+
436
+ ```html
437
+ <igx-pivot-grid #grid1 [data]="data" [pivotConfiguration]="pivotConfigHierarchy" height="500px">
438
+ </igx-pivot-grid>
439
+ ```
440
+
441
+ ```json
442
+ export const DATA = [
443
+ {
444
+ Product: {
445
+ Name: 'Clothing',
446
+ UnitPrice: '12.814860936633712'
447
+ },
448
+ Seller: {
449
+ Name: 'Stanley Brooker',
450
+ City: 'Seattle'
451
+ },
452
+ Date: '2007-01-01T00:00:00',
453
+ Value: '94.2652032683907',
454
+ NumberOfUnits: '282'
455
+ },
456
+ {
457
+ Product: {
458
+ Name: 'Clothing',
459
+ UnitPrice: '49.579375120615296'
460
+ },
461
+ Seller: {
462
+ Name: 'Elisa Longbottom',
463
+ City: 'Sofia'
464
+ },
465
+ Date: '2007-01-05T00:00:00',
466
+ Value: '70.798922689072285',
467
+ NumberOfUnits: '296'
468
+ }
469
+ ...
470
+ ];
471
+ ```
472
+
473
+ ### Pivot Data Selector
474
+
475
+ Provide a drag-and-drop UI for users to reshape the pivot interactively:
476
+
477
+ ```html
478
+ <igx-pivot-data-selector [grid]="pivotGridRef()"></igx-pivot-data-selector>
479
+ <igx-pivot-grid #pivotGrid [data]="salesData()" [pivotConfiguration]="pivotConfig"></igx-pivot-grid>
480
+ ```
481
+
482
+ ### Pivot Grid Data Operations
483
+
484
+ - **Filtering**: Per-dimension only — set the `filter` property on an `IPivotDimension`, NOT `[allowFiltering]`
485
+ - **Sorting**: Per-dimension only — set `sortable: true` and `sortDirection` on an `IPivotDimension`
486
+ - **Aggregation**: Configured via `IPivotValue.aggregate` (e.g., `IgxPivotNumericAggregate.sum`, `.average`, `.min`, `.max`, `.count`)
487
+ - **Columns are auto-generated** from the pivot configuration — do not define `<igx-column>` manually
488
+ - **State persistence**: Serializes the entire `pivotConfiguration` (dimensions, values, filters)
489
+
490
+ ---
491
+
492
+ ## Key Rules
493
+
494
+ 1. **Tree Grid**: use `[primaryKey]` + `[foreignKey]` for flat data or `[childDataKey]` for nested objects; filtering is recursive (parents of matching children are always shown)
495
+ 2. **Hierarchical Grid**: sorting/filtering/paging are independent per level; configure features on the `<igx-row-island>` blueprint
496
+ 3. **Pivot Grid is read-only** — editing, paging, pinning, column moving, row dragging are all disabled; use `pivotConfiguration` for all data operations
497
+ 4. **Grid Lite requires `CUSTOM_ELEMENTS_SCHEMA`** and `igniteui-grid-lite` npm package — it has no editing, selection, paging, or export
498
+
499
+ ## See Also
500
+
501
+ - [`structure.md`](./structure.md) — Grid setup, column config, sorting UI, filtering UI, selection
502
+ - [`features.md`](./features.md) — Grouping, summaries, toolbar, export, row drag, action strip
503
+ - [`data-operations.md`](./data-operations.md) — Programmatic sorting, filtering, grouping, canonical import patterns
504
+ - [`paging-remote.md`](./paging-remote.md) — Paging, remote data operations, virtualization
505
+ - [`editing.md`](./editing.md) — Cell editing, row editing, batch editing, validation, summaries
506
+ - [`state.md`](./state.md) — State persistence, Tree Grid / Hierarchical Grid / Pivot Grid / Grid Lite data operations
507
+ - [`../../igniteui-angular-theming/SKILL.md`](../../igniteui-angular-theming/SKILL.md) — Grid styling and theming