Skip to content

Commit 19490e7

Browse files
authored
feat: refactor table store into feature atoms (#6234)
* feat: refactor table store into feature atoms * get rid of stupid proxies because optional chaining isn't bad * fix some legacy table stuff and update migrating guide * subscribe with atoms refactor * fixed vue table types * fix more subscribe types * simplify atom and store construction more
1 parent 7254dc9 commit 19490e7

823 files changed

Lines changed: 11947 additions & 10235 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,5 @@ vite.config.ts.timestamp-*
6161
.cursor/*
6262

6363
Agents.md
64-
.agents/*
64+
.agents/*
65+
terminalOutput

docs/config.json

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@
811811
{ "to": "framework/lit/examples/basic-table-controller", "label": "Basic (TableController)" },
812812
{ "to": "framework/lit/examples/basic-app-table", "label": "Basic (useAppTable)" },
813813
{ "to": "framework/lit/examples/basic-external-state", "label": "Basic (External State)" },
814-
{ "to": "framework/lit/examples/basic-external-store", "label": "Basic (External Store)" },
814+
{ "to": "framework/lit/examples/basic-external-atoms", "label": "Basic (External Atoms)" },
815815
{ "to": "framework/lit/examples/column-groups", "label": "Header Groups" }
816816
]
817817
},
@@ -822,7 +822,7 @@
822822
{ "to": "framework/react/examples/basic-use-app-table", "label": "Basic (useAppTable)" },
823823
{ "to": "framework/react/examples/basic-use-legacy-table", "label": "Basic (useLegacyTable)" },
824824
{ "to": "framework/react/examples/basic-external-state", "label": "Basic (External State)" },
825-
{ "to": "framework/react/examples/basic-external-store", "label": "Basic (External Store)" },
825+
{ "to": "framework/react/examples/basic-external-atoms", "label": "Basic (External Atoms)" },
826826
{ "to": "framework/react/examples/basic-shadcn", "label": "Shadcn Basic" },
827827
{ "to": "framework/react/examples/column-groups", "label": "Header Groups" }
828828
]
@@ -833,7 +833,7 @@
833833
{ "to": "framework/solid/examples/basic-use-table", "label": "Basic (createTable)" },
834834
{ "to": "framework/solid/examples/basic-app-table", "label": "Basic (createAppTable)" },
835835
{ "to": "framework/solid/examples/basic-external-state", "label": "Basic (External State)" },
836-
{ "to": "framework/solid/examples/basic-external-store", "label": "Basic (External Store)" },
836+
{ "to": "framework/solid/examples/basic-external-atoms", "label": "Basic (External Atoms)" },
837837
{ "to": "framework/solid/examples/column-groups", "label": "Header Groups" }
838838
]
839839
},
@@ -844,15 +844,18 @@
844844
{ "to": "framework/svelte/examples/basic-app-table", "label": "Basic (createAppTable)" },
845845
{ "to": "framework/svelte/examples/basic-snippets", "label": "Basic (Snippets)" },
846846
{ "to": "framework/svelte/examples/basic-external-state", "label": "Basic (External State)" },
847-
{ "to": "framework/svelte/examples/basic-external-store", "label": "Basic (External Store)" },
847+
{ "to": "framework/svelte/examples/basic-external-atoms", "label": "Basic (External Atoms)" },
848848
{ "to": "framework/svelte/examples/column-groups", "label": "Header Groups" }
849849
]
850850
},
851851
{
852852
"label": "vue",
853853
"children": [
854-
{ "to": "framework/vue/examples/basic", "label": "Basic" },
855-
{ "to": "framework/vue/examples/basic-use-app-table", "label": "Basic (useAppTable)" }
854+
{ "to": "framework/vue/examples/basic-use-table", "label": "Basic (useTable)" },
855+
{ "to": "framework/vue/examples/basic-use-app-table", "label": "Basic (useAppTable)" },
856+
{ "to": "framework/vue/examples/basic-external-state", "label": "Basic (External State)" },
857+
{ "to": "framework/vue/examples/basic-external-atoms", "label": "Basic (External Atoms)" },
858+
{ "to": "framework/vue/examples/column-groups", "label": "Header Groups" }
856859
]
857860
},
858861
{
@@ -861,7 +864,7 @@
861864
{ "to": "framework/preact/examples/basic", "label": "Basic (useTable)" },
862865
{ "to": "framework/preact/examples/basic-use-app-table", "label": "Basic (useAppTable)" },
863866
{ "to": "framework/preact/examples/basic-external-state", "label": "Basic (External State)" },
864-
{ "to": "framework/preact/examples/basic-external-store", "label": "Basic (External Store)" },
867+
{ "to": "framework/preact/examples/basic-external-atoms", "label": "Basic (External Atoms)" },
865868
{ "to": "framework/preact/examples/column-groups", "label": "Header Groups" }
866869
]
867870
},
@@ -986,13 +989,23 @@
986989
{
987990
"label": "vue",
988991
"children": [
992+
{ "to": "framework/vue/examples/filters", "label": "Column Filters" },
993+
{ "to": "framework/vue/examples/filters-faceted", "label": "Column Filters (Faceted)" },
994+
{ "to": "framework/vue/examples/filters-fuzzy", "label": "Fuzzy Search Filters" },
989995
{ "to": "framework/vue/examples/column-ordering", "label": "Column Ordering" },
990996
{ "to": "framework/vue/examples/column-pinning", "label": "Column Pinning" },
997+
{ "to": "framework/vue/examples/column-pinning-split", "label": "Column Pinning (Split)" },
998+
{ "to": "framework/vue/examples/column-pinning-sticky", "label": "Sticky Column Pinning" },
999+
{ "to": "framework/vue/examples/column-sizing", "label": "Column Sizing" },
1000+
{ "to": "framework/vue/examples/column-resizing", "label": "Column Resizing" },
1001+
{ "to": "framework/vue/examples/column-resizing-performant", "label": "Performant Column Resizing" },
1002+
{ "to": "framework/vue/examples/column-visibility", "label": "Column Visibility" },
1003+
{ "to": "framework/vue/examples/expanding", "label": "Expanding" },
1004+
{ "to": "framework/vue/examples/grouping", "label": "Grouping" },
9911005
{ "to": "framework/vue/examples/pagination", "label": "Pagination" },
992-
{ "to": "framework/vue/examples/pagination-controlled", "label": "Pagination Controlled" },
1006+
{ "to": "framework/vue/examples/row-pinning", "label": "Row Pinning" },
9931007
{ "to": "framework/vue/examples/row-selection", "label": "Row Selection" },
994-
{ "to": "framework/vue/examples/sorting", "label": "Sorting" },
995-
{ "to": "framework/vue/examples/filters", "label": "Column Filters" }
1008+
{ "to": "framework/vue/examples/sorting", "label": "Sorting" }
9961009
]
9971010
},
9981011
{
@@ -1098,7 +1111,11 @@
10981111
"children": [
10991112
{ "to": "framework/vue/examples/composable-tables", "label": "Composable Tables" },
11001113
{ "to": "framework/vue/examples/sub-components", "label": "Sub Components" },
1101-
{ "to": "framework/vue/examples/virtualized-rows", "label": "With TanStack Virtual (Rows)" }
1114+
{ "to": "framework/vue/examples/virtualized-columns", "label": "With TanStack Virtual - Columns" },
1115+
{ "to": "framework/vue/examples/virtualized-rows", "label": "With TanStack Virtual - Rows" },
1116+
{ "to": "framework/vue/examples/virtualized-infinite-scrolling", "label": "With TanStack Virtual - Infinite Scrolling" },
1117+
{ "to": "framework/vue/examples/with-tanstack-form", "label": "With TanStack Form" },
1118+
{ "to": "framework/vue/examples/with-tanstack-query", "label": "With TanStack Query" }
11021119
]
11031120
},
11041121
{

docs/framework/angular/reference/functions/injectTable.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ title: injectTable
99
function injectTable<TFeatures, TData, TSelected>(options, selector): AngularTable<TFeatures, TData, TSelected>;
1010
```
1111

12-
Defined in: [injectTable.ts:104](https://github.com/TanStack/table/blob/main/packages/angular-table/src/injectTable.ts#L104)
12+
Defined in: [injectTable.ts:124](https://github.com/TanStack/table/blob/main/packages/angular-table/src/injectTable.ts#L124)
1313

1414
Creates and returns an Angular-reactive table instance.
1515

docs/framework/angular/reference/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ title: "@tanstack/angular-table"
1616

1717
## Interfaces
1818

19+
- [AngularTableComputed](interfaces/AngularTableComputed.md)
1920
- [FlexRenderComponent](interfaces/FlexRenderComponent.md)
2021
- [TanStackTableCellContext](interfaces/TanStackTableCellContext.md)
2122
- [TanStackTableHeaderContext](interfaces/TanStackTableHeaderContext.md)
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
---
2+
id: AngularTableComputed
3+
title: AngularTableComputed
4+
---
5+
6+
# Interface: AngularTableComputed()\<TFeatures\>
7+
8+
Defined in: [injectTable.ts:31](https://github.com/TanStack/table/blob/main/packages/angular-table/src/injectTable.ts#L31)
9+
10+
Store mode: pass `selector` (required) to project from full table state.
11+
Atom mode: pass `atom`; omit `selector` for the whole atom (identity), or pass
12+
`selector` to project. Split overloads match React `Subscribe` inference.
13+
14+
## Type Parameters
15+
16+
### TFeatures
17+
18+
`TFeatures` *extends* `TableFeatures`
19+
20+
## Call Signature
21+
22+
```ts
23+
AngularTableComputed<TAtomValue>(props): Signal<Readonly<TAtomValue>>;
24+
```
25+
26+
Defined in: [injectTable.ts:32](https://github.com/TanStack/table/blob/main/packages/angular-table/src/injectTable.ts#L32)
27+
28+
Store mode: pass `selector` (required) to project from full table state.
29+
Atom mode: pass `atom`; omit `selector` for the whole atom (identity), or pass
30+
`selector` to project. Split overloads match React `Subscribe` inference.
31+
32+
### Type Parameters
33+
34+
#### TAtomValue
35+
36+
`TAtomValue`
37+
38+
### Parameters
39+
40+
#### props
41+
42+
##### atom
43+
44+
`Atom`\<`TAtomValue`\> \| `ReadonlyAtom`\<`TAtomValue`\>
45+
46+
##### equal?
47+
48+
`ValueEqualityFn`\<`TAtomValue`\>
49+
50+
##### selector?
51+
52+
`undefined`
53+
54+
### Returns
55+
56+
`Signal`\<`Readonly`\<`TAtomValue`\>\>
57+
58+
## Call Signature
59+
60+
```ts
61+
AngularTableComputed<TAtomValue, TSubSelected>(props): Signal<Readonly<TSubSelected>>;
62+
```
63+
64+
Defined in: [injectTable.ts:37](https://github.com/TanStack/table/blob/main/packages/angular-table/src/injectTable.ts#L37)
65+
66+
Store mode: pass `selector` (required) to project from full table state.
67+
Atom mode: pass `atom`; omit `selector` for the whole atom (identity), or pass
68+
`selector` to project. Split overloads match React `Subscribe` inference.
69+
70+
### Type Parameters
71+
72+
#### TAtomValue
73+
74+
`TAtomValue`
75+
76+
#### TSubSelected
77+
78+
`TSubSelected`
79+
80+
### Parameters
81+
82+
#### props
83+
84+
##### atom
85+
86+
`Atom`\<`TAtomValue`\> \| `ReadonlyAtom`\<`TAtomValue`\>
87+
88+
##### equal?
89+
90+
`ValueEqualityFn`\<`TSubSelected`\>
91+
92+
##### selector
93+
94+
(`state`) => `TSubSelected`
95+
96+
### Returns
97+
98+
`Signal`\<`Readonly`\<`TSubSelected`\>\>
99+
100+
## Call Signature
101+
102+
```ts
103+
AngularTableComputed<TSubSelected>(props): Signal<Readonly<TSubSelected>>;
104+
```
105+
106+
Defined in: [injectTable.ts:42](https://github.com/TanStack/table/blob/main/packages/angular-table/src/injectTable.ts#L42)
107+
108+
Store mode: pass `selector` (required) to project from full table state.
109+
Atom mode: pass `atom`; omit `selector` for the whole atom (identity), or pass
110+
`selector` to project. Split overloads match React `Subscribe` inference.
111+
112+
### Type Parameters
113+
114+
#### TSubSelected
115+
116+
`TSubSelected`
117+
118+
### Parameters
119+
120+
#### props
121+
122+
##### equal?
123+
124+
`ValueEqualityFn`\<`TSubSelected`\>
125+
126+
##### selector
127+
128+
(`state`) => `TSubSelected`
129+
130+
### Returns
131+
132+
`Signal`\<`Readonly`\<`TSubSelected`\>\>

docs/framework/angular/reference/type-aliases/AngularTable.md

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,17 @@ title: AngularTable
99
type AngularTable<TFeatures, TData, TSelected> = Table<TFeatures, TData> & object;
1010
```
1111

12-
Defined in: [injectTable.ts:25](https://github.com/TanStack/table/blob/main/packages/angular-table/src/injectTable.ts#L25)
12+
Defined in: [injectTable.ts:48](https://github.com/TanStack/table/blob/main/packages/angular-table/src/injectTable.ts#L48)
1313

1414
## Type Declaration
1515

16-
### computed()
16+
### computed
1717

1818
```ts
19-
computed: <TSubSelected>(props) => Signal<Readonly<TSubSelected>>;
19+
computed: AngularTableComputed<TFeatures>;
2020
```
2121

22-
Creates a computed that subscribe to changes in the table store with a custom selector.
23-
Default equality function is "shallow".
24-
25-
#### Type Parameters
26-
27-
##### TSubSelected
28-
29-
`TSubSelected` = \{
30-
\}
31-
32-
#### Parameters
33-
34-
##### props
35-
36-
###### equal?
37-
38-
`ValueEqualityFn`\<`TSubSelected`\>
39-
40-
###### selector
41-
42-
(`state`) => `TSubSelected`
43-
44-
#### Returns
45-
46-
`Signal`\<`Readonly`\<`TSubSelected`\>\>
22+
Alias: **`Subscribe`** — same function reference as `computed` (naming parity with other adapters).
4723

4824
### state
4925

@@ -53,6 +29,12 @@ readonly state: Signal<Readonly<TSelected>>;
5329

5430
The selected state from the table store, based on the selector provided.
5531

32+
### Subscribe
33+
34+
```ts
35+
Subscribe: AngularTableComputed<TFeatures>;
36+
```
37+
5638
### value
5739

5840
```ts

0 commit comments

Comments
 (0)