@dxos/react-ui-table 0.6.14-main.f49f251 → 0.6.14-staging.4b6f9cf

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 (242) hide show
  1. package/dist/lib/browser/_deprecated/index.mjs +1483 -0
  2. package/dist/lib/browser/_deprecated/index.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-A5W4XWPD.mjs +18 -0
  4. package/dist/lib/browser/chunk-A5W4XWPD.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +1277 -1356
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/types/index.mjs +7 -0
  9. package/dist/lib/browser/types/index.mjs.map +7 -0
  10. package/dist/lib/node/_deprecated/index.cjs +1511 -0
  11. package/dist/lib/node/_deprecated/index.cjs.map +7 -0
  12. package/dist/lib/node/chunk-32IGMRME.cjs +40 -0
  13. package/dist/lib/node/chunk-32IGMRME.cjs.map +7 -0
  14. package/dist/lib/node/index.cjs +1383 -0
  15. package/dist/lib/node/index.cjs.map +7 -0
  16. package/dist/lib/node/meta.json +1 -0
  17. package/dist/lib/node/types/index.cjs +29 -0
  18. package/dist/lib/node/types/index.cjs.map +7 -0
  19. package/dist/lib/node-esm/_deprecated/index.mjs +1485 -0
  20. package/dist/lib/node-esm/_deprecated/index.mjs.map +7 -0
  21. package/dist/lib/node-esm/chunk-DWQ4KGLD.mjs +20 -0
  22. package/dist/lib/node-esm/chunk-DWQ4KGLD.mjs.map +7 -0
  23. package/dist/lib/node-esm/index.mjs +1402 -0
  24. package/dist/lib/node-esm/index.mjs.map +7 -0
  25. package/dist/lib/node-esm/meta.json +1 -0
  26. package/dist/lib/node-esm/types/index.mjs +8 -0
  27. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  28. package/dist/types/src/_deprecated/components/Cell/Cell.d.ts.map +1 -0
  29. package/dist/types/src/_deprecated/components/Cell/CellCombobox.d.ts.map +1 -0
  30. package/dist/types/src/_deprecated/components/Cell/index.d.ts.map +1 -0
  31. package/dist/types/src/_deprecated/components/ColumnMenu/ColumnMenu.d.ts.map +1 -0
  32. package/dist/types/src/_deprecated/components/ColumnMenu/ColumnMenu.stories.d.ts.map +1 -0
  33. package/dist/types/src/_deprecated/components/ColumnMenu/ColumnSettings.d.ts.map +1 -0
  34. package/dist/types/src/{components → _deprecated/components}/ColumnMenu/ColumnSettings.stories.d.ts +4 -4
  35. package/dist/types/src/_deprecated/components/ColumnMenu/ColumnSettings.stories.d.ts.map +1 -0
  36. package/dist/types/src/_deprecated/components/ColumnMenu/index.d.ts.map +1 -0
  37. package/dist/types/src/_deprecated/components/Table/Table.d.ts +20 -0
  38. package/dist/types/src/_deprecated/components/Table/Table.d.ts.map +1 -0
  39. package/dist/types/src/_deprecated/components/Table/Table.stories.d.ts +116 -0
  40. package/dist/types/src/_deprecated/components/Table/Table.stories.d.ts.map +1 -0
  41. package/dist/types/src/_deprecated/components/Table/TableBody.d.ts.map +1 -0
  42. package/dist/types/src/_deprecated/components/Table/TableContext.d.ts.map +1 -0
  43. package/dist/types/src/_deprecated/components/Table/TableHead.d.ts.map +1 -0
  44. package/dist/types/src/_deprecated/components/Table/TableRootContext.d.ts.map +1 -0
  45. package/dist/types/src/_deprecated/components/Table/index.d.ts +5 -0
  46. package/dist/types/src/_deprecated/components/Table/index.d.ts.map +1 -0
  47. package/dist/types/src/_deprecated/components/Table/props.d.ts.map +1 -0
  48. package/dist/types/src/_deprecated/components/index.d.ts +4 -0
  49. package/dist/types/src/_deprecated/components/index.d.ts.map +1 -0
  50. package/dist/types/src/_deprecated/helpers.d.ts.map +1 -0
  51. package/dist/types/src/_deprecated/hooks/index.d.ts +5 -0
  52. package/dist/types/src/_deprecated/hooks/index.d.ts.map +1 -0
  53. package/dist/types/src/_deprecated/hooks/useColumnSizing.d.ts.map +1 -0
  54. package/dist/types/src/{hooks → _deprecated/hooks}/useColumnSorting.d.ts +1 -1
  55. package/dist/types/src/_deprecated/hooks/useColumnSorting.d.ts.map +1 -0
  56. package/dist/types/src/_deprecated/hooks/usePinLastRow.d.ts.map +1 -0
  57. package/dist/types/src/_deprecated/hooks/useRowSelection.d.ts.map +1 -0
  58. package/dist/types/src/_deprecated/index.d.ts +8 -0
  59. package/dist/types/src/_deprecated/index.d.ts.map +1 -0
  60. package/dist/types/src/_deprecated/schema/Schema.stories.d.ts.map +1 -0
  61. package/dist/types/src/{schema → _deprecated/schema}/column-utils.d.ts +3 -0
  62. package/dist/types/src/_deprecated/schema/column-utils.d.ts.map +1 -0
  63. package/dist/types/src/_deprecated/schema/index.d.ts.map +1 -0
  64. package/dist/types/src/{schema → _deprecated/schema}/types.d.ts +3 -2
  65. package/dist/types/src/_deprecated/schema/types.d.ts.map +1 -0
  66. package/dist/types/src/_deprecated/theme.d.ts.map +1 -0
  67. package/dist/types/src/_deprecated/translations.d.ts +21 -0
  68. package/dist/types/src/_deprecated/translations.d.ts.map +1 -0
  69. package/dist/types/src/_deprecated/types.d.ts.map +1 -0
  70. package/dist/types/src/components/Table/ColumnActionsMenu.d.ts +8 -0
  71. package/dist/types/src/components/Table/ColumnActionsMenu.d.ts.map +1 -0
  72. package/dist/types/src/components/Table/ColumnSettings.d.ts +8 -0
  73. package/dist/types/src/components/Table/ColumnSettings.d.ts.map +1 -0
  74. package/dist/types/src/components/Table/RowActionsMenu.d.ts +8 -0
  75. package/dist/types/src/components/Table/RowActionsMenu.d.ts.map +1 -0
  76. package/dist/types/src/components/Table/Table.d.ts +11 -14
  77. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  78. package/dist/types/src/components/Table/Table.stories.d.ts +10 -113
  79. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/Table/index.d.ts +0 -3
  81. package/dist/types/src/components/Table/index.d.ts.map +1 -1
  82. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts +17 -0
  83. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -0
  84. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts +11 -0
  85. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -0
  86. package/dist/types/src/components/TableCellEditor/extension.d.ts +12 -0
  87. package/dist/types/src/components/TableCellEditor/extension.d.ts.map +1 -0
  88. package/dist/types/src/components/TableCellEditor/index.d.ts +2 -0
  89. package/dist/types/src/components/TableCellEditor/index.d.ts.map +1 -0
  90. package/dist/types/src/components/Toolbar/Toolbar.d.ts +21 -0
  91. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
  92. package/dist/types/src/components/Toolbar/common.d.ts +20 -0
  93. package/dist/types/src/components/Toolbar/common.d.ts.map +1 -0
  94. package/dist/types/src/components/Toolbar/index.d.ts +2 -0
  95. package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
  96. package/dist/types/src/components/index.d.ts +1 -2
  97. package/dist/types/src/components/index.d.ts.map +1 -1
  98. package/dist/types/src/components/testing.d.ts +97 -0
  99. package/dist/types/src/components/testing.d.ts.map +1 -0
  100. package/dist/types/src/hooks/index.d.ts +1 -4
  101. package/dist/types/src/hooks/index.d.ts.map +1 -1
  102. package/dist/types/src/hooks/useTableModel.d.ts +15 -0
  103. package/dist/types/src/hooks/useTableModel.d.ts.map +1 -0
  104. package/dist/types/src/index.d.ts +3 -4
  105. package/dist/types/src/index.d.ts.map +1 -1
  106. package/dist/types/src/model/index.d.ts +3 -0
  107. package/dist/types/src/model/index.d.ts.map +1 -0
  108. package/dist/types/src/model/modal-controller.d.ts +29 -0
  109. package/dist/types/src/model/modal-controller.d.ts.map +1 -0
  110. package/dist/types/src/model/selection-model.d.ts +22 -0
  111. package/dist/types/src/model/selection-model.d.ts.map +1 -0
  112. package/dist/types/src/model/table-model.d.ts +93 -0
  113. package/dist/types/src/model/table-model.d.ts.map +1 -0
  114. package/dist/types/src/model/table-model.test.d.ts +2 -0
  115. package/dist/types/src/model/table-model.test.d.ts.map +1 -0
  116. package/dist/types/src/translations.d.ts +23 -16
  117. package/dist/types/src/translations.d.ts.map +1 -1
  118. package/dist/types/src/types/index.d.ts +2 -0
  119. package/dist/types/src/types/index.d.ts.map +1 -0
  120. package/dist/types/src/types/table.d.ts +106 -0
  121. package/dist/types/src/types/table.d.ts.map +1 -0
  122. package/dist/types/src/util/grid.d.ts +14 -0
  123. package/dist/types/src/util/grid.d.ts.map +1 -0
  124. package/dist/types/src/util/index.d.ts +5 -0
  125. package/dist/types/src/util/index.d.ts.map +1 -0
  126. package/dist/types/src/util/signals.d.ts +6 -0
  127. package/dist/types/src/util/signals.d.ts.map +1 -0
  128. package/dist/types/src/util/table-buttons.d.ts +24 -0
  129. package/dist/types/src/util/table-buttons.d.ts.map +1 -0
  130. package/dist/types/src/util/table-controls.d.ts +21 -0
  131. package/dist/types/src/util/table-controls.d.ts.map +1 -0
  132. package/dist/types/src/util/table.d.ts +8 -0
  133. package/dist/types/src/util/table.d.ts.map +1 -0
  134. package/package.json +56 -22
  135. package/src/{components → _deprecated/components}/ColumnMenu/ColumnMenu.stories.tsx +4 -4
  136. package/src/{components → _deprecated/components}/ColumnMenu/ColumnSettings.stories.tsx +9 -9
  137. package/src/{components → _deprecated/components}/ColumnMenu/ColumnSettings.tsx +3 -3
  138. package/src/_deprecated/components/Table/Table.stories.tsx +508 -0
  139. package/src/_deprecated/components/Table/Table.tsx +301 -0
  140. package/src/{components → _deprecated/components}/Table/TableHead.tsx +3 -1
  141. package/src/_deprecated/components/Table/index.ts +8 -0
  142. package/src/_deprecated/components/index.ts +7 -0
  143. package/src/{helpers.tsx → _deprecated/helpers.tsx} +4 -3
  144. package/src/_deprecated/hooks/index.ts +8 -0
  145. package/src/_deprecated/index.ts +12 -0
  146. package/src/_deprecated/schema/column-utils.ts +54 -0
  147. package/src/{schema → _deprecated/schema}/types.ts +3 -2
  148. package/src/_deprecated/translations.ts +26 -0
  149. package/src/components/Table/ColumnActionsMenu.tsx +60 -0
  150. package/src/components/Table/ColumnSettings.tsx +76 -0
  151. package/src/components/Table/RowActionsMenu.tsx +36 -0
  152. package/src/components/Table/Table.stories.tsx +197 -467
  153. package/src/components/Table/Table.tsx +174 -257
  154. package/src/components/Table/index.ts +1 -4
  155. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +114 -0
  156. package/src/components/TableCellEditor/TableCellEditor.tsx +155 -0
  157. package/src/components/TableCellEditor/extension.ts +62 -0
  158. package/src/components/TableCellEditor/index.ts +5 -0
  159. package/src/components/Toolbar/Toolbar.tsx +86 -0
  160. package/src/components/Toolbar/common.tsx +72 -0
  161. package/src/components/Toolbar/index.ts +5 -0
  162. package/src/components/index.ts +2 -3
  163. package/src/components/testing.ts +114 -0
  164. package/src/hooks/index.ts +1 -4
  165. package/src/hooks/useTableModel.ts +52 -0
  166. package/src/index.ts +5 -6
  167. package/src/model/index.ts +6 -0
  168. package/src/model/modal-controller.ts +83 -0
  169. package/src/model/selection-model.ts +99 -0
  170. package/src/model/table-model.test.ts +182 -0
  171. package/src/model/table-model.ts +565 -0
  172. package/src/translations.ts +20 -13
  173. package/src/types/index.ts +5 -0
  174. package/src/types/table.ts +13 -0
  175. package/src/util/grid.ts +23 -0
  176. package/src/util/index.ts +8 -0
  177. package/src/util/signals.ts +9 -0
  178. package/src/util/table-buttons.ts +48 -0
  179. package/src/util/table-controls.ts +27 -0
  180. package/src/util/table.ts +77 -0
  181. package/dist/types/src/components/Cell/Cell.d.ts.map +0 -1
  182. package/dist/types/src/components/Cell/CellCombobox.d.ts.map +0 -1
  183. package/dist/types/src/components/Cell/index.d.ts.map +0 -1
  184. package/dist/types/src/components/ColumnMenu/ColumnMenu.d.ts.map +0 -1
  185. package/dist/types/src/components/ColumnMenu/ColumnMenu.stories.d.ts.map +0 -1
  186. package/dist/types/src/components/ColumnMenu/ColumnSettings.d.ts.map +0 -1
  187. package/dist/types/src/components/ColumnMenu/ColumnSettings.stories.d.ts.map +0 -1
  188. package/dist/types/src/components/ColumnMenu/index.d.ts.map +0 -1
  189. package/dist/types/src/components/Table/TableBody.d.ts.map +0 -1
  190. package/dist/types/src/components/Table/TableContext.d.ts.map +0 -1
  191. package/dist/types/src/components/Table/TableHead.d.ts.map +0 -1
  192. package/dist/types/src/components/Table/TableRootContext.d.ts.map +0 -1
  193. package/dist/types/src/components/Table/props.d.ts.map +0 -1
  194. package/dist/types/src/helpers.d.ts.map +0 -1
  195. package/dist/types/src/hooks/useColumnSizing.d.ts.map +0 -1
  196. package/dist/types/src/hooks/useColumnSorting.d.ts.map +0 -1
  197. package/dist/types/src/hooks/usePinLastRow.d.ts.map +0 -1
  198. package/dist/types/src/hooks/useRowSelection.d.ts.map +0 -1
  199. package/dist/types/src/schema/Schema.stories.d.ts.map +0 -1
  200. package/dist/types/src/schema/column-utils.d.ts.map +0 -1
  201. package/dist/types/src/schema/index.d.ts.map +0 -1
  202. package/dist/types/src/schema/types.d.ts.map +0 -1
  203. package/dist/types/src/theme.d.ts.map +0 -1
  204. package/dist/types/src/types.d.ts.map +0 -1
  205. package/src/schema/column-utils.ts +0 -48
  206. /package/dist/types/src/{components → _deprecated/components}/Cell/Cell.d.ts +0 -0
  207. /package/dist/types/src/{components → _deprecated/components}/Cell/CellCombobox.d.ts +0 -0
  208. /package/dist/types/src/{components → _deprecated/components}/Cell/index.d.ts +0 -0
  209. /package/dist/types/src/{components → _deprecated/components}/ColumnMenu/ColumnMenu.d.ts +0 -0
  210. /package/dist/types/src/{components → _deprecated/components}/ColumnMenu/ColumnMenu.stories.d.ts +0 -0
  211. /package/dist/types/src/{components → _deprecated/components}/ColumnMenu/ColumnSettings.d.ts +0 -0
  212. /package/dist/types/src/{components → _deprecated/components}/ColumnMenu/index.d.ts +0 -0
  213. /package/dist/types/src/{components → _deprecated/components}/Table/TableBody.d.ts +0 -0
  214. /package/dist/types/src/{components → _deprecated/components}/Table/TableContext.d.ts +0 -0
  215. /package/dist/types/src/{components → _deprecated/components}/Table/TableHead.d.ts +0 -0
  216. /package/dist/types/src/{components → _deprecated/components}/Table/TableRootContext.d.ts +0 -0
  217. /package/dist/types/src/{components → _deprecated/components}/Table/props.d.ts +0 -0
  218. /package/dist/types/src/{helpers.d.ts → _deprecated/helpers.d.ts} +0 -0
  219. /package/dist/types/src/{hooks → _deprecated/hooks}/useColumnSizing.d.ts +0 -0
  220. /package/dist/types/src/{hooks → _deprecated/hooks}/usePinLastRow.d.ts +0 -0
  221. /package/dist/types/src/{hooks → _deprecated/hooks}/useRowSelection.d.ts +0 -0
  222. /package/dist/types/src/{schema → _deprecated/schema}/Schema.stories.d.ts +0 -0
  223. /package/dist/types/src/{schema → _deprecated/schema}/index.d.ts +0 -0
  224. /package/dist/types/src/{theme.d.ts → _deprecated/theme.d.ts} +0 -0
  225. /package/dist/types/src/{types.d.ts → _deprecated/types.d.ts} +0 -0
  226. /package/src/{components → _deprecated/components}/Cell/Cell.tsx +0 -0
  227. /package/src/{components → _deprecated/components}/Cell/CellCombobox.tsx +0 -0
  228. /package/src/{components → _deprecated/components}/Cell/index.ts +0 -0
  229. /package/src/{components → _deprecated/components}/ColumnMenu/ColumnMenu.tsx +0 -0
  230. /package/src/{components → _deprecated/components}/ColumnMenu/index.ts +0 -0
  231. /package/src/{components → _deprecated/components}/Table/TableBody.tsx +0 -0
  232. /package/src/{components → _deprecated/components}/Table/TableContext.tsx +0 -0
  233. /package/src/{components → _deprecated/components}/Table/TableRootContext.ts +0 -0
  234. /package/src/{components → _deprecated/components}/Table/props.ts +0 -0
  235. /package/src/{hooks → _deprecated/hooks}/useColumnSizing.ts +0 -0
  236. /package/src/{hooks → _deprecated/hooks}/useColumnSorting.ts +0 -0
  237. /package/src/{hooks → _deprecated/hooks}/usePinLastRow.ts +0 -0
  238. /package/src/{hooks → _deprecated/hooks}/useRowSelection.ts +0 -0
  239. /package/src/{schema → _deprecated/schema}/Schema.stories.tsx +0 -0
  240. /package/src/{schema → _deprecated/schema}/index.ts +0 -0
  241. /package/src/{theme.ts → _deprecated/theme.ts} +0 -0
  242. /package/src/{types.ts → _deprecated/types.ts} +0 -0
@@ -0,0 +1,1402 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ TableType
4
+ } from "./chunk-DWQ4KGLD.mjs";
5
+
6
+ // packages/ui/react-ui-table/src/translations.ts
7
+ var translationKey = "table";
8
+ var translations_default = [
9
+ {
10
+ "en-US": {
11
+ [translationKey]: {
12
+ "object placeholder": "New table",
13
+ "create object label": "Create table",
14
+ "table name placeholder": "Table name",
15
+ "settings title": "Table settings",
16
+ "table schema label": "Schema",
17
+ "new schema": "New schema",
18
+ "continue label": "Continue",
19
+ "create stack section label": "Create table",
20
+ "add row": "Add row",
21
+ "create comment": "Create thread",
22
+ "column action sort descending": "Sort Descending",
23
+ "column action sort ascending": "Sort Ascending",
24
+ "column action clear sorting": "Clear Sorting",
25
+ "column action settings": "Column Settings",
26
+ "column action delete": "Delete Column",
27
+ "delete row label": "Delete row",
28
+ "bulk delete row label": "Delete selected rows",
29
+ "column deleted label": "Column deleted",
30
+ "new column button label": "Create column"
31
+ }
32
+ }
33
+ }
34
+ ];
35
+
36
+ // packages/ui/react-ui-table/src/components/Table/Table.tsx
37
+ import React5, { forwardRef, useCallback as useCallback3, useImperativeHandle, useState as useState2 } from "react";
38
+ import { getValue } from "@dxos/echo-schema";
39
+ import { invariant as invariant2 } from "@dxos/invariant";
40
+ import { Filter, getSpace as getSpace2, fullyQualifiedId } from "@dxos/react-client/echo";
41
+ import { useAttention } from "@dxos/react-ui-attention";
42
+ import { Grid, closestCell } from "@dxos/react-ui-grid";
43
+ import { StackItem } from "@dxos/react-ui-stack";
44
+ import { mx } from "@dxos/react-ui-theme";
45
+ import { isNotFalsy } from "@dxos/util";
46
+
47
+ // packages/ui/react-ui-table/src/components/Table/ColumnActionsMenu.tsx
48
+ import React from "react";
49
+ import { DropdownMenu, useTranslation } from "@dxos/react-ui";
50
+ var ColumnActionsMenu = ({ model }) => {
51
+ const { t } = useTranslation(translationKey);
52
+ const state = model?.modalController.state.value;
53
+ if (!model || state?.type !== "column") {
54
+ return null;
55
+ }
56
+ const currentSort = model.sorting;
57
+ const isCurrentColumnSorted = currentSort?.fieldId === state.fieldId;
58
+ return /* @__PURE__ */ React.createElement(DropdownMenu.Root, {
59
+ modal: false,
60
+ open: state?.type === "column",
61
+ onOpenChange: model.modalController.close
62
+ }, /* @__PURE__ */ React.createElement(DropdownMenu.VirtualTrigger, {
63
+ virtualRef: model.modalController.trigger
64
+ }), /* @__PURE__ */ React.createElement(DropdownMenu.Portal, null, /* @__PURE__ */ React.createElement(DropdownMenu.Content, null, /* @__PURE__ */ React.createElement(DropdownMenu.Viewport, null, (!isCurrentColumnSorted || currentSort?.direction === "asc") && /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
65
+ onClick: () => model.setSort(state.fieldId, "desc")
66
+ }, t("column action sort descending")), (!isCurrentColumnSorted || currentSort?.direction === "desc") && /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
67
+ onClick: () => model.setSort(state.fieldId, "asc")
68
+ }, t("column action sort ascending")), isCurrentColumnSorted && /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
69
+ onClick: () => model.clearSort()
70
+ }, t("column action clear sorting")), model.getColumnCount() > 1 && /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
71
+ onClick: () => model.deleteColumn(state.fieldId)
72
+ }, t("column action delete")), /* @__PURE__ */ React.createElement(DropdownMenu.Item, {
73
+ onClick: () => model.modalController.openColumnSettings()
74
+ }, t("column action settings"))), /* @__PURE__ */ React.createElement(DropdownMenu.Arrow, null))));
75
+ };
76
+
77
+ // packages/ui/react-ui-table/src/components/Table/ColumnSettings.tsx
78
+ import React2, { useCallback, useEffect, useMemo, useState } from "react";
79
+ import { getSpace } from "@dxos/react-client/echo";
80
+ import { DropdownMenu as DropdownMenu2 } from "@dxos/react-ui";
81
+ import { FieldEditor } from "@dxos/react-ui-data";
82
+ var ColumnSettings = ({ model }) => {
83
+ const [newField, setNewField] = useState();
84
+ const state = model?.modalController.state.value;
85
+ const space = getSpace(model?.table);
86
+ useEffect(() => {
87
+ if (state?.type === "columnSettings" && state.mode.type === "create" && model?.projection) {
88
+ setNewField(model.projection.createFieldProjection());
89
+ } else {
90
+ setNewField(void 0);
91
+ }
92
+ }, [
93
+ model?.projection,
94
+ state
95
+ ]);
96
+ const existingField = useMemo(() => {
97
+ if (state?.type === "columnSettings") {
98
+ const { mode } = state;
99
+ if (mode.type === "edit") {
100
+ return model?.table?.view?.fields.find((f) => f.id === mode.fieldId);
101
+ }
102
+ }
103
+ return void 0;
104
+ }, [
105
+ model?.table?.view?.fields,
106
+ state
107
+ ]);
108
+ const field = existingField ?? newField;
109
+ const handleClose = useCallback(() => {
110
+ model?.modalController.close();
111
+ }, [
112
+ model?.modalController
113
+ ]);
114
+ const handleCancel = useCallback(() => {
115
+ if (state?.type === "columnSettings" && state.mode.type === "create" && newField) {
116
+ model?.projection?.deleteFieldProjection(newField.id);
117
+ }
118
+ }, [
119
+ model?.projection,
120
+ state,
121
+ newField
122
+ ]);
123
+ if (!model?.table?.view || !model.projection || !field) {
124
+ return null;
125
+ }
126
+ return /* @__PURE__ */ React2.createElement(DropdownMenu2.Root, {
127
+ modal: false,
128
+ open: state?.type === "columnSettings"
129
+ }, /* @__PURE__ */ React2.createElement(DropdownMenu2.VirtualTrigger, {
130
+ virtualRef: model.modalController.trigger
131
+ }), /* @__PURE__ */ React2.createElement(DropdownMenu2.Portal, null, /* @__PURE__ */ React2.createElement(DropdownMenu2.Content, {
132
+ classNames: "md:is-64"
133
+ }, /* @__PURE__ */ React2.createElement(DropdownMenu2.Viewport, null, /* @__PURE__ */ React2.createElement(FieldEditor, {
134
+ view: model.table.view,
135
+ projection: model.projection,
136
+ field,
137
+ registry: space?.db.schemaRegistry,
138
+ onClose: handleClose,
139
+ onCancel: handleCancel
140
+ })), /* @__PURE__ */ React2.createElement(DropdownMenu2.Arrow, null))));
141
+ };
142
+
143
+ // packages/ui/react-ui-table/src/components/Table/RowActionsMenu.tsx
144
+ import React3 from "react";
145
+ import { DropdownMenu as DropdownMenu3, useTranslation as useTranslation2 } from "@dxos/react-ui";
146
+ var RowActionsMenu = ({ model }) => {
147
+ const { t } = useTranslation2(translationKey);
148
+ const state = model.modalController.state.value;
149
+ const hasSelection = model.selection.hasSelection.value;
150
+ if (state?.type !== "row") {
151
+ return null;
152
+ }
153
+ return /* @__PURE__ */ React3.createElement(DropdownMenu3.Root, {
154
+ modal: false,
155
+ open: true,
156
+ onOpenChange: model.modalController.close
157
+ }, /* @__PURE__ */ React3.createElement(DropdownMenu3.VirtualTrigger, {
158
+ virtualRef: model.modalController.trigger
159
+ }), /* @__PURE__ */ React3.createElement(DropdownMenu3.Content, null, /* @__PURE__ */ React3.createElement(DropdownMenu3.Viewport, null, /* @__PURE__ */ React3.createElement(DropdownMenu3.Item, {
160
+ onClick: () => model.deleteRow(state.rowIndex)
161
+ }, t(hasSelection ? "bulk delete row label" : "delete row label"))), /* @__PURE__ */ React3.createElement(DropdownMenu3.Arrow, null)));
162
+ };
163
+
164
+ // packages/ui/react-ui-table/src/components/TableCellEditor/TableCellEditor.tsx
165
+ import React4, { useCallback as useCallback2, useMemo as useMemo2 } from "react";
166
+ import { FormatEnum as FormatEnum2 } from "@dxos/echo-schema";
167
+ import { invariant } from "@dxos/invariant";
168
+ import { editorKeys, GridCellEditor, useGridContext } from "@dxos/react-ui-grid";
169
+
170
+ // packages/ui/react-ui-table/src/components/TableCellEditor/extension.ts
171
+ import { autocompletion, pickedCompletion } from "@codemirror/autocomplete";
172
+ import { EditorView } from "@codemirror/view";
173
+ var completion = ({ onQuery, onMatch }) => {
174
+ return [
175
+ EditorView.theme({
176
+ ".cm-completionDialog": {
177
+ width: "var(--dx-gridCellWidth)"
178
+ }
179
+ }),
180
+ autocompletion({
181
+ icons: false,
182
+ activateOnTyping: true,
183
+ override: [
184
+ async (context) => {
185
+ const text = context.state.doc.toString();
186
+ return {
187
+ from: 0,
188
+ options: await onQuery(text)
189
+ };
190
+ }
191
+ ],
192
+ // TODO(burdon): Consts from grid (to line-up with grid).
193
+ tooltipClass: () => "cm-completionDialog !mt-[8px] !-ml-[4px] [&>ul]:!max-h-[264px]",
194
+ optionClass: () => "flex h-[33px] items-center"
195
+ }),
196
+ // Check for accepted completion metadata in the transaction.
197
+ EditorView.updateListener.of((update) => {
198
+ update.transactions.forEach((tr) => {
199
+ const completion2 = tr.annotation(pickedCompletion);
200
+ if (completion2) {
201
+ onMatch(completion2.data);
202
+ }
203
+ });
204
+ })
205
+ ];
206
+ };
207
+
208
+ // packages/ui/react-ui-table/src/util/grid.ts
209
+ var fromGridCell = ({ col, row }) => {
210
+ return `${col},${row}`;
211
+ };
212
+ var toGridCell = (cell) => {
213
+ const [col, row] = cell.split(",").map(Number);
214
+ return {
215
+ row,
216
+ col
217
+ };
218
+ };
219
+
220
+ // packages/ui/react-ui-table/src/util/signals.ts
221
+ var touch = (value) => value;
222
+
223
+ // packages/ui/react-ui-table/src/util/table.ts
224
+ import { AST, Format, FormatEnum, S, TypedObject, TypeEnum } from "@dxos/echo-schema";
225
+ import { log } from "@dxos/log";
226
+ import { PublicKey } from "@dxos/react-client";
227
+ import { create } from "@dxos/react-client/echo";
228
+ import { createFieldId, createView, ViewProjection } from "@dxos/schema";
229
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-table/src/util/table.ts";
230
+ var initializeTable = ({ space, table }) => {
231
+ log.info("initializeTable", {
232
+ table
233
+ }, {
234
+ F: __dxlog_file,
235
+ L: 26,
236
+ S: void 0,
237
+ C: (f, a) => f(...a)
238
+ });
239
+ const ContactSchema = TypedObject({
240
+ typename: `example.com/type/${PublicKey.random().truncate()}`,
241
+ version: "0.1.0"
242
+ })({
243
+ name: S.optional(S.String).annotations({
244
+ [AST.TitleAnnotationId]: "Name"
245
+ }),
246
+ email: S.optional(Format.Email),
247
+ salary: S.optional(Format.Currency()).annotations({
248
+ [AST.TitleAnnotationId]: "Salary"
249
+ })
250
+ });
251
+ const contactSchema = space.db.schemaRegistry.addSchema(ContactSchema);
252
+ table.view = createView({
253
+ name: "Test",
254
+ typename: contactSchema.typename,
255
+ jsonSchema: contactSchema.jsonSchema,
256
+ fields: [
257
+ "name",
258
+ "email",
259
+ "salary"
260
+ ]
261
+ });
262
+ const projection = new ViewProjection(contactSchema, table.view);
263
+ projection.setFieldProjection({
264
+ field: {
265
+ id: table.view.fields[2].id,
266
+ path: "salary",
267
+ size: 150
268
+ }
269
+ });
270
+ projection.setFieldProjection({
271
+ field: {
272
+ id: createFieldId(),
273
+ path: "manager",
274
+ referencePath: "name"
275
+ },
276
+ props: {
277
+ property: "manager",
278
+ type: TypeEnum.Ref,
279
+ format: FormatEnum.Ref,
280
+ referenceSchema: contactSchema.typename,
281
+ title: "Manager"
282
+ }
283
+ });
284
+ space.db.add(create(contactSchema, {}));
285
+ return contactSchema;
286
+ };
287
+
288
+ // packages/ui/react-ui-table/src/util/table-buttons.ts
289
+ var TABLE_ATTRS = {
290
+ columnSettings: "data-table-column-settings-button",
291
+ rowMenu: "data-table-row-menu-button",
292
+ newColumn: "data-table-new-column-button"
293
+ };
294
+ var ICONS = {
295
+ columnSettings: "ph--caret-down--regular",
296
+ rowMenu: "ph--dots-three--regular",
297
+ newColumn: "ph--plus--regular"
298
+ };
299
+ var createButtonHtml = ({ button, value = "", disabled = false }) => {
300
+ const buttonClasses = "ch-button is-6 pli-0.5 min-bs-0 absolute inset-block-1 inline-end-2";
301
+ return `<button class="${buttonClasses}" ${TABLE_ATTRS[button]}="${value}" ${disabled ? "disabled" : ""}><svg><use href="/icons.svg#${ICONS[button]}"/></svg></button>`;
302
+ };
303
+ var tableButtons = {
304
+ columnSettings: {
305
+ attr: TABLE_ATTRS.columnSettings,
306
+ icon: ICONS.columnSettings,
307
+ render: ({ fieldId }) => createButtonHtml({
308
+ button: "columnSettings",
309
+ value: fieldId
310
+ })
311
+ },
312
+ rowMenu: {
313
+ attr: TABLE_ATTRS.rowMenu,
314
+ icon: ICONS.rowMenu,
315
+ render: ({ rowIndex }) => createButtonHtml({
316
+ button: "rowMenu",
317
+ value: rowIndex.toString()
318
+ })
319
+ },
320
+ addColumn: {
321
+ attr: TABLE_ATTRS.newColumn,
322
+ icon: ICONS.newColumn,
323
+ render: ({ disabled } = {}) => createButtonHtml({
324
+ button: "newColumn",
325
+ disabled
326
+ })
327
+ }
328
+ };
329
+
330
+ // packages/ui/react-ui-table/src/components/TableCellEditor/TableCellEditor.tsx
331
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-table/src/components/TableCellEditor/TableCellEditor.tsx";
332
+ var TableCellEditor = ({ model, onEnter, onFocus, onQuery, __gridScope }) => {
333
+ const { editing } = useGridContext("TableCellEditor", __gridScope);
334
+ const fieldProjection = useMemo2(() => {
335
+ if (!model || !editing) {
336
+ return;
337
+ }
338
+ const { col } = toGridCell(editing.index);
339
+ const field = model.projection.view.fields[col];
340
+ const fieldProjection2 = model.projection.getFieldProjection(field.id);
341
+ invariant(fieldProjection2, void 0, {
342
+ F: __dxlog_file2,
343
+ L: 49,
344
+ S: void 0,
345
+ A: [
346
+ "fieldProjection",
347
+ ""
348
+ ]
349
+ });
350
+ return fieldProjection2;
351
+ }, [
352
+ model,
353
+ editing
354
+ ]);
355
+ const handleClose = useCallback2((value, event) => {
356
+ if (!model || !editing || !fieldProjection) {
357
+ return;
358
+ }
359
+ const cell = toGridCell(editing.index);
360
+ onEnter?.(cell);
361
+ if (event && onFocus) {
362
+ onFocus(determineNavigationAxis(event), determineNavigationDelta(event));
363
+ }
364
+ }, [
365
+ model,
366
+ editing,
367
+ onFocus,
368
+ onEnter,
369
+ fieldProjection,
370
+ determineNavigationAxis,
371
+ determineNavigationDelta
372
+ ]);
373
+ const handleBlur = useCallback2((value) => {
374
+ if (!model || !editing) {
375
+ return;
376
+ }
377
+ const cell = toGridCell(editing.index);
378
+ if (value !== void 0) {
379
+ model.setCellData(cell, value);
380
+ }
381
+ }, [
382
+ model,
383
+ editing
384
+ ]);
385
+ const extension = useMemo2(() => {
386
+ if (!fieldProjection) {
387
+ return [];
388
+ }
389
+ const extension2 = [
390
+ editorKeys({
391
+ onClose: handleClose,
392
+ ...editing?.initialContent && {
393
+ onNav: handleClose
394
+ }
395
+ })
396
+ ];
397
+ if (onQuery) {
398
+ switch (fieldProjection.props.format) {
399
+ case FormatEnum2.Ref: {
400
+ extension2.push([
401
+ completion({
402
+ onQuery: (text) => onQuery(fieldProjection, text),
403
+ onMatch: (data) => {
404
+ if (model && editing) {
405
+ const cell = toGridCell(editing.index);
406
+ model.setCellData(cell, data);
407
+ onEnter?.(cell);
408
+ onFocus?.();
409
+ }
410
+ }
411
+ })
412
+ ]);
413
+ break;
414
+ }
415
+ }
416
+ }
417
+ return extension2;
418
+ }, [
419
+ model,
420
+ editing,
421
+ fieldProjection,
422
+ handleClose
423
+ ]);
424
+ const getCellContent = useCallback2(() => {
425
+ if (model && editing) {
426
+ const value = model.getCellData(toGridCell(editing.index));
427
+ return value !== void 0 ? String(value) : "";
428
+ }
429
+ }, [
430
+ model,
431
+ editing
432
+ ]);
433
+ return /* @__PURE__ */ React4.createElement(GridCellEditor, {
434
+ extension,
435
+ getCellContent,
436
+ onBlur: handleBlur
437
+ });
438
+ };
439
+ var determineNavigationAxis = ({ key }) => {
440
+ switch (key) {
441
+ case "ArrowUp":
442
+ case "ArrowDown":
443
+ case "Enter": {
444
+ return "row";
445
+ }
446
+ case "ArrowLeft":
447
+ case "ArrowRight":
448
+ case "Tab":
449
+ return "col";
450
+ }
451
+ };
452
+ var determineNavigationDelta = ({ key, shift }) => {
453
+ switch (key) {
454
+ case "ArrowUp":
455
+ case "ArrowLeft":
456
+ return -1;
457
+ case "ArrowDown":
458
+ case "ArrowRight":
459
+ return 1;
460
+ }
461
+ return shift ? -1 : 1;
462
+ };
463
+
464
+ // packages/ui/react-ui-table/src/components/Table/Table.tsx
465
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-table/src/components/Table/Table.tsx";
466
+ var inlineEndLine = "[&>.dx-grid]:relative [&>.dx-grid]:after:absolute [&>.dx-grid]:after:inset-block-0 [&>.dx-grid]:after:-inline-end-px [&>.dx-grid]:after:is-px [&>.dx-grid]:after:bg-separator";
467
+ var blockEndLine = "[&>.dx-grid]:before:absolute [&>.dx-grid]:before:inset-inline-0 [&>.dx-grid]:before:-block-end-px [&>.dx-grid]:before:bs-px [&>.dx-grid]:before:bg-separator";
468
+ var frozen = {
469
+ frozenRowsStart: 1,
470
+ frozenColsStart: 1,
471
+ frozenColsEnd: 1
472
+ };
473
+ var TableRoot = ({ children }) => {
474
+ return /* @__PURE__ */ React5.createElement(StackItem.Content, {
475
+ toolbar: true,
476
+ contentSize: "intrinsic",
477
+ classNames: "relative"
478
+ }, children);
479
+ };
480
+ var TableMain = /* @__PURE__ */ forwardRef(({ model }, forwardedRef) => {
481
+ const [dxGrid, setDxGrid] = useState2(null);
482
+ const { hasAttention } = useAttention(model?.table ? fullyQualifiedId(model.table) : "table");
483
+ useImperativeHandle(forwardedRef, () => {
484
+ if (!model || !dxGrid) {
485
+ return {};
486
+ }
487
+ dxGrid.getCells = model.getCells.bind(model);
488
+ return {
489
+ update: (cell) => {
490
+ if (cell) {
491
+ dxGrid.updateIfWithinBounds(cell);
492
+ } else {
493
+ dxGrid.updateCells(true);
494
+ }
495
+ }
496
+ };
497
+ }, [
498
+ model,
499
+ dxGrid
500
+ ]);
501
+ const handleFocus = (increment, delta) => {
502
+ dxGrid?.refocus(increment, delta);
503
+ };
504
+ const handleEnter = useCallback3((cell) => {
505
+ if (model && cell.row === model.getRowCount() - 1) {
506
+ model.insertRow(cell.row);
507
+ }
508
+ }, [
509
+ model
510
+ ]);
511
+ const handleKeyDown = useCallback3((event) => {
512
+ const cell = closestCell(event.target);
513
+ if (!model || !cell) {
514
+ return;
515
+ }
516
+ switch (event.key) {
517
+ case "Backspace":
518
+ case "Delete": {
519
+ model.setCellData(cell, void 0);
520
+ break;
521
+ }
522
+ }
523
+ }, [
524
+ model
525
+ ]);
526
+ const handleAxisResize = useCallback3((event) => {
527
+ if (event.axis === "col") {
528
+ const columnIndex = parseInt(event.index, 10);
529
+ model?.setColumnWidth(columnIndex, event.size);
530
+ }
531
+ }, [
532
+ model
533
+ ]);
534
+ const handleWheel = useCallback3((event) => {
535
+ if (!hasAttention) {
536
+ event.stopPropagation();
537
+ }
538
+ }, [
539
+ hasAttention
540
+ ]);
541
+ const handleQuery = useCallback3(async ({ field, props }, _text) => {
542
+ if (model && props.referenceSchema && field.referencePath) {
543
+ const space = getSpace2(model.table);
544
+ invariant2(space, void 0, {
545
+ F: __dxlog_file3,
546
+ L: 150,
547
+ S: void 0,
548
+ A: [
549
+ "space",
550
+ ""
551
+ ]
552
+ });
553
+ const schema = space.db.schemaRegistry.getSchema(props.referenceSchema);
554
+ if (schema) {
555
+ const { objects } = await space.db.query(Filter.schema(schema)).run();
556
+ return objects.map((obj) => {
557
+ const value = getValue(obj, field.referencePath);
558
+ if (!value || typeof value !== "string") {
559
+ return void 0;
560
+ }
561
+ return {
562
+ label: value,
563
+ data: obj
564
+ };
565
+ }).filter(isNotFalsy);
566
+ }
567
+ }
568
+ return [];
569
+ }, [
570
+ model
571
+ ]);
572
+ if (!model) {
573
+ return /* @__PURE__ */ React5.createElement("span", {
574
+ role: "none",
575
+ className: "attention-surface"
576
+ });
577
+ }
578
+ return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(Grid.Root, {
579
+ id: model.table.id ?? "table-grid"
580
+ }, /* @__PURE__ */ React5.createElement(TableCellEditor, {
581
+ model,
582
+ onEnter: handleEnter,
583
+ onFocus: handleFocus,
584
+ onQuery: handleQuery
585
+ }), /* @__PURE__ */ React5.createElement(Grid.Content, {
586
+ onWheelCapture: handleWheel,
587
+ className: mx("[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:bs-min [&_.dx-grid]:shrink [&_.dx-grid]:max-is-max", inlineEndLine, blockEndLine),
588
+ frozen,
589
+ columns: model.columnMeta.value,
590
+ limitRows: model.getRowCount() ?? 0,
591
+ limitColumns: model.table.view?.fields?.length ?? 0,
592
+ onAxisResize: handleAxisResize,
593
+ onClick: model?.handleGridClick,
594
+ onKeyDown: handleKeyDown,
595
+ overscroll: "trap",
596
+ ref: setDxGrid
597
+ })), /* @__PURE__ */ React5.createElement(RowActionsMenu, {
598
+ model
599
+ }), /* @__PURE__ */ React5.createElement(ColumnActionsMenu, {
600
+ model
601
+ }), /* @__PURE__ */ React5.createElement(ColumnSettings, {
602
+ model
603
+ }));
604
+ });
605
+ var Table = {
606
+ Root: TableRoot,
607
+ Main: TableMain
608
+ };
609
+
610
+ // packages/ui/react-ui-table/src/components/Toolbar/Toolbar.tsx
611
+ import { ChatText, RowsPlusBottom } from "@phosphor-icons/react";
612
+ import { createContext } from "@radix-ui/react-context";
613
+ import React7 from "react";
614
+ import { Toolbar as NaturalToolbar2, useTranslation as useTranslation3 } from "@dxos/react-ui";
615
+
616
+ // packages/ui/react-ui-table/src/components/Toolbar/common.tsx
617
+ import React6 from "react";
618
+ import { Toolbar as NaturalToolbar, Tooltip } from "@dxos/react-ui";
619
+ import { getSize } from "@dxos/react-ui-theme";
620
+ var iconStyles = getSize(5);
621
+ var buttonStyles = "min-bs-0 p-2";
622
+ var tooltipProps = {
623
+ side: "top",
624
+ classNames: "z-10"
625
+ };
626
+ var ToolbarSeparator = () => /* @__PURE__ */ React6.createElement("div", {
627
+ role: "separator",
628
+ className: "grow"
629
+ });
630
+ var ToolbarButton = ({ Icon, children, ...props }) => {
631
+ return /* @__PURE__ */ React6.createElement(Tooltip.Root, null, /* @__PURE__ */ React6.createElement(Tooltip.Trigger, {
632
+ asChild: true
633
+ }, /* @__PURE__ */ React6.createElement(NaturalToolbar.Button, {
634
+ variant: "ghost",
635
+ ...props,
636
+ classNames: buttonStyles
637
+ }, /* @__PURE__ */ React6.createElement(Icon, {
638
+ className: iconStyles
639
+ }), /* @__PURE__ */ React6.createElement("span", {
640
+ className: "sr-only"
641
+ }, children))), /* @__PURE__ */ React6.createElement(Tooltip.Portal, null, /* @__PURE__ */ React6.createElement(Tooltip.Content, tooltipProps, children, /* @__PURE__ */ React6.createElement(Tooltip.Arrow, null))));
642
+ };
643
+
644
+ // packages/ui/react-ui-table/src/components/Toolbar/Toolbar.tsx
645
+ var [ToolbarContextProvider, useToolbarContext] = createContext("Toolbar");
646
+ var ToolbarRoot = ({ classNames, children, onAction }) => {
647
+ return /* @__PURE__ */ React7.createElement(ToolbarContextProvider, {
648
+ onAction
649
+ }, /* @__PURE__ */ React7.createElement(NaturalToolbar2.Root, {
650
+ classNames: [
651
+ "is-full shrink-0 overflow-x-auto overflow-y-hidden p-1",
652
+ classNames
653
+ ]
654
+ }, children));
655
+ };
656
+ var Editing = () => {
657
+ const { onAction } = useToolbarContext("Editing");
658
+ const { t } = useTranslation3(translationKey);
659
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(ToolbarButton, {
660
+ value: "add-row",
661
+ Icon: RowsPlusBottom,
662
+ "data-testid": "table.toolbar.add-row",
663
+ onClick: () => onAction?.({
664
+ type: "add-row"
665
+ })
666
+ }, t("add row")));
667
+ };
668
+ var Actions = () => {
669
+ const { onAction } = useToolbarContext("Actions");
670
+ const { t } = useTranslation3(translationKey);
671
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(ToolbarButton, {
672
+ value: "comment",
673
+ Icon: ChatText,
674
+ "data-testid": "table.toolbar.comment",
675
+ onClick: () => onAction?.({
676
+ type: "comment"
677
+ })
678
+ }, t("create comment")));
679
+ };
680
+ var Toolbar = {
681
+ Root: ToolbarRoot,
682
+ Editing,
683
+ Actions,
684
+ Separator: ToolbarSeparator
685
+ };
686
+
687
+ // packages/ui/react-ui-table/src/hooks/useTableModel.ts
688
+ import { useEffect as useEffect2, useState as useState3 } from "react";
689
+
690
+ // packages/ui/react-ui-table/src/model/table-model.ts
691
+ import { computed as computed2, effect as effect2, signal as signal3 } from "@preact/signals-core";
692
+ import orderBy from "lodash.orderby";
693
+ import { Resource as Resource2 } from "@dxos/context";
694
+ import { getValue as getValue2, setValue, FormatEnum as FormatEnum3 } from "@dxos/echo-schema";
695
+ import { invariant as invariant3 } from "@dxos/invariant";
696
+ import { PublicKey as PublicKey2 } from "@dxos/react-client";
697
+ import { cellClassesForFieldType, cellClassesForRowSelection, formatForDisplay, formatForEditing, parseValue } from "@dxos/react-ui-data";
698
+ import { mx as mx2 } from "@dxos/react-ui-theme";
699
+ import { VIEW_FIELD_LIMIT } from "@dxos/schema";
700
+
701
+ // packages/ui/react-ui-table/src/model/modal-controller.ts
702
+ import { signal } from "@preact/signals-core";
703
+ var ModalController = class {
704
+ constructor() {
705
+ this._state = signal({
706
+ type: "closed"
707
+ });
708
+ this._triggerRef = {
709
+ current: null
710
+ };
711
+ this.handleClick = (event) => {
712
+ const target = event.target;
713
+ const rowButton = target.closest(`button[${tableButtons.rowMenu.attr}]`);
714
+ if (rowButton) {
715
+ this._triggerRef.current = rowButton;
716
+ this._state.value = {
717
+ type: "row",
718
+ rowIndex: Number(rowButton.getAttribute(tableButtons.rowMenu.attr))
719
+ };
720
+ return true;
721
+ }
722
+ const columnButton = target.closest(`button[${tableButtons.columnSettings.attr}]`);
723
+ if (columnButton) {
724
+ const fieldId = columnButton.getAttribute(tableButtons.columnSettings.attr);
725
+ this._triggerRef.current = columnButton;
726
+ this._state.value = {
727
+ type: "column",
728
+ fieldId
729
+ };
730
+ return true;
731
+ }
732
+ const addColumnButton = target.closest(`button[${tableButtons.addColumn.attr}]`);
733
+ if (addColumnButton) {
734
+ this._triggerRef.current = addColumnButton;
735
+ this._state.value = {
736
+ type: "columnSettings",
737
+ mode: {
738
+ type: "create"
739
+ }
740
+ };
741
+ return true;
742
+ }
743
+ return false;
744
+ };
745
+ this.openColumnSettings = () => {
746
+ if (this._state.value.type === "column") {
747
+ const fieldId = this._state.value.fieldId;
748
+ requestAnimationFrame(() => {
749
+ this._state.value = {
750
+ type: "columnSettings",
751
+ mode: {
752
+ type: "edit",
753
+ fieldId
754
+ }
755
+ };
756
+ });
757
+ }
758
+ };
759
+ this.close = () => {
760
+ this._state.value = {
761
+ type: "closed"
762
+ };
763
+ };
764
+ }
765
+ get state() {
766
+ return this._state;
767
+ }
768
+ get trigger() {
769
+ return this._triggerRef;
770
+ }
771
+ };
772
+
773
+ // packages/ui/react-ui-table/src/model/selection-model.ts
774
+ import { computed, effect, signal as signal2 } from "@preact/signals-core";
775
+ import { Resource } from "@dxos/context";
776
+ var SelectionModel = class extends Resource {
777
+ constructor(_rows, _onSelectionChanged) {
778
+ super();
779
+ this._rows = _rows;
780
+ this._onSelectionChanged = _onSelectionChanged;
781
+ this._selection = signal2(/* @__PURE__ */ new Set());
782
+ this._validSelectedIds = computed(() => {
783
+ const rows = this._rows.value;
784
+ if (!rows) {
785
+ return /* @__PURE__ */ new Set();
786
+ }
787
+ const validIds = new Set(rows.map((row) => row.id));
788
+ return new Set([
789
+ ...this._selection.value
790
+ ].filter((id) => validIds.has(id)));
791
+ });
792
+ this._hasSelection = computed(() => this._validSelectedIds.value.size > 0);
793
+ this._allSelected = computed(() => {
794
+ const rows = this._rows.value;
795
+ if (rows.length === 0) {
796
+ return false;
797
+ }
798
+ return rows.length !== 0 || rows.every((row) => this._selection.value.has(row.id));
799
+ });
800
+ this.getSelectedRows = () => {
801
+ const selectedIds = this._validSelectedIds.value;
802
+ return this._rows.value.filter((row) => selectedIds.has(row.id));
803
+ };
804
+ this.isRowIndexSelected = (rowIndex) => {
805
+ const row = this._rows.value[rowIndex];
806
+ return this._selection.value.has(row.id);
807
+ };
808
+ this.isObjectSelected = (object) => {
809
+ return this._selection.value.has(object.id);
810
+ };
811
+ this.toggleSelectionForRowIndex = (rowIndex) => {
812
+ const row = this._rows.value[rowIndex];
813
+ const newSelection = new Set(this._selection.value);
814
+ if (newSelection.has(row.id)) {
815
+ newSelection.delete(row.id);
816
+ } else {
817
+ newSelection.add(row.id);
818
+ }
819
+ this._selection.value = newSelection;
820
+ };
821
+ this.setSelection = (mode) => {
822
+ this._selection.value = mode === "all" ? new Set(this._rows.value.map((row) => row.id)) : /* @__PURE__ */ new Set();
823
+ };
824
+ }
825
+ async _open() {
826
+ const selectionWatcher = effect(() => {
827
+ touch(this._selection.value);
828
+ this._onSelectionChanged?.();
829
+ });
830
+ this._ctx.onDispose(selectionWatcher);
831
+ }
832
+ //
833
+ // Getters
834
+ //
835
+ get selection() {
836
+ return this._selection;
837
+ }
838
+ get hasSelection() {
839
+ return this._hasSelection;
840
+ }
841
+ get allRowsSeleted() {
842
+ return this._allSelected;
843
+ }
844
+ };
845
+
846
+ // packages/ui/react-ui-table/src/util/table-controls.ts
847
+ var checkboxAttributes = {
848
+ checkbox: "data-table-checkbox",
849
+ header: "data-table-header"
850
+ };
851
+ var renderCheckbox = ({ rowIndex, header = false, checked = false, disabled = false }) => {
852
+ const baseClasses = "absolute inset-block-[6px] inline-end-[6px]";
853
+ const { attributes } = tableControls.checkbox;
854
+ return `<input type="checkbox" class="${baseClasses}" ${attributes.checkbox}="${rowIndex}" ${header ? attributes.header : ""} ${checked ? "checked" : ""} ${disabled ? "disabled" : ""}/>`;
855
+ };
856
+ var tableControls = {
857
+ checkbox: {
858
+ attributes: checkboxAttributes,
859
+ render: renderCheckbox
860
+ }
861
+ };
862
+
863
+ // packages/ui/react-ui-table/src/model/table-model.ts
864
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-table/src/model/table-model.ts";
865
+ var TableModel = class extends Resource2 {
866
+ constructor({ table, projection, sorting = [], pinnedRows = {
867
+ top: [],
868
+ bottom: []
869
+ }, onCellUpdate, onDeleteColumn, onDeleteRows, onInsertRow, onRowOrderChanged }) {
870
+ super();
871
+ this.id = `table-model-${PublicKey2.random().truncate()}`;
872
+ this._visibleRange = signal3({
873
+ start: {
874
+ row: 0,
875
+ col: 0
876
+ },
877
+ end: {
878
+ row: 0,
879
+ col: 0
880
+ }
881
+ });
882
+ /**
883
+ * Maps display indices to data indices.
884
+ * Used for translating between sorted/displayed order and original data order.
885
+ * Keys are display indices, values are corresponding data indices.
886
+ */
887
+ this._displayToDataIndex = /* @__PURE__ */ new Map();
888
+ this._sorting = signal3(void 0);
889
+ this._rows = signal3([]);
890
+ this._modalController = new ModalController();
891
+ //
892
+ // Get Cells
893
+ //
894
+ this.getCells = (range, plane) => {
895
+ switch (plane) {
896
+ case "grid": {
897
+ this._visibleRange.value = range;
898
+ return this.getMainGridCells(range);
899
+ }
900
+ case "frozenRowsStart": {
901
+ return this.getHeaderCells(range);
902
+ }
903
+ case "frozenColsStart": {
904
+ return this.getSelectionColumnCells(range);
905
+ }
906
+ case "frozenColsEnd": {
907
+ return this.getActionColumnCells(range);
908
+ }
909
+ case "fixedStartStart": {
910
+ return this.getSelectAllCell();
911
+ }
912
+ case "fixedStartEnd": {
913
+ return this.getNewColumnCell();
914
+ }
915
+ default: {
916
+ return {};
917
+ }
918
+ }
919
+ };
920
+ this.getMainGridCells = (range) => {
921
+ const values = {};
922
+ const fields = this._table.view?.fields ?? [];
923
+ const addCell = (obj, field, colIndex, displayIndex) => {
924
+ const { props } = this._projection.getFieldProjection(field.id);
925
+ const value = {
926
+ get value() {
927
+ const value2 = getValue2(obj, field.path);
928
+ if (value2 == null) {
929
+ return "";
930
+ }
931
+ switch (props.format) {
932
+ case FormatEnum3.Ref: {
933
+ if (!field.referencePath) {
934
+ return "";
935
+ }
936
+ return getValue2(value2, field.referencePath);
937
+ }
938
+ default: {
939
+ return formatForDisplay({
940
+ type: props.type,
941
+ format: props.format,
942
+ value: value2
943
+ });
944
+ }
945
+ }
946
+ }
947
+ };
948
+ const classes = [];
949
+ const formatClasses = cellClassesForFieldType({
950
+ type: props.type,
951
+ format: props.format
952
+ });
953
+ if (formatClasses) {
954
+ classes.push(formatClasses);
955
+ }
956
+ const rowSelectionClasses = cellClassesForRowSelection(this._selection.isObjectSelected(obj));
957
+ if (rowSelectionClasses) {
958
+ classes.push(rowSelectionClasses);
959
+ }
960
+ if (classes.length > 0) {
961
+ value.className = mx2(classes.flat());
962
+ }
963
+ const idx = fromGridCell({
964
+ col: colIndex,
965
+ row: displayIndex
966
+ });
967
+ values[idx] = value;
968
+ };
969
+ for (let row = range.start.row; row <= range.end.row && row < this._sortedRows.value.length; row++) {
970
+ for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {
971
+ const field = fields[col];
972
+ if (!field) {
973
+ continue;
974
+ }
975
+ addCell(this._sortedRows.value[row], field, col, row);
976
+ }
977
+ }
978
+ return values;
979
+ };
980
+ this.getHeaderCells = (range) => {
981
+ const values = {};
982
+ const fields = this.table.view?.fields ?? [];
983
+ for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {
984
+ const { field, props } = this._projection.getFieldProjection(fields[col].id);
985
+ values[fromGridCell({
986
+ col,
987
+ row: 0
988
+ })] = {
989
+ value: props.title ?? field.path,
990
+ readonly: true,
991
+ resizeHandle: "col",
992
+ accessoryHtml: tableButtons.columnSettings.render({
993
+ fieldId: field.id
994
+ })
995
+ };
996
+ }
997
+ return values;
998
+ };
999
+ this.getSelectionColumnCells = (range) => {
1000
+ const values = {};
1001
+ for (let row = range.start.row; row <= range.end.row && row < this._rows.value.length; row++) {
1002
+ const isSelected = this._selection.isRowIndexSelected(row);
1003
+ const classes = cellClassesForRowSelection(isSelected);
1004
+ values[fromGridCell({
1005
+ col: 0,
1006
+ row
1007
+ })] = {
1008
+ value: "",
1009
+ readonly: true,
1010
+ className: classes ? mx2(classes) : void 0,
1011
+ accessoryHtml: tableControls.checkbox.render({
1012
+ rowIndex: row,
1013
+ checked: isSelected
1014
+ })
1015
+ };
1016
+ }
1017
+ return values;
1018
+ };
1019
+ this.getActionColumnCells = (range) => {
1020
+ const values = {};
1021
+ for (let row = range.start.row; row <= range.end.row && row < this._rows.value.length; row++) {
1022
+ const isSelected = this._selection.isRowIndexSelected(row);
1023
+ const classes = cellClassesForRowSelection(isSelected);
1024
+ values[fromGridCell({
1025
+ col: 0,
1026
+ row
1027
+ })] = {
1028
+ value: "",
1029
+ readonly: true,
1030
+ className: classes ? mx2(classes) : void 0,
1031
+ accessoryHtml: tableButtons.rowMenu.render({
1032
+ rowIndex: row
1033
+ })
1034
+ };
1035
+ }
1036
+ return values;
1037
+ };
1038
+ this.getSelectAllCell = () => {
1039
+ return {
1040
+ [fromGridCell({
1041
+ col: 0,
1042
+ row: 0
1043
+ })]: {
1044
+ value: "",
1045
+ accessoryHtml: tableControls.checkbox.render({
1046
+ rowIndex: 0,
1047
+ header: true,
1048
+ checked: this._selection.allRowsSeleted.value
1049
+ }),
1050
+ readonly: true
1051
+ }
1052
+ };
1053
+ };
1054
+ this.getNewColumnCell = () => {
1055
+ return {
1056
+ [fromGridCell({
1057
+ col: 0,
1058
+ row: 0
1059
+ })]: {
1060
+ value: "",
1061
+ accessoryHtml: tableButtons.addColumn.render({
1062
+ disabled: (this._table.view?.fields?.length ?? 0) >= VIEW_FIELD_LIMIT
1063
+ }),
1064
+ readonly: true
1065
+ }
1066
+ };
1067
+ };
1068
+ //
1069
+ // Data
1070
+ //
1071
+ this.setRows = (obj) => {
1072
+ this._rows.value = obj;
1073
+ };
1074
+ this.getRowCount = () => this._rows.value.length;
1075
+ this.getColumnCount = () => this.table.view?.fields.length ?? 0;
1076
+ this.insertRow = (rowIndex) => {
1077
+ const row = rowIndex !== void 0 ? this._displayToDataIndex.get(rowIndex) ?? rowIndex : this._rows.value.length;
1078
+ this._onInsertRow?.(row);
1079
+ };
1080
+ this.deleteRow = (rowIndex) => {
1081
+ const row = this._displayToDataIndex.get(rowIndex) ?? rowIndex;
1082
+ const obj = this._rows.value[row];
1083
+ const objectsToDelete = [];
1084
+ if (this._selection.hasSelection.value) {
1085
+ const selectedRows = this._selection.getSelectedRows();
1086
+ objectsToDelete.push(...selectedRows);
1087
+ } else {
1088
+ objectsToDelete.push(obj);
1089
+ }
1090
+ this._onDeleteRows?.(row, objectsToDelete);
1091
+ };
1092
+ this.getCellData = ({ col, row }) => {
1093
+ const fields = this.table.view?.fields ?? [];
1094
+ if (col < 0 || col >= fields.length) {
1095
+ return void 0;
1096
+ }
1097
+ const field = fields[col];
1098
+ const dataIndex = this._displayToDataIndex.get(row) ?? row;
1099
+ const value = getValue2(this._rows.value[dataIndex], field.path);
1100
+ if (value == null) {
1101
+ return "";
1102
+ }
1103
+ const { props } = this._projection.getFieldProjection(field.id);
1104
+ switch (props.format) {
1105
+ case FormatEnum3.Ref: {
1106
+ if (!field.referencePath) {
1107
+ return "";
1108
+ }
1109
+ return getValue2(value, field.referencePath);
1110
+ }
1111
+ default: {
1112
+ return formatForEditing({
1113
+ type: props.type,
1114
+ format: props.format,
1115
+ value
1116
+ });
1117
+ }
1118
+ }
1119
+ };
1120
+ this.setCellData = ({ col, row }, value) => {
1121
+ const rowIdx = this._displayToDataIndex.get(row) ?? row;
1122
+ const fields = this.table.view?.fields ?? [];
1123
+ if (col < 0 || col >= fields.length) {
1124
+ return;
1125
+ }
1126
+ const field = fields[col];
1127
+ const { props } = this._projection.getFieldProjection(field.id);
1128
+ switch (props.format) {
1129
+ case FormatEnum3.Ref: {
1130
+ setValue(this._rows.value[rowIdx], field.path, value);
1131
+ break;
1132
+ }
1133
+ default: {
1134
+ setValue(this._rows.value[rowIdx], field.path, parseValue({
1135
+ type: props.type,
1136
+ format: props.format,
1137
+ value
1138
+ }));
1139
+ break;
1140
+ }
1141
+ }
1142
+ };
1143
+ //
1144
+ // Interactions
1145
+ //
1146
+ this.handleGridClick = (event) => {
1147
+ if (!this._modalController.handleClick(event)) {
1148
+ const target = event.target;
1149
+ const selectionCheckbox = target.closest(`input[${tableControls.checkbox.attributes.checkbox}]`);
1150
+ if (selectionCheckbox) {
1151
+ const isHeader = selectionCheckbox.hasAttribute(tableControls.checkbox.attributes.header);
1152
+ if (isHeader) {
1153
+ if (this._selection.allRowsSeleted.value) {
1154
+ this._selection.setSelection("none");
1155
+ } else {
1156
+ this._selection.setSelection("all");
1157
+ }
1158
+ } else {
1159
+ const rowIndex = Number(selectionCheckbox.getAttribute(tableControls.checkbox.attributes.checkbox));
1160
+ this._selection.toggleSelectionForRowIndex(rowIndex);
1161
+ }
1162
+ }
1163
+ }
1164
+ };
1165
+ this._table = table;
1166
+ this._projection = projection;
1167
+ this._sorting.value = sorting.at(0);
1168
+ this._pinnedRows = pinnedRows;
1169
+ this._onInsertRow = onInsertRow;
1170
+ this._onDeleteRows = onDeleteRows;
1171
+ this._onDeleteColumn = onDeleteColumn;
1172
+ this._onCellUpdate = onCellUpdate;
1173
+ this._onRowOrderChanged = onRowOrderChanged;
1174
+ }
1175
+ get table() {
1176
+ return this._table;
1177
+ }
1178
+ get projection() {
1179
+ return this._projection;
1180
+ }
1181
+ get pinnedRows() {
1182
+ return this._pinnedRows;
1183
+ }
1184
+ get columnMeta() {
1185
+ invariant3(this._columnMeta, void 0, {
1186
+ F: __dxlog_file4,
1187
+ L: 124,
1188
+ S: this,
1189
+ A: [
1190
+ "this._columnMeta",
1191
+ ""
1192
+ ]
1193
+ });
1194
+ return this._columnMeta;
1195
+ }
1196
+ get sorting() {
1197
+ return this._sorting.value;
1198
+ }
1199
+ get modalController() {
1200
+ return this._modalController;
1201
+ }
1202
+ get selection() {
1203
+ return this._selection;
1204
+ }
1205
+ //
1206
+ // Initialisation
1207
+ //
1208
+ async _open() {
1209
+ this.initializeColumnMeta();
1210
+ this.initializeSorting();
1211
+ this.initializeEffects();
1212
+ this._selection = new SelectionModel(this._sortedRows, () => this._onRowOrderChanged?.());
1213
+ await this._selection.open(this._ctx);
1214
+ }
1215
+ initializeColumnMeta() {
1216
+ this._columnMeta = computed2(() => {
1217
+ const fields = this._table.view?.fields ?? [];
1218
+ const meta = Object.fromEntries(fields.map((field, index) => [
1219
+ index,
1220
+ {
1221
+ size: field?.size ?? 256,
1222
+ resizeable: true
1223
+ }
1224
+ ]));
1225
+ return {
1226
+ grid: meta,
1227
+ frozenColsStart: {
1228
+ 0: {
1229
+ size: 30,
1230
+ resizeable: false
1231
+ }
1232
+ },
1233
+ frozenColsEnd: {
1234
+ 0: {
1235
+ size: 40,
1236
+ resizeable: false
1237
+ }
1238
+ }
1239
+ };
1240
+ });
1241
+ }
1242
+ initializeSorting() {
1243
+ this._sortedRows = computed2(() => {
1244
+ this._displayToDataIndex.clear();
1245
+ const sort = this._sorting.value;
1246
+ if (!sort) {
1247
+ return this._rows.value;
1248
+ }
1249
+ const field = this._table.view?.fields.find((field2) => field2.id === sort.fieldId);
1250
+ if (!field) {
1251
+ return this._rows.value;
1252
+ }
1253
+ const dataWithIndices = this._rows.value.map((item, index) => {
1254
+ const value = getValue2(item, field.path);
1255
+ return {
1256
+ item,
1257
+ index,
1258
+ value,
1259
+ isEmpty: value == null || value === ""
1260
+ };
1261
+ });
1262
+ const sorted = orderBy(dataWithIndices, [
1263
+ "isEmpty",
1264
+ "value"
1265
+ ], [
1266
+ "asc",
1267
+ sort.direction
1268
+ ]);
1269
+ for (let displayIndex = 0; displayIndex < sorted.length; displayIndex++) {
1270
+ const { index: dataIndex } = sorted[displayIndex];
1271
+ if (displayIndex !== dataIndex) {
1272
+ this._displayToDataIndex.set(displayIndex, dataIndex);
1273
+ }
1274
+ }
1275
+ return sorted.map(({ item }) => item);
1276
+ });
1277
+ }
1278
+ initializeEffects() {
1279
+ const rowOrderWatcher = effect2(() => {
1280
+ touch(this._sortedRows.value);
1281
+ this._onRowOrderChanged?.();
1282
+ });
1283
+ this._ctx.onDispose(rowOrderWatcher);
1284
+ const rowEffectManager = effect2(() => {
1285
+ const { start, end } = touch(this._visibleRange.value);
1286
+ const rowEffects = [];
1287
+ for (let row = start.row; row <= end.row; row++) {
1288
+ rowEffects.push(effect2(() => {
1289
+ const obj = this._sortedRows.value[row];
1290
+ this?._table?.view?.fields.forEach((field) => touch(getValue2(obj, field.path)));
1291
+ this._onCellUpdate?.({
1292
+ row,
1293
+ col: start.col
1294
+ });
1295
+ }));
1296
+ }
1297
+ return () => rowEffects.forEach((cleanup) => cleanup());
1298
+ });
1299
+ this._ctx.onDispose(rowEffectManager);
1300
+ }
1301
+ //
1302
+ // Column Operations
1303
+ //
1304
+ deleteColumn(fieldId) {
1305
+ if (!this.table.view) {
1306
+ return;
1307
+ }
1308
+ const field = this.table.view.fields.find((field2) => field2.id === fieldId);
1309
+ if (field && this._onDeleteColumn) {
1310
+ if (this._sorting.value?.fieldId === fieldId) {
1311
+ this.clearSort();
1312
+ }
1313
+ this._onDeleteColumn(field.id);
1314
+ }
1315
+ }
1316
+ //
1317
+ // Resize
1318
+ //
1319
+ setColumnWidth(columnIndex, width) {
1320
+ const fields = this.table.view?.fields ?? [];
1321
+ if (columnIndex < fields.length) {
1322
+ const newWidth = Math.max(0, width);
1323
+ const field = fields[columnIndex];
1324
+ if (field) {
1325
+ field.size = newWidth;
1326
+ }
1327
+ }
1328
+ }
1329
+ //
1330
+ // Sorting
1331
+ //
1332
+ setSort(fieldId, direction) {
1333
+ this._sorting.value = {
1334
+ fieldId,
1335
+ direction
1336
+ };
1337
+ }
1338
+ clearSort() {
1339
+ this._sorting.value = void 0;
1340
+ }
1341
+ //
1342
+ // Pinning
1343
+ //
1344
+ // TODO(burdon): Change to setPinned(on/off).
1345
+ pinRow(rowIndex, side) {
1346
+ this._pinnedRows[side].push(rowIndex);
1347
+ }
1348
+ unpinRow(rowIndex) {
1349
+ this._pinnedRows.top = this._pinnedRows.top.filter((index) => index !== rowIndex);
1350
+ this._pinnedRows.bottom = this._pinnedRows.bottom.filter((index) => index !== rowIndex);
1351
+ }
1352
+ };
1353
+
1354
+ // packages/ui/react-ui-table/src/hooks/useTableModel.ts
1355
+ var useTableModel = ({ objects, table, projection, ...props }) => {
1356
+ const [model, setModel] = useState3();
1357
+ useEffect2(() => {
1358
+ if (!table || !projection) {
1359
+ return;
1360
+ }
1361
+ let model2;
1362
+ const t = setTimeout(async () => {
1363
+ model2 = new TableModel({
1364
+ table,
1365
+ projection,
1366
+ ...props
1367
+ });
1368
+ await model2.open();
1369
+ setModel(model2);
1370
+ });
1371
+ return () => {
1372
+ clearTimeout(t);
1373
+ void model2?.close();
1374
+ };
1375
+ }, [
1376
+ table,
1377
+ projection
1378
+ ]);
1379
+ useEffect2(() => {
1380
+ if (objects) {
1381
+ model?.setRows(objects);
1382
+ }
1383
+ }, [
1384
+ model,
1385
+ objects
1386
+ ]);
1387
+ return model;
1388
+ };
1389
+ export {
1390
+ Table,
1391
+ TableType,
1392
+ Toolbar,
1393
+ fromGridCell,
1394
+ initializeTable,
1395
+ tableButtons,
1396
+ toGridCell,
1397
+ touch,
1398
+ translations_default as translations,
1399
+ useTableModel,
1400
+ useToolbarContext
1401
+ };
1402
+ //# sourceMappingURL=index.mjs.map