@dxos/react-ui-table 0.4.7-next.f4b92be → 0.4.8-main.00e6f19
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.
- package/dist/lib/browser/index.mjs +93 -56
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/components/Cell/Cell.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.d.ts +2 -0
- package/dist/types/src/components/Table/Table.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.stories.d.ts +3 -0
- package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
- package/dist/types/src/helpers.d.ts.map +1 -1
- package/dist/types/src/theme.d.ts +1 -1
- package/dist/types/src/theme.d.ts.map +1 -1
- package/package.json +15 -14
- package/src/components/Cell/Cell.tsx +4 -1
- package/src/components/Table/Table.stories.tsx +77 -60
- package/src/components/Table/Table.tsx +45 -39
- package/src/helpers.tsx +52 -43
- package/src/theme.ts +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Table/Table.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAMpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;;;;;;
|
|
1
|
+
{"version":3,"file":"Table.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Table/Table.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAMpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;;;;;;4BA4FsB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAL5B,wBAuCE;AAEF,eAAO,MAAM,OAAO;;;;;CAKnB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;CAMtB,CAAC;AAEF,eAAO,MAAM,KAAK;;;;CAIjB,CAAC;AAEF,eAAO,MAAM,OAAO;;CAmCnB,CAAC;AAEF,eAAO,MAAM,QAAQ;;CA4BpB,CAAC;AAEF,eAAO,MAAM,SAAS;;CAyBrB,CAAC;AAEF,eAAO,MAAM,eAAe;;CA4B3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,IAAI,EAAK,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ export declare const selectedRow = "!bg-primary-100 dark:!bg-primary-700";
|
|
|
6
6
|
export declare const flushPadding = "pli-0 plb-0";
|
|
7
7
|
export declare const textPadding = "pli-2 plb-0.5";
|
|
8
8
|
export declare const headPadding = "pli-2 plb-1.5";
|
|
9
|
-
export declare const gridCellFocusRing = "focus:z-[11] focus:outline outline-2 outline-primary-500 dark:outline-primary-400";
|
|
9
|
+
export declare const gridCellFocusRing = "focus-within:z-[11] focus-within:outline outline-2 outline-primary-500 dark:outline-primary-400";
|
|
10
10
|
export type TableStyleProps = Partial<TableContextValue<any>>;
|
|
11
11
|
export declare const tableRoot: ComponentFunction<TableStyleProps>;
|
|
12
12
|
export declare const groupTh: ComponentFunction<TableStyleProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/theme.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWzD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEvE,eAAO,MAAM,UAAU,wCAAwC,CAAC;AAChE,eAAO,MAAM,WAAW,yCAAyC,CAAC;AAClE,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAC1C,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAC3C,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAE3C,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/theme.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWzD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEvE,eAAO,MAAM,UAAU,wCAAwC,CAAC;AAChE,eAAO,MAAM,WAAW,yCAAyC,CAAC;AAClE,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAC1C,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAC3C,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAE3C,eAAO,MAAM,iBAAiB,oGACqE,CAAC;AAMpG,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9D,eAAO,MAAM,SAAS,EAAE,iBAAiB,CAAC,eAAe,CACN,CAAC;AAEpD,eAAO,MAAM,OAAO,EAAE,iBAAiB,CAAC,eAAe,CACH,CAAC;AAMrD,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAElD,eAAO,MAAM,SAAS,EAAE,iBAAiB,CAAC,eAAe,CAC4D,CAAC;AAEtH,eAAO,MAAM,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAA2C,CAAC;AAEnG,eAAO,MAAM,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAOpD,CAAC;AAEJ,eAAO,MAAM,eAAe,EAAE,iBAAiB,CAAC,eAAe,CAI5D,CAAC;AAEJ,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,CAAC,eAAe,CACQ,CAAC;AAMzE,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,eAAO,MAAM,SAAS,EAAE,iBAAiB,CAAC,eAAe,CAAkC,CAAC;AAE5F,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AACpE,eAAO,MAAM,OAAO,EAAE,iBAAiB,CAAC,iBAAiB,CAOtD,CAAC;AAMJ,eAAO,MAAM,MAAM,EAAE,iBAAiB,CAAC,eAAe,CACwD,CAAC;AAE/G,eAAO,MAAM,SAAS,EAAE,iBAAiB,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAkC,CAAC;AAMlG,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9D,eAAO,MAAM,SAAS,EAAE,iBAAiB,CAAC,eAAe,CACJ,CAAC;AAEtD,eAAO,MAAM,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAkC,CAAC;AAE1F,eAAO,MAAM,OAAO,EAAE,iBAAiB,CAAC,eAAe,CACO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/react-ui-table",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.8-main.00e6f19",
|
|
4
4
|
"description": "A table component.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -22,27 +22,28 @@
|
|
|
22
22
|
"@tanstack/react-table": "^8.9.3",
|
|
23
23
|
"@tanstack/react-virtual": "^3.0.1",
|
|
24
24
|
"date-fns": "^3.3.1",
|
|
25
|
-
"@dxos/async": "0.4.
|
|
26
|
-
"@dxos/
|
|
27
|
-
"@dxos/
|
|
28
|
-
"@dxos/
|
|
29
|
-
"@dxos/
|
|
30
|
-
"@dxos/react-ui": "0.4.
|
|
31
|
-
"@dxos/react-ui-
|
|
32
|
-
"@dxos/
|
|
25
|
+
"@dxos/async": "0.4.8-main.00e6f19",
|
|
26
|
+
"@dxos/invariant": "0.4.8-main.00e6f19",
|
|
27
|
+
"@dxos/log": "0.4.8-main.00e6f19",
|
|
28
|
+
"@dxos/react-ui": "0.4.8-main.00e6f19",
|
|
29
|
+
"@dxos/keys": "0.4.8-main.00e6f19",
|
|
30
|
+
"@dxos/react-ui-theme": "0.4.8-main.00e6f19",
|
|
31
|
+
"@dxos/react-ui-searchlist": "0.4.8-main.00e6f19",
|
|
32
|
+
"@dxos/react-ui-types": "0.4.8-main.00e6f19",
|
|
33
|
+
"@dxos/util": "0.4.8-main.00e6f19"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
36
|
"@phosphor-icons/react": "^2.0.5",
|
|
36
37
|
"@types/react": "^18.0.21",
|
|
37
38
|
"@types/react-dom": "^18.0.6",
|
|
38
|
-
"deepsignal": "^1.5.0",
|
|
39
39
|
"react": "^18.2.0",
|
|
40
40
|
"react-dom": "^18.2.0",
|
|
41
|
-
"vite": "^5.1.
|
|
41
|
+
"vite": "^5.1.5",
|
|
42
42
|
"vite-plugin-turbosnap": "^1.0.2",
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/storybook-utils": "0.4.
|
|
45
|
-
"@dxos/random": "0.4.
|
|
43
|
+
"@dxos/echo-schema": "0.4.8-main.00e6f19",
|
|
44
|
+
"@dxos/storybook-utils": "0.4.8-main.00e6f19",
|
|
45
|
+
"@dxos/random": "0.4.8-main.00e6f19",
|
|
46
|
+
"@dxos/react-ui-theme": "0.4.8-main.00e6f19"
|
|
46
47
|
},
|
|
47
48
|
"peerDependencies": {
|
|
48
49
|
"@phosphor-icons/react": "^2.0.5",
|
|
@@ -18,8 +18,11 @@ const CELL_NAME = 'Cell';
|
|
|
18
18
|
const FocusableCell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {
|
|
19
19
|
const tableContext = useTableContext(CELL_NAME);
|
|
20
20
|
const domAttributes = useFocusableGroup({ tabBehavior: 'limited' });
|
|
21
|
+
|
|
22
|
+
const className = tdRoot(tableContext, cell.column.columnDef.meta?.cell?.classNames);
|
|
23
|
+
|
|
21
24
|
return (
|
|
22
|
-
<td tabIndex={0} {...domAttributes} className={
|
|
25
|
+
<td tabIndex={0} {...domAttributes} className={className}>
|
|
23
26
|
{children}
|
|
24
27
|
</td>
|
|
25
28
|
);
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
import '@dxosTheme';
|
|
6
6
|
|
|
7
7
|
import { Plugs, PlugsConnected } from '@phosphor-icons/react';
|
|
8
|
-
import {
|
|
9
|
-
import React, { useEffect, useRef, useState } from 'react';
|
|
8
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
10
9
|
|
|
10
|
+
import * as E from '@dxos/echo-schema/schema';
|
|
11
11
|
import { PublicKey } from '@dxos/keys';
|
|
12
12
|
import { faker } from '@dxos/random';
|
|
13
|
-
import {
|
|
13
|
+
import { AnchoredOverflow, DensityProvider } from '@dxos/react-ui';
|
|
14
14
|
import { withTheme } from '@dxos/storybook-utils';
|
|
15
15
|
import { range } from '@dxos/util';
|
|
16
16
|
|
|
@@ -35,7 +35,7 @@ faker.seed(911);
|
|
|
35
35
|
const createItems = (count: number) =>
|
|
36
36
|
range(count).map(
|
|
37
37
|
() =>
|
|
38
|
-
|
|
38
|
+
E.object<Item>({
|
|
39
39
|
publicKey: PublicKey.random(),
|
|
40
40
|
name: faker.commerce.productName(),
|
|
41
41
|
count: faker.datatype.boolean({ probability: 0.9 }) ? faker.number.int({ min: 0, max: 10_000 }) : undefined,
|
|
@@ -72,7 +72,7 @@ const tableStorySelectModel: SearchListQueryModel<Item> = {
|
|
|
72
72
|
|
|
73
73
|
const { helper, builder } = createColumnBuilder<Item>();
|
|
74
74
|
|
|
75
|
-
const
|
|
75
|
+
const makeColumns = (onUpdate?: ValueUpdater<Item, any>): TableColumnDef<Item, any>[] => [
|
|
76
76
|
helper.display(builder.selectRow()),
|
|
77
77
|
helper.accessor((item) => item.publicKey, { id: 'key', ...builder.key({ tooltip: true }) }),
|
|
78
78
|
helper.accessor(
|
|
@@ -90,26 +90,14 @@ const columns = (onUpdate?: ValueUpdater<Item, any>): TableColumnDef<Item, any>[
|
|
|
90
90
|
builder.number({
|
|
91
91
|
label: 'Count',
|
|
92
92
|
meta: { resizable: true },
|
|
93
|
-
// TODO(burdon): Sorting.
|
|
94
|
-
getGroupingValue: (row) => (row.count ? (row.count < 2_000 ? 'A' : row.count < 5_000 ? 'B' : 'C') : 'D'),
|
|
95
|
-
}),
|
|
96
|
-
),
|
|
97
|
-
helper.accessor(
|
|
98
|
-
'company',
|
|
99
|
-
builder.combobox({
|
|
100
|
-
label: 'Company',
|
|
101
|
-
model: tableStorySelectModel,
|
|
102
93
|
onUpdate,
|
|
94
|
+
getGroupingValue: (row) => (row.count ? (row.count < 2000 ? 'A' : row.count < 5000 ? 'B' : 'C') : 'D'),
|
|
103
95
|
}),
|
|
104
96
|
),
|
|
97
|
+
helper.accessor('company', builder.combobox({ label: 'Company', model: tableStorySelectModel, onUpdate })),
|
|
105
98
|
helper.accessor(
|
|
106
99
|
'complete',
|
|
107
|
-
builder.switch({
|
|
108
|
-
// enableGrouping: true,
|
|
109
|
-
getGroupingValue: (row) => row.complete === true,
|
|
110
|
-
label: '',
|
|
111
|
-
onUpdate,
|
|
112
|
-
}),
|
|
100
|
+
builder.switch({ getGroupingValue: (row) => row.complete === true, label: '', onUpdate }),
|
|
113
101
|
),
|
|
114
102
|
helper.accessor('complete', builder.icon({ id: 'done', label: '' })),
|
|
115
103
|
helper.accessor(
|
|
@@ -135,18 +123,10 @@ export default {
|
|
|
135
123
|
keyAccessor: (item: Item) => item.publicKey.toHex(),
|
|
136
124
|
},
|
|
137
125
|
argTypes: {
|
|
138
|
-
header: {
|
|
139
|
-
|
|
140
|
-
},
|
|
141
|
-
|
|
142
|
-
control: 'boolean',
|
|
143
|
-
},
|
|
144
|
-
border: {
|
|
145
|
-
control: 'boolean',
|
|
146
|
-
},
|
|
147
|
-
fullWidth: {
|
|
148
|
-
control: 'boolean',
|
|
149
|
-
},
|
|
126
|
+
header: { control: 'boolean' },
|
|
127
|
+
footer: { control: 'boolean' },
|
|
128
|
+
border: { control: 'boolean' },
|
|
129
|
+
fullWidth: { control: 'boolean' },
|
|
150
130
|
grouping: {
|
|
151
131
|
control: 'select',
|
|
152
132
|
options: ['none', 'complete', 'count'],
|
|
@@ -164,10 +144,7 @@ export default {
|
|
|
164
144
|
limited: { key: false, started: false },
|
|
165
145
|
},
|
|
166
146
|
},
|
|
167
|
-
rowsSelectable: {
|
|
168
|
-
control: 'select',
|
|
169
|
-
options: [false, true, 'multi'],
|
|
170
|
-
},
|
|
147
|
+
rowsSelectable: { control: 'select', options: [false, true, 'multi'] },
|
|
171
148
|
},
|
|
172
149
|
decorators: [
|
|
173
150
|
withTheme,
|
|
@@ -181,21 +158,21 @@ export default {
|
|
|
181
158
|
|
|
182
159
|
export const Default = {
|
|
183
160
|
args: {
|
|
184
|
-
columns:
|
|
161
|
+
columns: makeColumns(),
|
|
185
162
|
data: createItems(20),
|
|
186
163
|
},
|
|
187
164
|
};
|
|
188
165
|
|
|
189
166
|
export const Scrolling = {
|
|
190
167
|
args: {
|
|
191
|
-
columns:
|
|
168
|
+
columns: makeColumns(),
|
|
192
169
|
data: createItems(200),
|
|
193
170
|
},
|
|
194
171
|
};
|
|
195
172
|
|
|
196
173
|
export const Visibility = {
|
|
197
174
|
args: {
|
|
198
|
-
columns:
|
|
175
|
+
columns: makeColumns(),
|
|
199
176
|
data: createItems(10),
|
|
200
177
|
columnVisibility: { key: false, started: false },
|
|
201
178
|
},
|
|
@@ -203,7 +180,7 @@ export const Visibility = {
|
|
|
203
180
|
|
|
204
181
|
export const Empty = {
|
|
205
182
|
args: {
|
|
206
|
-
columns:
|
|
183
|
+
columns: makeColumns(),
|
|
207
184
|
},
|
|
208
185
|
};
|
|
209
186
|
|
|
@@ -211,6 +188,7 @@ export const Dynamic = {
|
|
|
211
188
|
render: () => {
|
|
212
189
|
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
213
190
|
const [items, setItems] = useState<Item[]>(createItems(50));
|
|
191
|
+
|
|
214
192
|
useEffect(() => {
|
|
215
193
|
const interval = setInterval(() => {
|
|
216
194
|
setItems((items) => {
|
|
@@ -222,12 +200,15 @@ export const Dynamic = {
|
|
|
222
200
|
}, 500);
|
|
223
201
|
return () => clearInterval(interval);
|
|
224
202
|
}, []);
|
|
203
|
+
|
|
204
|
+
const columns = useMemo(() => makeColumns(), []);
|
|
205
|
+
|
|
225
206
|
return (
|
|
226
207
|
<AnchoredOverflow.Root classNames='max-bs-[80dvh]' ref={containerRef}>
|
|
227
208
|
<Table<Item>
|
|
228
209
|
rowsSelectable='multi'
|
|
229
210
|
keyAccessor={(row) => row.publicKey.toHex()}
|
|
230
|
-
columns={columns
|
|
211
|
+
columns={columns}
|
|
231
212
|
data={items}
|
|
232
213
|
fullWidth
|
|
233
214
|
footer
|
|
@@ -244,9 +225,13 @@ export const Editable = {
|
|
|
244
225
|
render: () => {
|
|
245
226
|
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
246
227
|
const [items, setItems] = useState<Item[]>(createItems(200));
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
228
|
+
|
|
229
|
+
const onUpdate: ValueUpdater<Item, any> = useCallback(
|
|
230
|
+
(item, prop, value) => setItems((items) => updateItems(items, item.publicKey, prop, value)),
|
|
231
|
+
[setItems],
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
const columns = useMemo(() => makeColumns(onUpdate), [onUpdate]);
|
|
250
235
|
|
|
251
236
|
return (
|
|
252
237
|
<div ref={containerRef} className='fixed inset-0 overflow-auto'>
|
|
@@ -254,7 +239,7 @@ export const Editable = {
|
|
|
254
239
|
role='grid'
|
|
255
240
|
rowsSelectable='multi'
|
|
256
241
|
keyAccessor={(row) => row.publicKey.toHex()}
|
|
257
|
-
columns={columns
|
|
242
|
+
columns={columns}
|
|
258
243
|
data={items}
|
|
259
244
|
fullWidth
|
|
260
245
|
stickyHeader
|
|
@@ -268,25 +253,57 @@ export const Editable = {
|
|
|
268
253
|
|
|
269
254
|
export const Resizable = {
|
|
270
255
|
render: () => {
|
|
256
|
+
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
271
257
|
const [items, setItems] = useState<Item[]>(createItems(10));
|
|
272
|
-
const onUpdate: ValueUpdater<Item, any> = (item, prop, value) => {
|
|
273
|
-
setItems((items) => updateItems(items, item.publicKey, prop, value));
|
|
274
|
-
};
|
|
275
258
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
259
|
+
const onUpdate: ValueUpdater<Item, any> = useCallback(
|
|
260
|
+
(item, prop, value) => setItems((items) => updateItems(items, item.publicKey, prop, value)),
|
|
261
|
+
[setItems],
|
|
262
|
+
);
|
|
279
263
|
|
|
280
264
|
return (
|
|
281
|
-
<
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
265
|
+
<div ref={containerRef} className='fixed inset-0 overflow-auto'>
|
|
266
|
+
<Table<Item>
|
|
267
|
+
rowsSelectable='multi'
|
|
268
|
+
keyAccessor={(row) => row.publicKey.toHex()}
|
|
269
|
+
columns={makeColumns(onUpdate)}
|
|
270
|
+
data={items}
|
|
271
|
+
fullWidth
|
|
272
|
+
stickyHeader
|
|
273
|
+
getScrollElement={() => containerRef.current}
|
|
274
|
+
// onColumnResize={handleColumnResize}
|
|
275
|
+
/>
|
|
276
|
+
</div>
|
|
277
|
+
);
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
export const TenThousandRows = {
|
|
282
|
+
render: () => {
|
|
283
|
+
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
284
|
+
const [items, setItems] = useState<Item[]>(createItems(10000));
|
|
285
|
+
|
|
286
|
+
const onUpdate: ValueUpdater<Item, any> = useCallback(
|
|
287
|
+
(item, prop, value) => setItems((items) => updateItems(items, item.publicKey, prop, value)),
|
|
288
|
+
[setItems],
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
const columns = useMemo(() => makeColumns(onUpdate), [onUpdate]);
|
|
292
|
+
|
|
293
|
+
return (
|
|
294
|
+
<div ref={containerRef} className='fixed inset-0 overflow-auto'>
|
|
295
|
+
<Table<Item>
|
|
296
|
+
role='grid'
|
|
297
|
+
rowsSelectable='multi'
|
|
298
|
+
keyAccessor={(row) => row.publicKey.toHex()}
|
|
299
|
+
columns={columns}
|
|
300
|
+
data={items}
|
|
301
|
+
fullWidth
|
|
302
|
+
stickyHeader
|
|
303
|
+
border
|
|
304
|
+
getScrollElement={() => containerRef.current}
|
|
305
|
+
/>
|
|
306
|
+
</div>
|
|
290
307
|
);
|
|
291
308
|
},
|
|
292
309
|
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
//
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
|
-
|
|
5
4
|
import { useControllableState } from '@radix-ui/react-use-controllable-state';
|
|
6
5
|
import {
|
|
7
6
|
getCoreRowModel,
|
|
@@ -18,6 +17,8 @@ import { useVirtualizer, type VirtualizerOptions } from '@tanstack/react-virtual
|
|
|
18
17
|
import React, { Fragment, useCallback, useEffect, useState } from 'react';
|
|
19
18
|
|
|
20
19
|
import { debounce } from '@dxos/async';
|
|
20
|
+
import { log } from '@dxos/log';
|
|
21
|
+
import { useDefaultValue } from '@dxos/react-ui';
|
|
21
22
|
|
|
22
23
|
import { TableBody } from './TableBody';
|
|
23
24
|
import { TableProvider as UntypedTableProvider, type TypedTableProvider, useTableContext } from './TableContext';
|
|
@@ -29,25 +30,23 @@ import { groupTh, tableRoot } from '../../theme';
|
|
|
29
30
|
export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
30
31
|
const {
|
|
31
32
|
role,
|
|
32
|
-
data = [],
|
|
33
|
-
columns = [],
|
|
34
33
|
onColumnResize,
|
|
35
34
|
columnVisibility,
|
|
36
35
|
header = true,
|
|
37
36
|
rowsSelectable,
|
|
38
37
|
debug,
|
|
39
38
|
onDataSelectionChange,
|
|
39
|
+
getScrollElement,
|
|
40
40
|
} = props;
|
|
41
41
|
|
|
42
|
-
const
|
|
42
|
+
const columns = useDefaultValue(props.columns, []);
|
|
43
|
+
const data = useDefaultValue(props.data, []);
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
// Column resizing
|
|
46
|
-
//
|
|
45
|
+
const TableProvider = UntypedTableProvider as TypedTableProvider<TData>;
|
|
47
46
|
|
|
48
47
|
const [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});
|
|
48
|
+
|
|
49
49
|
useEffect(() => {
|
|
50
|
-
// Set initial state.
|
|
51
50
|
setColumnSizing(
|
|
52
51
|
columns
|
|
53
52
|
.filter((column) => !!column.size && (column as any).prop !== undefined)
|
|
@@ -56,19 +55,9 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
56
55
|
return state;
|
|
57
56
|
}, {}),
|
|
58
57
|
);
|
|
59
|
-
}, [columns]);
|
|
58
|
+
}, [columns, setColumnSizing]);
|
|
60
59
|
|
|
61
60
|
const [columnSizingInfo, setColumnSizingInfo] = useState<ColumnSizingInfoState>({} as ColumnSizingInfoState);
|
|
62
|
-
const onColumnResizeDebounced = onColumnResize && debounce<ColumnSizingState>(onColumnResize, 1_000);
|
|
63
|
-
useEffect(() => {
|
|
64
|
-
if (columnSizingInfo.columnSizingStart?.length === 0) {
|
|
65
|
-
onColumnResizeDebounced?.(table.getState().columnSizing);
|
|
66
|
-
}
|
|
67
|
-
}, [columnSizingInfo]);
|
|
68
|
-
|
|
69
|
-
//
|
|
70
|
-
// Row selection
|
|
71
|
-
//
|
|
72
61
|
|
|
73
62
|
const [rowSelection = {}, setRowSelection] = useControllableState({
|
|
74
63
|
prop: props.rowSelection,
|
|
@@ -76,10 +65,6 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
76
65
|
defaultProp: props.defaultRowSelection,
|
|
77
66
|
});
|
|
78
67
|
|
|
79
|
-
useEffect(() => {
|
|
80
|
-
onDataSelectionChange?.(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));
|
|
81
|
-
}, [onDataSelectionChange, rowSelection]);
|
|
82
|
-
|
|
83
68
|
// TODO(thure): Does @tanstack/react-table really need this intervention? It did seem necessary to enforce single-selection...
|
|
84
69
|
const handleRowSelectionChange = useCallback<OnChangeFn<RowSelectionState>>(
|
|
85
70
|
(updaterOrValue) => {
|
|
@@ -93,15 +78,11 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
93
78
|
setRowSelection({});
|
|
94
79
|
}
|
|
95
80
|
},
|
|
96
|
-
[
|
|
81
|
+
[rowsSelectable, setRowSelection, rowSelection],
|
|
97
82
|
);
|
|
98
83
|
|
|
99
|
-
//
|
|
100
|
-
// Row grouping
|
|
101
|
-
//
|
|
102
|
-
|
|
103
84
|
const [grouping, handleGroupingChange] = useState<GroupingState>(props.grouping ?? []);
|
|
104
|
-
useEffect(() => handleGroupingChange(props.grouping ?? []), [props.grouping]);
|
|
85
|
+
useEffect(() => handleGroupingChange(props.grouping ?? []), [handleGroupingChange, props.grouping]);
|
|
105
86
|
|
|
106
87
|
const table = useReactTable({
|
|
107
88
|
// Data
|
|
@@ -137,21 +118,36 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
137
118
|
getGroupedRowModel: grouping.length > 1 ? getGroupedRowModel() : undefined,
|
|
138
119
|
onGroupingChange: handleGroupingChange,
|
|
139
120
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
: rowsSelectable
|
|
144
|
-
? { enableRowSelection: true }
|
|
145
|
-
: {}),
|
|
121
|
+
enableMultiRowSelection: rowsSelectable === 'multi' ? true : undefined,
|
|
122
|
+
enableRowSelection: rowsSelectable === true ? true : undefined,
|
|
123
|
+
|
|
146
124
|
onRowSelectionChange: handleRowSelectionChange,
|
|
147
125
|
|
|
148
126
|
// Debug
|
|
149
127
|
debugTable: debug,
|
|
150
128
|
});
|
|
151
129
|
|
|
130
|
+
const onColumnResizeDebounced = onColumnResize && debounce(onColumnResize, 1_000);
|
|
131
|
+
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
onDataSelectionChange?.(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));
|
|
134
|
+
}, [onDataSelectionChange, rowSelection, table]);
|
|
135
|
+
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
const shouldTriggerResize = columnSizingInfo.columnSizingStart?.length === 0;
|
|
138
|
+
|
|
139
|
+
if (shouldTriggerResize) {
|
|
140
|
+
onColumnResizeDebounced?.(table.getState().columnSizing);
|
|
141
|
+
}
|
|
142
|
+
}, [columnSizingInfo, onColumnResizeDebounced, table]);
|
|
143
|
+
|
|
152
144
|
// Create additional expansion column if all columns have fixed width.
|
|
153
145
|
const expand = false; // columns.map((column) => column.size).filter(Boolean).length === columns?.length;
|
|
154
146
|
|
|
147
|
+
if (!getScrollElement) {
|
|
148
|
+
log.warn('Table: getScrollElement is not set. This is required for virtualized tables.');
|
|
149
|
+
}
|
|
150
|
+
|
|
155
151
|
return (
|
|
156
152
|
<TableProvider
|
|
157
153
|
{...props}
|
|
@@ -160,7 +156,7 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
160
156
|
expand={expand}
|
|
161
157
|
isGrid={role === 'grid' || role === 'treegrid'}
|
|
162
158
|
>
|
|
163
|
-
<TableImpl<TData> debug={false} />
|
|
159
|
+
<TableImpl<TData> debug={false} getScrollElement={getScrollElement} {...props} />
|
|
164
160
|
</TableProvider>
|
|
165
161
|
);
|
|
166
162
|
};
|
|
@@ -169,7 +165,7 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
169
165
|
* Pure implementation of table outside of context set-up.
|
|
170
166
|
*/
|
|
171
167
|
const TableImpl = <TData extends RowData>(props: TableProps<TData>) => {
|
|
172
|
-
const {
|
|
168
|
+
const { debug, classNames, getScrollElement, role, footer, grouping, fullWidth } = props;
|
|
173
169
|
const { table } = useTableContext<TData>('TableImpl');
|
|
174
170
|
const { rows } = table.getRowModel();
|
|
175
171
|
|
|
@@ -181,6 +177,8 @@ const TableImpl = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
181
177
|
);
|
|
182
178
|
}
|
|
183
179
|
|
|
180
|
+
const isResizingColumn = table.getState().columnSizingInfo.isResizingColumn;
|
|
181
|
+
|
|
184
182
|
return (
|
|
185
183
|
<table
|
|
186
184
|
role={role}
|
|
@@ -191,7 +189,11 @@ const TableImpl = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
191
189
|
|
|
192
190
|
{grouping?.length !== 0 ? (
|
|
193
191
|
getScrollElement ? (
|
|
194
|
-
|
|
192
|
+
isResizingColumn ? (
|
|
193
|
+
<MemoizedVirtualisedTableContent getScrollElement={getScrollElement} />
|
|
194
|
+
) : (
|
|
195
|
+
<VirtualizedTableContent getScrollElement={getScrollElement} />
|
|
196
|
+
)
|
|
195
197
|
) : (
|
|
196
198
|
<TableBody rows={rows} />
|
|
197
199
|
)
|
|
@@ -210,14 +212,16 @@ const VirtualizedTableContent = ({
|
|
|
210
212
|
const {
|
|
211
213
|
table: { getRowModel },
|
|
212
214
|
} = useTableContext('VirtualizedTableContent');
|
|
215
|
+
|
|
213
216
|
const rows = getRowModel().rows;
|
|
214
217
|
|
|
215
218
|
const { getTotalSize, getVirtualItems } = useVirtualizer({
|
|
216
219
|
getScrollElement,
|
|
217
220
|
count: rows.length,
|
|
218
|
-
overscan:
|
|
221
|
+
overscan: 4,
|
|
219
222
|
estimateSize: () => 33,
|
|
220
223
|
});
|
|
224
|
+
|
|
221
225
|
const virtualRows = getVirtualItems();
|
|
222
226
|
const totalSize = getTotalSize();
|
|
223
227
|
|
|
@@ -245,6 +249,8 @@ const VirtualizedTableContent = ({
|
|
|
245
249
|
);
|
|
246
250
|
};
|
|
247
251
|
|
|
252
|
+
export const MemoizedVirtualisedTableContent = React.memo(VirtualizedTableContent) as typeof VirtualizedTableContent;
|
|
253
|
+
|
|
248
254
|
const GroupedTableContent = () => {
|
|
249
255
|
const {
|
|
250
256
|
table: { getGroupedRowModel, getHeaderGroups, getState },
|