@dxos/react-ui-table 0.6.14-staging.e15392e → 0.7.0

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 +1275 -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 +1381 -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 +1400 -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 +172 -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 +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,1400 @@
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-data";
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 }) => {
473
+ return /* @__PURE__ */ React5.createElement("div", {
474
+ role: "none",
475
+ className: "relative flex flex-col"
476
+ }, children);
477
+ };
478
+ var TableMain = /* @__PURE__ */ forwardRef(({ model }, 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 (!hasAttention) {
534
+ event.stopPropagation();
535
+ }
536
+ }, [
537
+ hasAttention
538
+ ]);
539
+ const handleQuery = useCallback3(async ({ field, props }, _text) => {
540
+ if (model && props.referenceSchema && field.referencePath) {
541
+ const space = getSpace2(model.table);
542
+ invariant2(space, void 0, {
543
+ F: __dxlog_file3,
544
+ L: 149,
545
+ S: void 0,
546
+ A: [
547
+ "space",
548
+ ""
549
+ ]
550
+ });
551
+ const schema = space.db.schemaRegistry.getSchema(props.referenceSchema);
552
+ if (schema) {
553
+ const { objects } = await space.db.query(Filter.schema(schema)).run();
554
+ return objects.map((obj) => {
555
+ const value = getValue(obj, field.referencePath);
556
+ if (!value || typeof value !== "string") {
557
+ return void 0;
558
+ }
559
+ return {
560
+ label: value,
561
+ data: obj
562
+ };
563
+ }).filter(isNotFalsy);
564
+ }
565
+ }
566
+ return [];
567
+ }, [
568
+ model
569
+ ]);
570
+ if (!model) {
571
+ return /* @__PURE__ */ React5.createElement("span", {
572
+ role: "none",
573
+ className: "attention-surface"
574
+ });
575
+ }
576
+ return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(Grid.Root, {
577
+ id: model.table.id ?? "table-grid"
578
+ }, /* @__PURE__ */ React5.createElement(TableCellEditor, {
579
+ model,
580
+ onEnter: handleEnter,
581
+ onFocus: handleFocus,
582
+ onQuery: handleQuery
583
+ }), /* @__PURE__ */ React5.createElement(Grid.Content, {
584
+ onWheelCapture: handleWheel,
585
+ className: mx("[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:grow [&_.dx-grid]:max-is-max [&_.dx-grid]:bs-0 [&_.dx-grid]:max-bs-max", inlineEndLine, blockEndLine),
586
+ frozen,
587
+ columns: model.columnMeta.value,
588
+ limitRows: model.getRowCount() ?? 0,
589
+ limitColumns: model.table.view?.fields?.length ?? 0,
590
+ onAxisResize: handleAxisResize,
591
+ onClick: model?.handleGridClick,
592
+ onKeyDown: handleKeyDown,
593
+ overscroll: "trap",
594
+ ref: setDxGrid
595
+ })), /* @__PURE__ */ React5.createElement(RowActionsMenu, {
596
+ model
597
+ }), /* @__PURE__ */ React5.createElement(ColumnActionsMenu, {
598
+ model
599
+ }), /* @__PURE__ */ React5.createElement(ColumnSettings, {
600
+ model
601
+ }));
602
+ });
603
+ var Table = {
604
+ Root: TableRoot,
605
+ Main: TableMain
606
+ };
607
+
608
+ // packages/ui/react-ui-table/src/components/Toolbar/Toolbar.tsx
609
+ import { ChatText, RowsPlusBottom } from "@phosphor-icons/react";
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 { Toolbar as NaturalToolbar, Tooltip } from "@dxos/react-ui";
617
+ import { getSize } from "@dxos/react-ui-theme";
618
+ var iconStyles = getSize(5);
619
+ var buttonStyles = "min-bs-0 p-2";
620
+ var tooltipProps = {
621
+ side: "top",
622
+ classNames: "z-10"
623
+ };
624
+ var ToolbarSeparator = () => /* @__PURE__ */ React6.createElement("div", {
625
+ role: "separator",
626
+ className: "grow"
627
+ });
628
+ var ToolbarButton = ({ Icon, children, ...props }) => {
629
+ return /* @__PURE__ */ React6.createElement(Tooltip.Root, null, /* @__PURE__ */ React6.createElement(Tooltip.Trigger, {
630
+ asChild: true
631
+ }, /* @__PURE__ */ React6.createElement(NaturalToolbar.Button, {
632
+ variant: "ghost",
633
+ ...props,
634
+ classNames: buttonStyles
635
+ }, /* @__PURE__ */ React6.createElement(Icon, {
636
+ className: iconStyles
637
+ }), /* @__PURE__ */ React6.createElement("span", {
638
+ className: "sr-only"
639
+ }, children))), /* @__PURE__ */ React6.createElement(Tooltip.Portal, null, /* @__PURE__ */ React6.createElement(Tooltip.Content, tooltipProps, children, /* @__PURE__ */ React6.createElement(Tooltip.Arrow, null))));
640
+ };
641
+
642
+ // packages/ui/react-ui-table/src/components/Toolbar/Toolbar.tsx
643
+ var [ToolbarContextProvider, useToolbarContext] = createContext("Toolbar");
644
+ var ToolbarRoot = ({ classNames, children, onAction }) => {
645
+ return /* @__PURE__ */ React7.createElement(ToolbarContextProvider, {
646
+ onAction
647
+ }, /* @__PURE__ */ React7.createElement(NaturalToolbar2.Root, {
648
+ classNames: [
649
+ "is-full shrink-0 overflow-x-auto overflow-y-hidden p-1",
650
+ classNames
651
+ ]
652
+ }, children));
653
+ };
654
+ var Editing = () => {
655
+ const { onAction } = useToolbarContext("Editing");
656
+ const { t } = useTranslation3(translationKey);
657
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(ToolbarButton, {
658
+ value: "add-row",
659
+ Icon: RowsPlusBottom,
660
+ "data-testid": "table.toolbar.add-row",
661
+ onClick: () => onAction?.({
662
+ type: "add-row"
663
+ })
664
+ }, t("add row")));
665
+ };
666
+ var Actions = () => {
667
+ const { onAction } = useToolbarContext("Actions");
668
+ const { t } = useTranslation3(translationKey);
669
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(ToolbarButton, {
670
+ value: "comment",
671
+ Icon: ChatText,
672
+ "data-testid": "table.toolbar.comment",
673
+ onClick: () => onAction?.({
674
+ type: "comment"
675
+ })
676
+ }, t("create comment")));
677
+ };
678
+ var Toolbar = {
679
+ Root: ToolbarRoot,
680
+ Editing,
681
+ Actions,
682
+ Separator: ToolbarSeparator
683
+ };
684
+
685
+ // packages/ui/react-ui-table/src/hooks/useTableModel.ts
686
+ import { useEffect as useEffect2, useState as useState3 } from "react";
687
+
688
+ // packages/ui/react-ui-table/src/model/table-model.ts
689
+ import { computed as computed2, effect as effect2, signal as signal3 } from "@preact/signals-core";
690
+ import orderBy from "lodash.orderby";
691
+ import { Resource as Resource2 } from "@dxos/context";
692
+ import { getValue as getValue2, setValue, FormatEnum as FormatEnum3 } from "@dxos/echo-schema";
693
+ import { invariant as invariant3 } from "@dxos/invariant";
694
+ import { PublicKey as PublicKey2 } from "@dxos/react-client";
695
+ import { cellClassesForFieldType, cellClassesForRowSelection, formatForDisplay, formatForEditing, parseValue } from "@dxos/react-ui-data";
696
+ import { mx as mx2 } from "@dxos/react-ui-theme";
697
+ import { VIEW_FIELD_LIMIT } from "@dxos/schema";
698
+
699
+ // packages/ui/react-ui-table/src/model/modal-controller.ts
700
+ import { signal } from "@preact/signals-core";
701
+ var ModalController = class {
702
+ constructor() {
703
+ this._state = signal({
704
+ type: "closed"
705
+ });
706
+ this._triggerRef = {
707
+ current: null
708
+ };
709
+ this.handleClick = (event) => {
710
+ const target = event.target;
711
+ const rowButton = target.closest(`button[${tableButtons.rowMenu.attr}]`);
712
+ if (rowButton) {
713
+ this._triggerRef.current = rowButton;
714
+ this._state.value = {
715
+ type: "row",
716
+ rowIndex: Number(rowButton.getAttribute(tableButtons.rowMenu.attr))
717
+ };
718
+ return true;
719
+ }
720
+ const columnButton = target.closest(`button[${tableButtons.columnSettings.attr}]`);
721
+ if (columnButton) {
722
+ const fieldId = columnButton.getAttribute(tableButtons.columnSettings.attr);
723
+ this._triggerRef.current = columnButton;
724
+ this._state.value = {
725
+ type: "column",
726
+ fieldId
727
+ };
728
+ return true;
729
+ }
730
+ const addColumnButton = target.closest(`button[${tableButtons.addColumn.attr}]`);
731
+ if (addColumnButton) {
732
+ this._triggerRef.current = addColumnButton;
733
+ this._state.value = {
734
+ type: "columnSettings",
735
+ mode: {
736
+ type: "create"
737
+ }
738
+ };
739
+ return true;
740
+ }
741
+ return false;
742
+ };
743
+ this.openColumnSettings = () => {
744
+ if (this._state.value.type === "column") {
745
+ const fieldId = this._state.value.fieldId;
746
+ requestAnimationFrame(() => {
747
+ this._state.value = {
748
+ type: "columnSettings",
749
+ mode: {
750
+ type: "edit",
751
+ fieldId
752
+ }
753
+ };
754
+ });
755
+ }
756
+ };
757
+ this.close = () => {
758
+ this._state.value = {
759
+ type: "closed"
760
+ };
761
+ };
762
+ }
763
+ get state() {
764
+ return this._state;
765
+ }
766
+ get trigger() {
767
+ return this._triggerRef;
768
+ }
769
+ };
770
+
771
+ // packages/ui/react-ui-table/src/model/selection-model.ts
772
+ import { computed, effect, signal as signal2 } from "@preact/signals-core";
773
+ import { Resource } from "@dxos/context";
774
+ var SelectionModel = class extends Resource {
775
+ constructor(_rows, _onSelectionChanged) {
776
+ super();
777
+ this._rows = _rows;
778
+ this._onSelectionChanged = _onSelectionChanged;
779
+ this._selection = signal2(/* @__PURE__ */ new Set());
780
+ this._validSelectedIds = computed(() => {
781
+ const rows = this._rows.value;
782
+ if (!rows) {
783
+ return /* @__PURE__ */ new Set();
784
+ }
785
+ const validIds = new Set(rows.map((row) => row.id));
786
+ return new Set([
787
+ ...this._selection.value
788
+ ].filter((id) => validIds.has(id)));
789
+ });
790
+ this._hasSelection = computed(() => this._validSelectedIds.value.size > 0);
791
+ this._allSelected = computed(() => {
792
+ const rows = this._rows.value;
793
+ if (rows.length === 0) {
794
+ return false;
795
+ }
796
+ return rows.length !== 0 || rows.every((row) => this._selection.value.has(row.id));
797
+ });
798
+ this.getSelectedRows = () => {
799
+ const selectedIds = this._validSelectedIds.value;
800
+ return this._rows.value.filter((row) => selectedIds.has(row.id));
801
+ };
802
+ this.isRowIndexSelected = (rowIndex) => {
803
+ const row = this._rows.value[rowIndex];
804
+ return this._selection.value.has(row.id);
805
+ };
806
+ this.isObjectSelected = (object) => {
807
+ return this._selection.value.has(object.id);
808
+ };
809
+ this.toggleSelectionForRowIndex = (rowIndex) => {
810
+ const row = this._rows.value[rowIndex];
811
+ const newSelection = new Set(this._selection.value);
812
+ if (newSelection.has(row.id)) {
813
+ newSelection.delete(row.id);
814
+ } else {
815
+ newSelection.add(row.id);
816
+ }
817
+ this._selection.value = newSelection;
818
+ };
819
+ this.setSelection = (mode) => {
820
+ this._selection.value = mode === "all" ? new Set(this._rows.value.map((row) => row.id)) : /* @__PURE__ */ new Set();
821
+ };
822
+ }
823
+ async _open() {
824
+ const selectionWatcher = effect(() => {
825
+ touch(this._selection.value);
826
+ this._onSelectionChanged?.();
827
+ });
828
+ this._ctx.onDispose(selectionWatcher);
829
+ }
830
+ //
831
+ // Getters
832
+ //
833
+ get selection() {
834
+ return this._selection;
835
+ }
836
+ get hasSelection() {
837
+ return this._hasSelection;
838
+ }
839
+ get allRowsSeleted() {
840
+ return this._allSelected;
841
+ }
842
+ };
843
+
844
+ // packages/ui/react-ui-table/src/util/table-controls.ts
845
+ var checkboxAttributes = {
846
+ checkbox: "data-table-checkbox",
847
+ header: "data-table-header"
848
+ };
849
+ var renderCheckbox = ({ rowIndex, header = false, checked = false, disabled = false }) => {
850
+ const baseClasses = "absolute inset-block-[6px] inline-end-[6px]";
851
+ const { attributes } = tableControls.checkbox;
852
+ return `<input type="checkbox" class="${baseClasses}" ${attributes.checkbox}="${rowIndex}" ${header ? attributes.header : ""} ${checked ? "checked" : ""} ${disabled ? "disabled" : ""}/>`;
853
+ };
854
+ var tableControls = {
855
+ checkbox: {
856
+ attributes: checkboxAttributes,
857
+ render: renderCheckbox
858
+ }
859
+ };
860
+
861
+ // packages/ui/react-ui-table/src/model/table-model.ts
862
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-table/src/model/table-model.ts";
863
+ var TableModel = class extends Resource2 {
864
+ constructor({ table, projection, sorting = [], pinnedRows = {
865
+ top: [],
866
+ bottom: []
867
+ }, onCellUpdate, onDeleteColumn, onDeleteRows, onInsertRow, onRowOrderChanged }) {
868
+ super();
869
+ this.id = `table-model-${PublicKey2.random().truncate()}`;
870
+ this._visibleRange = signal3({
871
+ start: {
872
+ row: 0,
873
+ col: 0
874
+ },
875
+ end: {
876
+ row: 0,
877
+ col: 0
878
+ }
879
+ });
880
+ /**
881
+ * Maps display indices to data indices.
882
+ * Used for translating between sorted/displayed order and original data order.
883
+ * Keys are display indices, values are corresponding data indices.
884
+ */
885
+ this._displayToDataIndex = /* @__PURE__ */ new Map();
886
+ this._sorting = signal3(void 0);
887
+ this._rows = signal3([]);
888
+ this._modalController = new ModalController();
889
+ //
890
+ // Get Cells
891
+ //
892
+ this.getCells = (range, plane) => {
893
+ switch (plane) {
894
+ case "grid": {
895
+ this._visibleRange.value = range;
896
+ return this.getMainGridCells(range);
897
+ }
898
+ case "frozenRowsStart": {
899
+ return this.getHeaderCells(range);
900
+ }
901
+ case "frozenColsStart": {
902
+ return this.getSelectionColumnCells(range);
903
+ }
904
+ case "frozenColsEnd": {
905
+ return this.getActionColumnCells(range);
906
+ }
907
+ case "fixedStartStart": {
908
+ return this.getSelectAllCell();
909
+ }
910
+ case "fixedStartEnd": {
911
+ return this.getNewColumnCell();
912
+ }
913
+ default: {
914
+ return {};
915
+ }
916
+ }
917
+ };
918
+ this.getMainGridCells = (range) => {
919
+ const values = {};
920
+ const fields = this._table.view?.fields ?? [];
921
+ const addCell = (obj, field, colIndex, displayIndex) => {
922
+ const { props } = this._projection.getFieldProjection(field.id);
923
+ const value = {
924
+ get value() {
925
+ const value2 = getValue2(obj, field.path);
926
+ if (value2 == null) {
927
+ return "";
928
+ }
929
+ switch (props.format) {
930
+ case FormatEnum3.Ref: {
931
+ if (!field.referencePath) {
932
+ return "";
933
+ }
934
+ return getValue2(value2, field.referencePath);
935
+ }
936
+ default: {
937
+ return formatForDisplay({
938
+ type: props.type,
939
+ format: props.format,
940
+ value: value2
941
+ });
942
+ }
943
+ }
944
+ }
945
+ };
946
+ const classes = [];
947
+ const formatClasses = cellClassesForFieldType({
948
+ type: props.type,
949
+ format: props.format
950
+ });
951
+ if (formatClasses) {
952
+ classes.push(formatClasses);
953
+ }
954
+ const rowSelectionClasses = cellClassesForRowSelection(this._selection.isObjectSelected(obj));
955
+ if (rowSelectionClasses) {
956
+ classes.push(rowSelectionClasses);
957
+ }
958
+ if (classes.length > 0) {
959
+ value.className = mx2(classes.flat());
960
+ }
961
+ const idx = fromGridCell({
962
+ col: colIndex,
963
+ row: displayIndex
964
+ });
965
+ values[idx] = value;
966
+ };
967
+ for (let row = range.start.row; row <= range.end.row && row < this._sortedRows.value.length; row++) {
968
+ for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {
969
+ const field = fields[col];
970
+ if (!field) {
971
+ continue;
972
+ }
973
+ addCell(this._sortedRows.value[row], field, col, row);
974
+ }
975
+ }
976
+ return values;
977
+ };
978
+ this.getHeaderCells = (range) => {
979
+ const values = {};
980
+ const fields = this.table.view?.fields ?? [];
981
+ for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {
982
+ const { field, props } = this._projection.getFieldProjection(fields[col].id);
983
+ values[fromGridCell({
984
+ col,
985
+ row: 0
986
+ })] = {
987
+ value: props.title ?? field.path,
988
+ readonly: true,
989
+ resizeHandle: "col",
990
+ accessoryHtml: tableButtons.columnSettings.render({
991
+ fieldId: field.id
992
+ })
993
+ };
994
+ }
995
+ return values;
996
+ };
997
+ this.getSelectionColumnCells = (range) => {
998
+ const values = {};
999
+ for (let row = range.start.row; row <= range.end.row && row < this._rows.value.length; row++) {
1000
+ const isSelected = this._selection.isRowIndexSelected(row);
1001
+ const classes = cellClassesForRowSelection(isSelected);
1002
+ values[fromGridCell({
1003
+ col: 0,
1004
+ row
1005
+ })] = {
1006
+ value: "",
1007
+ readonly: true,
1008
+ className: classes ? mx2(classes) : void 0,
1009
+ accessoryHtml: tableControls.checkbox.render({
1010
+ rowIndex: row,
1011
+ checked: isSelected
1012
+ })
1013
+ };
1014
+ }
1015
+ return values;
1016
+ };
1017
+ this.getActionColumnCells = (range) => {
1018
+ const values = {};
1019
+ for (let row = range.start.row; row <= range.end.row && row < this._rows.value.length; row++) {
1020
+ const isSelected = this._selection.isRowIndexSelected(row);
1021
+ const classes = cellClassesForRowSelection(isSelected);
1022
+ values[fromGridCell({
1023
+ col: 0,
1024
+ row
1025
+ })] = {
1026
+ value: "",
1027
+ readonly: true,
1028
+ className: classes ? mx2(classes) : void 0,
1029
+ accessoryHtml: tableButtons.rowMenu.render({
1030
+ rowIndex: row
1031
+ })
1032
+ };
1033
+ }
1034
+ return values;
1035
+ };
1036
+ this.getSelectAllCell = () => {
1037
+ return {
1038
+ [fromGridCell({
1039
+ col: 0,
1040
+ row: 0
1041
+ })]: {
1042
+ value: "",
1043
+ accessoryHtml: tableControls.checkbox.render({
1044
+ rowIndex: 0,
1045
+ header: true,
1046
+ checked: this._selection.allRowsSeleted.value
1047
+ }),
1048
+ readonly: true
1049
+ }
1050
+ };
1051
+ };
1052
+ this.getNewColumnCell = () => {
1053
+ return {
1054
+ [fromGridCell({
1055
+ col: 0,
1056
+ row: 0
1057
+ })]: {
1058
+ value: "",
1059
+ accessoryHtml: tableButtons.addColumn.render({
1060
+ disabled: (this._table.view?.fields?.length ?? 0) >= VIEW_FIELD_LIMIT
1061
+ }),
1062
+ readonly: true
1063
+ }
1064
+ };
1065
+ };
1066
+ //
1067
+ // Data
1068
+ //
1069
+ this.setRows = (obj) => {
1070
+ this._rows.value = obj;
1071
+ };
1072
+ this.getRowCount = () => this._rows.value.length;
1073
+ this.getColumnCount = () => this.table.view?.fields.length ?? 0;
1074
+ this.insertRow = (rowIndex) => {
1075
+ const row = rowIndex !== void 0 ? this._displayToDataIndex.get(rowIndex) ?? rowIndex : this._rows.value.length;
1076
+ this._onInsertRow?.(row);
1077
+ };
1078
+ this.deleteRow = (rowIndex) => {
1079
+ const row = this._displayToDataIndex.get(rowIndex) ?? rowIndex;
1080
+ const obj = this._rows.value[row];
1081
+ const objectsToDelete = [];
1082
+ if (this._selection.hasSelection.value) {
1083
+ const selectedRows = this._selection.getSelectedRows();
1084
+ objectsToDelete.push(...selectedRows);
1085
+ } else {
1086
+ objectsToDelete.push(obj);
1087
+ }
1088
+ this._onDeleteRows?.(row, objectsToDelete);
1089
+ };
1090
+ this.getCellData = ({ col, row }) => {
1091
+ const fields = this.table.view?.fields ?? [];
1092
+ if (col < 0 || col >= fields.length) {
1093
+ return void 0;
1094
+ }
1095
+ const field = fields[col];
1096
+ const dataIndex = this._displayToDataIndex.get(row) ?? row;
1097
+ const value = getValue2(this._rows.value[dataIndex], field.path);
1098
+ if (value == null) {
1099
+ return "";
1100
+ }
1101
+ const { props } = this._projection.getFieldProjection(field.id);
1102
+ switch (props.format) {
1103
+ case FormatEnum3.Ref: {
1104
+ if (!field.referencePath) {
1105
+ return "";
1106
+ }
1107
+ return getValue2(value, field.referencePath);
1108
+ }
1109
+ default: {
1110
+ return formatForEditing({
1111
+ type: props.type,
1112
+ format: props.format,
1113
+ value
1114
+ });
1115
+ }
1116
+ }
1117
+ };
1118
+ this.setCellData = ({ col, row }, value) => {
1119
+ const rowIdx = this._displayToDataIndex.get(row) ?? row;
1120
+ const fields = this.table.view?.fields ?? [];
1121
+ if (col < 0 || col >= fields.length) {
1122
+ return;
1123
+ }
1124
+ const field = fields[col];
1125
+ const { props } = this._projection.getFieldProjection(field.id);
1126
+ switch (props.format) {
1127
+ case FormatEnum3.Ref: {
1128
+ setValue(this._rows.value[rowIdx], field.path, value);
1129
+ break;
1130
+ }
1131
+ default: {
1132
+ setValue(this._rows.value[rowIdx], field.path, parseValue({
1133
+ type: props.type,
1134
+ format: props.format,
1135
+ value
1136
+ }));
1137
+ break;
1138
+ }
1139
+ }
1140
+ };
1141
+ //
1142
+ // Interactions
1143
+ //
1144
+ this.handleGridClick = (event) => {
1145
+ if (!this._modalController.handleClick(event)) {
1146
+ const target = event.target;
1147
+ const selectionCheckbox = target.closest(`input[${tableControls.checkbox.attributes.checkbox}]`);
1148
+ if (selectionCheckbox) {
1149
+ const isHeader = selectionCheckbox.hasAttribute(tableControls.checkbox.attributes.header);
1150
+ if (isHeader) {
1151
+ if (this._selection.allRowsSeleted.value) {
1152
+ this._selection.setSelection("none");
1153
+ } else {
1154
+ this._selection.setSelection("all");
1155
+ }
1156
+ } else {
1157
+ const rowIndex = Number(selectionCheckbox.getAttribute(tableControls.checkbox.attributes.checkbox));
1158
+ this._selection.toggleSelectionForRowIndex(rowIndex);
1159
+ }
1160
+ }
1161
+ }
1162
+ };
1163
+ this._table = table;
1164
+ this._projection = projection;
1165
+ this._sorting.value = sorting.at(0);
1166
+ this._pinnedRows = pinnedRows;
1167
+ this._onInsertRow = onInsertRow;
1168
+ this._onDeleteRows = onDeleteRows;
1169
+ this._onDeleteColumn = onDeleteColumn;
1170
+ this._onCellUpdate = onCellUpdate;
1171
+ this._onRowOrderChanged = onRowOrderChanged;
1172
+ }
1173
+ get table() {
1174
+ return this._table;
1175
+ }
1176
+ get projection() {
1177
+ return this._projection;
1178
+ }
1179
+ get pinnedRows() {
1180
+ return this._pinnedRows;
1181
+ }
1182
+ get columnMeta() {
1183
+ invariant3(this._columnMeta, void 0, {
1184
+ F: __dxlog_file4,
1185
+ L: 124,
1186
+ S: this,
1187
+ A: [
1188
+ "this._columnMeta",
1189
+ ""
1190
+ ]
1191
+ });
1192
+ return this._columnMeta;
1193
+ }
1194
+ get sorting() {
1195
+ return this._sorting.value;
1196
+ }
1197
+ get modalController() {
1198
+ return this._modalController;
1199
+ }
1200
+ get selection() {
1201
+ return this._selection;
1202
+ }
1203
+ //
1204
+ // Initialisation
1205
+ //
1206
+ async _open() {
1207
+ this.initializeColumnMeta();
1208
+ this.initializeSorting();
1209
+ this.initializeEffects();
1210
+ this._selection = new SelectionModel(this._sortedRows, () => this._onRowOrderChanged?.());
1211
+ await this._selection.open(this._ctx);
1212
+ }
1213
+ initializeColumnMeta() {
1214
+ this._columnMeta = computed2(() => {
1215
+ const fields = this._table.view?.fields ?? [];
1216
+ const meta = Object.fromEntries(fields.map((field, index) => [
1217
+ index,
1218
+ {
1219
+ size: field?.size ?? 256,
1220
+ resizeable: true
1221
+ }
1222
+ ]));
1223
+ return {
1224
+ grid: meta,
1225
+ frozenColsStart: {
1226
+ 0: {
1227
+ size: 30,
1228
+ resizeable: false
1229
+ }
1230
+ },
1231
+ frozenColsEnd: {
1232
+ 0: {
1233
+ size: 40,
1234
+ resizeable: false
1235
+ }
1236
+ }
1237
+ };
1238
+ });
1239
+ }
1240
+ initializeSorting() {
1241
+ this._sortedRows = computed2(() => {
1242
+ this._displayToDataIndex.clear();
1243
+ const sort = this._sorting.value;
1244
+ if (!sort) {
1245
+ return this._rows.value;
1246
+ }
1247
+ const field = this._table.view?.fields.find((field2) => field2.id === sort.fieldId);
1248
+ if (!field) {
1249
+ return this._rows.value;
1250
+ }
1251
+ const dataWithIndices = this._rows.value.map((item, index) => {
1252
+ const value = getValue2(item, field.path);
1253
+ return {
1254
+ item,
1255
+ index,
1256
+ value,
1257
+ isEmpty: value == null || value === ""
1258
+ };
1259
+ });
1260
+ const sorted = orderBy(dataWithIndices, [
1261
+ "isEmpty",
1262
+ "value"
1263
+ ], [
1264
+ "asc",
1265
+ sort.direction
1266
+ ]);
1267
+ for (let displayIndex = 0; displayIndex < sorted.length; displayIndex++) {
1268
+ const { index: dataIndex } = sorted[displayIndex];
1269
+ if (displayIndex !== dataIndex) {
1270
+ this._displayToDataIndex.set(displayIndex, dataIndex);
1271
+ }
1272
+ }
1273
+ return sorted.map(({ item }) => item);
1274
+ });
1275
+ }
1276
+ initializeEffects() {
1277
+ const rowOrderWatcher = effect2(() => {
1278
+ touch(this._sortedRows.value);
1279
+ this._onRowOrderChanged?.();
1280
+ });
1281
+ this._ctx.onDispose(rowOrderWatcher);
1282
+ const rowEffectManager = effect2(() => {
1283
+ const { start, end } = touch(this._visibleRange.value);
1284
+ const rowEffects = [];
1285
+ for (let row = start.row; row <= end.row; row++) {
1286
+ rowEffects.push(effect2(() => {
1287
+ const obj = this._sortedRows.value[row];
1288
+ this?._table?.view?.fields.forEach((field) => touch(getValue2(obj, field.path)));
1289
+ this._onCellUpdate?.({
1290
+ row,
1291
+ col: start.col
1292
+ });
1293
+ }));
1294
+ }
1295
+ return () => rowEffects.forEach((cleanup) => cleanup());
1296
+ });
1297
+ this._ctx.onDispose(rowEffectManager);
1298
+ }
1299
+ //
1300
+ // Column Operations
1301
+ //
1302
+ deleteColumn(fieldId) {
1303
+ if (!this.table.view) {
1304
+ return;
1305
+ }
1306
+ const field = this.table.view.fields.find((field2) => field2.id === fieldId);
1307
+ if (field && this._onDeleteColumn) {
1308
+ if (this._sorting.value?.fieldId === fieldId) {
1309
+ this.clearSort();
1310
+ }
1311
+ this._onDeleteColumn(field.id);
1312
+ }
1313
+ }
1314
+ //
1315
+ // Resize
1316
+ //
1317
+ setColumnWidth(columnIndex, width) {
1318
+ const fields = this.table.view?.fields ?? [];
1319
+ if (columnIndex < fields.length) {
1320
+ const newWidth = Math.max(0, width);
1321
+ const field = fields[columnIndex];
1322
+ if (field) {
1323
+ field.size = newWidth;
1324
+ }
1325
+ }
1326
+ }
1327
+ //
1328
+ // Sorting
1329
+ //
1330
+ setSort(fieldId, direction) {
1331
+ this._sorting.value = {
1332
+ fieldId,
1333
+ direction
1334
+ };
1335
+ }
1336
+ clearSort() {
1337
+ this._sorting.value = void 0;
1338
+ }
1339
+ //
1340
+ // Pinning
1341
+ //
1342
+ // TODO(burdon): Change to setPinned(on/off).
1343
+ pinRow(rowIndex, side) {
1344
+ this._pinnedRows[side].push(rowIndex);
1345
+ }
1346
+ unpinRow(rowIndex) {
1347
+ this._pinnedRows.top = this._pinnedRows.top.filter((index) => index !== rowIndex);
1348
+ this._pinnedRows.bottom = this._pinnedRows.bottom.filter((index) => index !== rowIndex);
1349
+ }
1350
+ };
1351
+
1352
+ // packages/ui/react-ui-table/src/hooks/useTableModel.ts
1353
+ var useTableModel = ({ objects, table, projection, ...props }) => {
1354
+ const [model, setModel] = useState3();
1355
+ useEffect2(() => {
1356
+ if (!table || !projection) {
1357
+ return;
1358
+ }
1359
+ let model2;
1360
+ const t = setTimeout(async () => {
1361
+ model2 = new TableModel({
1362
+ table,
1363
+ projection,
1364
+ ...props
1365
+ });
1366
+ await model2.open();
1367
+ setModel(model2);
1368
+ });
1369
+ return () => {
1370
+ clearTimeout(t);
1371
+ void model2?.close();
1372
+ };
1373
+ }, [
1374
+ table,
1375
+ projection
1376
+ ]);
1377
+ useEffect2(() => {
1378
+ if (objects) {
1379
+ model?.setRows(objects);
1380
+ }
1381
+ }, [
1382
+ model,
1383
+ objects
1384
+ ]);
1385
+ return model;
1386
+ };
1387
+ export {
1388
+ Table,
1389
+ TableType,
1390
+ Toolbar,
1391
+ fromGridCell,
1392
+ initializeTable,
1393
+ tableButtons,
1394
+ toGridCell,
1395
+ touch,
1396
+ translations_default as translations,
1397
+ useTableModel,
1398
+ useToolbarContext
1399
+ };
1400
+ //# sourceMappingURL=index.mjs.map