@dxos/react-ui-table 0.8.4-main.70d3990 → 0.8.4-main.74a063c4e0
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/{chunk-5XWSB3JP.mjs → chunk-BF54SSNL.mjs} +27 -28
- package/dist/lib/browser/chunk-BF54SSNL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KNC7XYT6.mjs → chunk-NTWHM2PX.mjs} +620 -652
- package/dist/lib/browser/chunk-NTWHM2PX.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1164 -1021
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +22 -21
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node-esm/{chunk-MKTMOY46.mjs → chunk-SIRDIPHZ.mjs} +27 -28
- package/dist/lib/node-esm/chunk-SIRDIPHZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-CWSGS3Y2.mjs → chunk-Z3TLFG6Z.mjs} +620 -651
- package/dist/lib/node-esm/chunk-Z3TLFG6Z.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +1164 -1021
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +22 -21
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/components/Table/ColumnActionsMenu.d.ts +1 -2
- package/dist/types/src/components/Table/ColumnActionsMenu.d.ts.map +1 -1
- package/dist/types/src/components/Table/ColumnSettings.d.ts +2 -2
- package/dist/types/src/components/Table/ColumnSettings.d.ts.map +1 -1
- package/dist/types/src/components/Table/DynamicTable.d.ts +7 -7
- package/dist/types/src/components/Table/DynamicTable.d.ts.map +1 -1
- package/dist/types/src/components/Table/DynamicTable.stories.d.ts +21 -37
- package/dist/types/src/components/Table/DynamicTable.stories.d.ts.map +1 -1
- package/dist/types/src/components/Table/Relations.stories.d.ts +82 -81
- package/dist/types/src/components/Table/Relations.stories.d.ts.map +1 -1
- package/dist/types/src/components/Table/RowActionsMenu.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.d.ts +28 -21
- package/dist/types/src/components/Table/Table.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.stories.d.ts +84 -83
- package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
- package/dist/types/src/components/Table/TableContent.d.ts +21 -0
- package/dist/types/src/components/Table/TableContent.d.ts.map +1 -0
- package/dist/types/src/components/Table/TableToolbar.d.ts +25 -0
- package/dist/types/src/components/Table/TableToolbar.d.ts.map +1 -0
- package/dist/types/src/components/TableCellEditor/CellValidationMessage.d.ts +1 -1
- package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts +10 -12
- package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts.map +1 -1
- package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts +5 -7
- package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -1
- package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts +24 -26
- package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +0 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +22 -13
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/hooks/useAddRow.d.ts +5 -6
- package/dist/types/src/hooks/useAddRow.d.ts.map +1 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts +2 -1
- package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
- package/dist/types/src/hooks/useTableModel.d.ts +6 -5
- package/dist/types/src/hooks/useTableModel.d.ts.map +1 -1
- package/dist/types/src/model/modal-controller.d.ts +5 -1
- package/dist/types/src/model/modal-controller.d.ts.map +1 -1
- package/dist/types/src/model/selection-model.d.ts +17 -8
- package/dist/types/src/model/selection-model.d.ts.map +1 -1
- package/dist/types/src/model/table-model.d.ts +100 -18
- package/dist/types/src/model/table-model.d.ts.map +1 -1
- package/dist/types/src/model/table-presentation.d.ts +3 -1
- package/dist/types/src/model/table-presentation.d.ts.map +1 -1
- package/dist/types/src/playwright/TableManager.d.ts +2 -1
- package/dist/types/src/playwright/TableManager.d.ts.map +1 -1
- package/dist/types/src/testing/useTestTableModel.d.ts +5 -8
- package/dist/types/src/testing/useTestTableModel.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +21 -23
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Table.d.ts +13 -15
- package/dist/types/src/types/Table.d.ts.map +1 -1
- package/dist/types/src/util/dynamic-table.d.ts +12 -10
- package/dist/types/src/util/dynamic-table.d.ts.map +1 -1
- package/dist/types/src/util/dynamic-table.test.d.ts +2 -0
- package/dist/types/src/util/dynamic-table.test.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +2 -0
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/query-ast.d.ts +7 -0
- package/dist/types/src/util/query-ast.d.ts.map +1 -0
- package/dist/types/src/util/sort.d.ts +12 -0
- package/dist/types/src/util/sort.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +55 -56
- package/src/components/Table/ColumnActionsMenu.tsx +15 -11
- package/src/components/Table/ColumnSettings.tsx +8 -9
- package/src/components/Table/DynamicTable.stories.tsx +22 -23
- package/src/components/Table/DynamicTable.tsx +32 -40
- package/src/components/Table/Relations.stories.tsx +56 -48
- package/src/components/Table/RowActionsMenu.tsx +3 -2
- package/src/components/Table/Table.stories.tsx +89 -78
- package/src/components/Table/Table.tsx +43 -407
- package/src/components/Table/TableContent.tsx +421 -0
- package/src/components/{TableToolbar → Table}/TableToolbar.tsx +43 -44
- package/src/components/TableCellEditor/CellValidationMessage.tsx +5 -5
- package/src/components/TableCellEditor/FormCellEditor.tsx +118 -135
- package/src/components/TableCellEditor/TableCellEditor.stories.tsx +16 -14
- package/src/components/TableCellEditor/TableCellEditor.tsx +33 -29
- package/src/components/index.ts +0 -1
- package/src/components/testing.ts +42 -16
- package/src/hooks/useAddRow.ts +8 -10
- package/src/hooks/useProjectionModel.ts +29 -9
- package/src/hooks/useTableModel.ts +27 -23
- package/src/model/modal-controller.ts +23 -12
- package/src/model/selection-model.ts +75 -44
- package/src/model/table-model.test.ts +81 -54
- package/src/model/table-model.ts +410 -138
- package/src/model/table-presentation.test.ts +58 -49
- package/src/model/table-presentation.ts +34 -29
- package/src/playwright/TableManager.ts +12 -5
- package/src/playwright/playwright.config.ts +1 -1
- package/src/playwright/smoke.spec.ts +51 -7
- package/src/testing/useTestTableModel.ts +26 -27
- package/src/translations.ts +20 -22
- package/src/types/Table.ts +28 -38
- package/src/util/dynamic-table.test.ts +70 -0
- package/src/util/dynamic-table.ts +36 -19
- package/src/util/index.ts +2 -0
- package/src/util/query-ast.ts +22 -0
- package/src/util/sort.ts +90 -0
- package/src/util/table-buttons.ts +1 -1
- package/src/util/table-controls.ts +2 -2
- package/dist/lib/browser/chunk-5XWSB3JP.mjs.map +0 -7
- package/dist/lib/browser/chunk-KNC7XYT6.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CWSGS3Y2.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MKTMOY46.mjs.map +0 -7
- package/dist/types/src/components/TableToolbar/TableToolbar.d.ts +0 -21
- package/dist/types/src/components/TableToolbar/TableToolbar.d.ts.map +0 -1
- package/dist/types/src/components/TableToolbar/index.d.ts +0 -2
- package/dist/types/src/components/TableToolbar/index.d.ts.map +0 -1
- package/dist/types/src/model/table-sorting.d.ts +0 -56
- package/dist/types/src/model/table-sorting.d.ts.map +0 -1
- package/src/components/TableToolbar/index.ts +0 -5
- package/src/model/table-sorting.ts +0 -234
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/react-ui-table",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.74a063c4e0",
|
|
4
4
|
"description": "A table component.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
7
11
|
"license": "MIT",
|
|
8
12
|
"author": "DXOS.org",
|
|
9
|
-
"sideEffects":
|
|
13
|
+
"sideEffects": false,
|
|
10
14
|
"type": "module",
|
|
11
15
|
"exports": {
|
|
12
16
|
"./deprecated": {
|
|
@@ -56,71 +60,66 @@
|
|
|
56
60
|
"@codemirror/autocomplete": "^6.19.0",
|
|
57
61
|
"@codemirror/state": "^6.5.2",
|
|
58
62
|
"@codemirror/view": "^6.38.4",
|
|
59
|
-
"@
|
|
60
|
-
"@
|
|
61
|
-
"@preact/signals-core": "^1.12.1",
|
|
63
|
+
"@effect-atom/atom-react": "^0.5.0",
|
|
64
|
+
"@fluentui/react-tabster": "9.26.11",
|
|
62
65
|
"@radix-ui/react-context": "1.1.1",
|
|
63
66
|
"@radix-ui/react-primitive": "2.0.2",
|
|
64
67
|
"@radix-ui/react-slot": "1.1.2",
|
|
65
68
|
"@radix-ui/react-use-controllable-state": "1.1.0",
|
|
66
|
-
"date-fns": "^3.
|
|
69
|
+
"date-fns": "^3.6.0",
|
|
67
70
|
"lodash.orderby": "^4.6.0",
|
|
68
|
-
"@dxos/
|
|
69
|
-
"@dxos/
|
|
70
|
-
"@dxos/
|
|
71
|
-
"@dxos/
|
|
72
|
-
"@dxos/echo-
|
|
73
|
-
"@dxos/invariant": "0.8.4-main.
|
|
74
|
-
"@dxos/
|
|
75
|
-
"@dxos/keys": "0.8.4-main.
|
|
76
|
-
"@dxos/lit-grid": "0.8.4-main.
|
|
77
|
-
"@dxos/
|
|
78
|
-
"@dxos/
|
|
79
|
-
"@dxos/
|
|
80
|
-
"@dxos/react-
|
|
81
|
-
"@dxos/
|
|
82
|
-
"@dxos/react-ui-
|
|
83
|
-
"@dxos/react-
|
|
84
|
-
"@dxos/react-ui-
|
|
85
|
-
"@dxos/react-ui-
|
|
86
|
-
"@dxos/react-ui-
|
|
87
|
-
"@dxos/react-ui-
|
|
88
|
-
"@dxos/react-ui-
|
|
89
|
-
"@dxos/
|
|
90
|
-
"@dxos/
|
|
91
|
-
"@dxos/
|
|
92
|
-
"@dxos/
|
|
93
|
-
"@dxos/util": "0.8.4-main.70d3990",
|
|
94
|
-
"@dxos/react-ui-syntax-highlighter": "0.8.4-main.70d3990"
|
|
71
|
+
"@dxos/context": "0.8.4-main.74a063c4e0",
|
|
72
|
+
"@dxos/async": "0.8.4-main.74a063c4e0",
|
|
73
|
+
"@dxos/debug": "0.8.4-main.74a063c4e0",
|
|
74
|
+
"@dxos/effect": "0.8.4-main.74a063c4e0",
|
|
75
|
+
"@dxos/echo-atom": "0.8.4-main.74a063c4e0",
|
|
76
|
+
"@dxos/invariant": "0.8.4-main.74a063c4e0",
|
|
77
|
+
"@dxos/echo": "0.8.4-main.74a063c4e0",
|
|
78
|
+
"@dxos/keys": "0.8.4-main.74a063c4e0",
|
|
79
|
+
"@dxos/lit-grid": "0.8.4-main.74a063c4e0",
|
|
80
|
+
"@dxos/random": "0.8.4-main.74a063c4e0",
|
|
81
|
+
"@dxos/log": "0.8.4-main.74a063c4e0",
|
|
82
|
+
"@dxos/react-ui-attention": "0.8.4-main.74a063c4e0",
|
|
83
|
+
"@dxos/react-ui-editor": "0.8.4-main.74a063c4e0",
|
|
84
|
+
"@dxos/react-ui-components": "0.8.4-main.74a063c4e0",
|
|
85
|
+
"@dxos/react-ui-form": "0.8.4-main.74a063c4e0",
|
|
86
|
+
"@dxos/react-client": "0.8.4-main.74a063c4e0",
|
|
87
|
+
"@dxos/react-ui-grid": "0.8.4-main.74a063c4e0",
|
|
88
|
+
"@dxos/react-ui-menu": "0.8.4-main.74a063c4e0",
|
|
89
|
+
"@dxos/react-ui-stack": "0.8.4-main.74a063c4e0",
|
|
90
|
+
"@dxos/react-ui-search": "0.8.4-main.74a063c4e0",
|
|
91
|
+
"@dxos/react-ui-syntax-highlighter": "0.8.4-main.74a063c4e0",
|
|
92
|
+
"@dxos/schema": "0.8.4-main.74a063c4e0",
|
|
93
|
+
"@dxos/ui-types": "0.8.4-main.74a063c4e0",
|
|
94
|
+
"@dxos/types": "0.8.4-main.74a063c4e0",
|
|
95
|
+
"@dxos/util": "0.8.4-main.74a063c4e0"
|
|
95
96
|
},
|
|
96
97
|
"devDependencies": {
|
|
97
|
-
"@effect
|
|
98
|
-
"@effect/platform": "0.92.1",
|
|
98
|
+
"@effect/platform": "0.94.4",
|
|
99
99
|
"@types/lodash.orderby": "^4.6.9",
|
|
100
|
-
"@types/react": "~19.2.
|
|
101
|
-
"@types/react-dom": "~19.2.
|
|
102
|
-
"effect": "3.
|
|
100
|
+
"@types/react": "~19.2.7",
|
|
101
|
+
"@types/react-dom": "~19.2.3",
|
|
102
|
+
"effect": "3.20.0",
|
|
103
103
|
"fast-check": "^3.19.0",
|
|
104
|
-
"react": "~19.2.
|
|
105
|
-
"react-dom": "~19.2.
|
|
106
|
-
"vite": "7.1.
|
|
107
|
-
"@dxos/
|
|
108
|
-
"@dxos/
|
|
109
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
110
|
-
"@dxos/react-
|
|
111
|
-
"@dxos/
|
|
112
|
-
"@dxos/
|
|
113
|
-
"@dxos/test-utils": "0.8.4-main.
|
|
114
|
-
"@dxos/random": "0.8.4-main.70d3990"
|
|
104
|
+
"react": "~19.2.3",
|
|
105
|
+
"react-dom": "~19.2.3",
|
|
106
|
+
"vite": "^7.1.11",
|
|
107
|
+
"@dxos/lit-ui": "0.8.4-main.74a063c4e0",
|
|
108
|
+
"@dxos/random": "0.8.4-main.74a063c4e0",
|
|
109
|
+
"@dxos/react-ui": "0.8.4-main.74a063c4e0",
|
|
110
|
+
"@dxos/react-client": "0.8.4-main.74a063c4e0",
|
|
111
|
+
"@dxos/storybook-utils": "0.8.4-main.74a063c4e0",
|
|
112
|
+
"@dxos/ui-theme": "0.8.4-main.74a063c4e0",
|
|
113
|
+
"@dxos/test-utils": "0.8.4-main.74a063c4e0"
|
|
115
114
|
},
|
|
116
115
|
"peerDependencies": {
|
|
117
|
-
"@effect-atom/atom-react": "^0.
|
|
118
|
-
"@effect/platform": "
|
|
119
|
-
"effect": "
|
|
120
|
-
"react": "
|
|
121
|
-
"react-dom": "
|
|
122
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
123
|
-
"@dxos/
|
|
116
|
+
"@effect-atom/atom-react": "^0.5.0",
|
|
117
|
+
"@effect/platform": "0.94.4",
|
|
118
|
+
"effect": "3.20.0",
|
|
119
|
+
"react": "~19.2.3",
|
|
120
|
+
"react-dom": "~19.2.3",
|
|
121
|
+
"@dxos/react-ui": "0.8.4-main.74a063c4e0",
|
|
122
|
+
"@dxos/ui-theme": "0.8.4-main.74a063c4e0"
|
|
124
123
|
},
|
|
125
124
|
"publishConfig": {
|
|
126
125
|
"access": "public"
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { useAtomValue } from '@effect-atom/atom-react';
|
|
5
6
|
import React from 'react';
|
|
6
7
|
|
|
7
8
|
import { DropdownMenu, useTranslation } from '@dxos/react-ui';
|
|
@@ -9,16 +10,19 @@ import { DropdownMenu, useTranslation } from '@dxos/react-ui';
|
|
|
9
10
|
import { type ModalController, type TableModel } from '../../model';
|
|
10
11
|
import { translationKey } from '../../translations';
|
|
11
12
|
|
|
12
|
-
type ColumnActionsMenuProps = {
|
|
13
|
+
export type ColumnActionsMenuProps = {
|
|
14
|
+
model: TableModel;
|
|
15
|
+
modals: ModalController;
|
|
16
|
+
};
|
|
13
17
|
|
|
14
18
|
export const ColumnActionsMenu = ({ model, modals }: ColumnActionsMenuProps) => {
|
|
15
19
|
const { t } = useTranslation(translationKey);
|
|
16
|
-
const state = modals.state
|
|
20
|
+
const state = useAtomValue(modals.state);
|
|
17
21
|
if (state?.type !== 'column') {
|
|
18
22
|
return null;
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
const currentSort = model.
|
|
25
|
+
const currentSort = model.getSorting();
|
|
22
26
|
const isCurrentColumnSorted = currentSort?.fieldId === state.fieldId;
|
|
23
27
|
|
|
24
28
|
return (
|
|
@@ -30,32 +34,32 @@ export const ColumnActionsMenu = ({ model, modals }: ColumnActionsMenuProps) =>
|
|
|
30
34
|
{(!isCurrentColumnSorted || currentSort?.direction === 'asc') && (
|
|
31
35
|
<DropdownMenu.Item
|
|
32
36
|
data-testid='column-sort-descending'
|
|
33
|
-
onClick={() => model.
|
|
37
|
+
onClick={() => model.setSort(state.fieldId, 'desc')}
|
|
34
38
|
>
|
|
35
|
-
{t('column
|
|
39
|
+
{t('column-action-sort-descending.menu')}
|
|
36
40
|
</DropdownMenu.Item>
|
|
37
41
|
)}
|
|
38
42
|
{(!isCurrentColumnSorted || currentSort?.direction === 'desc') && (
|
|
39
43
|
<DropdownMenu.Item
|
|
40
44
|
data-testid='column-sort-ascending'
|
|
41
|
-
onClick={() => model.
|
|
45
|
+
onClick={() => model.setSort(state.fieldId, 'asc')}
|
|
42
46
|
>
|
|
43
|
-
{t('column
|
|
47
|
+
{t('column-action-sort-ascending.menu')}
|
|
44
48
|
</DropdownMenu.Item>
|
|
45
49
|
)}
|
|
46
50
|
{isCurrentColumnSorted && (
|
|
47
|
-
<DropdownMenu.Item data-testid='column-clear-sort' onClick={() => model.
|
|
48
|
-
{t('column
|
|
51
|
+
<DropdownMenu.Item data-testid='column-clear-sort' onClick={() => model.clearSort()}>
|
|
52
|
+
{t('column-action-clear-sorting.menu')}
|
|
49
53
|
</DropdownMenu.Item>
|
|
50
54
|
)}
|
|
51
55
|
{model.getColumnCount() > 1 && model.features.schemaEditable && (
|
|
52
56
|
<DropdownMenu.Item data-testid='column-delete' onClick={() => model.deleteColumn(state.fieldId)}>
|
|
53
|
-
{t('column
|
|
57
|
+
{t('column-action-delete.menu')}
|
|
54
58
|
</DropdownMenu.Item>
|
|
55
59
|
)}
|
|
56
60
|
{model.features.schemaEditable && (
|
|
57
61
|
<DropdownMenu.Item data-testid='column-settings' onClick={() => modals.openColumnSettings()}>
|
|
58
|
-
{t('column
|
|
62
|
+
{t('column-action-settings.menu')}
|
|
59
63
|
</DropdownMenu.Item>
|
|
60
64
|
)}
|
|
61
65
|
</DropdownMenu.Viewport>
|
|
@@ -2,26 +2,25 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { useAtomValue } from '@effect-atom/atom-react';
|
|
5
6
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
import { type SchemaRegistry } from '@dxos/echo-db';
|
|
8
|
+
import { type SchemaRegistry, type View } from '@dxos/echo';
|
|
9
9
|
import { Popover } from '@dxos/react-ui';
|
|
10
10
|
import { FieldEditor } from '@dxos/react-ui-form';
|
|
11
|
-
import { type FieldType } from '@dxos/schema';
|
|
12
11
|
|
|
13
12
|
import { type ModalController, type TableModel } from '../../model';
|
|
14
13
|
|
|
15
14
|
type ColumnSettingsProps = {
|
|
16
|
-
registry?: SchemaRegistry;
|
|
15
|
+
registry?: SchemaRegistry.SchemaRegistry;
|
|
17
16
|
model?: TableModel;
|
|
18
17
|
modals: ModalController;
|
|
19
18
|
onNewColumn: () => void;
|
|
20
19
|
};
|
|
21
20
|
|
|
22
21
|
export const ColumnSettings = ({ registry, model, modals, onNewColumn }: ColumnSettingsProps) => {
|
|
23
|
-
const [newField, setNewField] = useState<FieldType>();
|
|
24
|
-
const state = modals.state
|
|
22
|
+
const [newField, setNewField] = useState<View.FieldType>();
|
|
23
|
+
const state = useAtomValue(modals.state);
|
|
25
24
|
|
|
26
25
|
useEffect(() => {
|
|
27
26
|
if (state?.type === 'columnSettings' && state.mode.type === 'create' && model?.projection) {
|
|
@@ -38,11 +37,11 @@ export const ColumnSettings = ({ registry, model, modals, onNewColumn }: ColumnS
|
|
|
38
37
|
if (state?.type === 'columnSettings') {
|
|
39
38
|
const { mode } = state;
|
|
40
39
|
if (mode.type === 'edit') {
|
|
41
|
-
return model?.projection?.
|
|
40
|
+
return model?.projection?.getFields().find((f) => f.id === mode.fieldId);
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
43
|
return undefined;
|
|
45
|
-
}, [model?.projection
|
|
44
|
+
}, [model?.projection, state]);
|
|
46
45
|
|
|
47
46
|
const field = existingField ?? newField;
|
|
48
47
|
|
|
@@ -64,7 +63,7 @@ export const ColumnSettings = ({ registry, model, modals, onNewColumn }: ColumnS
|
|
|
64
63
|
<Popover.Root modal={false} open={state?.type === 'columnSettings'}>
|
|
65
64
|
<Popover.VirtualTrigger virtualRef={modals.trigger} />
|
|
66
65
|
<Popover.Portal>
|
|
67
|
-
<Popover.Content classNames='md:
|
|
66
|
+
<Popover.Content classNames='md:w-64'>
|
|
68
67
|
<Popover.Viewport>
|
|
69
68
|
<FieldEditor
|
|
70
69
|
projection={model.projection}
|
|
@@ -3,24 +3,24 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import type * as Types from 'effect/Types';
|
|
6
7
|
import React, { useMemo, useState } from 'react';
|
|
7
8
|
|
|
8
|
-
import { Obj } from '@dxos/echo';
|
|
9
|
-
import { Format
|
|
10
|
-
import {
|
|
11
|
-
import { useClient } from '@dxos/react-client';
|
|
9
|
+
import { type JsonSchema, Obj } from '@dxos/echo';
|
|
10
|
+
import { Format } from '@dxos/echo/internal';
|
|
11
|
+
import { random } from '@dxos/random';
|
|
12
12
|
import { Filter, useQuery, useSchema } from '@dxos/react-client/echo';
|
|
13
|
-
import {
|
|
14
|
-
import { withTheme } from '@dxos/react-ui/testing';
|
|
13
|
+
import { useClientStory, withClientProvider } from '@dxos/react-client/testing';
|
|
14
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
15
15
|
import { type SchemaPropertyDefinition } from '@dxos/schema';
|
|
16
16
|
import { TestSchema } from '@dxos/schema/testing';
|
|
17
|
+
import { withRegistry } from '@dxos/storybook-utils';
|
|
17
18
|
|
|
18
19
|
import { type TableFeatures } from '../../model';
|
|
19
20
|
import { translations } from '../../translations';
|
|
20
|
-
|
|
21
21
|
import { DynamicTable } from './DynamicTable';
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
random.seed(0);
|
|
24
24
|
|
|
25
25
|
const useTestPropertiesAndObjects = () => {
|
|
26
26
|
const properties = useMemo<SchemaPropertyDefinition[]>(
|
|
@@ -33,9 +33,9 @@ const useTestPropertiesAndObjects = () => {
|
|
|
33
33
|
|
|
34
34
|
const [rows] = useState<any[]>(
|
|
35
35
|
Array.from({ length: 10 }, () => ({
|
|
36
|
-
id:
|
|
37
|
-
name:
|
|
38
|
-
age:
|
|
36
|
+
id: random.string.uuid(),
|
|
37
|
+
name: random.person.fullName(),
|
|
38
|
+
age: random.number.int({ min: 18, max: 80 }),
|
|
39
39
|
})),
|
|
40
40
|
);
|
|
41
41
|
|
|
@@ -58,7 +58,7 @@ const DynamicTableStory = () => {
|
|
|
58
58
|
const meta = {
|
|
59
59
|
title: 'ui/react-ui-table/DynamicTable',
|
|
60
60
|
component: DynamicTable,
|
|
61
|
-
decorators: [withTheme],
|
|
61
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withRegistry],
|
|
62
62
|
parameters: {
|
|
63
63
|
layout: 'fullscreen',
|
|
64
64
|
translations,
|
|
@@ -101,7 +101,7 @@ export const WithClickToSelect: StoryObj = {
|
|
|
101
101
|
|
|
102
102
|
export const WithJsonSchema: StoryObj = {
|
|
103
103
|
render: () => {
|
|
104
|
-
const schema = useMemo<
|
|
104
|
+
const schema = useMemo<Types.DeepMutable<JsonSchema.JsonSchema>>(
|
|
105
105
|
() => ({
|
|
106
106
|
type: 'object',
|
|
107
107
|
properties: {
|
|
@@ -117,10 +117,10 @@ export const WithJsonSchema: StoryObj = {
|
|
|
117
117
|
|
|
118
118
|
const [rows] = useState<any[]>(
|
|
119
119
|
Array.from({ length: 15 }, () => ({
|
|
120
|
-
name:
|
|
121
|
-
age:
|
|
122
|
-
email:
|
|
123
|
-
active:
|
|
120
|
+
name: random.person.fullName(),
|
|
121
|
+
age: random.number.int({ min: 18, max: 80 }),
|
|
122
|
+
email: random.internet.email(),
|
|
123
|
+
active: random.datatype.boolean(),
|
|
124
124
|
})),
|
|
125
125
|
);
|
|
126
126
|
|
|
@@ -130,10 +130,9 @@ export const WithJsonSchema: StoryObj = {
|
|
|
130
130
|
|
|
131
131
|
export const WithEchoSchema: StoryObj = {
|
|
132
132
|
render: () => {
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
const
|
|
136
|
-
const objects = useQuery(space, schema ? Filter.type(schema) : Filter.nothing());
|
|
133
|
+
const { space } = useClientStory();
|
|
134
|
+
const schema = useSchema(space?.db, TestSchema.Person.typename);
|
|
135
|
+
const objects = useQuery(space?.db, schema ? Filter.type(schema) : Filter.nothing());
|
|
137
136
|
if (!schema) {
|
|
138
137
|
return <div>Loading schema...</div>;
|
|
139
138
|
}
|
|
@@ -149,8 +148,8 @@ export const WithEchoSchema: StoryObj = {
|
|
|
149
148
|
Array.from({ length: 10 }).forEach(() => {
|
|
150
149
|
space.db.add(
|
|
151
150
|
Obj.make(TestSchema.Person, {
|
|
152
|
-
name:
|
|
153
|
-
email:
|
|
151
|
+
name: random.person.fullName(),
|
|
152
|
+
email: random.internet.email(),
|
|
154
153
|
}),
|
|
155
154
|
);
|
|
156
155
|
});
|
|
@@ -2,26 +2,28 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
import
|
|
5
|
+
import { RegistryContext } from '@effect-atom/atom-react';
|
|
6
|
+
import type * as Types from 'effect/Types';
|
|
7
|
+
import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
7
8
|
|
|
8
|
-
import { type
|
|
9
|
+
import { type Type } from '@dxos/echo';
|
|
10
|
+
import { type JsonSchema } from '@dxos/echo';
|
|
9
11
|
import { type ThemedClassName, useDefaultValue } from '@dxos/react-ui';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
+
import { type ProjectionModel } from '@dxos/schema';
|
|
13
|
+
import { mx } from '@dxos/ui-theme';
|
|
12
14
|
|
|
13
15
|
import { useTableModel } from '../../hooks';
|
|
14
16
|
import { type TableFeatures, TablePresentation, type TableRowAction } from '../../model';
|
|
17
|
+
import { type Table as TableType } from '../../types';
|
|
15
18
|
import { type TablePropertyDefinition, getBaseSchema, makeDynamicTable } from '../../util';
|
|
16
|
-
|
|
17
19
|
import { Table, type TableController } from './Table';
|
|
18
20
|
|
|
19
|
-
type DynamicTableProps = ThemedClassName<{
|
|
21
|
+
export type DynamicTableProps<T extends Type.AnyEntity = Type.AnyEntity> = ThemedClassName<{
|
|
22
|
+
schema?: T;
|
|
20
23
|
name?: string; // TODO(burdon): Remove?
|
|
21
24
|
rows: any[];
|
|
22
25
|
properties?: TablePropertyDefinition[];
|
|
23
|
-
jsonSchema?:
|
|
24
|
-
schema?: Schema.Schema.AnyNoContext;
|
|
26
|
+
jsonSchema?: Types.DeepMutable<JsonSchema.JsonSchema>;
|
|
25
27
|
features?: Partial<TableFeatures>;
|
|
26
28
|
rowActions?: TableRowAction[];
|
|
27
29
|
onRowClick?: (row: any) => void;
|
|
@@ -33,25 +35,30 @@ type DynamicTableProps = ThemedClassName<{
|
|
|
33
35
|
*/
|
|
34
36
|
// TODO(burdon): Instead of creating component variants, create helpers/hooks that normalize the props.
|
|
35
37
|
// TODO(burdon): Warning: Cannot update a component (`DynamicTable`) while rendering a different component (`DynamicTable`).
|
|
36
|
-
export const DynamicTable = ({
|
|
38
|
+
export const DynamicTable = <T extends Type.AnyEntity = Type.AnyEntity>({
|
|
37
39
|
classNames,
|
|
38
|
-
|
|
40
|
+
schema,
|
|
41
|
+
name = 'com.example.dynamic-table', // Remove default or make random; this will lead to type collisions.
|
|
39
42
|
rows,
|
|
40
43
|
properties,
|
|
41
|
-
jsonSchema:
|
|
42
|
-
schema,
|
|
44
|
+
jsonSchema: jsonSchemaProp,
|
|
43
45
|
rowActions,
|
|
44
46
|
onRowClick,
|
|
45
47
|
onRowAction,
|
|
46
48
|
...props
|
|
47
|
-
}: DynamicTableProps) => {
|
|
49
|
+
}: DynamicTableProps<T>) => {
|
|
50
|
+
const registry = useContext(RegistryContext);
|
|
51
|
+
const [dynamicTable, setDynamicTable] = useState<{ object: TableType.Table; projection: ProjectionModel }>();
|
|
52
|
+
|
|
48
53
|
// TODO(burdon): Remove variance from the props (should be normalized externally; possibly via hooks).
|
|
49
54
|
const { jsonSchema } = useMemo(
|
|
50
|
-
() => getBaseSchema({ typename: name, properties, jsonSchema:
|
|
51
|
-
[name, properties,
|
|
55
|
+
() => getBaseSchema({ typename: name, properties, jsonSchema: jsonSchemaProp, schema }),
|
|
56
|
+
[name, properties, jsonSchemaProp, schema],
|
|
52
57
|
);
|
|
53
58
|
|
|
54
|
-
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
setDynamicTable(makeDynamicTable({ registry, jsonSchema, properties }));
|
|
61
|
+
}, [registry, jsonSchema, properties]);
|
|
55
62
|
|
|
56
63
|
const tableRef = useRef<TableController>(null);
|
|
57
64
|
const handleCellUpdate = useCallback((cell: any) => {
|
|
@@ -71,18 +78,10 @@ export const DynamicTable = ({
|
|
|
71
78
|
}) as const,
|
|
72
79
|
);
|
|
73
80
|
|
|
74
|
-
const projectionModel = useMemo(() => {
|
|
75
|
-
if (jsonSchema && projection) {
|
|
76
|
-
const model = new ProjectionModel(jsonSchema, projection);
|
|
77
|
-
model.normalizeView();
|
|
78
|
-
return model;
|
|
79
|
-
}
|
|
80
|
-
}, [jsonSchema, projection]);
|
|
81
|
-
|
|
82
81
|
const model = useTableModel({
|
|
83
82
|
rows,
|
|
84
|
-
object,
|
|
85
|
-
projection:
|
|
83
|
+
object: dynamicTable?.object,
|
|
84
|
+
projection: dynamicTable?.projection,
|
|
86
85
|
features,
|
|
87
86
|
rowActions,
|
|
88
87
|
onCellUpdate: handleCellUpdate,
|
|
@@ -92,22 +91,15 @@ export const DynamicTable = ({
|
|
|
92
91
|
|
|
93
92
|
const presentation = useMemo(() => {
|
|
94
93
|
if (model) {
|
|
95
|
-
return new TablePresentation(model);
|
|
94
|
+
return new TablePresentation(registry, model);
|
|
96
95
|
}
|
|
97
|
-
}, [model]);
|
|
96
|
+
}, [registry, model]);
|
|
98
97
|
|
|
99
|
-
// TODO(burdon): Do we need the outer divs?
|
|
100
98
|
return (
|
|
101
|
-
<div role='none' className={mx('
|
|
102
|
-
<div role='none' className='grid min-
|
|
103
|
-
<Table.Root>
|
|
104
|
-
<Table.
|
|
105
|
-
ref={tableRef}
|
|
106
|
-
model={model}
|
|
107
|
-
presentation={presentation}
|
|
108
|
-
ignoreAttention
|
|
109
|
-
onRowClick={onRowClick}
|
|
110
|
-
/>
|
|
99
|
+
<div role='none' className={mx('dx-expander grid', classNames)}>
|
|
100
|
+
<div role='none' className='grid min-h-0 overflow-hidden'>
|
|
101
|
+
<Table.Root ref={tableRef}>
|
|
102
|
+
<Table.Content model={model} presentation={presentation} ignoreAttention onRowClick={onRowClick} />
|
|
111
103
|
</Table.Root>
|
|
112
104
|
</div>
|
|
113
105
|
</div>
|