@flanksource/clicky-ui 0.3.22 → 0.3.24

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 (257) hide show
  1. package/dist/components/CountryFlag.cjs +55 -0
  2. package/dist/components/CountryFlag.cjs.map +1 -0
  3. package/dist/components/CountryFlag.d.ts +8 -0
  4. package/dist/components/CountryFlag.d.ts.map +1 -0
  5. package/dist/components/CountryFlag.js +38 -0
  6. package/dist/components/CountryFlag.js.map +1 -0
  7. package/dist/components/CountryPicker.cjs +35 -0
  8. package/dist/components/CountryPicker.cjs.map +1 -0
  9. package/dist/components/CountryPicker.d.ts +4 -0
  10. package/dist/components/CountryPicker.d.ts.map +1 -0
  11. package/dist/components/CountryPicker.js +35 -0
  12. package/dist/components/CountryPicker.js.map +1 -0
  13. package/dist/components/SplitButton.cjs +3 -2
  14. package/dist/components/SplitButton.cjs.map +1 -1
  15. package/dist/components/SplitButton.d.ts +6 -1
  16. package/dist/components/SplitButton.d.ts.map +1 -1
  17. package/dist/components/SplitButton.js +3 -2
  18. package/dist/components/SplitButton.js.map +1 -1
  19. package/dist/components/country-options.cjs +34 -0
  20. package/dist/components/country-options.cjs.map +1 -0
  21. package/dist/components/country-options.d.ts +8 -0
  22. package/dist/components/country-options.d.ts.map +1 -0
  23. package/dist/components/country-options.js +34 -0
  24. package/dist/components/country-options.js.map +1 -0
  25. package/dist/components.cjs +11 -0
  26. package/dist/components.cjs.map +1 -1
  27. package/dist/components.d.ts +4 -0
  28. package/dist/components.d.ts.map +1 -1
  29. package/dist/components.js +11 -0
  30. package/dist/components.js.map +1 -1
  31. package/dist/data/Clicky.cjs +4 -1
  32. package/dist/data/Clicky.cjs.map +1 -1
  33. package/dist/data/Clicky.d.ts.map +1 -1
  34. package/dist/data/Clicky.js +4 -1
  35. package/dist/data/Clicky.js.map +1 -1
  36. package/dist/data/CodeDiff.cjs +3 -18
  37. package/dist/data/CodeDiff.cjs.map +1 -1
  38. package/dist/data/CodeDiff.d.ts.map +1 -1
  39. package/dist/data/CodeDiff.js +3 -18
  40. package/dist/data/CodeDiff.js.map +1 -1
  41. package/dist/data/DataTable.cjs +182 -64
  42. package/dist/data/DataTable.cjs.map +1 -1
  43. package/dist/data/DataTable.d.ts +9 -1
  44. package/dist/data/DataTable.d.ts.map +1 -1
  45. package/dist/data/DataTable.grouping.cjs +26 -0
  46. package/dist/data/DataTable.grouping.cjs.map +1 -1
  47. package/dist/data/DataTable.grouping.d.ts +38 -0
  48. package/dist/data/DataTable.grouping.d.ts.map +1 -1
  49. package/dist/data/DataTable.grouping.js +26 -0
  50. package/dist/data/DataTable.grouping.js.map +1 -1
  51. package/dist/data/DataTable.js +183 -65
  52. package/dist/data/DataTable.js.map +1 -1
  53. package/dist/data/DataTableGroupingControls.cjs +84 -0
  54. package/dist/data/DataTableGroupingControls.cjs.map +1 -0
  55. package/dist/data/DataTableGroupingControls.d.ts +17 -0
  56. package/dist/data/DataTableGroupingControls.d.ts.map +1 -0
  57. package/dist/data/DataTableGroupingControls.js +84 -0
  58. package/dist/data/DataTableGroupingControls.js.map +1 -0
  59. package/dist/data/HighlightedTokens.cjs +21 -0
  60. package/dist/data/HighlightedTokens.cjs.map +1 -0
  61. package/dist/data/HighlightedTokens.d.ts +6 -0
  62. package/dist/data/HighlightedTokens.d.ts.map +1 -0
  63. package/dist/data/HighlightedTokens.js +21 -0
  64. package/dist/data/HighlightedTokens.js.map +1 -0
  65. package/dist/data/ai/AdvancedChatConfig.cjs +3 -0
  66. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  67. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -1
  68. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  69. package/dist/data/ai/AdvancedChatConfig.js +3 -0
  70. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  71. package/dist/data/ai/ChatWindow.cjs +77 -4
  72. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  73. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  74. package/dist/data/ai/ChatWindow.js +78 -5
  75. package/dist/data/ai/ChatWindow.js.map +1 -1
  76. package/dist/data/ai/ChatWindow.runtime.cjs +19 -4
  77. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  78. package/dist/data/ai/ChatWindow.runtime.d.ts +2 -0
  79. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  80. package/dist/data/ai/ChatWindow.runtime.js +19 -4
  81. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  82. package/dist/data/ai/ChatWindow.test-utils.d.ts +2 -1
  83. package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
  84. package/dist/data/ai/ToolPreferences.cjs +8 -1
  85. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  86. package/dist/data/ai/ToolPreferences.d.ts +2 -1
  87. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  88. package/dist/data/ai/ToolPreferences.js +8 -1
  89. package/dist/data/ai/ToolPreferences.js.map +1 -1
  90. package/dist/data/chat/Chat.cjs +26 -3
  91. package/dist/data/chat/Chat.cjs.map +1 -1
  92. package/dist/data/chat/Chat.d.ts +9 -1
  93. package/dist/data/chat/Chat.d.ts.map +1 -1
  94. package/dist/data/chat/Chat.js +26 -3
  95. package/dist/data/chat/Chat.js.map +1 -1
  96. package/dist/data/chat/ChatRuntimeToolbar.cjs +2 -0
  97. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  98. package/dist/data/chat/ChatRuntimeToolbar.d.ts +2 -1
  99. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  100. package/dist/data/chat/ChatRuntimeToolbar.js +2 -0
  101. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  102. package/dist/data/chat/Message.cjs +36 -1
  103. package/dist/data/chat/Message.cjs.map +1 -1
  104. package/dist/data/chat/Message.d.ts +1 -1
  105. package/dist/data/chat/Message.d.ts.map +1 -1
  106. package/dist/data/chat/Message.js +37 -2
  107. package/dist/data/chat/Message.js.map +1 -1
  108. package/dist/data/chat/approval.cjs +17 -0
  109. package/dist/data/chat/approval.cjs.map +1 -1
  110. package/dist/data/chat/approval.d.ts +5 -0
  111. package/dist/data/chat/approval.d.ts.map +1 -1
  112. package/dist/data/chat/approval.js +17 -0
  113. package/dist/data/chat/approval.js.map +1 -1
  114. package/dist/data/chat/fork-seed.cjs +22 -0
  115. package/dist/data/chat/fork-seed.cjs.map +1 -0
  116. package/dist/data/chat/fork-seed.d.ts +8 -0
  117. package/dist/data/chat/fork-seed.d.ts.map +1 -0
  118. package/dist/data/chat/fork-seed.js +22 -0
  119. package/dist/data/chat/fork-seed.js.map +1 -0
  120. package/dist/data/code-highlight.cjs +0 -6
  121. package/dist/data/code-highlight.cjs.map +1 -1
  122. package/dist/data/code-highlight.d.ts +4 -3
  123. package/dist/data/code-highlight.d.ts.map +1 -1
  124. package/dist/data/code-highlight.js +1 -7
  125. package/dist/data/code-highlight.js.map +1 -1
  126. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +6 -2
  127. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  128. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +8 -1
  129. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  130. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +6 -2
  131. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  132. package/dist/data/diagnostics/ErrorDetails.cjs +29 -5
  133. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  134. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  135. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  136. package/dist/data/diagnostics/ErrorDetails.js +29 -5
  137. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  138. package/dist/data/diagnostics/FrameSourceWindow.cjs +54 -24
  139. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  140. package/dist/data/diagnostics/FrameSourceWindow.d.ts +2 -1
  141. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  142. package/dist/data/diagnostics/FrameSourceWindow.js +54 -24
  143. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  144. package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -1
  145. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +3 -0
  146. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -1
  147. package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -1
  148. package/dist/data/diagnostics/JvmStackTrace.cjs +14 -30
  149. package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
  150. package/dist/data/diagnostics/JvmStackTrace.d.ts +6 -9
  151. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
  152. package/dist/data/diagnostics/JvmStackTrace.js +15 -31
  153. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
  154. package/dist/data/diagnostics/RenderedStackTrace.cjs +14 -144
  155. package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
  156. package/dist/data/diagnostics/RenderedStackTrace.d.ts +6 -6
  157. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
  158. package/dist/data/diagnostics/RenderedStackTrace.js +15 -145
  159. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
  160. package/dist/data/diagnostics/StackFrameRow.cjs +65 -0
  161. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -0
  162. package/dist/data/diagnostics/StackFrameRow.d.ts +13 -0
  163. package/dist/data/diagnostics/StackFrameRow.d.ts.map +1 -0
  164. package/dist/data/diagnostics/StackFrameRow.js +65 -0
  165. package/dist/data/diagnostics/StackFrameRow.js.map +1 -0
  166. package/dist/data/diagnostics/ThreadCard.cjs +9 -2
  167. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  168. package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
  169. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  170. package/dist/data/diagnostics/ThreadCard.js +9 -2
  171. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  172. package/dist/data/diagnostics/frame-heuristics.cjs +26 -0
  173. package/dist/data/diagnostics/frame-heuristics.cjs.map +1 -0
  174. package/dist/data/diagnostics/frame-heuristics.d.ts +5 -0
  175. package/dist/data/diagnostics/frame-heuristics.d.ts.map +1 -0
  176. package/dist/data/diagnostics/frame-heuristics.js +26 -0
  177. package/dist/data/diagnostics/frame-heuristics.js.map +1 -0
  178. package/dist/data/diagnostics/jvm-stacktrace.cjs +5 -7
  179. package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
  180. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
  181. package/dist/data/diagnostics/jvm-stacktrace.js +5 -7
  182. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
  183. package/dist/data/diagnostics/stacktrace-parse.cjs +4 -9
  184. package/dist/data/diagnostics/stacktrace-parse.cjs.map +1 -1
  185. package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -1
  186. package/dist/data/diagnostics/stacktrace-parse.js +4 -9
  187. package/dist/data/diagnostics/stacktrace-parse.js.map +1 -1
  188. package/dist/data/runtime/RuntimeBar.cjs +3 -0
  189. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  190. package/dist/data/runtime/RuntimeBar.d.ts +3 -1
  191. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  192. package/dist/data/runtime/RuntimeBar.js +3 -0
  193. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  194. package/dist/data/runtime/RuntimeBarCombo.cjs +15 -1
  195. package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
  196. package/dist/data/runtime/RuntimeBarCombo.d.ts +2 -1
  197. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
  198. package/dist/data/runtime/RuntimeBarCombo.js +15 -1
  199. package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
  200. package/dist/data/runtime/RuntimeBarSegments.cjs +7 -0
  201. package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
  202. package/dist/data/runtime/RuntimeBarSegments.d.ts +2 -1
  203. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
  204. package/dist/data/runtime/RuntimeBarSegments.js +7 -0
  205. package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
  206. package/dist/data/version-info.cjs +3 -3
  207. package/dist/data/version-info.js +3 -3
  208. package/dist/data.cjs +7 -1
  209. package/dist/data.cjs.map +1 -1
  210. package/dist/data.d.ts +4 -2
  211. package/dist/data.d.ts.map +1 -1
  212. package/dist/data.js +8 -2
  213. package/dist/data.js.map +1 -1
  214. package/dist/index.cjs +18 -1
  215. package/dist/index.cjs.map +1 -1
  216. package/dist/index.js +19 -2
  217. package/dist/index.js.map +1 -1
  218. package/dist/rpc/CommandForm.cjs +8 -18
  219. package/dist/rpc/CommandForm.cjs.map +1 -1
  220. package/dist/rpc/CommandForm.d.ts +8 -2
  221. package/dist/rpc/CommandForm.d.ts.map +1 -1
  222. package/dist/rpc/CommandForm.js +9 -19
  223. package/dist/rpc/CommandForm.js.map +1 -1
  224. package/dist/rpc/OperationActionDialog.cjs +3 -3
  225. package/dist/rpc/OperationActionDialog.cjs.map +1 -1
  226. package/dist/rpc/OperationActionDialog.js +3 -3
  227. package/dist/rpc/OperationActionDialog.js.map +1 -1
  228. package/dist/rpc/OperationCommandPage.cjs +7 -7
  229. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  230. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  231. package/dist/rpc/OperationCommandPage.js +7 -7
  232. package/dist/rpc/OperationCommandPage.js.map +1 -1
  233. package/dist/rpc/apiClient.cjs +17 -3
  234. package/dist/rpc/apiClient.cjs.map +1 -1
  235. package/dist/rpc/apiClient.d.ts +4 -4
  236. package/dist/rpc/apiClient.d.ts.map +1 -1
  237. package/dist/rpc/apiClient.js +17 -3
  238. package/dist/rpc/apiClient.js.map +1 -1
  239. package/dist/rpc/formMetadata.cjs +5 -9
  240. package/dist/rpc/formMetadata.cjs.map +1 -1
  241. package/dist/rpc/formMetadata.d.ts +3 -3
  242. package/dist/rpc/formMetadata.d.ts.map +1 -1
  243. package/dist/rpc/formMetadata.js +5 -9
  244. package/dist/rpc/formMetadata.js.map +1 -1
  245. package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
  246. package/dist/rpc/types.cjs.map +1 -1
  247. package/dist/rpc/types.d.ts +1 -0
  248. package/dist/rpc/types.d.ts.map +1 -1
  249. package/dist/rpc/types.js.map +1 -1
  250. package/dist/rpc/useOperations.cjs.map +1 -1
  251. package/dist/rpc/useOperations.d.ts +4 -4
  252. package/dist/rpc/useOperations.d.ts.map +1 -1
  253. package/dist/rpc/useOperations.js.map +1 -1
  254. package/dist/rpc.d.ts +2 -2
  255. package/dist/rpc.d.ts.map +1 -1
  256. package/dist/styles.css +1 -1
  257. package/package.json +2 -1
@@ -25,6 +25,7 @@ const tagUtils = require("./cells/tag-utils.cjs");
25
25
  const StatusDot = require("./cells/StatusDot.cjs");
26
26
  const statusMapping = require("./cells/status-mapping.cjs");
27
27
  const DataTable_grouping = require("./DataTable.grouping.cjs");
28
+ const DataTableGroupingControls = require("./DataTableGroupingControls.cjs");
28
29
  const UiEllipsis = require("../icons/components/UiEllipsis.cjs");
29
30
  const UiFilter = require("../icons/components/UiFilter.cjs");
30
31
  const UiChevronRight = require("../icons/components/UiChevronRight.cjs");
@@ -67,6 +68,44 @@ const TIMESTAMP_RANGE_PRESETS = [
67
68
  { label: "Last 7 days", from: "now-7d", to: "now" },
68
69
  { label: "Last 30 days", from: "now-30d", to: "now" }
69
70
  ];
71
+ function assertDataTableGroupingProps({
72
+ grouping,
73
+ groupingModes,
74
+ groupingMode,
75
+ defaultGroupingMode,
76
+ onGroupingModeChange
77
+ }) {
78
+ if (grouping && groupingModes) {
79
+ throw new Error("DataTable accepts grouping or groupingModes, not both");
80
+ }
81
+ if (!groupingModes) {
82
+ if (groupingMode !== void 0 || defaultGroupingMode !== void 0) {
83
+ throw new Error("DataTable groupingMode values require groupingModes");
84
+ }
85
+ return;
86
+ }
87
+ if (groupingModes.length === 0) {
88
+ throw new Error("DataTable groupingModes must not be empty");
89
+ }
90
+ const values = new Set(groupingModes.map((mode) => mode.value));
91
+ if (values.size !== groupingModes.length) {
92
+ throw new Error("DataTable groupingModes values must be unique");
93
+ }
94
+ if (groupingMode !== void 0 && !onGroupingModeChange) {
95
+ throw new Error(
96
+ "DataTable controlled groupingMode requires onGroupingModeChange"
97
+ );
98
+ }
99
+ if (groupingMode !== void 0 && defaultGroupingMode !== void 0) {
100
+ throw new Error(
101
+ "DataTable cannot combine groupingMode with defaultGroupingMode"
102
+ );
103
+ }
104
+ const selected = groupingMode ?? defaultGroupingMode;
105
+ if (selected !== void 0 && !values.has(selected)) {
106
+ throw new Error(`DataTable grouping mode "${selected}" does not exist`);
107
+ }
108
+ }
70
109
  function DataTableInner({
71
110
  data,
72
111
  error,
@@ -103,6 +142,10 @@ function DataTableInner({
103
142
  getRowClassName,
104
143
  footer,
105
144
  grouping,
145
+ groupingModes,
146
+ groupingMode,
147
+ defaultGroupingMode,
148
+ onGroupingModeChange,
106
149
  onRowClick,
107
150
  isRowClickable,
108
151
  getRowHref,
@@ -128,6 +171,14 @@ function DataTableInner({
128
171
  showHeaderFilters = true,
129
172
  menuActions
130
173
  }) {
174
+ var _a;
175
+ assertDataTableGroupingProps({
176
+ grouping,
177
+ groupingModes,
178
+ groupingMode,
179
+ defaultGroupingMode,
180
+ onGroupingModeChange
181
+ });
131
182
  const columns = react.useMemo(
132
183
  () => columnsInput.map(
133
184
  (column) => typeof column === "string" ? { key: column, label: column } : column
@@ -161,17 +212,18 @@ function DataTableInner({
161
212
  const [numberFilters, setNumberFilters] = react.useState({});
162
213
  const [expandedRows, setExpandedRows] = react.useState({});
163
214
  const [detailRow, setDetailRow] = react.useState(null);
215
+ const [localGroupingMode, setLocalGroupingMode] = react.useState(defaultGroupingMode);
164
216
  const [localGlobalFilter, setLocalGlobalFilter] = react.useState("");
165
217
  const [timeRangeFilter, setTimeRangeFilter] = react.useState(() => {
166
- var _a, _b, _c, _d;
218
+ var _a2, _b, _c, _d;
167
219
  const seed = columns.find(
168
220
  (column) => {
169
- var _a2;
170
- return column.kind === "timestamp" && ((_a2 = column.timestamp) == null ? void 0 : _a2.defaultRange);
221
+ var _a3;
222
+ return column.kind === "timestamp" && ((_a3 = column.timestamp) == null ? void 0 : _a3.defaultRange);
171
223
  }
172
224
  );
173
225
  return {
174
- from: ((_b = (_a = seed == null ? void 0 : seed.timestamp) == null ? void 0 : _a.defaultRange) == null ? void 0 : _b.from) ?? "",
226
+ from: ((_b = (_a2 = seed == null ? void 0 : seed.timestamp) == null ? void 0 : _a2.defaultRange) == null ? void 0 : _b.from) ?? "",
175
227
  to: ((_d = (_c = seed == null ? void 0 : seed.timestamp) == null ? void 0 : _c.defaultRange) == null ? void 0 : _d.to) ?? ""
176
228
  };
177
229
  });
@@ -249,7 +301,7 @@ function DataTableInner({
249
301
  [data, getRowId]
250
302
  );
251
303
  const timestampFormats = react.useMemo(() => {
252
- var _a;
304
+ var _a2;
253
305
  const out = {};
254
306
  for (const column of columns) {
255
307
  if (column.kind !== "timestamp") continue;
@@ -261,7 +313,7 @@ function DataTableInner({
261
313
  }
262
314
  const dataFormat = timestampFormat.chooseTimestampFormat(dates);
263
315
  out[column.key] = timestampFormat.modeToFormat(
264
- ((_a = column.timestamp) == null ? void 0 : _a.mode) ?? "auto",
316
+ ((_a2 = column.timestamp) == null ? void 0 : _a2.mode) ?? "auto",
265
317
  dataFormat
266
318
  );
267
319
  }
@@ -273,6 +325,35 @@ function DataTableInner({
273
325
  ),
274
326
  [columns, timestampFormats]
275
327
  );
328
+ const activeGroupingModeValue = groupingMode ?? localGroupingMode ?? defaultGroupingMode ?? ((_a = groupingModes == null ? void 0 : groupingModes[0]) == null ? void 0 : _a.value);
329
+ const activeGroupingMode = groupingModes == null ? void 0 : groupingModes.find(
330
+ (mode) => mode.value === activeGroupingModeValue
331
+ );
332
+ const effectiveGrouping = react.useMemo(() => {
333
+ if (!activeGroupingMode) return grouping;
334
+ if (activeGroupingMode.type === "none") return void 0;
335
+ if (activeGroupingMode.type === "custom") return activeGroupingMode;
336
+ const column = effectiveColumns.find(
337
+ (candidate) => candidate.key === activeGroupingMode.columnKey
338
+ );
339
+ if (!column) {
340
+ throw new Error(
341
+ `DataTable grouping mode "${activeGroupingMode.value}" references missing column "${activeGroupingMode.columnKey}"`
342
+ );
343
+ }
344
+ return {
345
+ ...activeGroupingMode,
346
+ getGroupKey: (row) => DataTable_grouping.dataTableGroupKey(dataTableUtils.resolveColumnValue(row, column)),
347
+ // `emptyGroupLabel` is a header label, never a key — resolving it here
348
+ // keeps rows with no value apart from rows whose value happens to read
349
+ // like the label.
350
+ getGroupLabel: (key, rows2) => {
351
+ var _a2;
352
+ const custom = (_a2 = activeGroupingMode.getGroupLabel) == null ? void 0 : _a2.call(activeGroupingMode, key, rows2);
353
+ return custom !== void 0 ? custom : DataTable_grouping.dataTableGroupLabel(key, activeGroupingMode.emptyGroupLabel);
354
+ }
355
+ };
356
+ }, [activeGroupingMode, effectiveColumns, grouping]);
276
357
  const visibleColumns = react.useMemo(() => {
277
358
  if (!hideableColumns) return effectiveColumns;
278
359
  const next = effectiveColumns.filter(
@@ -296,8 +377,8 @@ function DataTableInner({
296
377
  const rangeCapableColumn = react.useMemo(
297
378
  () => effectiveColumns.find(
298
379
  (column) => {
299
- var _a;
300
- return column.kind === "timestamp" && column.filterable !== false && ((_a = column.timestamp) == null ? void 0 : _a.autoRangeFilter) !== false;
380
+ var _a2;
381
+ return column.kind === "timestamp" && column.filterable !== false && ((_a2 = column.timestamp) == null ? void 0 : _a2.autoRangeFilter) !== false;
301
382
  }
302
383
  ) ?? null,
303
384
  [effectiveColumns]
@@ -325,7 +406,7 @@ function DataTableInner({
325
406
  const generatedFilters = react.useMemo(() => {
326
407
  if (!autoFilter || loading$1) return [];
327
408
  return filterableColumns.map((column) => {
328
- var _a;
409
+ var _a2;
329
410
  const numberBounds = getNumericFilterBounds(rows, column);
330
411
  if (numberBounds) {
331
412
  return {
@@ -347,7 +428,7 @@ function DataTableInner({
347
428
  const multiCap = column.kind === "tags" ? 50 : 20;
348
429
  const fitsMulti = options.length >= 2 && options.length <= multiCap;
349
430
  if (column.kind === "tags" && fitsMulti) {
350
- const separator = ((_a = column.tags) == null ? void 0 : _a.separator) ?? "=";
431
+ const separator = ((_a2 = column.tags) == null ? void 0 : _a2.separator) ?? "=";
351
432
  const groups2 = groupTagOptions(options, separator);
352
433
  if (groups2.length >= 2) {
353
434
  return {
@@ -393,7 +474,7 @@ function DataTableInner({
393
474
  }) : setLocalGlobalFilter;
394
475
  const nativeFilters = react.useMemo(
395
476
  () => generatedFilters.map((filter) => {
396
- var _a, _b, _c;
477
+ var _a2, _b, _c;
397
478
  const columnKey = filter.column.key;
398
479
  if (filter.kind === "multi") {
399
480
  return {
@@ -429,7 +510,7 @@ function DataTableInner({
429
510
  (current) => updateNumberFilterValue(current, columnKey, next)
430
511
  )
431
512
  };
432
- if (((_a = filter.numberBounds) == null ? void 0 : _a.min) !== void 0) {
513
+ if (((_a2 = filter.numberBounds) == null ? void 0 : _a2.min) !== void 0) {
433
514
  numberFilter.domainMin = filter.numberBounds.min;
434
515
  }
435
516
  if (((_b = filter.numberBounds) == null ? void 0 : _b.max) !== void 0) {
@@ -478,13 +559,13 @@ function DataTableInner({
478
559
  (filterBarProps == null ? void 0 : filterBarProps.leading) || (filterBarProps == null ? void 0 : filterBarProps.children) || (filterBarProps == null ? void 0 : filterBarProps.trailing) || (filterBarProps == null ? void 0 : filterBarProps.timeRange) || (filterBarProps == null ? void 0 : filterBarProps.dateRange)
479
560
  );
480
561
  const autoTimeRange = react.useMemo(() => {
481
- var _a, _b, _c, _d;
562
+ var _a2, _b, _c, _d;
482
563
  if (!timeRangeColumn) return null;
483
564
  const next = {
484
565
  from: timeRangeFilter.from,
485
566
  to: timeRangeFilter.to,
486
567
  onApply: (from, to) => setTimeRangeFilter({ from, to }),
487
- presets: ((_a = timeRangeColumn.timestamp) == null ? void 0 : _a.rangePresets) ?? TIMESTAMP_RANGE_PRESETS,
568
+ presets: ((_a2 = timeRangeColumn.timestamp) == null ? void 0 : _a2.rangePresets) ?? TIMESTAMP_RANGE_PRESETS,
488
569
  fromPlaceholder: "now-24h",
489
570
  toPlaceholder: "now",
490
571
  emptyLabel: "Any time"
@@ -527,20 +608,11 @@ function DataTableInner({
527
608
  globalFilterControlled: globalFilter !== void 0 || onGlobalFilterChange !== void 0,
528
609
  hasExternalSearch: externalSearch !== void 0
529
610
  });
530
- const showFilterBar = resolvedShowGlobalFilter || nativeFilters.length > 0 || !!barTimeRange || !!externalSearch || externalFilters && externalFilters.length > 0 || hasCustomFilterBarContent || showTablePreferencesControl;
611
+ const showFilterBar = resolvedShowGlobalFilter || nativeFilters.length > 0 || !!barTimeRange || !!externalSearch || externalFilters && externalFilters.length > 0 || hasCustomFilterBarContent || !!groupingModes || showTablePreferencesControl;
531
612
  const setDensityOverride = (next) => {
532
613
  if (!densityControlled) setLocalDensityOverride(next);
533
614
  onDensityChange == null ? void 0 : onDensityChange(next);
534
615
  };
535
- const filterBarTrailing = showTablePreferencesControl ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
536
- filterBarProps == null ? void 0 : filterBarProps.trailing,
537
- /* @__PURE__ */ jsxRuntime.jsx(
538
- ColumnVisibilityTrigger,
539
- {
540
- onOpen: (event) => setColumnMenu(menuStateFromTrigger(event))
541
- }
542
- )
543
- ] }) : filterBarProps == null ? void 0 : filterBarProps.trailing;
544
616
  const showHeaderFilterControls = showHeaderFilters && (headerFilterByColumn.size > 0 || !!columnTimeRange);
545
617
  const filteredRows = react.useMemo(() => {
546
618
  if (manualFilter) return rows;
@@ -650,8 +722,8 @@ function DataTableInner({
650
722
  const selectableVisibleRows = react.useMemo(
651
723
  () => visibleSorted.filter(
652
724
  (record) => {
653
- var _a;
654
- return ((_a = rowSelection == null ? void 0 : rowSelection.isRowSelectable) == null ? void 0 : _a.call(rowSelection, record.row)) ?? true;
725
+ var _a2;
726
+ return ((_a2 = rowSelection == null ? void 0 : rowSelection.isRowSelectable) == null ? void 0 : _a2.call(rowSelection, record.row)) ?? true;
655
727
  }
656
728
  ),
657
729
  [rowSelection, visibleSorted]
@@ -679,9 +751,9 @@ function DataTableInner({
679
751
  );
680
752
  const toggleRowSelection = react.useCallback(
681
753
  (record) => {
682
- var _a;
754
+ var _a2;
683
755
  if (!rowSelection) return;
684
- if (((_a = rowSelection.isRowSelectable) == null ? void 0 : _a.call(rowSelection, record.row)) === false) return;
756
+ if (((_a2 = rowSelection.isRowSelectable) == null ? void 0 : _a2.call(rowSelection, record.row)) === false) return;
685
757
  const next = new Set(selectedRowIDs);
686
758
  if (next.has(record.id)) next.delete(record.id);
687
759
  else next.add(record.id);
@@ -720,31 +792,67 @@ function DataTableInner({
720
792
  totalRowCount: data.length,
721
793
  loading: loading$1
722
794
  }) : footer : pagination ? null : loading$1 && sorted.length === 0 ? loadingMessage : `${sorted.length} of ${data.length} row${data.length === 1 ? "" : "s"}`;
723
- const [collapsedGroups, setCollapsedGroups] = react.useState({});
795
+ const [collapseStateByMode, setCollapseStateByMode] = react.useState({});
796
+ const collapseStateKey = activeGroupingMode ? `mode:${activeGroupingMode.value}` : "fixed";
797
+ const collapseState = collapseStateByMode[collapseStateKey];
724
798
  const groups = react.useMemo(() => {
725
- if (!grouping) return null;
799
+ if (!effectiveGrouping) return null;
726
800
  const buckets = DataTable_grouping.groupRecords(
727
801
  visibleSorted,
728
- (record) => grouping.getGroupKey(record.row)
802
+ (record) => effectiveGrouping.getGroupKey(record.row)
729
803
  );
730
804
  const resolved = buckets.map((bucket) => ({
731
805
  key: bucket.key,
732
806
  records: bucket.rows,
733
807
  rows: bucket.rows.map((record) => record.row)
734
808
  }));
735
- if (grouping.compareGroups) {
736
- resolved.sort((a, b) => grouping.compareGroups(a, b));
809
+ if (effectiveGrouping.compareGroups) {
810
+ resolved.sort((a, b) => effectiveGrouping.compareGroups(a, b));
737
811
  }
738
812
  return resolved.map((group) => {
739
- var _a, _b;
813
+ var _a2, _b;
740
814
  return {
741
815
  ...group,
742
- label: ((_a = grouping.getGroupLabel) == null ? void 0 : _a.call(grouping, group.key, group.rows)) ?? group.key,
743
- meta: (_b = grouping.getGroupMeta) == null ? void 0 : _b.call(grouping, group.key, group.rows),
744
- collapsed: collapsedGroups[group.key] ?? DataTable_grouping.isGroupCollapsedByDefault(group, grouping.defaultCollapsed)
816
+ label: ((_a2 = effectiveGrouping.getGroupLabel) == null ? void 0 : _a2.call(effectiveGrouping, group.key, group.rows)) ?? group.key,
817
+ meta: (_b = effectiveGrouping.getGroupMeta) == null ? void 0 : _b.call(effectiveGrouping, group.key, group.rows),
818
+ collapsed: (collapseState == null ? void 0 : collapseState.groups[group.key]) ?? (collapseState == null ? void 0 : collapseState.all) ?? DataTable_grouping.isGroupCollapsedByDefault(group, effectiveGrouping.defaultCollapsed)
745
819
  };
746
820
  });
747
- }, [collapsedGroups, grouping, visibleSorted]);
821
+ }, [collapseState, effectiveGrouping, visibleSorted]);
822
+ const hasGroups = !!(groups == null ? void 0 : groups.length);
823
+ const allGroupsExpanded = hasGroups && groups.every((group) => !group.collapsed);
824
+ const allGroupsCollapsed = hasGroups && groups.every((group) => group.collapsed);
825
+ const setAllGroupsCollapsed = (collapsed) => {
826
+ setCollapseStateByMode((current) => ({
827
+ ...current,
828
+ [collapseStateKey]: { all: collapsed, groups: {} }
829
+ }));
830
+ };
831
+ const filterBarTrailing = (filterBarProps == null ? void 0 : filterBarProps.trailing) || groupingModes || showTablePreferencesControl ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
832
+ filterBarProps == null ? void 0 : filterBarProps.trailing,
833
+ groupingModes ? /* @__PURE__ */ jsxRuntime.jsx(
834
+ DataTableGroupingControls.DataTableGroupingControls,
835
+ {
836
+ modes: groupingModes,
837
+ value: activeGroupingModeValue,
838
+ hasGroups,
839
+ allExpanded: allGroupsExpanded,
840
+ allCollapsed: allGroupsCollapsed,
841
+ onModeChange: (value) => {
842
+ if (groupingMode === void 0) setLocalGroupingMode(value);
843
+ onGroupingModeChange == null ? void 0 : onGroupingModeChange(value);
844
+ },
845
+ onExpandAll: () => setAllGroupsCollapsed(false),
846
+ onCollapseAll: () => setAllGroupsCollapsed(true)
847
+ }
848
+ ) : null,
849
+ showTablePreferencesControl ? /* @__PURE__ */ jsxRuntime.jsx(
850
+ ColumnVisibilityTrigger,
851
+ {
852
+ onOpen: (event) => setColumnMenu(menuStateFromTrigger(event))
853
+ }
854
+ ) : null
855
+ ] }) : void 0;
748
856
  const rowStream = react.useMemo(() => {
749
857
  if (!groups) {
750
858
  return visibleSorted.map((record) => ({ kind: "row", record }));
@@ -759,8 +867,8 @@ function DataTableInner({
759
867
  if (!rowSelection) return;
760
868
  const selectable = records.filter(
761
869
  (record) => {
762
- var _a;
763
- return ((_a = rowSelection.isRowSelectable) == null ? void 0 : _a.call(rowSelection, record.row)) ?? true;
870
+ var _a2;
871
+ return ((_a2 = rowSelection.isRowSelectable) == null ? void 0 : _a2.call(rowSelection, record.row)) ?? true;
764
872
  }
765
873
  );
766
874
  const next = new Set(selectedRowIDs);
@@ -779,8 +887,8 @@ function DataTableInner({
779
887
  if (!node || !sentinelActive) return;
780
888
  revealObserver.current = new IntersectionObserver(
781
889
  (entries) => {
782
- var _a;
783
- if (!((_a = entries[0]) == null ? void 0 : _a.isIntersecting)) return;
890
+ var _a2;
891
+ if (!((_a2 = entries[0]) == null ? void 0 : _a2.isIntersecting)) return;
784
892
  if (infiniteEnabled) {
785
893
  requestMoreRows();
786
894
  return;
@@ -830,14 +938,14 @@ function DataTableInner({
830
938
  document.body.style.userSelect = "none";
831
939
  };
832
940
  const autoFitColumn = (event, column) => {
833
- var _a;
941
+ var _a2;
834
942
  event.preventDefault();
835
943
  event.stopPropagation();
836
944
  const header = event.currentTarget.closest("th");
837
945
  const table = event.currentTarget.closest("table");
838
946
  if (!header || !table) return;
839
947
  const columnIndex = Array.from(
840
- ((_a = header.parentElement) == null ? void 0 : _a.children) ?? []
948
+ ((_a2 = header.parentElement) == null ? void 0 : _a2.children) ?? []
841
949
  ).indexOf(header);
842
950
  if (columnIndex < 0) return;
843
951
  const width = measureColumnContentWidth(table, columnIndex, column);
@@ -1042,28 +1150,37 @@ function DataTableInner({
1042
1150
  children: emptyMessage
1043
1151
  }
1044
1152
  ) }) : rowStream.map((item) => {
1045
- var _a;
1153
+ var _a2;
1046
1154
  if (item.kind === "group") {
1047
1155
  return /* @__PURE__ */ jsxRuntime.jsx(
1048
1156
  DataTableGroupHeaderRow,
1049
1157
  {
1050
1158
  label: item.group.label,
1051
1159
  meta: item.group.meta,
1052
- metaAlign: (grouping == null ? void 0 : grouping.metaAlign) ?? "end",
1053
- ...(grouping == null ? void 0 : grouping.metaClassName) ? { metaClassName: grouping.metaClassName } : {},
1160
+ metaAlign: (effectiveGrouping == null ? void 0 : effectiveGrouping.metaAlign) ?? "end",
1161
+ ...(effectiveGrouping == null ? void 0 : effectiveGrouping.metaClassName) ? { metaClassName: effectiveGrouping.metaClassName } : {},
1054
1162
  count: item.group.records.length,
1055
1163
  colSpan: visibleColumns.length + (rowSelection ? 1 : 0),
1056
1164
  collapsed: item.group.collapsed,
1057
- onToggleCollapsed: () => setCollapsedGroups((current) => ({
1058
- ...current,
1059
- [item.group.key]: !item.group.collapsed
1060
- })),
1165
+ onToggleCollapsed: () => setCollapseStateByMode((current) => {
1166
+ var _a3;
1167
+ return {
1168
+ ...current,
1169
+ [collapseStateKey]: {
1170
+ ...current[collapseStateKey],
1171
+ groups: {
1172
+ ...(_a3 = current[collapseStateKey]) == null ? void 0 : _a3.groups,
1173
+ [item.group.key]: !item.group.collapsed
1174
+ }
1175
+ }
1176
+ };
1177
+ }),
1061
1178
  ...rowSelection ? {
1062
1179
  selection: {
1063
1180
  selectableCount: item.group.records.filter(
1064
1181
  (record2) => {
1065
- var _a2;
1066
- return ((_a2 = rowSelection.isRowSelectable) == null ? void 0 : _a2.call(
1182
+ var _a3;
1183
+ return ((_a3 = rowSelection.isRowSelectable) == null ? void 0 : _a3.call(
1067
1184
  rowSelection,
1068
1185
  record2.row
1069
1186
  )) ?? true;
@@ -1091,7 +1208,7 @@ function DataTableInner({
1091
1208
  const expandsInline = expandable && detailStyle === "row";
1092
1209
  const opensDialog = expandable && detailStyle === "dialog";
1093
1210
  const rowClickEnabled = (isRowClickable == null ? void 0 : isRowClickable(record.row)) ?? !!onRowClick;
1094
- const rowSelectable = ((_a = rowSelection == null ? void 0 : rowSelection.isRowSelectable) == null ? void 0 : _a.call(rowSelection, record.row)) ?? true;
1211
+ const rowSelectable = ((_a2 = rowSelection == null ? void 0 : rowSelection.isRowSelectable) == null ? void 0 : _a2.call(rowSelection, record.row)) ?? true;
1095
1212
  const selectionClickEnabled = !!(rowSelection == null ? void 0 : rowSelection.toggleOnRowClick) && rowSelectable;
1096
1213
  const clickable = !!href || rowClickEnabled || expandable || selectionClickEnabled;
1097
1214
  return /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
@@ -1105,7 +1222,8 @@ function DataTableInner({
1105
1222
  getRowClassName == null ? void 0 : getRowClassName(record.row)
1106
1223
  ),
1107
1224
  onClick: () => {
1108
- if (selectionClickEnabled) toggleRowSelection(record);
1225
+ if (selectionClickEnabled)
1226
+ toggleRowSelection(record);
1109
1227
  if (expandsInline) {
1110
1228
  setExpandedRows((current) => ({
1111
1229
  ...current,
@@ -1144,7 +1262,7 @@ function DataTableInner({
1144
1262
  }
1145
1263
  ) : null,
1146
1264
  visibleColumns.map((column, index) => {
1147
- var _a2;
1265
+ var _a3;
1148
1266
  const rawValue = dataTableUtils.resolveColumnValue(
1149
1267
  record.row,
1150
1268
  column
@@ -1168,7 +1286,7 @@ function DataTableInner({
1168
1286
  {
1169
1287
  value: serverFilterValue,
1170
1288
  ...serverFilterDisplayValue !== void 0 ? { displayValue: serverFilterDisplayValue } : {},
1171
- mode: (_a2 = cellFilters == null ? void 0 : cellFilters[filterKey]) == null ? void 0 : _a2[serverFilterValue],
1289
+ mode: (_a3 = cellFilters == null ? void 0 : cellFilters[filterKey]) == null ? void 0 : _a3[serverFilterValue],
1172
1290
  onChange: (mode) => onCellFilterChange({
1173
1291
  key: filterKey,
1174
1292
  value: serverFilterValue,
@@ -1365,7 +1483,10 @@ function DataTablePaginationFooter({
1365
1483
  const atLast = cursor ? cursor.next == null : pagination.hasMore != null ? !pagination.hasMore : totalPages != null ? safePage >= totalPages - 1 : visibleRowCount < pageSize;
1366
1484
  const hasVisibleRows = visibleRowCount > 0;
1367
1485
  const rangeStart = total === 0 || !hasVisibleRows ? 0 : infinite ? 1 : safePage * pageSize + 1;
1368
- const rangeEnd = total != null && hasVisibleRows ? Math.min(approximate ? Infinity : total, rangeStart + Math.max(visibleRowCount - 1, 0)) : visibleRowCount;
1486
+ const rangeEnd = total != null && hasVisibleRows ? Math.min(
1487
+ approximate ? Infinity : total,
1488
+ rangeStart + Math.max(visibleRowCount - 1, 0)
1489
+ ) : visibleRowCount;
1369
1490
  const rangeLabel = total != null ? `${rangeStart}-${rangeEnd} of ${approximate ? `~${total}+` : total}` : `${visibleRowCount} row${visibleRowCount === 1 ? "" : "s"}`;
1370
1491
  const steppable = !infinite && (cursor != null || onPageChange != null);
1371
1492
  const goPrevious = () => {
@@ -1470,7 +1591,7 @@ function DataTableGroupHeaderRow({
1470
1591
  "aria-expanded": !collapsed,
1471
1592
  onClick: onToggleCollapsed,
1472
1593
  className: utils.cn(
1473
- "flex min-w-0 items-center gap-1.5 text-left text-xs font-semibold text-foreground hover:text-primary",
1594
+ "flex min-w-0 items-center gap-1.5 text-left text-sm font-semibold text-foreground hover:text-primary",
1474
1595
  // `flex-1` is what pushes the meta to the trailing edge. Dropping
1475
1596
  // it lets the meta sit right after the count instead.
1476
1597
  metaAlign === "end" && "flex-1"
@@ -1492,7 +1613,7 @@ function DataTableGroupHeaderRow({
1492
1613
  "div",
1493
1614
  {
1494
1615
  className: utils.cn(
1495
- "shrink-0 text-xs text-muted-foreground",
1616
+ "shrink-0 text-sm text-muted-foreground",
1496
1617
  metaClassName
1497
1618
  ),
1498
1619
  children: meta
@@ -2049,10 +2170,7 @@ function CellContent({
2049
2170
  return /* @__PURE__ */ jsxRuntime.jsx(
2050
2171
  "div",
2051
2172
  {
2052
- className: utils.cn(
2053
- cellContentClassName(column),
2054
- alignmentClass(column.align)
2055
- ),
2173
+ className: utils.cn(cellContentClassName(column), alignmentClass(column.align)),
2056
2174
  children
2057
2175
  }
2058
2176
  );