Skip to content

Commit 525fbcb

Browse files
feat(angular-table): Support Tanstack v9 alpha and Angular 19, fix examples (#5817)
* angular v19 table adapter * angular v19 table adapter * fix types
1 parent bd735ba commit 525fbcb

File tree

31 files changed

+616
-195
lines changed

31 files changed

+616
-195
lines changed

examples/angular/basic/src/app/app.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<tbody>
2525
@for (row of table.getRowModel().rows; track row.id) {
2626
<tr>
27-
@for (cell of row.getVisibleCells(); track cell.id) {
27+
@for (cell of row.getAllCells(); track cell.id) {
2828
<td>
2929
<ng-container
3030
*flexRender="

examples/angular/basic/src/app/app.component.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { ChangeDetectionStrategy, Component, signal } from '@angular/core'
2-
import { RouterOutlet } from '@angular/router'
32
import {
43
FlexRenderDirective,
5-
createCoreRowModel,
64
injectTable,
5+
tableFeatures,
76
} from '@tanstack/angular-table'
87
import type { ColumnDef } from '@tanstack/angular-table'
98

@@ -81,18 +80,22 @@ const defaultColumns: Array<ColumnDef<any, Person>> = [
8180
@Component({
8281
selector: 'app-root',
8382
standalone: true,
84-
imports: [RouterOutlet, FlexRenderDirective],
83+
imports: [FlexRenderDirective],
8584
templateUrl: './app.component.html',
8685
changeDetection: ChangeDetectionStrategy.OnPush,
8786
})
8887
export class AppComponent {
89-
data = signal<Array<Person>>(defaultData)
88+
readonly data = signal<Array<Person>>(defaultData)
89+
90+
readonly tableFeatures = tableFeatures({})
9091

9192
table = injectTable(() => ({
93+
_features: this.tableFeatures, // new required option in V9. Tell the table which features you are importing and using (better tree-shaking)
94+
_rowModels: {}, // `Core` row model is now included by default, but you can still override it here
9295
data: this.data(),
9396
columns: defaultColumns,
94-
getCoreRowModel: createCoreRowModel(),
9597
debugTable: true,
98+
// other options here
9699
}))
97100

98101
rerender() {

examples/angular/column-ordering/src/app/app.component.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import {
66
} from '@angular/core'
77
import {
88
FlexRenderDirective,
9+
columnOrderingFeature,
10+
columnVisibilityFeature,
911
createCoreRowModel,
1012
injectTable,
1113
} from '@tanstack/angular-table'
@@ -84,12 +86,15 @@ export class AppComponent {
8486

8587
readonly table = injectTable(() => ({
8688
data: this.data(),
89+
_features: {
90+
columnVisibilityFeature,
91+
columnOrderingFeature,
92+
},
8793
columns: defaultColumns,
8894
state: {
8995
columnOrder: this.columnOrder(),
9096
columnVisibility: this.columnVisibility(),
9197
},
92-
getCoreRowModel: createCoreRowModel(),
9398
onColumnVisibilityChange: (updaterOrValue) => {
9499
typeof updaterOrValue === 'function'
95100
? this.columnVisibility.update(updaterOrValue)

examples/angular/column-pinning-sticky/src/app/app.component.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { Component, computed, signal } from '@angular/core'
22
import {
33
FlexRenderDirective,
4+
columnOrderingFeature,
5+
columnPinningFeature,
6+
columnResizingFeature,
7+
columnSizingFeature,
8+
columnVisibilityFeature,
49
createCoreRowModel,
510
injectTable,
611
} from '@tanstack/angular-table'
@@ -74,25 +79,34 @@ const defaultColumns: Array<ColumnDef<any, Person>> = [
7479
@Component({
7580
selector: 'app-root',
7681
standalone: true,
77-
imports: [FlexRenderDirective, SlicePipe, NgTemplateOutlet, NgStyle],
82+
imports: [FlexRenderDirective, NgStyle],
7883
templateUrl: './app.component.html',
7984
})
8085
export class AppComponent {
8186
readonly columns = signal([...defaultColumns])
8287
readonly data = signal<Array<Person>>(makeData(30))
8388
readonly columnVisibility = signal<ColumnVisibilityState>({})
8489
readonly columnOrder = signal<ColumnOrderState>([])
85-
readonly columnPinning = signal<ColumnPinningState>({})
90+
readonly columnPinning = signal<ColumnPinningState>({
91+
left: [],
92+
right: [],
93+
})
8694
readonly split = signal(false)
8795

8896
table = injectTable(() => ({
8997
data: this.data(),
98+
_features: {
99+
columnPinningFeature,
100+
columnVisibilityFeature,
101+
columnSizingFeature,
102+
columnOrderingFeature,
103+
columnResizingFeature,
104+
},
90105
columns: this.columns(),
91-
getCoreRowModel: createCoreRowModel(),
92106
debugTable: true,
93107
debugHeaders: true,
94108
debugColumns: true,
95-
columnResizeMode: 'onChange',
109+
columnResizeMode: 'onChange' as const,
96110
}))
97111

98112
stringifiedColumnPinning = computed(() => {

examples/angular/column-pinning/src/app/app.component.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import {
66
} from '@angular/core'
77
import {
88
FlexRenderDirective,
9+
columnOrderingFeature,
10+
columnPinningFeature,
11+
columnVisibilityFeature,
912
createCoreRowModel,
1013
injectTable,
14+
rowPinningFeature,
1115
} from '@tanstack/angular-table'
1216
import { faker } from '@faker-js/faker'
1317
import { NgTemplateOutlet, SlicePipe } from '@angular/common'
@@ -91,11 +95,19 @@ export class AppComponent {
9195
readonly data = signal<Array<Person>>(makeData(5000))
9296
readonly columnVisibility = signal<ColumnVisibilityState>({})
9397
readonly columnOrder = signal<ColumnOrderState>([])
94-
readonly columnPinning = signal<ColumnPinningState>({})
98+
readonly columnPinning = signal<ColumnPinningState>({
99+
left: [],
100+
right: [],
101+
})
95102
readonly split = signal(false)
96103

97104
table = injectTable(() => ({
98105
data: this.data(),
106+
_features: {
107+
columnPinningFeature,
108+
columnOrderingFeature,
109+
columnVisibilityFeature,
110+
},
99111
columns: defaultColumns,
100112
state: {
101113
columnVisibility: this.columnVisibility(),
@@ -117,7 +129,6 @@ export class AppComponent {
117129
? this.columnPinning.update(updaterOrValue)
118130
: this.columnPinning.set(updaterOrValue)
119131
},
120-
getCoreRowModel: createCoreRowModel(),
121132
debugTable: true,
122133
debugHeaders: true,
123134
debugColumns: true,

examples/angular/grouping/src/app/app.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<tbody>
4343
@for (row of table.getRowModel().rows; track row.id) {
4444
<tr>
45-
@for (cell of row.getVisibleCells(); track cell.id) {
45+
@for (cell of row.getAllCells(); track cell.id) {
4646
<td
4747
[style.background]="
4848
cell.getIsGrouped()

examples/angular/grouping/src/app/app.component.ts

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@ import {
77
} from '@angular/core'
88
import {
99
FlexRenderDirective,
10+
columnFilteringFeature,
11+
columnGroupingFeature,
1012
createCoreRowModel,
1113
createExpandedRowModel,
1214
createFilteredRowModel,
1315
createGroupedRowModel,
1416
createPaginatedRowModel,
1517
injectTable,
18+
rowExpandingFeature,
19+
rowPaginationFeature,
1620
tableOptions,
1721
} from '@tanstack/angular-table'
1822
import { columns } from './columns'
@@ -28,35 +32,42 @@ import type { GroupingState, Updater } from '@tanstack/angular-table'
2832
})
2933
export class AppComponent {
3034
title = 'grouping'
31-
data = signal(makeData(10000))
32-
grouping = signal<GroupingState>([])
35+
readonly data = signal(makeData(10000))
36+
readonly grouping = signal<GroupingState>([])
3337

34-
stringifiedGrouping = computed(() => JSON.stringify(this.grouping(), null, 2))
35-
36-
tableOptions = computed(() =>
37-
tableOptions({
38-
data: this.data(),
39-
columns: columns,
40-
state: {
41-
grouping: this.grouping(),
42-
},
43-
onGroupingChange: (updaterOrValue: Updater<GroupingState>) => {
44-
const groupingState =
45-
typeof updaterOrValue === 'function'
46-
? updaterOrValue([...this.grouping()])
47-
: updaterOrValue
48-
this.grouping.set(groupingState)
49-
},
50-
getExpandedRowModel: createExpandedRowModel(),
51-
getGroupedRowModel: createGroupedRowModel(),
52-
getCoreRowModel: createCoreRowModel(),
53-
getPaginatedRowModel: createPaginatedRowModel(),
54-
getFilteredRowModel: createFilteredRowModel(),
55-
debugTable: true,
56-
}),
38+
readonly stringifiedGrouping = computed(() =>
39+
JSON.stringify(this.grouping(), null, 2),
5740
)
5841

59-
table = injectTable(this.tableOptions)
42+
readonly table = injectTable(() => ({
43+
data: this.data(),
44+
columns: columns,
45+
initialState: {
46+
pagination: { pageSize: 20, pageIndex: 0 },
47+
},
48+
state: {
49+
grouping: this.grouping(),
50+
},
51+
_features: {
52+
columnGroupingFeature,
53+
rowPaginationFeature,
54+
columnFilteringFeature,
55+
rowExpandingFeature,
56+
},
57+
_rowModels: {
58+
groupedRowModel: createGroupedRowModel(),
59+
expandedRowModel: createExpandedRowModel(),
60+
paginatedRowModel: createPaginatedRowModel(),
61+
filteredRowModel: createFilteredRowModel(),
62+
},
63+
onGroupingChange: (updaterOrValue: Updater<GroupingState>) => {
64+
const groupingState =
65+
typeof updaterOrValue === 'function'
66+
? updaterOrValue([...this.grouping()])
67+
: updaterOrValue
68+
this.grouping.set(groupingState)
69+
},
70+
}))
6071

6172
onPageInputChange(event: any): void {
6273
const page = event.target.value ? Number(event.target.value) - 1 : 0

examples/angular/row-selection-signal/src/app/app.component.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020

2121
@if (header.column.getCanFilter()) {
2222
<div>
23+
<!-- TODO fix type -->
2324
<app-table-filter
24-
[column]="header.column"
25+
[column]="$any(header.column)"
2526
[table]="table"
2627
/>
2728
</div>

examples/angular/row-selection-signal/src/app/app.component.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ import {
77
} from '@angular/core'
88
import {
99
FlexRenderDirective,
10-
createCoreRowModel,
10+
columnFilteringFeature,
11+
columnVisibilityFeature,
1112
createFilteredRowModel,
1213
createPaginatedRowModel,
1314
injectTable,
15+
rowPaginationFeature,
16+
rowSelectionFeature,
1417
} from '@tanstack/angular-table'
1518
import { FilterComponent } from './filter'
1619
import { makeData } from './makeData'
@@ -97,6 +100,16 @@ export class AppComponent {
97100

98101
table = injectTable(() => ({
99102
data: this.data(),
103+
_features: {
104+
rowSelectionFeature,
105+
rowPaginationFeature,
106+
columnFilteringFeature,
107+
columnVisibilityFeature,
108+
},
109+
_rowModels: {
110+
filteredRowModel: createFilteredRowModel(),
111+
paginatedRowModel: createPaginatedRowModel(),
112+
},
100113
columns: this.columns,
101114
state: {
102115
rowSelection: this.rowSelection(),
@@ -110,9 +123,6 @@ export class AppComponent {
110123
: updaterOrValue,
111124
)
112125
},
113-
getCoreRowModel: createCoreRowModel(),
114-
getFilteredRowModel: createFilteredRowModel(),
115-
getPaginatedRowModel: createPaginatedRowModel(),
116126
debugTable: true,
117127
}))
118128

examples/angular/row-selection-signal/src/app/filter.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { CommonModule } from '@angular/common'
22
import { Component, input } from '@angular/core'
33
import type { OnInit } from '@angular/core'
4-
import type { Column, Table } from '@tanstack/angular-table'
4+
import type { Column, RowData, Table } from '@tanstack/angular-table'
55

66
@Component({
77
selector: 'app-table-filter',
@@ -39,10 +39,10 @@ import type { Column, Table } from '@tanstack/angular-table'
3939
standalone: true,
4040
imports: [CommonModule],
4141
})
42-
export class FilterComponent<T> implements OnInit {
42+
export class FilterComponent<T extends RowData> implements OnInit {
4343
column = input.required<Column<any, any>>()
4444

45-
table = input.required<Table<T>>()
45+
table = input.required<Table<any, T>>()
4646

4747
columnType!: string
4848

0 commit comments

Comments
 (0)