@dxos/react-ui-table 0.8.3 → 0.8.4-main.28f8d3d

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 (143) hide show
  1. package/dist/lib/browser/chunk-L2LSB6KV.mjs +18 -0
  2. package/dist/lib/browser/chunk-L2LSB6KV.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-ZAOSIG3L.mjs +1814 -0
  4. package/dist/lib/browser/chunk-ZAOSIG3L.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +728 -2104
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +123 -0
  9. package/dist/lib/browser/testing/index.mjs.map +7 -0
  10. package/dist/lib/browser/types/index.mjs +3 -5
  11. package/dist/lib/node-esm/chunk-NXZ4CJYX.mjs +20 -0
  12. package/dist/lib/node-esm/chunk-NXZ4CJYX.mjs.map +7 -0
  13. package/dist/lib/node-esm/chunk-ZOFFI3JJ.mjs +1815 -0
  14. package/dist/lib/node-esm/chunk-ZOFFI3JJ.mjs.map +7 -0
  15. package/dist/lib/node-esm/index.mjs +728 -2104
  16. package/dist/lib/node-esm/index.mjs.map +4 -4
  17. package/dist/lib/node-esm/meta.json +1 -1
  18. package/dist/lib/node-esm/testing/index.mjs +124 -0
  19. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  20. package/dist/lib/node-esm/types/index.mjs +3 -5
  21. package/dist/types/src/components/Table/ColumnActionsMenu.d.ts +1 -1
  22. package/dist/types/src/components/Table/ColumnActionsMenu.d.ts.map +1 -1
  23. package/dist/types/src/components/Table/ColumnSettings.d.ts +4 -2
  24. package/dist/types/src/components/Table/ColumnSettings.d.ts.map +1 -1
  25. package/dist/types/src/components/Table/CreateRefPanel.d.ts +1 -1
  26. package/dist/types/src/components/Table/CreateRefPanel.d.ts.map +1 -1
  27. package/dist/types/src/components/Table/DynamicTable.d.ts +1 -1
  28. package/dist/types/src/components/Table/DynamicTable.d.ts.map +1 -1
  29. package/dist/types/src/components/Table/DynamicTable.stories.d.ts +1 -1
  30. package/dist/types/src/components/Table/DynamicTable.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Table/{relations.stories.d.ts → Relations.stories.d.ts} +2 -2
  32. package/dist/types/src/components/Table/Relations.stories.d.ts.map +1 -0
  33. package/dist/types/src/components/Table/RowActionsMenu.d.ts +1 -1
  34. package/dist/types/src/components/Table/RowActionsMenu.d.ts.map +1 -1
  35. package/dist/types/src/components/Table/Table.d.ts +1 -0
  36. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  37. package/dist/types/src/components/Table/Table.stories.d.ts +1 -1
  38. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/TableCellEditor/CellValidationMessage.d.ts +2 -1
  40. package/dist/types/src/components/TableCellEditor/CellValidationMessage.d.ts.map +1 -1
  41. package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts +2 -1
  42. package/dist/types/src/components/TableCellEditor/FormCellEditor.d.ts.map +1 -1
  43. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts +8 -7
  44. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -1
  45. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts +1 -1
  46. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -1
  47. package/dist/types/src/components/TableCellEditor/extension.d.ts.map +1 -1
  48. package/dist/types/src/components/TableToolbar/TableToolbar.d.ts.map +1 -1
  49. package/dist/types/src/components/testing.d.ts +3 -40
  50. package/dist/types/src/components/testing.d.ts.map +1 -1
  51. package/dist/types/src/hooks/index.d.ts +1 -0
  52. package/dist/types/src/hooks/index.d.ts.map +1 -1
  53. package/dist/types/src/hooks/useAddRow.d.ts +13 -0
  54. package/dist/types/src/hooks/useAddRow.d.ts.map +1 -0
  55. package/dist/types/src/hooks/useTableModel.d.ts +8 -7
  56. package/dist/types/src/hooks/useTableModel.d.ts.map +1 -1
  57. package/dist/types/src/index.d.ts +1 -2
  58. package/dist/types/src/index.d.ts.map +1 -1
  59. package/dist/types/src/model/modal-controller.d.ts.map +1 -1
  60. package/dist/types/src/model/selection-model.d.ts +2 -1
  61. package/dist/types/src/model/selection-model.d.ts.map +1 -1
  62. package/dist/types/src/model/table-model.d.ts +58 -21
  63. package/dist/types/src/model/table-model.d.ts.map +1 -1
  64. package/dist/types/src/model/table-presentation.d.ts +10 -1
  65. package/dist/types/src/model/table-presentation.d.ts.map +1 -1
  66. package/dist/types/src/model/table-sorting.d.ts +4 -4
  67. package/dist/types/src/model/table-sorting.d.ts.map +1 -1
  68. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  69. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  70. package/dist/types/src/testing/index.d.ts +2 -0
  71. package/dist/types/src/testing/index.d.ts.map +1 -0
  72. package/dist/types/src/testing/useTestTableModel.d.ts +41 -0
  73. package/dist/types/src/testing/useTestTableModel.d.ts.map +1 -0
  74. package/dist/types/src/translations.d.ts +5 -6
  75. package/dist/types/src/translations.d.ts.map +1 -1
  76. package/dist/types/src/types/index.d.ts +1 -1
  77. package/dist/types/src/types/index.d.ts.map +1 -1
  78. package/dist/types/src/types/schema.d.ts +8 -0
  79. package/dist/types/src/types/schema.d.ts.map +1 -0
  80. package/dist/types/src/util/dynamic-table.d.ts +3 -4
  81. package/dist/types/src/util/dynamic-table.d.ts.map +1 -1
  82. package/dist/types/src/util/table-buttons.d.ts +15 -1
  83. package/dist/types/src/util/table-buttons.d.ts.map +1 -1
  84. package/dist/types/src/util/table-controls.d.ts.map +1 -1
  85. package/dist/types/src/util/table.d.ts +9 -11
  86. package/dist/types/src/util/table.d.ts.map +1 -1
  87. package/dist/types/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +52 -40
  89. package/src/components/Table/ColumnActionsMenu.tsx +1 -1
  90. package/src/components/Table/ColumnSettings.tsx +15 -11
  91. package/src/components/Table/CreateRefPanel.tsx +6 -4
  92. package/src/components/Table/DynamicTable.stories.tsx +4 -3
  93. package/src/components/Table/DynamicTable.tsx +17 -10
  94. package/src/components/Table/{relations.stories.tsx → Relations.stories.tsx} +37 -37
  95. package/src/components/Table/RowActionsMenu.tsx +3 -3
  96. package/src/components/Table/Table.stories.tsx +109 -148
  97. package/src/components/Table/Table.tsx +95 -66
  98. package/src/components/TableCellEditor/CellValidationMessage.tsx +7 -2
  99. package/src/components/TableCellEditor/FormCellEditor.tsx +30 -21
  100. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +27 -30
  101. package/src/components/TableCellEditor/TableCellEditor.tsx +88 -34
  102. package/src/components/TableCellEditor/extension.ts +2 -2
  103. package/src/components/TableToolbar/TableToolbar.tsx +2 -2
  104. package/src/components/testing.ts +7 -24
  105. package/src/hooks/index.ts +1 -0
  106. package/src/hooks/useAddRow.ts +36 -0
  107. package/src/hooks/useTableModel.ts +21 -17
  108. package/src/index.ts +1 -2
  109. package/src/model/modal-controller.ts +1 -1
  110. package/src/model/selection-model.ts +6 -3
  111. package/src/model/table-model.test.ts +8 -8
  112. package/src/model/table-model.ts +278 -86
  113. package/src/model/table-presentation.test.ts +8 -8
  114. package/src/model/table-presentation.ts +240 -135
  115. package/src/model/table-sorting.ts +11 -11
  116. package/src/playwright/playwright.config.ts +17 -0
  117. package/src/playwright/smoke.spec.ts +113 -20
  118. package/src/testing/index.ts +5 -0
  119. package/src/testing/useTestTableModel.ts +123 -0
  120. package/src/translations.ts +7 -5
  121. package/src/types/index.ts +2 -2
  122. package/src/types/schema.ts +16 -0
  123. package/src/util/dynamic-table.ts +20 -18
  124. package/src/util/schema.ts +1 -1
  125. package/src/util/table-buttons.ts +26 -2
  126. package/src/util/table-controls.ts +4 -1
  127. package/src/util/table.ts +37 -111
  128. package/dist/lib/browser/chunk-TL7CKQQV.mjs +0 -27
  129. package/dist/lib/browser/chunk-TL7CKQQV.mjs.map +0 -7
  130. package/dist/lib/node/chunk-O2VPBNS5.cjs +0 -50
  131. package/dist/lib/node/chunk-O2VPBNS5.cjs.map +0 -7
  132. package/dist/lib/node/index.cjs +0 -2739
  133. package/dist/lib/node/index.cjs.map +0 -7
  134. package/dist/lib/node/meta.json +0 -1
  135. package/dist/lib/node/types/index.cjs +0 -31
  136. package/dist/lib/node/types/index.cjs.map +0 -7
  137. package/dist/lib/node-esm/chunk-GBT6GD4G.mjs +0 -29
  138. package/dist/lib/node-esm/chunk-GBT6GD4G.mjs.map +0 -7
  139. package/dist/types/src/components/Table/relations.stories.d.ts.map +0 -1
  140. package/dist/types/src/types/table.d.ts +0 -56
  141. package/dist/types/src/types/table.d.ts.map +0 -1
  142. package/src/playwright/playwright.config.cts +0 -18
  143. package/src/types/table.ts +0 -27
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-table",
3
- "version": "0.8.3",
3
+ "version": "0.8.4-main.28f8d3d",
4
4
  "description": "A table component.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,16 +10,25 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  "./deprecated": {
13
+ "source": "./src/deprecated/index.ts",
13
14
  "types": "./dist/types/src/deprecated/index.d.ts",
14
15
  "browser": "./dist/lib/browser/deprecated/index.mjs",
15
16
  "node": "./dist/lib/node-esm/deprecated/index.mjs"
16
17
  },
17
18
  ".": {
19
+ "source": "./src/index.ts",
18
20
  "types": "./dist/types/src/index.d.ts",
19
21
  "browser": "./dist/lib/browser/index.mjs",
20
22
  "node": "./dist/lib/node-esm/index.mjs"
21
23
  },
24
+ "./testing": {
25
+ "source": "./src/testing/index.ts",
26
+ "types": "./dist/types/src/testing/index.d.ts",
27
+ "browser": "./dist/lib/browser/testing/index.mjs",
28
+ "node": "./dist/lib/node-esm/testing/index.mjs"
29
+ },
22
30
  "./types": {
31
+ "source": "./src/types/index.ts",
23
32
  "types": "./dist/types/src/types/index.d.ts",
24
33
  "browser": "./dist/lib/browser/types/index.mjs",
25
34
  "node": "./dist/lib/node-esm/types/index.mjs"
@@ -31,6 +40,9 @@
31
40
  "deprecated": [
32
41
  "dist/types/src/deprecated/index.d.ts"
33
42
  ],
43
+ "testing": [
44
+ "dist/types/src/testing/index.d.ts"
45
+ ],
34
46
  "types": [
35
47
  "dist/types/src/types/index.d.ts"
36
48
  ]
@@ -53,60 +65,60 @@
53
65
  "@radix-ui/react-use-controllable-state": "1.1.0",
54
66
  "date-fns": "^3.3.1",
55
67
  "lodash.orderby": "^4.6.0",
56
- "@dxos/context": "0.8.3",
57
- "@dxos/debug": "0.8.3",
58
- "@dxos/echo": "0.8.3",
59
- "@dxos/invariant": "0.8.3",
60
- "@dxos/keys": "0.8.3",
61
- "@dxos/effect": "0.8.3",
62
- "@dxos/lit-grid": "0.8.3",
63
- "@dxos/live-object": "0.8.3",
64
- "@dxos/echo-schema": "0.8.3",
65
- "@dxos/log": "0.8.3",
66
- "@dxos/plugin-search": "0.8.3",
67
- "@dxos/react-client": "0.8.3",
68
- "@dxos/react-ui-attention": "0.8.3",
69
- "@dxos/plugin-space": "0.8.3",
70
- "@dxos/react-ui-editor": "0.8.3",
71
- "@dxos/react-ui-form": "0.8.3",
72
- "@dxos/react-ui-grid": "0.8.3",
73
- "@dxos/react-ui-menu": "0.8.3",
74
- "@dxos/react-ui-searchlist": "0.8.3",
75
- "@dxos/react-ui-syntax-highlighter": "0.8.3",
76
- "@dxos/react-ui-tag-picker": "0.8.3",
77
- "@dxos/react-ui-stack": "0.8.3",
78
- "@dxos/react-ui-types": "0.8.3",
79
- "@dxos/util": "0.8.3",
80
- "@dxos/schema": "0.8.3"
68
+ "@dxos/context": "0.8.4-main.28f8d3d",
69
+ "@dxos/debug": "0.8.4-main.28f8d3d",
70
+ "@dxos/echo": "0.8.4-main.28f8d3d",
71
+ "@dxos/echo-db": "0.8.4-main.28f8d3d",
72
+ "@dxos/echo-schema": "0.8.4-main.28f8d3d",
73
+ "@dxos/effect": "0.8.4-main.28f8d3d",
74
+ "@dxos/keys": "0.8.4-main.28f8d3d",
75
+ "@dxos/lit-grid": "0.8.4-main.28f8d3d",
76
+ "@dxos/live-object": "0.8.4-main.28f8d3d",
77
+ "@dxos/log": "0.8.4-main.28f8d3d",
78
+ "@dxos/invariant": "0.8.4-main.28f8d3d",
79
+ "@dxos/plugin-search": "0.8.4-main.28f8d3d",
80
+ "@dxos/react-client": "0.8.4-main.28f8d3d",
81
+ "@dxos/react-ui-attention": "0.8.4-main.28f8d3d",
82
+ "@dxos/random": "0.8.4-main.28f8d3d",
83
+ "@dxos/react-ui-form": "0.8.4-main.28f8d3d",
84
+ "@dxos/react-ui-editor": "0.8.4-main.28f8d3d",
85
+ "@dxos/react-ui-grid": "0.8.4-main.28f8d3d",
86
+ "@dxos/react-ui-menu": "0.8.4-main.28f8d3d",
87
+ "@dxos/react-ui-searchlist": "0.8.4-main.28f8d3d",
88
+ "@dxos/react-ui-stack": "0.8.4-main.28f8d3d",
89
+ "@dxos/react-ui-tag-picker": "0.8.4-main.28f8d3d",
90
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.28f8d3d",
91
+ "@dxos/schema": "0.8.4-main.28f8d3d",
92
+ "@dxos/util": "0.8.4-main.28f8d3d",
93
+ "@dxos/react-ui-types": "0.8.4-main.28f8d3d"
81
94
  },
82
95
  "devDependencies": {
83
- "@effect-rx/rx-react": "^0.34.1",
84
- "@effect/platform": "0.80.12",
85
- "@phosphor-icons/react": "^2.1.5",
96
+ "@effect-rx/rx-react": "0.38.0",
97
+ "@effect/platform": "0.90.2",
86
98
  "@types/lodash.orderby": "^4.6.9",
87
99
  "@types/react": "~18.2.0",
88
100
  "@types/react-dom": "~18.2.0",
89
- "effect": "3.14.21",
101
+ "effect": "3.17.7",
90
102
  "fast-check": "^3.19.0",
91
103
  "react": "~18.2.0",
92
104
  "react-dom": "~18.2.0",
93
105
  "vite": "5.4.7",
94
- "@dxos/random": "0.8.3",
95
- "@dxos/echo-signals": "0.8.3",
96
- "@dxos/storybook-utils": "0.8.3",
97
- "@dxos/react-ui": "0.8.3",
98
- "@dxos/react-ui-theme": "0.8.3",
99
- "@dxos/test-utils": "0.8.3"
106
+ "@dxos/echo-signals": "0.8.4-main.28f8d3d",
107
+ "@dxos/plugin-search": "0.8.4-main.28f8d3d",
108
+ "@dxos/react-ui-theme": "0.8.4-main.28f8d3d",
109
+ "@dxos/storybook-utils": "0.8.4-main.28f8d3d",
110
+ "@dxos/react-ui": "0.8.4-main.28f8d3d",
111
+ "@dxos/test-utils": "0.8.4-main.28f8d3d",
112
+ "@dxos/random": "0.8.4-main.28f8d3d"
100
113
  },
101
114
  "peerDependencies": {
102
115
  "@effect-rx/rx-react": "^0.34.1",
103
- "@effect/platform": "0.80.12",
104
- "@phosphor-icons/react": "^2.1.5",
116
+ "@effect/platform": "^0.80.12",
105
117
  "effect": "^3.13.3",
106
118
  "react": "~18.2.0",
107
119
  "react-dom": "~18.2.0",
108
- "@dxos/react-ui": "0.8.3",
109
- "@dxos/react-ui-theme": "0.8.3"
120
+ "@dxos/react-ui": "0.8.4-main.28f8d3d",
121
+ "@dxos/react-ui-theme": "0.8.4-main.28f8d3d"
110
122
  },
111
123
  "publishConfig": {
112
124
  "access": "public"
@@ -6,7 +6,7 @@ import React from 'react';
6
6
 
7
7
  import { DropdownMenu, useTranslation } from '@dxos/react-ui';
8
8
 
9
- import { type TableModel, type ModalController } from '../../model';
9
+ import { type ModalController, type TableModel } from '../../model';
10
10
  import { translationKey } from '../../translations';
11
11
 
12
12
  type ColumnActionsMenuProps = { model: TableModel; modals: ModalController };
@@ -4,20 +4,25 @@
4
4
 
5
5
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
6
6
 
7
+ // TODO(burdon): Remove dependency on echo-db.
8
+ import { type SchemaRegistry } from '@dxos/echo-db';
7
9
  import { Popover } from '@dxos/react-ui';
8
10
  import { FieldEditor } from '@dxos/react-ui-form';
9
11
  import { type FieldType } from '@dxos/schema';
10
12
 
11
- import { type TableModel, type ModalController } from '../../model';
13
+ import { type ModalController, type TableModel } from '../../model';
12
14
 
13
- type ColumnSettingsProps = { model?: TableModel; modals: ModalController; onNewColumn: () => void };
15
+ type ColumnSettingsProps = {
16
+ registry?: SchemaRegistry;
17
+ model?: TableModel;
18
+ modals: ModalController;
19
+ onNewColumn: () => void;
20
+ };
14
21
 
15
- export const ColumnSettings = ({ model, modals, onNewColumn }: ColumnSettingsProps) => {
22
+ export const ColumnSettings = ({ registry, model, modals, onNewColumn }: ColumnSettingsProps) => {
16
23
  const [newField, setNewField] = useState<FieldType>();
17
24
  const state = modals.state.value;
18
25
 
19
- const space = model?.space;
20
-
21
26
  useEffect(() => {
22
27
  if (state?.type === 'columnSettings' && state.mode.type === 'create' && model?.projection) {
23
28
  setNewField(model.projection.createFieldProjection());
@@ -33,11 +38,11 @@ export const ColumnSettings = ({ model, modals, onNewColumn }: ColumnSettingsPro
33
38
  if (state?.type === 'columnSettings') {
34
39
  const { mode } = state;
35
40
  if (mode.type === 'edit') {
36
- return model?.view?.fields.find((f) => f.id === mode.fieldId);
41
+ return model?.projection?.fields.find((f) => f.id === mode.fieldId);
37
42
  }
38
43
  }
39
44
  return undefined;
40
- }, [model?.view?.fields, state]);
45
+ }, [model?.projection?.fields, state]);
41
46
 
42
47
  const field = existingField ?? newField;
43
48
 
@@ -47,11 +52,11 @@ export const ColumnSettings = ({ model, modals, onNewColumn }: ColumnSettingsPro
47
52
 
48
53
  const handleCancel = useCallback(() => {
49
54
  if (state?.type === 'columnSettings' && state.mode.type === 'create' && newField) {
50
- model?.projection?.deleteFieldProjection(newField.id);
55
+ model?.projection.deleteFieldProjection(newField.id);
51
56
  }
52
57
  }, [model?.projection, state, newField]);
53
58
 
54
- if (!model?.view || !model.projection || !field) {
59
+ if (!model?.projection || !field) {
55
60
  return null;
56
61
  }
57
62
 
@@ -62,10 +67,9 @@ export const ColumnSettings = ({ model, modals, onNewColumn }: ColumnSettingsPro
62
67
  <Popover.Content classNames='md:is-64'>
63
68
  <Popover.Viewport>
64
69
  <FieldEditor
65
- view={model.view!}
66
70
  projection={model.projection}
67
71
  field={field}
68
- registry={space?.db.schemaRegistry}
72
+ registry={registry}
69
73
  onSave={handleSave}
70
74
  onCancel={handleCancel}
71
75
  />
@@ -5,19 +5,21 @@
5
5
  import { Schema } from 'effect';
6
6
  import React, { useCallback, useMemo } from 'react';
7
7
 
8
- import { live } from '@dxos/react-client/echo';
8
+ import { live } from '@dxos/live-object';
9
+ // TODO(wittjosiah): Remove dependency on react-client.
10
+ import { getSpace } from '@dxos/react-client/echo';
9
11
  import { Popover } from '@dxos/react-ui';
10
12
  import { Form } from '@dxos/react-ui-form';
11
13
  import { type GridScopedProps, useGridContext } from '@dxos/react-ui-grid';
12
14
 
13
- import { type TableModel, type ModalController } from '../../model';
15
+ import { type ModalController, type TableModel } from '../../model';
14
16
 
15
17
  export type CreateRefPanelProps = { model?: TableModel; modals: ModalController };
16
18
 
17
19
  // TODO(burdon): Factor out Space dependency (to plugin?)
18
20
  export const CreateRefPanel = ({ model, modals, __gridScope }: GridScopedProps<CreateRefPanelProps>) => {
19
21
  const { id: gridId } = useGridContext('TableCellEditor', __gridScope);
20
- const space = model?.space;
22
+ const space = model && getSpace(model?.view);
21
23
  const state = modals.state.value;
22
24
 
23
25
  const schema = useMemo<Schema.Schema<any> | undefined>(() => {
@@ -54,7 +56,7 @@ export const CreateRefPanel = ({ model, modals, __gridScope }: GridScopedProps<C
54
56
  }
55
57
  }, [modals]);
56
58
 
57
- if (!model?.view || !model.projection) {
59
+ if (!model?.projection) {
58
60
  return null;
59
61
  }
60
62
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React, { useMemo, useState } from 'react';
9
9
 
10
10
  import { Obj } from '@dxos/echo';
@@ -17,9 +17,10 @@ import { type SchemaPropertyDefinition } from '@dxos/schema';
17
17
  import { Testing } from '@dxos/schema/testing';
18
18
  import { withLayout, withTheme } from '@dxos/storybook-utils';
19
19
 
20
- import { DynamicTable } from './DynamicTable';
21
20
  import { type TableFeatures } from '../../model';
22
- import translations from '../../translations';
21
+ import { translations } from '../../translations';
22
+
23
+ import { DynamicTable } from './DynamicTable';
23
24
 
24
25
  faker.seed(0);
25
26
 
@@ -3,16 +3,17 @@
3
3
  //
4
4
 
5
5
  import { type Schema } from 'effect';
6
- import React, { useRef, useMemo, useCallback } from 'react';
6
+ import React, { useCallback, useMemo, useRef } from 'react';
7
7
 
8
8
  import { type JsonSchemaType } from '@dxos/echo-schema';
9
9
  import { type ThemedClassName, useDefaultValue } from '@dxos/react-ui';
10
10
  import { mx } from '@dxos/react-ui-theme';
11
11
 
12
- import { Table, type TableController } from './Table';
13
12
  import { useTableModel } from '../../hooks';
14
13
  import { type TableFeatures, TablePresentation, type TableRowAction } from '../../model';
15
- import { getBaseSchema, makeDynamicTable, type TablePropertyDefinition } from '../../util';
14
+ import { type TablePropertyDefinition, getBaseSchema, makeDynamicTable } from '../../util';
15
+
16
+ import { Table, type TableController } from './Table';
16
17
 
17
18
  type DynamicTableProps = ThemedClassName<{
18
19
  name?: string; // TODO(burdon): Remove?
@@ -36,18 +37,23 @@ export const DynamicTable = ({
36
37
  name = 'example.com/dynamic-table', // Rmove default or make random; this will lead to type collisions.
37
38
  rows,
38
39
  properties,
39
- jsonSchema,
40
+ jsonSchema: _jsonSchema,
40
41
  schema,
41
42
  rowActions,
42
43
  onRowClick,
43
44
  onRowAction,
44
45
  ...props
45
46
  }: DynamicTableProps) => {
46
- const { table, projection } = useMemo(() => {
47
- // TODO(burdon): Remove variance from the props (should be normalized externally; possibly via hooks).
48
- const props = getBaseSchema({ typename: name, properties, jsonSchema, schema });
49
- return makeDynamicTable({ ...props, properties });
50
- }, [name, properties, schema, jsonSchema]);
47
+ // TODO(burdon): Remove variance from the props (should be normalized externally; possibly via hooks).
48
+ const { typename, jsonSchema } = useMemo(
49
+ () => getBaseSchema({ typename: name, properties, jsonSchema: _jsonSchema, schema }),
50
+ [name, properties, _jsonSchema, schema],
51
+ );
52
+
53
+ const { projection, view } = useMemo(
54
+ () => makeDynamicTable({ typename, jsonSchema, properties }),
55
+ [typename, jsonSchema, properties],
56
+ );
51
57
 
52
58
  const tableRef = useRef<TableController>(null);
53
59
  const handleCellUpdate = useCallback((cell: any) => {
@@ -68,8 +74,9 @@ export const DynamicTable = ({
68
74
  );
69
75
 
70
76
  const model = useTableModel({
71
- table,
72
77
  rows,
78
+ view,
79
+ schema: jsonSchema,
73
80
  projection,
74
81
  features,
75
82
  rowActions,
@@ -4,27 +4,25 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react';
8
- import { SchemaAST } from 'effect';
9
- import React, { useEffect, useMemo } from 'react';
10
-
11
- import { Obj, type Type } from '@dxos/echo';
12
- import { getSchemaTypename, toJsonSchema } from '@dxos/echo-schema';
13
- import { getAnnotation } from '@dxos/effect';
14
- import { invariant } from '@dxos/invariant';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
+ import React, { useEffect, useMemo, useState } from 'react';
9
+
10
+ import { Type } from '@dxos/echo';
11
+ import { type JsonSchemaType } from '@dxos/echo-schema';
15
12
  import { faker } from '@dxos/random';
16
13
  import { useClient } from '@dxos/react-client';
17
- import { makeRef } from '@dxos/react-client/echo';
18
14
  import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
19
- import { DataType, createView, ViewProjection, ViewType } from '@dxos/schema';
20
- import { createAsyncGenerator, type ValueGenerator } from '@dxos/schema/testing';
15
+ import { DataType } from '@dxos/schema';
16
+ import { type ValueGenerator, createAsyncGenerator } from '@dxos/schema/testing';
21
17
  import { withLayout, withTheme } from '@dxos/storybook-utils';
22
18
 
23
- import { Table } from './Table';
24
19
  import { useTableModel } from '../../hooks';
25
20
  import { type TableFeatures, TablePresentation, type TableRow } from '../../model';
26
- import translations from '../../translations';
27
- import { TableType } from '../../types';
21
+ import { translations } from '../../translations';
22
+ import { TableView } from '../../types';
23
+ import { createTable } from '../../util';
24
+
25
+ import { Table } from './Table';
28
26
 
29
27
  faker.seed(1);
30
28
  const generator: ValueGenerator = faker as any;
@@ -34,35 +32,37 @@ const generator: ValueGenerator = faker as any;
34
32
  // TODO(burdon): Reconcile schemas types and utils (see API PR).
35
33
  // TODO(burdon): Base type for T (with id); see ECHO API PR?
36
34
  const useTestModel = <S extends Type.Obj.Any>(schema: S, count: number) => {
35
+ const client = useClient();
37
36
  const { space } = useClientProvider();
38
-
39
- const jsonSchema = useMemo(() => toJsonSchema(schema), [schema]);
40
- const table = useMemo(() => {
41
- if (!space) {
42
- return undefined;
43
- }
44
- const typename = getSchemaTypename(schema);
45
- invariant(typename);
46
- const name = getAnnotation<string>(SchemaAST.TitleAnnotationId)(schema.ast) ?? typename;
47
- const view = createView({ name, typename, jsonSchema });
48
- return space.db.add(Obj.make(TableType, { view: makeRef(view) }));
49
- }, [schema, space, jsonSchema]);
50
-
51
- const projection = useMemo(() => {
52
- if (!table?.view?.target) {
53
- return undefined;
54
- }
55
-
56
- // TODO(burdon): Just pass in view? Reuse same jsonSchema instance? View determines if mutable, etc.
57
- return new ViewProjection(jsonSchema, table.view.target);
58
- }, [jsonSchema, table]);
37
+ const [view, setView] = useState<DataType.View>();
38
+ const [jsonSchema, setJsonSchema] = useState<JsonSchemaType>();
59
39
 
60
40
  const features = useMemo<TableFeatures>(
61
41
  () => ({ schemaEditable: false, dataEditable: true, selection: { enabled: false } }),
62
42
  [],
63
43
  );
64
44
 
65
- const model = useTableModel<TableRow>({ table, projection, rows: [], features });
45
+ useEffect(() => {
46
+ if (!space) {
47
+ return;
48
+ }
49
+
50
+ const timeout = setTimeout(async () => {
51
+ const {
52
+ jsonSchema,
53
+ schema: effectSchema,
54
+ view,
55
+ } = await createTable({ client, space, typename: Type.getTypename(schema) });
56
+ setJsonSchema(jsonSchema);
57
+ setView(view);
58
+ space.db.add(view);
59
+ await space.db.schemaRegistry.register([effectSchema]);
60
+ });
61
+ return () => clearTimeout(timeout);
62
+ }, [client, space, schema]);
63
+
64
+ const model = useTableModel<TableRow>({ view, schema: jsonSchema, rows: [], features });
65
+
66
66
  useEffect(() => {
67
67
  if (!model || !space) {
68
68
  return;
@@ -108,7 +108,7 @@ const meta: Meta<typeof DefaultStory> = {
108
108
  parameters: { translations, controls: { disable: true } },
109
109
  decorators: [
110
110
  withClientProvider({
111
- types: [TableType, ViewType, DataType.Organization, DataType.Person],
111
+ types: [DataType.View, DataType.Organization, DataType.Person, TableView],
112
112
  createIdentity: true,
113
113
  createSpace: true,
114
114
  }),
@@ -4,9 +4,9 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { DropdownMenu, useTranslation } from '@dxos/react-ui';
7
+ import { DropdownMenu, toLocalizedString, useTranslation } from '@dxos/react-ui';
8
8
 
9
- import { type TableModel, type ModalController } from '../../model';
9
+ import { type ModalController, type TableModel } from '../../model';
10
10
  import { translationKey } from '../../translations';
11
11
 
12
12
  type RowActionsMenuProps = { model: TableModel; modals: ModalController };
@@ -38,7 +38,7 @@ export const RowActionsMenu = ({ model, modals }: RowActionsMenuProps) => {
38
38
  model.handleRowAction(action.id, state.rowIndex);
39
39
  }}
40
40
  >
41
- {t(action.translationKey)}
41
+ {toLocalizedString(action.label, t)}
42
42
  </DropdownMenu.Item>
43
43
  ))}
44
44
  </DropdownMenu.Viewport>