@dxos/react-ui-table 0.8.1-staging.5be625a → 0.8.1-staging.97aedb1

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 (172) hide show
  1. package/dist/lib/browser/{chunk-5MKYB7NF.mjs → chunk-YWNRUF4J.mjs} +7 -3
  2. package/dist/lib/browser/{chunk-5MKYB7NF.mjs.map → chunk-YWNRUF4J.mjs.map} +3 -3
  3. package/dist/lib/browser/index.mjs +295 -97
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types/index.mjs +1 -1
  7. package/dist/lib/node/{chunk-NRFKBRPV.cjs → chunk-TGG6OZ54.cjs} +10 -6
  8. package/dist/lib/node/{chunk-NRFKBRPV.cjs.map → chunk-TGG6OZ54.cjs.map} +3 -3
  9. package/dist/lib/node/index.cjs +293 -93
  10. package/dist/lib/node/index.cjs.map +3 -3
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/types/index.cjs +3 -3
  13. package/dist/lib/node/types/index.cjs.map +1 -1
  14. package/dist/lib/node-esm/{chunk-SU4D55KI.mjs → chunk-KKLP54L3.mjs} +7 -3
  15. package/dist/lib/node-esm/{chunk-SU4D55KI.mjs.map → chunk-KKLP54L3.mjs.map} +3 -3
  16. package/dist/lib/node-esm/index.mjs +295 -97
  17. package/dist/lib/node-esm/index.mjs.map +3 -3
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/types/index.mjs +1 -1
  20. package/dist/types/src/components/Table/DynamicTable.d.ts +15 -10
  21. package/dist/types/src/components/Table/DynamicTable.d.ts.map +1 -1
  22. package/dist/types/src/components/Table/DynamicTable.stories.d.ts +10 -0
  23. package/dist/types/src/components/Table/DynamicTable.stories.d.ts.map +1 -0
  24. package/dist/types/src/components/Table/Table.d.ts +1 -1
  25. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  26. package/dist/types/src/components/Table/Table.stories.d.ts +2 -3
  27. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Table/relations.stories.d.ts +9 -0
  29. package/dist/types/src/components/Table/relations.stories.d.ts.map +1 -0
  30. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -1
  31. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -1
  32. package/dist/types/src/components/testing.d.ts.map +1 -1
  33. package/dist/types/src/hooks/useTableModel.d.ts +6 -10
  34. package/dist/types/src/hooks/useTableModel.d.ts.map +1 -1
  35. package/dist/types/src/model/index.d.ts +1 -0
  36. package/dist/types/src/model/index.d.ts.map +1 -1
  37. package/dist/types/src/model/selection-model.d.ts +6 -3
  38. package/dist/types/src/model/selection-model.d.ts.map +1 -1
  39. package/dist/types/src/model/table-model.d.ts +13 -14
  40. package/dist/types/src/model/table-model.d.ts.map +1 -1
  41. package/dist/types/src/model/table-presentation.d.ts +4 -4
  42. package/dist/types/src/model/table-presentation.d.ts.map +1 -1
  43. package/dist/types/src/model/table-sorting.d.ts +2 -2
  44. package/dist/types/src/model/table-sorting.d.ts.map +1 -1
  45. package/dist/types/src/types/table.d.ts +2 -1
  46. package/dist/types/src/types/table.d.ts.map +1 -1
  47. package/dist/types/src/util/dynamic-table.d.ts +21 -30
  48. package/dist/types/src/util/dynamic-table.d.ts.map +1 -1
  49. package/dist/types/src/util/table-controls.d.ts +2 -2
  50. package/dist/types/src/util/table-controls.d.ts.map +1 -1
  51. package/dist/types/src/util/table.d.ts.map +1 -1
  52. package/package.json +33 -32
  53. package/src/components/Table/DynamicTable.stories.tsx +155 -0
  54. package/src/components/Table/DynamicTable.tsx +46 -28
  55. package/src/components/Table/Table.stories.tsx +129 -125
  56. package/src/components/Table/Table.tsx +51 -26
  57. package/src/components/Table/relations.stories.tsx +113 -0
  58. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +8 -3
  59. package/src/components/TableCellEditor/TableCellEditor.tsx +102 -4
  60. package/src/components/testing.ts +0 -1
  61. package/src/hooks/useTableModel.ts +11 -11
  62. package/src/model/index.ts +1 -0
  63. package/src/model/selection-model.ts +12 -2
  64. package/src/model/table-model.test.ts +1 -1
  65. package/src/model/table-model.ts +27 -18
  66. package/src/model/table-presentation.test.ts +1 -1
  67. package/src/model/table-presentation.ts +65 -11
  68. package/src/model/table-sorting.ts +2 -2
  69. package/src/playwright/smoke.spec.ts +2 -3
  70. package/src/types/table.ts +6 -5
  71. package/src/util/dynamic-table.ts +57 -25
  72. package/src/util/table-controls.ts +4 -4
  73. package/src/util/table.ts +2 -1
  74. package/dist/lib/browser/deprecated/index.mjs +0 -1483
  75. package/dist/lib/browser/deprecated/index.mjs.map +0 -7
  76. package/dist/lib/node/deprecated/index.cjs +0 -1511
  77. package/dist/lib/node/deprecated/index.cjs.map +0 -7
  78. package/dist/lib/node-esm/deprecated/index.mjs +0 -1485
  79. package/dist/lib/node-esm/deprecated/index.mjs.map +0 -7
  80. package/dist/types/src/deprecated/components/Cell/Cell.d.ts +0 -12
  81. package/dist/types/src/deprecated/components/Cell/Cell.d.ts.map +0 -1
  82. package/dist/types/src/deprecated/components/Cell/CellCombobox.d.ts +0 -13
  83. package/dist/types/src/deprecated/components/Cell/CellCombobox.d.ts.map +0 -1
  84. package/dist/types/src/deprecated/components/Cell/index.d.ts +0 -2
  85. package/dist/types/src/deprecated/components/Cell/index.d.ts.map +0 -1
  86. package/dist/types/src/deprecated/components/ColumnMenu/ColumnMenu.d.ts +0 -23
  87. package/dist/types/src/deprecated/components/ColumnMenu/ColumnMenu.d.ts.map +0 -1
  88. package/dist/types/src/deprecated/components/ColumnMenu/ColumnMenu.stories.d.ts +0 -36
  89. package/dist/types/src/deprecated/components/ColumnMenu/ColumnMenu.stories.d.ts.map +0 -1
  90. package/dist/types/src/deprecated/components/ColumnMenu/ColumnSettings.d.ts +0 -15
  91. package/dist/types/src/deprecated/components/ColumnMenu/ColumnSettings.d.ts.map +0 -1
  92. package/dist/types/src/deprecated/components/ColumnMenu/ColumnSettings.stories.d.ts +0 -84
  93. package/dist/types/src/deprecated/components/ColumnMenu/ColumnSettings.stories.d.ts.map +0 -1
  94. package/dist/types/src/deprecated/components/ColumnMenu/index.d.ts +0 -3
  95. package/dist/types/src/deprecated/components/ColumnMenu/index.d.ts.map +0 -1
  96. package/dist/types/src/deprecated/components/Table/Table.d.ts +0 -20
  97. package/dist/types/src/deprecated/components/Table/Table.d.ts.map +0 -1
  98. package/dist/types/src/deprecated/components/Table/Table.stories.d.ts +0 -116
  99. package/dist/types/src/deprecated/components/Table/Table.stories.d.ts.map +0 -1
  100. package/dist/types/src/deprecated/components/Table/TableBody.d.ts +0 -12
  101. package/dist/types/src/deprecated/components/Table/TableBody.d.ts.map +0 -1
  102. package/dist/types/src/deprecated/components/Table/TableContext.d.ts +0 -13
  103. package/dist/types/src/deprecated/components/Table/TableContext.d.ts.map +0 -1
  104. package/dist/types/src/deprecated/components/Table/TableHead.d.ts +0 -9
  105. package/dist/types/src/deprecated/components/Table/TableHead.d.ts.map +0 -1
  106. package/dist/types/src/deprecated/components/Table/TableRootContext.d.ts +0 -17
  107. package/dist/types/src/deprecated/components/Table/TableRootContext.d.ts.map +0 -1
  108. package/dist/types/src/deprecated/components/Table/index.d.ts +0 -5
  109. package/dist/types/src/deprecated/components/Table/index.d.ts.map +0 -1
  110. package/dist/types/src/deprecated/components/Table/props.d.ts +0 -42
  111. package/dist/types/src/deprecated/components/Table/props.d.ts.map +0 -1
  112. package/dist/types/src/deprecated/components/index.d.ts +0 -4
  113. package/dist/types/src/deprecated/components/index.d.ts.map +0 -1
  114. package/dist/types/src/deprecated/helpers.d.ts +0 -91
  115. package/dist/types/src/deprecated/helpers.d.ts.map +0 -1
  116. package/dist/types/src/deprecated/hooks/index.d.ts +0 -5
  117. package/dist/types/src/deprecated/hooks/index.d.ts.map +0 -1
  118. package/dist/types/src/deprecated/hooks/useColumnSizing.d.ts +0 -12
  119. package/dist/types/src/deprecated/hooks/useColumnSizing.d.ts.map +0 -1
  120. package/dist/types/src/deprecated/hooks/useColumnSorting.d.ts +0 -15
  121. package/dist/types/src/deprecated/hooks/useColumnSorting.d.ts.map +0 -1
  122. package/dist/types/src/deprecated/hooks/usePinLastRow.d.ts +0 -3
  123. package/dist/types/src/deprecated/hooks/usePinLastRow.d.ts.map +0 -1
  124. package/dist/types/src/deprecated/hooks/useRowSelection.d.ts +0 -7
  125. package/dist/types/src/deprecated/hooks/useRowSelection.d.ts.map +0 -1
  126. package/dist/types/src/deprecated/index.d.ts +0 -8
  127. package/dist/types/src/deprecated/index.d.ts.map +0 -1
  128. package/dist/types/src/deprecated/schema/Schema.stories.d.ts +0 -11
  129. package/dist/types/src/deprecated/schema/Schema.stories.d.ts.map +0 -1
  130. package/dist/types/src/deprecated/schema/column-utils.d.ts +0 -7
  131. package/dist/types/src/deprecated/schema/column-utils.d.ts.map +0 -1
  132. package/dist/types/src/deprecated/schema/index.d.ts +0 -3
  133. package/dist/types/src/deprecated/schema/index.d.ts.map +0 -1
  134. package/dist/types/src/deprecated/schema/types.d.ts +0 -27
  135. package/dist/types/src/deprecated/schema/types.d.ts.map +0 -1
  136. package/dist/types/src/deprecated/theme.d.ts +0 -29
  137. package/dist/types/src/deprecated/theme.d.ts.map +0 -1
  138. package/dist/types/src/deprecated/translations.d.ts +0 -21
  139. package/dist/types/src/deprecated/translations.d.ts.map +0 -1
  140. package/dist/types/src/deprecated/types.d.ts +0 -26
  141. package/dist/types/src/deprecated/types.d.ts.map +0 -1
  142. package/src/deprecated/components/Cell/Cell.tsx +0 -88
  143. package/src/deprecated/components/Cell/CellCombobox.tsx +0 -103
  144. package/src/deprecated/components/Cell/index.ts +0 -5
  145. package/src/deprecated/components/ColumnMenu/ColumnMenu.stories.tsx +0 -129
  146. package/src/deprecated/components/ColumnMenu/ColumnMenu.tsx +0 -182
  147. package/src/deprecated/components/ColumnMenu/ColumnSettings.stories.tsx +0 -108
  148. package/src/deprecated/components/ColumnMenu/ColumnSettings.tsx +0 -207
  149. package/src/deprecated/components/ColumnMenu/index.ts +0 -6
  150. package/src/deprecated/components/Table/Table.stories.tsx +0 -508
  151. package/src/deprecated/components/Table/Table.tsx +0 -301
  152. package/src/deprecated/components/Table/TableBody.tsx +0 -82
  153. package/src/deprecated/components/Table/TableContext.tsx +0 -34
  154. package/src/deprecated/components/Table/TableHead.tsx +0 -78
  155. package/src/deprecated/components/Table/TableRootContext.ts +0 -39
  156. package/src/deprecated/components/Table/index.ts +0 -8
  157. package/src/deprecated/components/Table/props.ts +0 -60
  158. package/src/deprecated/components/index.ts +0 -7
  159. package/src/deprecated/helpers.tsx +0 -526
  160. package/src/deprecated/hooks/index.ts +0 -8
  161. package/src/deprecated/hooks/useColumnSizing.ts +0 -46
  162. package/src/deprecated/hooks/useColumnSorting.ts +0 -64
  163. package/src/deprecated/hooks/usePinLastRow.ts +0 -47
  164. package/src/deprecated/hooks/useRowSelection.ts +0 -40
  165. package/src/deprecated/index.ts +0 -12
  166. package/src/deprecated/schema/Schema.stories.tsx +0 -59
  167. package/src/deprecated/schema/column-utils.ts +0 -54
  168. package/src/deprecated/schema/index.ts +0 -6
  169. package/src/deprecated/schema/types.ts +0 -40
  170. package/src/deprecated/theme.ts +0 -82
  171. package/src/deprecated/translations.ts +0 -26
  172. package/src/deprecated/types.ts +0 -38
@@ -1,1511 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var deprecated_exports = {};
30
- __export(deprecated_exports, {
31
- CellCombobox: () => CellCombobox,
32
- ColumnBuilder: () => ColumnBuilder,
33
- ColumnMenu: () => ColumnMenu,
34
- ColumnSettings: () => ColumnSettings,
35
- MemoizedVirtualizedTableContent: () => MemoizedVirtualizedTableContent,
36
- SortIndicator: () => SortIndicator,
37
- TABLE_NAME: () => TABLE_NAME,
38
- Table: () => Table,
39
- TablePrimitive: () => TablePrimitive,
40
- TableProvider: () => TableProvider,
41
- TableRootContext: () => TableRootContext,
42
- createColumnBuilder: () => createColumnBuilder,
43
- currentRow: () => currentRow,
44
- flushPadding: () => flushPadding,
45
- gridCellFocusRing: () => gridCellFocusRing,
46
- groupTh: () => groupTh,
47
- headPadding: () => headPadding,
48
- schemaToColumnDefs: () => schemaToColumnDefs,
49
- selectedRow: () => selectedRow,
50
- tableRoot: () => tableRoot,
51
- tbodyRoot: () => tbodyRoot,
52
- tbodyTr: () => tbodyTr,
53
- tdRoot: () => tdRoot,
54
- textPadding: () => textPadding,
55
- theadResizeRoot: () => theadResizeRoot,
56
- theadRoot: () => theadRoot,
57
- theadTh: () => theadTh,
58
- theadTr: () => theadTr,
59
- translations: () => translations_default,
60
- useColumnResizing: () => useColumnResizing,
61
- useColumnSorting: () => useColumnSorting,
62
- usePinLastRow: () => usePinLastRow,
63
- useRowSelection: () => useRowSelection,
64
- useSortColumn: () => useSortColumn,
65
- useTableContext: () => useTableContext,
66
- useTableRootContext: () => useTableRootContext
67
- });
68
- module.exports = __toCommonJS(deprecated_exports);
69
- var import_react = require("@phosphor-icons/react");
70
- var import_react2 = __toESM(require("react"));
71
- var import_react_ui = require("@dxos/react-ui");
72
- var import_react_ui_searchlist = require("@dxos/react-ui-searchlist");
73
- var import_react_ui_theme = require("@dxos/react-ui-theme");
74
- var import_react3 = require("@phosphor-icons/react");
75
- var import_react4 = __toESM(require("react"));
76
- var import_react_ui2 = require("@dxos/react-ui");
77
- var import_react_ui_theme2 = require("@dxos/react-ui-theme");
78
- var import_react5 = __toESM(require("react"));
79
- var import_echo_schema = require("@dxos/echo-schema");
80
- var import_react_ui3 = require("@dxos/react-ui");
81
- var import_util = require("@dxos/util");
82
- var import_react6 = require("react");
83
- var import_react_ui4 = require("@dxos/react-ui");
84
- var import_react7 = require("react");
85
- var import_react8 = __toESM(require("react"));
86
- var import_debug = require("@dxos/debug");
87
- var import_react9 = require("react");
88
- var import_react_use_controllable_state = require("@radix-ui/react-use-controllable-state");
89
- var import_react10 = require("react");
90
- var import_react_slot = require("@radix-ui/react-slot");
91
- var import_react_table = require("@tanstack/react-table");
92
- var import_react11 = __toESM(require("react"));
93
- var import_react_ui5 = require("@dxos/react-ui");
94
- var import_react_ui_theme3 = require("@dxos/react-ui-theme");
95
- var import_react_tabster = require("@fluentui/react-tabster");
96
- var import_react_table2 = require("@tanstack/react-table");
97
- var import_react12 = __toESM(require("react"));
98
- var import_react_virtual = require("@tanstack/react-virtual");
99
- var import_react13 = require("react");
100
- var import_react_ui_theme4 = require("@dxos/react-ui-theme");
101
- var import_react_tabster2 = require("@fluentui/react-tabster");
102
- var import_react14 = __toESM(require("react"));
103
- var import_react_table3 = require("@tanstack/react-table");
104
- var import_react15 = __toESM(require("react"));
105
- var import_react_ui_grid = require("@dxos/react-ui-grid");
106
- var import_react_tabster3 = require("@fluentui/react-tabster");
107
- var import_react16 = require("@phosphor-icons/react");
108
- var import_react_table4 = require("@tanstack/react-table");
109
- var import_format = require("date-fns/format");
110
- var import_formatDistanceToNow = require("date-fns/formatDistanceToNow");
111
- var import_react17 = __toESM(require("react"));
112
- var import_log = require("@dxos/log");
113
- var import_react_ui6 = require("@dxos/react-ui");
114
- var import_react_ui_grid2 = require("@dxos/react-ui-grid");
115
- var import_react_ui_theme5 = require("@dxos/react-ui-theme");
116
- var import_echo_schema2 = require("@dxos/echo-schema");
117
- var import_echo_schema3 = require("@dxos/echo-schema");
118
- var import_schema = require("@dxos/schema");
119
- var translationKey = "table";
120
- var translations_default = [
121
- {
122
- "en-US": {
123
- [translationKey]: {
124
- "no selection label": "\xA0",
125
- "number column type label": "Number",
126
- "boolean column type label": "Boolean",
127
- "date column type label": "Date",
128
- "string column type label": "Text",
129
- "ref column type label": "Reference",
130
- "digits label": "Decimal places",
131
- "save label": "Save",
132
- "delete label": "Delete",
133
- "column label label": "Label",
134
- "property key label": "Property",
135
- "column type label": "Type"
136
- }
137
- }
138
- }
139
- ];
140
- var initialItems = (model, value) => value ? {
141
- [model.getId(value)]: {
142
- label: model.getText(value),
143
- data: value
144
- }
145
- } : {};
146
- var CellCombobox = ({ model, value, onValueChange }) => {
147
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
148
- const [items, setItems] = (0, import_react2.useState)(initialItems(model, value));
149
- const [loading, setLoading] = (0, import_react2.useState)(false);
150
- const [searchInputValue, setSearchInputValue] = (0, import_react2.useState)("");
151
- const handleSearchInputValueChange = async (text) => {
152
- setSearchInputValue(text ?? "");
153
- setLoading(true);
154
- const items2 = await model.query(text);
155
- setItems(items2.reduce((acc, item) => {
156
- acc[model.getId(item)] = {
157
- label: model.getText(item),
158
- data: item
159
- };
160
- return acc;
161
- }, initialItems(model, value)));
162
- setLoading(false);
163
- };
164
- const handleValueChange = (0, import_react2.useCallback)((id) => {
165
- onValueChange(items[id]?.data);
166
- }, [
167
- items,
168
- onValueChange
169
- ]);
170
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui_searchlist.PopoverCombobox.Root, {
171
- placeholder: t("no selection label")
172
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_searchlist.PopoverCombobox.Trigger, {
173
- variant: "ghost",
174
- classNames: "is-full rounded-none ring-inset"
175
- }, value ? /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("span", {
176
- className: (0, import_react_ui_theme.mx)("font-normal text-start text-baseText flex-1 min-is-0 truncate mie-2", !value && import_react_ui_theme.staticPlaceholderText)
177
- }, model.getText(value)), /* @__PURE__ */ import_react2.default.createElement(import_react.CaretDown, {
178
- weight: "bold",
179
- className: (0, import_react_ui_theme.getSize)(3)
180
- })) : null), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_searchlist.PopoverCombobox.Content, {
181
- shouldFilter: false,
182
- classNames: "is-[--radix-popover-trigger-width]"
183
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_searchlist.PopoverCombobox.Input, {
184
- value: searchInputValue,
185
- onValueChange: handleSearchInputValueChange
186
- }), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_searchlist.PopoverCombobox.List, null, searchInputValue.length < 1 ? /* @__PURE__ */ import_react2.default.createElement("p", {
187
- className: (0, import_react_ui_theme.mx)("text-center", import_react_ui_theme.descriptionText)
188
- }, "Start typing to search") : loading ? /* @__PURE__ */ import_react2.default.createElement("p", {
189
- className: (0, import_react_ui_theme.mx)("text-center", import_react_ui_theme.descriptionText)
190
- }, "Searching\u2026") : /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_searchlist.PopoverCombobox.Empty, {
191
- classNames: [
192
- "text-center",
193
- import_react_ui_theme.descriptionText
194
- ]
195
- }, "No results"), Object.entries(items).map(([id, { label }]) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_searchlist.PopoverCombobox.Item, {
196
- key: id,
197
- value: id,
198
- onSelect: handleValueChange,
199
- classNames: "truncate"
200
- }, label)))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Popover.Arrow, null)));
201
- };
202
- var ColumnSettings = ({ column, tableDef, tablesToReference, onUpdate, onDelete, onClose }) => {
203
- const { t } = (0, import_react_ui3.useTranslation)(translationKey);
204
- const propRef = (0, import_react5.useRef)(null);
205
- const [formState, setFormState] = (0, import_react5.useState)({
206
- prop: column.id,
207
- refTable: column.refTable,
208
- refProp: column.refProp,
209
- type: String(column.type),
210
- label: column.label,
211
- digits: String(column.digits ?? "0")
212
- });
213
- const handleSave = () => {
214
- const { prop, refTable, refProp, type, label, digits } = formState;
215
- if (!prop.length || !prop.match(/^[a-zA-Z_].+/i)) {
216
- propRef.current?.focus();
217
- return;
218
- }
219
- const current = tableDef.columns.find((c) => c.id !== column.id && c.id === prop);
220
- if (current) {
221
- if (current.type !== "ref") {
222
- propRef.current?.focus();
223
- return;
224
- }
225
- }
226
- onUpdate?.(column.id, {
227
- id: prop,
228
- prop,
229
- label,
230
- type,
231
- refTable,
232
- refProp,
233
- digits: (0, import_util.safeParseInt)(digits)
234
- });
235
- onClose?.();
236
- };
237
- const handleDelete = () => {
238
- onDelete?.(column.id);
239
- onClose?.();
240
- };
241
- return /* @__PURE__ */ import_react5.default.createElement("div", {
242
- className: "flex flex-col w-full gap-4"
243
- }, /* @__PURE__ */ import_react5.default.createElement("div", {
244
- className: "flex flex-col gap-2"
245
- }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Root, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Label, null, t("column label label")), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.TextInput, {
246
- placeholder: "Column label",
247
- value: formState.label ?? "",
248
- onChange: (event) => setFormState((prevState) => ({
249
- ...prevState,
250
- label: event.target.value
251
- })),
252
- autoFocus: true,
253
- "data-testid": "table.column-settings.label"
254
- })), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Root, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Label, null, t("property key label")), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.TextInput, {
255
- ref: propRef,
256
- placeholder: "Property key",
257
- value: formState.prop ?? "",
258
- onChange: (event) => setFormState((prevState) => ({
259
- ...prevState,
260
- prop: event.target.value.replace(/[^\w_]/g, "")
261
- }))
262
- })), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Root, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Label, null, t("column type label")), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Root, {
263
- value: formState.type,
264
- onValueChange: (value) => setFormState((prevState) => ({
265
- ...prevState,
266
- type: value
267
- }))
268
- }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.TriggerButton, {
269
- classNames: "is-full",
270
- placeholder: "Type"
271
- }), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Portal, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Content, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Viewport, null, import_echo_schema.FormatEnums.map((type) => /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Option, {
272
- key: type,
273
- value: type
274
- }, t(`${type} column type label`)))))))), formState.type === "number" && /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Root, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Label, null, t("digits label")), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.TextInput, {
275
- value: formState.digits ?? "",
276
- onChange: (event) => setFormState((prevState) => ({
277
- ...prevState,
278
- digits: event.target.value
279
- }))
280
- })), formState.type === "ref" && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Root, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Label, null, "Table"), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Root, {
281
- value: formState.refTable,
282
- onValueChange: (value) => setFormState((prevState) => ({
283
- ...prevState,
284
- refTable: value
285
- }))
286
- }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.TriggerButton, {
287
- placeholder: "Table",
288
- classNames: "is-full"
289
- }), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Portal, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Content, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Viewport, null, tablesToReference.filter((t2) => t2.id !== tableDef.id).map(({ id, name }) => /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Option, {
290
- key: id,
291
- value: id
292
- }, name ?? id))))))), formState.refTable && /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Root, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Input.Label, null, "Table property"), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Root, {
293
- value: formState.refProp,
294
- onValueChange: (value) => setFormState((prevState) => ({
295
- ...prevState,
296
- refProp: value
297
- }))
298
- }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.TriggerButton, {
299
- placeholder: "Property"
300
- }), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Portal, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Content, null, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Viewport, null, tablesToReference.find((tableDef2) => tableDef2.id === formState.refTable)?.columns.map(({ id, label }) => /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Select.Option, {
301
- key: id,
302
- value: id
303
- }, label ?? id))))))))), /* @__PURE__ */ import_react5.default.createElement("div", null, /* @__PURE__ */ import_react5.default.createElement("div", {
304
- className: "flex flex-row justify-end gap-1"
305
- }, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Button, {
306
- onClick: handleDelete,
307
- "data-testid": "table.column-settings.delete"
308
- }, t("delete label")), /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Button, {
309
- variant: "primary",
310
- onClick: handleSave,
311
- "data-testid": "table.column-settings.save"
312
- }, t("save label")))));
313
- };
314
- var useColumnResizing = ({ columns, onColumnResize }) => {
315
- const [columnsInitialised, setColumnsInitialised] = (0, import_react6.useState)(false);
316
- const [columnSizing, setColumnSizing] = (0, import_react6.useState)({});
317
- (0, import_react6.useEffect)(() => {
318
- if (columnsInitialised) {
319
- return;
320
- }
321
- setColumnSizing(columns.filter((column) => !!column.size && column.prop !== void 0).reduce((state, column) => {
322
- state[column.prop] = column.size;
323
- return state;
324
- }, {}));
325
- setColumnsInitialised(true);
326
- }, [
327
- columns,
328
- setColumnSizing
329
- ]);
330
- const [columnSizingInfo, setColumnSizingInfo] = (0, import_react6.useState)({});
331
- const notifyColumnResize = (0, import_react6.useCallback)(() => onColumnResize?.(columnSizing), [
332
- onColumnResize,
333
- columnSizing
334
- ]);
335
- (0, import_react_ui4.useOnTransition)(columnSizingInfo.isResizingColumn, (v) => typeof v === "string", false, notifyColumnResize);
336
- return {
337
- columnSizing,
338
- columnSizingInfo,
339
- setColumnSizing,
340
- setColumnSizingInfo
341
- };
342
- };
343
- var TABLE_NAME = "Table";
344
- var TableContext = /* @__PURE__ */ (0, import_react8.createContext)(void 0);
345
- var TableProvider = ({ children, ...value }) => {
346
- return /* @__PURE__ */ import_react8.default.createElement(TableContext.Provider, {
347
- value
348
- }, children);
349
- };
350
- var useTableContext = () => {
351
- return (0, import_react8.useContext)(TableContext) ?? (0, import_debug.raise)(new Error("Missing TableContext"));
352
- };
353
- var useColumnSorting = () => {
354
- const [columnSorting, setColumnSorting] = (0, import_react7.useState)([]);
355
- const sortColumn = (columnId, sortDirection) => {
356
- setColumnSorting([
357
- {
358
- id: columnId,
359
- desc: sortDirection === "desc"
360
- }
361
- ]);
362
- };
363
- const clearColumnSorting = () => {
364
- setColumnSorting([]);
365
- };
366
- return {
367
- sorting: columnSorting,
368
- sortColumn,
369
- clearColumnSorting
370
- };
371
- };
372
- var useSortColumn = (column) => {
373
- const { sorting, sortColumn, clearColumnSorting } = useTableContext();
374
- const [initialSortDirection, setInitialSortDirection] = (0, import_react7.useState)();
375
- const columnSort = sorting.find((s) => s.id === column.id);
376
- const sortDirection = columnSort ? columnSort.desc ? "desc" : "asc" : void 0;
377
- const canSort = column.getCanSort();
378
- const updateColumnSort = (direction) => {
379
- sortColumn(column.id, direction);
380
- };
381
- const onToggleSort = () => {
382
- if (sortDirection === void 0) {
383
- return;
384
- }
385
- if (sortDirection === initialSortDirection) {
386
- updateColumnSort(initialSortDirection === "asc" ? "desc" : "asc");
387
- } else {
388
- clearColumnSorting();
389
- }
390
- };
391
- const onSelectSort = (direction) => {
392
- clearColumnSorting();
393
- setInitialSortDirection(direction);
394
- updateColumnSort(direction);
395
- };
396
- const onClearSort = () => {
397
- clearColumnSorting();
398
- };
399
- return {
400
- canSort,
401
- sortDirection,
402
- onSelectSort,
403
- onToggleSort,
404
- onClearSort
405
- };
406
- };
407
- var usePinLastRow = (pinLastRow, table, data) => {
408
- const [pinnedRowKey, setPinnedRowKey] = (0, import_react9.useState)();
409
- const pinRow = (0, import_react9.useCallback)((rowToPin) => {
410
- table.resetRowPinning();
411
- rowToPin.pin("bottom");
412
- setPinnedRowKey(rowToPin.id);
413
- }, [
414
- table
415
- ]);
416
- const clearRowPinning = (0, import_react9.useCallback)(() => {
417
- table.resetRowPinning();
418
- setPinnedRowKey(void 0);
419
- }, [
420
- table
421
- ]);
422
- const pinLastRowCallback = (0, import_react9.useCallback)(() => {
423
- const rows = table.getRowModel().rows;
424
- if (rows.length === 0) {
425
- return clearRowPinning();
426
- }
427
- const lastRow = rows[rows.length - 1];
428
- if (lastRow.id === pinnedRowKey) {
429
- return;
430
- }
431
- pinRow(lastRow);
432
- }, [
433
- table,
434
- pinnedRowKey
435
- ]);
436
- (0, import_react9.useEffect)(() => {
437
- if (pinLastRow) {
438
- pinLastRowCallback();
439
- }
440
- }, [
441
- data,
442
- pinLastRow,
443
- pinLastRowCallback
444
- ]);
445
- };
446
- var useRowSelection = (props) => {
447
- const [rowSelection = {}, setRowSelection] = (0, import_react_use_controllable_state.useControllableState)({
448
- prop: props.rowSelection,
449
- onChange: props.onRowSelectionChange,
450
- defaultProp: props.defaultRowSelection
451
- });
452
- const handleRowSelectionChange = (0, import_react10.useCallback)((updaterOrValue) => {
453
- const nextRowSelection = typeof updaterOrValue === "function" ? updaterOrValue(rowSelection) : updaterOrValue;
454
- if (props.rowsSelectable === "multi") {
455
- setRowSelection(nextRowSelection);
456
- } else if (props.rowsSelectable) {
457
- const nextRowSelectionKey = Object.keys(nextRowSelection).filter((id) => !rowSelection[id])[0];
458
- setRowSelection(nextRowSelectionKey ? {
459
- [nextRowSelectionKey]: true
460
- } : {});
461
- } else {
462
- setRowSelection({});
463
- }
464
- }, [
465
- props.rowsSelectable,
466
- setRowSelection,
467
- rowSelection
468
- ]);
469
- return {
470
- rowSelection,
471
- handleRowSelectionChange
472
- };
473
- };
474
- var ColumnMenu = ({ column, columnOrderable, columnPosition, onColumnReorder, ...props }) => {
475
- const title = column.label?.length ? column.label : column.id;
476
- const header = props.context.header;
477
- const { canSort, sortDirection, onSelectSort, onToggleSort, onClearSort } = useSortColumn(header.column);
478
- const columnSettingsAnchorRef = (0, import_react4.useRef)(null);
479
- const [isColumnSettingsOpen, setIsColumnSettingsOpen] = (0, import_react4.useState)(false);
480
- const shouldPreventFocusOnClose = (0, import_react4.useRef)(false);
481
- const onOpenColumnSettings = (0, import_react4.useCallback)(() => {
482
- shouldPreventFocusOnClose.current = true;
483
- setIsColumnSettingsOpen(true);
484
- }, [
485
- shouldPreventFocusOnClose,
486
- setIsColumnSettingsOpen
487
- ]);
488
- const onDropdownCloseAutoFocus = (0, import_react4.useCallback)((event) => {
489
- if (shouldPreventFocusOnClose.current) {
490
- event.preventDefault();
491
- shouldPreventFocusOnClose.current = false;
492
- }
493
- }, [
494
- shouldPreventFocusOnClose
495
- ]);
496
- return /* @__PURE__ */ import_react4.default.createElement("div", {
497
- className: "flex items-center justify-between"
498
- }, /* @__PURE__ */ import_react4.default.createElement("div", {
499
- className: "flex items-center gap-1 truncate",
500
- title
501
- }, /* @__PURE__ */ import_react4.default.createElement(SortIndicator, {
502
- direction: sortDirection,
503
- onClick: onToggleSort
504
- }), /* @__PURE__ */ import_react4.default.createElement("div", {
505
- className: "truncate"
506
- }, title)), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Root, {
507
- modal: false
508
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Popover.Root, {
509
- open: isColumnSettingsOpen,
510
- onOpenChange: setIsColumnSettingsOpen,
511
- modal: false
512
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Trigger, {
513
- ref: columnSettingsAnchorRef,
514
- asChild: true
515
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Popover.Anchor, {
516
- asChild: true
517
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Button, {
518
- variant: "ghost",
519
- "data-testid": "table.column-menu"
520
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.CaretDown, {
521
- className: (0, import_react_ui_theme2.getSize)(4)
522
- })))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Portal, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Content, {
523
- onCloseAutoFocus: onDropdownCloseAutoFocus,
524
- sideOffset: 4,
525
- collisionPadding: 8
526
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Viewport, null, canSort && /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Item, {
527
- onClick: () => onSelectSort("asc")
528
- }, /* @__PURE__ */ import_react4.default.createElement("span", {
529
- className: "grow"
530
- }, "Sort ascending"), /* @__PURE__ */ import_react4.default.createElement("span", {
531
- className: "opacity-50"
532
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.ArrowUp, {
533
- className: (0, import_react_ui_theme2.getSize)(4)
534
- }))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Item, {
535
- onClick: () => onSelectSort("desc")
536
- }, /* @__PURE__ */ import_react4.default.createElement("span", {
537
- className: "grow"
538
- }, "Sort descending"), /* @__PURE__ */ import_react4.default.createElement("span", {
539
- className: "opacity-50"
540
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.ArrowDown, {
541
- className: (0, import_react_ui_theme2.getSize)(4)
542
- }))), sortDirection && /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Item, {
543
- onClick: onClearSort
544
- }, /* @__PURE__ */ import_react4.default.createElement("span", {
545
- className: "grow"
546
- }, "Clear sort"), /* @__PURE__ */ import_react4.default.createElement("span", {
547
- className: "opacity-50"
548
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.X, {
549
- className: (0, import_react_ui_theme2.getSize)(4)
550
- })))), columnOrderable && /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, columnPosition !== "start" && /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Item, {
551
- onClick: () => onColumnReorder(header.column.id, "left")
552
- }, /* @__PURE__ */ import_react4.default.createElement("span", {
553
- className: "grow"
554
- }, "Move left"), /* @__PURE__ */ import_react4.default.createElement("span", {
555
- className: "opacity-50"
556
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.ArrowLeft, {
557
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(4))
558
- }))), columnPosition !== "end" && /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Item, {
559
- onClick: () => onColumnReorder(header.column.id, "right")
560
- }, /* @__PURE__ */ import_react4.default.createElement("span", {
561
- className: "grow"
562
- }, "Move right"), /* @__PURE__ */ import_react4.default.createElement("span", {
563
- className: "opacity-50"
564
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.ArrowRight, {
565
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(4))
566
- })))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Item, {
567
- onClick: onOpenColumnSettings,
568
- "data-testid": "table.open-column-settings"
569
- }, /* @__PURE__ */ import_react4.default.createElement("span", {
570
- className: "grow"
571
- }, "Column settings"), /* @__PURE__ */ import_react4.default.createElement("span", {
572
- className: "opacity-50"
573
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.GearSix, {
574
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(4), "rotate-90")
575
- })))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Arrow, null))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Popover.Portal, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Popover.Content, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Popover.Viewport, null, /* @__PURE__ */ import_react4.default.createElement(ColumnSettings, {
576
- ...props,
577
- column,
578
- onClose: () => setIsColumnSettingsOpen(false)
579
- })), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Popover.Arrow, null))))));
580
- };
581
- var SortIndicator = ({ direction, onClick }) => {
582
- if (direction === void 0) {
583
- return null;
584
- }
585
- let icon;
586
- switch (direction) {
587
- case "asc":
588
- icon = /* @__PURE__ */ import_react4.default.createElement(import_react3.ArrowUp, {
589
- className: (0, import_react_ui_theme2.getSize)(3)
590
- });
591
- break;
592
- case "desc":
593
- icon = /* @__PURE__ */ import_react4.default.createElement(import_react3.ArrowDown, {
594
- className: (0, import_react_ui_theme2.getSize)(3)
595
- });
596
- break;
597
- }
598
- return /* @__PURE__ */ import_react4.default.createElement("div", {
599
- onClick,
600
- className: "flex items-center cursor-pointer"
601
- }, icon);
602
- };
603
- var useTableRootContext = () => {
604
- const scrollContextRef = (0, import_react13.useRef)(null);
605
- const [tableCount, setTableCount] = (0, import_react13.useState)(0);
606
- const virtualizer = (0, import_react_virtual.useVirtualizer)({
607
- getScrollElement: () => scrollContextRef?.current ?? null,
608
- count: tableCount,
609
- overscan: 8,
610
- estimateSize: () => 40
611
- });
612
- const dispatch = (action) => {
613
- switch (action.type) {
614
- case "updateTableCount":
615
- setTableCount(action.count);
616
- break;
617
- default:
618
- break;
619
- }
620
- };
621
- return {
622
- scrollContextRef,
623
- virtualizer,
624
- dispatch
625
- };
626
- };
627
- var TableRootContext = (0, import_react13.createContext)({});
628
- var currentRow = "!bg-neutral-75 !dark:bg-neutral-850";
629
- var selectedRow = "!bg-primary-100 dark:!bg-primary-700";
630
- var flushPadding = "pli-0 plb-0";
631
- var textPadding = "pli-2 plb-0";
632
- var headPadding = "pli-2 plb-0";
633
- var gridCellFocusRing = "relative focus-within:outline focus-within:outline-1 outline-primary-500 outline-offset-[-1px]";
634
- var borderColors = "border-neutral-200 dark:border-neutral-700";
635
- var stickyRowColors = "bg-neutral-50 dark:bg-neutral-800";
636
- var tableRoot = ({ fullWidth }, ...etc) => (0, import_react_ui_theme4.mx)("table-fixed", "text-neutral-800 dark:text-neutral-200", fullWidth && "is-full", ...etc);
637
- var groupTh = (_props, ...etc) => (0, import_react_ui_theme4.mx)("text-start font-medium", flushPadding, ...etc);
638
- var theadRoot = ({ header, stickyHeader }, ...etc) => (0, import_react_ui_theme4.mx)(header ? stickyHeader && "sticky block-start-[--sticky-top] z-[1]" : "collapse", stickyRowColors, ...etc);
639
- var theadTr = (_props, ...etc) => (0, import_react_ui_theme4.mx)("group", ...etc);
640
- var theadTh = ({ border }, ...etc) => (0, import_react_ui_theme4.mx)("relative", "text-start text-xs select-none truncate", headPadding, border && borderColors, border && "border-t border-b border-l last:border-r", ...etc);
641
- var theadResizeRoot = ({ isResizing }) => {
642
- return (0, import_react_ui_theme4.mx)("absolute h-full w-[4px] top-0 right-0", "cursor-col-resize", "user-select-none", "touch-action-none", "pointer-coarse:bg-neutral-100 dark:pointer-coarse:bg-neutral-800", !isResizing && "group-hover:bg-neutral-100 dark:group-hover:bg-neutral-800", isResizing && "bg-primary-500");
643
- };
644
- var tbodyRoot = (_props, ...etc) => (0, import_react_ui_theme4.mx)(...etc);
645
- var tbodyTr = ({ canBeCurrent, isPinned }, ...etc) => (0, import_react_ui_theme4.mx)("group", canBeCurrent ? import_react_ui_theme4.ghostSelectedCurrent : import_react_ui_theme4.ghostSelected, canBeCurrent && import_react_ui_theme4.focusRing, canBeCurrent && "cursor-pointer", isPinned && "sticky z-1 block-end-0", isPinned && stickyRowColors, ...etc);
646
- var tdRoot = ({ border, isGrid, pinned }, ...etc) => (0, import_react_ui_theme4.mx)("relative", "focus-within:!bg-neutral-50 dark:focus-within:!bg-neutral-900", flushPadding, border && "border-b border-l last:border-r border-neutral-200 dark:border-neutral-700", pinned && "border-t", isGrid && gridCellFocusRing, ...etc);
647
- var CELL_NAME = "Cell";
648
- var FocusableCell = ({ cell, children }) => {
649
- const tableContext = useTableContext();
650
- const focusableGroupAttrs = (0, import_react_tabster2.useFocusableGroup)({
651
- tabBehavior: "limited"
652
- });
653
- const pinned = tableContext.table.getState().rowPinning?.bottom?.includes(cell.row.id);
654
- const className = tdRoot({
655
- ...tableContext,
656
- pinned
657
- }, cell.column.columnDef.meta?.cell?.classNames);
658
- const handleKeyDown = (0, import_react14.useCallback)(({ key, currentTarget }) => {
659
- if (key !== "Enter") {
660
- return;
661
- }
662
- const currentRow2 = currentTarget.closest("tr");
663
- if (!currentRow2) {
664
- return;
665
- }
666
- const cellIndex = Array.from(currentRow2.cells || []).indexOf(currentTarget);
667
- const nextSibling = currentRow2.nextElementSibling;
668
- if (!(nextSibling instanceof HTMLTableRowElement)) {
669
- let depth = 0;
670
- const pollForNewRow = () => {
671
- const newNextSibling = currentRow2.nextElementSibling;
672
- if (newNextSibling instanceof HTMLTableRowElement) {
673
- const nextCell = newNextSibling.cells[cellIndex];
674
- const input = nextCell.querySelector("input");
675
- if (input) {
676
- input.focus();
677
- }
678
- currentRow2.scrollIntoView({
679
- behavior: "smooth",
680
- block: "center"
681
- });
682
- } else if (depth++ < 100) {
683
- requestAnimationFrame(pollForNewRow);
684
- }
685
- };
686
- requestAnimationFrame(pollForNewRow);
687
- }
688
- }, []);
689
- return /* @__PURE__ */ import_react14.default.createElement("td", {
690
- "data-testid": "table.cell",
691
- tabIndex: 0,
692
- ...focusableGroupAttrs,
693
- className,
694
- onKeyDown: handleKeyDown
695
- }, children);
696
- };
697
- var StaticCell = ({ cell, children }) => {
698
- const tableContext = useTableContext();
699
- return /* @__PURE__ */ import_react14.default.createElement("td", {
700
- "data-testid": "table.cell",
701
- className: tdRoot(tableContext, cell.column.columnDef.meta?.cell?.classNames)
702
- }, children);
703
- };
704
- var Cell = ({ cell, children }) => {
705
- const { isGrid } = useTableContext();
706
- const Root = isGrid ? FocusableCell : StaticCell;
707
- return /* @__PURE__ */ import_react14.default.createElement(Root, {
708
- cell
709
- }, children);
710
- };
711
- Cell.displayName = CELL_NAME;
712
- var TABLE_BODY_NAME = "TableBody";
713
- var TableBody = ({ rows }) => {
714
- const { table, keyAccessor, currentDatum, debug, expand, isGrid, onDatumClick } = useTableContext();
715
- const rowSelection = table.getState().rowSelection;
716
- const arrowNavigationAttrs = (0, import_react_tabster.useArrowNavigationGroup)({
717
- axis: "grid"
718
- });
719
- const canBeCurrent = !isGrid && !!onDatumClick;
720
- const { virtualizer } = (0, import_react12.useContext)(TableRootContext);
721
- return /* @__PURE__ */ import_react12.default.createElement("tbody", isGrid && arrowNavigationAttrs, rows.map((row) => {
722
- const isCurrent = currentDatum === row.original;
723
- const isSelected = rowSelection?.[row.id];
724
- const isPinned = row.getIsPinned();
725
- const classNames = tbodyTr({
726
- canBeCurrent,
727
- isPinned: isPinned !== false
728
- });
729
- return /* @__PURE__ */ import_react12.default.createElement("tr", {
730
- key: keyAccessor ? keyAccessor(row.original) : row.id,
731
- className: classNames,
732
- "data-index": row.index,
733
- "data-testid": "table.data-row",
734
- ref: virtualizer.measureElement,
735
- ...isCurrent && {
736
- "aria-current": "location"
737
- },
738
- ...isSelected && {
739
- "aria-selected": "true"
740
- },
741
- ...canBeCurrent && {
742
- tabIndex: 0,
743
- onClick: () => {
744
- onDatumClick(row.original);
745
- },
746
- onKeyUp: ({ key }) => {
747
- if (key === "Enter" || key === " ") {
748
- onDatumClick(row.original);
749
- }
750
- }
751
- }
752
- }, debug && /* @__PURE__ */ import_react12.default.createElement("td", null, row.id), row.getVisibleCells().map((cell) => {
753
- return /* @__PURE__ */ import_react12.default.createElement(Cell, {
754
- key: cell.id,
755
- cell
756
- }, (0, import_react_table2.flexRender)(cell.column.columnDef.cell, {
757
- ...cell.getContext()
758
- }));
759
- }), expand && /* @__PURE__ */ import_react12.default.createElement("td", null));
760
- }));
761
- };
762
- TableBody.displayName = TABLE_BODY_NAME;
763
- var TABLE_HEAD_NAME = "TableHeader";
764
- var TableHead = (_props) => {
765
- const tableContext = useTableContext();
766
- const headerGroups = tableContext.table.getHeaderGroups();
767
- return /* @__PURE__ */ import_react15.default.createElement("thead", {
768
- className: theadRoot(tableContext)
769
- }, headerGroups.map((headerGroup) => {
770
- return (
771
- // Group element to hover resize handles.
772
- /* @__PURE__ */ import_react15.default.createElement("tr", {
773
- key: headerGroup.id,
774
- className: theadTr(tableContext)
775
- }, tableContext.debug && /* @__PURE__ */ import_react15.default.createElement("th", {
776
- className: "font-mono",
777
- style: {
778
- width: import_react_ui_grid.defaultSizeCol
779
- }
780
- }, "#"), headerGroup.headers.map((header) => {
781
- const isResizing = header.column.getIsResizing();
782
- const onResize = header.getResizeHandler();
783
- const resizable = header.column.columnDef.meta?.resizable;
784
- return /* @__PURE__ */ import_react15.default.createElement("th", {
785
- key: header.id,
786
- style: {
787
- width: header.getSize()
788
- },
789
- className: theadTh(tableContext, header.column.columnDef.meta?.header?.classNames),
790
- "data-testid": "table.header-cell"
791
- }, !header || header.isPlaceholder ? null : (0, import_react_table3.flexRender)(header.column.columnDef.header, header.getContext()), resizable && /* @__PURE__ */ import_react15.default.createElement("div", {
792
- className: theadResizeRoot({
793
- isResizing
794
- }),
795
- onDoubleClick: header.column.resetSize,
796
- onMouseDown: onResize,
797
- onTouchStart: onResize
798
- }));
799
- }), tableContext.expand && /* @__PURE__ */ import_react15.default.createElement("th", null))
800
- );
801
- }));
802
- };
803
- TableHead.displayName = TABLE_HEAD_NAME;
804
- var TableRoot = ({ children }) => {
805
- const contextValue = useTableRootContext();
806
- return /* @__PURE__ */ import_react11.default.createElement(TableRootContext.Provider, {
807
- value: contextValue
808
- }, children);
809
- };
810
- var TableViewport = ({ children, classNames, asChild, ...props }) => {
811
- const { scrollContextRef } = (0, import_react11.useContext)(TableRootContext);
812
- const classes = (0, import_react_ui_theme3.mx)(classNames, "overflow-auto");
813
- return asChild ? /* @__PURE__ */ import_react11.default.createElement(import_react_slot.Slot, {
814
- ref: scrollContextRef,
815
- className: classes,
816
- ...props
817
- }, children) : /* @__PURE__ */ import_react11.default.createElement("div", {
818
- role: "none",
819
- className: classes,
820
- ref: scrollContextRef,
821
- ...props
822
- }, children);
823
- };
824
- var TablePrimitive = (props) => {
825
- const { role, header = true, rowsSelectable, debug, pinLastRow, columnVisibility, onColumnResize, onDataSelectionChange } = props;
826
- const columns = (0, import_react_ui5.useDefaultValue)(props.columns, () => []);
827
- const incomingData = (0, import_react_ui5.useDefaultValue)(props.data, () => []);
828
- const [data, setData] = (0, import_react11.useState)([
829
- ...incomingData
830
- ]);
831
- const forceUpdate = (0, import_react11.useCallback)(() => setData([
832
- ...incomingData
833
- ]), [
834
- incomingData
835
- ]);
836
- (0, import_react11.useEffect)(() => forceUpdate(), [
837
- JSON.stringify(incomingData),
838
- forceUpdate
839
- ]);
840
- const TableProvider2 = TableProvider;
841
- const { columnSizing, setColumnSizing, columnSizingInfo, setColumnSizingInfo } = useColumnResizing({
842
- columns,
843
- onColumnResize
844
- });
845
- const { rowSelection, handleRowSelectionChange } = useRowSelection(props);
846
- const [grouping, handleGroupingChange] = (0, import_react11.useState)(props.grouping ?? []);
847
- (0, import_react11.useEffect)(() => handleGroupingChange(props.grouping ?? []), [
848
- handleGroupingChange,
849
- props.grouping
850
- ]);
851
- const columnSorting = useColumnSorting();
852
- const table = (0, import_react_table.useReactTable)({
853
- // Data
854
- meta: {},
855
- data,
856
- // Columns
857
- columns,
858
- defaultColumn: {
859
- size: 400,
860
- maxSize: 1024
861
- },
862
- // State
863
- state: {
864
- columnVisibility,
865
- columnSizing,
866
- columnSizingInfo,
867
- sorting: columnSorting.sorting,
868
- rowSelection,
869
- grouping
870
- },
871
- // Resize columns
872
- columnResizeMode: "onChange",
873
- enableColumnResizing: true,
874
- onColumnSizingChange: setColumnSizing,
875
- onColumnSizingInfoChange: setColumnSizingInfo,
876
- // Rows
877
- getCoreRowModel: (0, import_react_table.getCoreRowModel)(),
878
- getSortedRowModel: (0, import_react_table.getSortedRowModel)(),
879
- getExpandedRowModel: (0, import_react_table.getExpandedRowModel)(),
880
- // Grouping
881
- getGroupedRowModel: grouping.length > 1 ? (0, import_react_table.getGroupedRowModel)() : void 0,
882
- onGroupingChange: handleGroupingChange,
883
- enableMultiRowSelection: rowsSelectable === "multi" ? true : void 0,
884
- enableRowSelection: rowsSelectable === true ? true : void 0,
885
- onRowSelectionChange: handleRowSelectionChange,
886
- enableSorting: true,
887
- enableColumnPinning: true,
888
- // Debug
889
- debugTable: debug
890
- });
891
- (0, import_react11.useEffect)(() => {
892
- onDataSelectionChange?.(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));
893
- }, [
894
- onDataSelectionChange,
895
- rowSelection,
896
- table
897
- ]);
898
- usePinLastRow(pinLastRow, table, data);
899
- const expand = false;
900
- return /* @__PURE__ */ import_react11.default.createElement(TableProvider2, {
901
- ...props,
902
- ...columnSorting,
903
- table,
904
- header,
905
- expand,
906
- isGrid: role === "grid" || role === "treegrid"
907
- }, /* @__PURE__ */ import_react11.default.createElement(TableImpl, {
908
- debug: false,
909
- ...props
910
- }));
911
- };
912
- var TableImpl = (props) => {
913
- const { debug, classNames, role, grouping, fullWidth } = props;
914
- const { table } = useTableContext();
915
- if (debug) {
916
- return /* @__PURE__ */ import_react11.default.createElement("pre", {
917
- className: "font-mono text-xs text-neutral-500 m-1 p-2 ring"
918
- }, /* @__PURE__ */ import_react11.default.createElement("code", null, JSON.stringify(table.getState(), void 0, 2)));
919
- }
920
- const isResizingColumn = table.getState().columnSizingInfo.isResizingColumn;
921
- const TableComponent = isResizingColumn ? MemoizedVirtualizedTableContent : VirtualizedTableContent;
922
- return /* @__PURE__ */ import_react11.default.createElement("table", {
923
- role,
924
- className: tableRoot(props, classNames),
925
- style: {
926
- // borderCollapse: 'separate',
927
- borderSpacing: 0,
928
- ...!fullWidth && {
929
- width: table.getTotalSize()
930
- }
931
- }
932
- }, /* @__PURE__ */ import_react11.default.createElement(TableHead, null), grouping?.length !== 0 ? /* @__PURE__ */ import_react11.default.createElement(TableComponent, null) : /* @__PURE__ */ import_react11.default.createElement(GroupedTableContent, null));
933
- };
934
- var VirtualizedTableContent = () => {
935
- const { table } = useTableContext();
936
- const { virtualizer, dispatch } = (0, import_react11.useContext)(TableRootContext);
937
- const centerRows = table.getCenterRows();
938
- let pinnedRows = [];
939
- (0, import_react11.useEffect)(() => {
940
- dispatch({
941
- type: "updateTableCount",
942
- count: centerRows.length
943
- });
944
- }, [
945
- centerRows.length
946
- ]);
947
- try {
948
- pinnedRows = table.getBottomRows();
949
- } catch (_) {
950
- }
951
- const { getTotalSize, getVirtualItems } = virtualizer;
952
- const virtualRows = getVirtualItems();
953
- const totalSize = getTotalSize();
954
- const paddingTop = virtualRows.length > 0 ? virtualRows?.[0]?.start || 0 : 0;
955
- const paddingBottom = virtualRows.length > 0 ? totalSize - (virtualRows?.[virtualRows.length - 1]?.end || 0) : 0;
956
- const rowsToRender = [
957
- ...virtualRows.map((virtualRow) => centerRows[virtualRow.index]),
958
- ...pinnedRows
959
- ].filter((r) => !!r);
960
- return /* @__PURE__ */ import_react11.default.createElement(import_react11.Fragment, null, paddingTop > 0 && /* @__PURE__ */ import_react11.default.createElement("tbody", {
961
- role: "none"
962
- }, /* @__PURE__ */ import_react11.default.createElement("tr", {
963
- role: "none"
964
- }, /* @__PURE__ */ import_react11.default.createElement("td", {
965
- style: {
966
- height: `${paddingTop}px`
967
- },
968
- role: "none"
969
- }))), /* @__PURE__ */ import_react11.default.createElement(TableBody, {
970
- rows: rowsToRender
971
- }), paddingBottom > 0 && /* @__PURE__ */ import_react11.default.createElement("tbody", {
972
- role: "none"
973
- }, /* @__PURE__ */ import_react11.default.createElement("tr", {
974
- role: "none"
975
- }, /* @__PURE__ */ import_react11.default.createElement("td", {
976
- style: {
977
- height: `${paddingBottom}px`
978
- },
979
- role: "none"
980
- }))));
981
- };
982
- var MemoizedVirtualizedTableContent = /* @__PURE__ */ (0, import_react11.memo)(VirtualizedTableContent);
983
- var GroupedTableContent = () => {
984
- const { table: { getGroupedRowModel: getGroupedRowModel2, getHeaderGroups, getState }, debug } = useTableContext();
985
- return /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, getGroupedRowModel2().rows.map((row, i) => {
986
- return /* @__PURE__ */ import_react11.default.createElement(import_react11.Fragment, {
987
- key: i
988
- }, /* @__PURE__ */ import_react11.default.createElement("thead", null, /* @__PURE__ */ import_react11.default.createElement("tr", null, debug && /* @__PURE__ */ import_react11.default.createElement("th", null), /* @__PURE__ */ import_react11.default.createElement("th", {
989
- // TODO(burdon): Calculate row span.
990
- colSpan: getHeaderGroups()[0].headers.length,
991
- className: groupTh({})
992
- }, getState().grouping[0], "[", String(row.getGroupingValue(getState().grouping[0])), "]"))), /* @__PURE__ */ import_react11.default.createElement(TableBody, {
993
- rows: row.subRows
994
- }));
995
- }));
996
- };
997
- var Table = {
998
- Root: TableRoot,
999
- Viewport: TableViewport,
1000
- Main: TablePrimitive
1001
- };
1002
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-table/src/deprecated/helpers.tsx";
1003
- var createColumnBuilder = () => ({
1004
- helper: (0, import_react_table4.createColumnHelper)(),
1005
- builder: new ColumnBuilder()
1006
- });
1007
- var ComboboxBuilderCell = (cellContext) => {
1008
- const { model, onUpdate } = cellContext.column.columnDef.meta;
1009
- return model ? /* @__PURE__ */ import_react17.default.createElement(CellCombobox, {
1010
- model,
1011
- value: cellContext.getValue(),
1012
- onValueChange: (value) => onUpdate?.(cellContext.row.original, cellContext.column.id, value)
1013
- }) : null;
1014
- };
1015
- var StringBuilderCell = (cellContext) => {
1016
- const ref = (0, import_react17.useRef)(null);
1017
- const { findPrevFocusable } = (0, import_react_tabster3.useFocusFinders)();
1018
- const { onUpdate, cell } = cellContext.column.columnDef.meta;
1019
- const initialValue = cellContext.getValue();
1020
- const getInitialValue = (0, import_react17.useCallback)(() => {
1021
- return initialValue?.content ?? initialValue;
1022
- }, [
1023
- initialValue
1024
- ]);
1025
- const [value, setValue] = (0, import_react17.useState)(getInitialValue);
1026
- (0, import_react17.useEffect)(() => setValue(getInitialValue()), [
1027
- getInitialValue
1028
- ]);
1029
- const handleSave = () => {
1030
- ref.current && document.activeElement === ref.current && findPrevFocusable(ref.current)?.focus();
1031
- if (value !== initialValue) {
1032
- onUpdate?.(cellContext.row.original, cellContext.column.id, value);
1033
- }
1034
- };
1035
- const handleCancel = () => setValue(initialValue);
1036
- let placeholder = false;
1037
- const columns = cellContext.table.getVisibleFlatColumns();
1038
- if (columns[0].id === cellContext.column.id) {
1039
- const rowCount = cellContext.table.getRowModel().rows.length;
1040
- placeholder = cellContext.row.index === rowCount - 1 && columns[0].id === cellContext.column.id;
1041
- }
1042
- return /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.Root, null, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.TextInput, {
1043
- ref,
1044
- variant: "subdued",
1045
- placeholder: placeholder ? "Add row..." : void 0,
1046
- classNames: [
1047
- "is-full",
1048
- textPadding,
1049
- cell?.classNames
1050
- ],
1051
- value: value ?? "",
1052
- onBlur: handleSave,
1053
- onChange: (event) => setValue(event.target.value),
1054
- onKeyDown: (event) => event.key === "Enter" && handleSave() || event.key === "Escape" && handleCancel(),
1055
- autoComplete: "off"
1056
- }));
1057
- };
1058
- var parseNumber = (text) => text?.trim().length ? Number(text) : NaN;
1059
- var displayNumber = (value, digits) => value || value === 0 ? value.toLocaleString(void 0, {
1060
- minimumFractionDigits: digits ?? 0,
1061
- maximumFractionDigits: digits ?? 2
1062
- }) : "";
1063
- var NumberBuilderCell = (cellContext) => {
1064
- const { onUpdate, digits } = cellContext.column.columnDef.meta;
1065
- const value = cellContext.getValue();
1066
- const [text, setText] = (0, import_react17.useState)(displayNumber(value, digits));
1067
- const { findPrevFocusable } = (0, import_react_tabster3.useFocusFinders)();
1068
- const ref = (0, import_react17.useRef)(null);
1069
- (0, import_react17.useEffect)(() => {
1070
- (!document.activeElement || document.activeElement !== ref.current) && setText(displayNumber(value, digits));
1071
- }, [
1072
- digits,
1073
- value
1074
- ]);
1075
- const handleEdit = () => setText(value !== void 0 ? String(value) : "");
1076
- const handleSave = () => {
1077
- const nextValue = parseNumber(text);
1078
- if (!isNaN(nextValue)) {
1079
- onUpdate?.(cellContext.row.original, cellContext.column.id, nextValue);
1080
- setText(displayNumber(nextValue, digits));
1081
- } else {
1082
- setText(displayNumber(value, digits));
1083
- }
1084
- ref.current && document.activeElement === ref.current && findPrevFocusable(ref.current)?.focus();
1085
- };
1086
- const _handleCancel = () => {
1087
- setText(displayNumber(value, digits));
1088
- ref.current && findPrevFocusable(ref.current)?.focus();
1089
- };
1090
- return /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.Root, null, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.TextInput, {
1091
- ref,
1092
- variant: "subdued",
1093
- value: text,
1094
- classNames: [
1095
- "is-full text-end font-mono",
1096
- textPadding
1097
- ],
1098
- onBlur: handleSave,
1099
- onFocus: handleEdit,
1100
- onChange: ({ target: { value: value2 } }) => setText(value2),
1101
- onKeyDown: (event) => {
1102
- return (
1103
- /* (event.key === 'Escape' && handleCancel()) || */
1104
- event.key === "Enter" && handleSave()
1105
- );
1106
- },
1107
- autoComplete: "off"
1108
- }));
1109
- };
1110
- var RowSelectorBuilderCell = (cellContext) => {
1111
- const { cell } = cellContext.column.columnDef.meta;
1112
- const { row } = cellContext;
1113
- const checked = row.getCanSelect() ? row.getIsSelected() : row.getCanSelectSubRows() && (row.getIsSomeSelected() ? "indeterminate" : row.getIsAllSubRowsSelected());
1114
- return /* @__PURE__ */ import_react17.default.createElement("div", {
1115
- className: "flex justify-center w-full h-full",
1116
- role: "presentation"
1117
- }, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.Root, null, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.Checkbox, {
1118
- size: 4,
1119
- classNames: [
1120
- cell?.classNames
1121
- ],
1122
- checked,
1123
- onCheckedChange: (event) => {
1124
- if (row.getCanSelect()) {
1125
- row.getToggleSelectedHandler()(event);
1126
- }
1127
- },
1128
- disabled: !(row.getCanSelect() || row.getCanSelectSubRows())
1129
- })));
1130
- };
1131
- var SwitchBuilderCell = (cellContext) => {
1132
- const { onUpdate } = cellContext.column.columnDef.meta;
1133
- const value = cellContext.getValue();
1134
- return /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.Root, null, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.Switch, {
1135
- classNames: "block mli-auto",
1136
- onClick: (event) => event.stopPropagation(),
1137
- disabled: !onUpdate,
1138
- checked: !!value,
1139
- onCheckedChange: (value2) => {
1140
- onUpdate?.(cellContext.row.original, cellContext.column.id, !!value2);
1141
- }
1142
- }));
1143
- };
1144
- var ColumnBuilder = class {
1145
- /**
1146
- * Combobox value
1147
- */
1148
- combobox({ label, classNames, model, onUpdate, ...props }) {
1149
- return {
1150
- minSize: 100,
1151
- header: (column) => {
1152
- return label ?? column.header.id;
1153
- },
1154
- cell: model && onUpdate ? ComboboxBuilderCell : (cellContext) => {
1155
- const cellValue = cellContext.getValue();
1156
- return /* @__PURE__ */ import_react17.default.createElement("div", {
1157
- className: (0, import_react_ui_theme5.mx)("truncate", classNames)
1158
- }, cellValue ? model?.getText(cellValue) : "");
1159
- },
1160
- ...props,
1161
- meta: {
1162
- ...props.meta,
1163
- model,
1164
- onUpdate,
1165
- cell: {
1166
- classNames,
1167
- ...props.meta?.cell
1168
- }
1169
- }
1170
- };
1171
- }
1172
- /**
1173
- * String formats.
1174
- */
1175
- string({ label, classNames, onUpdate, ...props } = {}) {
1176
- return {
1177
- minSize: 100,
1178
- // TODO(burdon): Default.
1179
- header: (column) => {
1180
- return label ?? column.header.id;
1181
- },
1182
- cell: onUpdate ? StringBuilderCell : (cell) => {
1183
- let value = cell.getValue();
1184
- if (typeof value === "object" && value?.type === "dxos.Text.v0") {
1185
- value = value.content;
1186
- }
1187
- return /* @__PURE__ */ import_react17.default.createElement("div", {
1188
- className: (0, import_react_ui_theme5.mx)("truncate", textPadding, classNames)
1189
- }, value);
1190
- },
1191
- ...props,
1192
- meta: {
1193
- ...props.meta,
1194
- onUpdate,
1195
- cell: {
1196
- ...props.meta?.cell,
1197
- classNames
1198
- }
1199
- }
1200
- };
1201
- }
1202
- /**
1203
- * Number formats.
1204
- */
1205
- number({ label, minSize, classNames, digits, onUpdate, ...props } = {}) {
1206
- return {
1207
- size: 100,
1208
- minSize: 100,
1209
- header: (cell) => label ?? cell.header.id,
1210
- cell: NumberBuilderCell,
1211
- ...props,
1212
- meta: {
1213
- ...props.meta,
1214
- onUpdate,
1215
- digits,
1216
- header: {
1217
- ...props.meta?.header
1218
- },
1219
- cell: {
1220
- ...props.meta?.cell,
1221
- classNames
1222
- }
1223
- }
1224
- };
1225
- }
1226
- /**
1227
- * Date formats.
1228
- */
1229
- // TODO(burdon): Date picker (pluggable renderers?)
1230
- date({ label, format: formatSpec, relative, classNames, ...props } = {}) {
1231
- return {
1232
- size: 220,
1233
- minSize: 100,
1234
- header: (cell) => label ?? cell.header.id,
1235
- cell: (cell) => {
1236
- const value = cell.getValue();
1237
- try {
1238
- const str = value ? formatSpec ? (0, import_format.format)(value, formatSpec) : relative ? (0, import_formatDistanceToNow.formatDistanceToNow)(value, {
1239
- addSuffix: true
1240
- }) : value.toISOString() : void 0;
1241
- return /* @__PURE__ */ import_react17.default.createElement("div", {
1242
- className: (0, import_react_ui_theme5.mx)(textPadding, classNames)
1243
- }, str);
1244
- } catch (err) {
1245
- import_log.log.info("formatError", {
1246
- value
1247
- }, {
1248
- F: __dxlog_file,
1249
- L: 378,
1250
- S: this,
1251
- C: (f, a) => f(...a)
1252
- });
1253
- return null;
1254
- }
1255
- },
1256
- ...props,
1257
- meta: {
1258
- ...props.meta,
1259
- cell: {
1260
- ...props.meta?.cell,
1261
- classNames
1262
- }
1263
- }
1264
- };
1265
- }
1266
- /**
1267
- * PublicKey with tooltip.
1268
- */
1269
- key({ label, tooltip, classNames, ...props } = {}) {
1270
- return {
1271
- size: 94,
1272
- minSize: 94,
1273
- header: (cell) => label ?? cell.header.id,
1274
- cell: (cell) => {
1275
- const value = cell.getValue();
1276
- if (!value) {
1277
- return;
1278
- }
1279
- const element = value.truncate();
1280
- if (!tooltip) {
1281
- return element;
1282
- }
1283
- return /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Tooltip.Provider, null, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Tooltip.Root, null, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Tooltip.Trigger, null, element), /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Tooltip.Portal, null, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Tooltip.Content, {
1284
- side: "right"
1285
- }, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Tooltip.Arrow, null), /* @__PURE__ */ import_react17.default.createElement(import_react16.ClipboardText, {
1286
- onClick: (ev) => {
1287
- ev.stopPropagation();
1288
- void navigator.clipboard.writeText(value.toHex());
1289
- }
1290
- })))));
1291
- },
1292
- ...props,
1293
- meta: {
1294
- ...props.meta,
1295
- cell: {
1296
- ...props.meta?.cell,
1297
- classNames: [
1298
- "font-mono",
1299
- textPadding,
1300
- classNames
1301
- ]
1302
- }
1303
- }
1304
- };
1305
- }
1306
- /**
1307
- * Row selector
1308
- */
1309
- selectRow({ classNames, onUpdate, id = "selectRow" } = {}) {
1310
- return {
1311
- id,
1312
- size: import_react_ui_grid2.defaultSizeRow,
1313
- enableResizing: false,
1314
- meta: {
1315
- onUpdate,
1316
- cell: {
1317
- classNames
1318
- }
1319
- },
1320
- header: ({ table }) => {
1321
- const { rowsSelectable } = useTableContext();
1322
- const checked = table.getIsSomeRowsSelected() ? "indeterminate" : table.getIsAllRowsSelected();
1323
- return rowsSelectable === "multi" ? /* @__PURE__ */ import_react17.default.createElement("div", {
1324
- className: "flex justify-center w-full h-full",
1325
- role: "presentation"
1326
- }, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.Root, null, /* @__PURE__ */ import_react17.default.createElement(import_react_ui6.Input.Checkbox, {
1327
- size: 4,
1328
- classNames: [
1329
- "mli-auto",
1330
- classNames
1331
- ],
1332
- checked,
1333
- onCheckedChange: () => table.toggleAllRowsSelected()
1334
- }))) : null;
1335
- },
1336
- cell: RowSelectorBuilderCell
1337
- };
1338
- }
1339
- /**
1340
- * Switch
1341
- */
1342
- switch({ label, classNames, onUpdate, ...props } = {}) {
1343
- return {
1344
- size: 50,
1345
- minSize: 50,
1346
- header: (column) => label ?? column.header.id,
1347
- // TODO(zan): Implement sort algorithm.
1348
- enableSorting: true,
1349
- cell: SwitchBuilderCell,
1350
- ...props,
1351
- meta: {
1352
- ...props.meta,
1353
- onUpdate,
1354
- cell: {
1355
- ...props.meta?.cell,
1356
- classNames: [
1357
- textPadding,
1358
- classNames
1359
- ]
1360
- }
1361
- }
1362
- };
1363
- }
1364
- /**
1365
- * Icon based on boolean value.
1366
- */
1367
- icon({ label, size, on, off, ...props } = {}) {
1368
- const IconOn = on?.Icon ?? import_react16.Check;
1369
- const IconOff = off?.Icon ?? import_react16.X;
1370
- return {
1371
- size: size ?? import_react_ui_grid2.defaultSizeRow,
1372
- // TODO(zan): Implement sort algorithm.
1373
- enableSorting: false,
1374
- header: (column) => /* @__PURE__ */ import_react17.default.createElement("div", {
1375
- className: "justify-center"
1376
- }, label ?? column.header.id),
1377
- cell: (cell) => {
1378
- const value = cell.getValue();
1379
- if (value) {
1380
- return /* @__PURE__ */ import_react17.default.createElement(IconOn, {
1381
- className: (0, import_react_ui_theme5.mx)("block mli-auto", (0, import_react_ui_theme5.getSize)(6), on?.className ?? "text-green-700")
1382
- });
1383
- } else if (value === false) {
1384
- return /* @__PURE__ */ import_react17.default.createElement(IconOff, {
1385
- className: (0, import_react_ui_theme5.mx)("block mli-auto", (0, import_react_ui_theme5.getSize)(6), off?.className ?? "text-red-700")
1386
- });
1387
- } else {
1388
- return null;
1389
- }
1390
- },
1391
- ...props
1392
- };
1393
- }
1394
- /**
1395
- * This display column type is for nested/unhandled data to appear as JSON.
1396
- */
1397
- json({ label, classNames, ...props } = {}) {
1398
- return {
1399
- size: 120,
1400
- minSize: 120,
1401
- header: (cell) => label ?? cell.header.id,
1402
- cell: (cell) => {
1403
- const value = cell.getValue();
1404
- return /* @__PURE__ */ import_react17.default.createElement("div", {
1405
- className: "overflow-scroll"
1406
- }, /* @__PURE__ */ import_react17.default.createElement("code", {
1407
- className: "text-xs"
1408
- }, JSON.stringify(value)));
1409
- },
1410
- ...props,
1411
- meta: {
1412
- ...props.meta,
1413
- cell: {
1414
- ...props.meta?.cell,
1415
- classNames: [
1416
- "font-mono",
1417
- textPadding,
1418
- classNames
1419
- ]
1420
- }
1421
- }
1422
- };
1423
- }
1424
- };
1425
- var schemaToColumnDefs = (schema) => {
1426
- const { helper, builder } = createColumnBuilder();
1427
- return (0, import_schema.mapSchemaToFields)(schema).map(({ property, type, format: format2 }) => {
1428
- const propertyKey = property.toString();
1429
- if (!format2) {
1430
- switch (type) {
1431
- case import_echo_schema2.TypeEnum.String: {
1432
- return helper.accessor(propertyKey, builder.string({
1433
- label: propertyKey,
1434
- classNames: [
1435
- property === "id" && "font-mono"
1436
- ]
1437
- }));
1438
- }
1439
- case import_echo_schema2.TypeEnum.Number: {
1440
- return helper.accessor(propertyKey, builder.number({
1441
- label: propertyKey
1442
- }));
1443
- }
1444
- case import_echo_schema2.TypeEnum.Boolean: {
1445
- return helper.accessor(propertyKey, builder.switch({
1446
- label: propertyKey
1447
- }));
1448
- }
1449
- default: {
1450
- throw new Error(`Unhandled scalar type: ${type}`);
1451
- }
1452
- }
1453
- }
1454
- switch (format2) {
1455
- case import_echo_schema3.FormatEnum.Date: {
1456
- return helper.accessor(propertyKey, builder.date({
1457
- label: propertyKey
1458
- }));
1459
- }
1460
- case import_echo_schema3.FormatEnum.JSON: {
1461
- return helper.accessor(propertyKey, builder.json({
1462
- label: propertyKey,
1463
- id: propertyKey
1464
- }));
1465
- }
1466
- default: {
1467
- throw new Error(`Unhandled format: ${format2}`);
1468
- }
1469
- }
1470
- });
1471
- };
1472
- // Annotate the CommonJS export names for ESM import in node:
1473
- 0 && (module.exports = {
1474
- CellCombobox,
1475
- ColumnBuilder,
1476
- ColumnMenu,
1477
- ColumnSettings,
1478
- MemoizedVirtualizedTableContent,
1479
- SortIndicator,
1480
- TABLE_NAME,
1481
- Table,
1482
- TablePrimitive,
1483
- TableProvider,
1484
- TableRootContext,
1485
- createColumnBuilder,
1486
- currentRow,
1487
- flushPadding,
1488
- gridCellFocusRing,
1489
- groupTh,
1490
- headPadding,
1491
- schemaToColumnDefs,
1492
- selectedRow,
1493
- tableRoot,
1494
- tbodyRoot,
1495
- tbodyTr,
1496
- tdRoot,
1497
- textPadding,
1498
- theadResizeRoot,
1499
- theadRoot,
1500
- theadTh,
1501
- theadTr,
1502
- translations,
1503
- useColumnResizing,
1504
- useColumnSorting,
1505
- usePinLastRow,
1506
- useRowSelection,
1507
- useSortColumn,
1508
- useTableContext,
1509
- useTableRootContext
1510
- });
1511
- //# sourceMappingURL=index.cjs.map