@dxos/react-ui-table 0.6.14-staging.e15392e → 0.7.1-staging.599df14

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