@perses-dev/table-plugin 0.11.2 → 0.13.0-beta.1

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 (223) hide show
  1. package/__mf/css/async/362.85c2cbf6.css +1 -0
  2. package/__mf/font/inter-cyrillic-300-normal.432f2b21.woff +0 -0
  3. package/__mf/font/inter-cyrillic-300-normal.9da91009.woff2 +0 -0
  4. package/__mf/font/inter-cyrillic-400-normal.372704ff.woff2 +0 -0
  5. package/__mf/font/inter-cyrillic-400-normal.a6b6ef6f.woff +0 -0
  6. package/__mf/font/inter-cyrillic-500-normal.7c15bba8.woff2 +0 -0
  7. package/__mf/font/inter-cyrillic-500-normal.b9f8c929.woff +0 -0
  8. package/__mf/font/inter-cyrillic-600-normal.2f42892a.woff2 +0 -0
  9. package/__mf/font/inter-cyrillic-600-normal.c3987adc.woff +0 -0
  10. package/__mf/font/inter-cyrillic-700-normal.93eba3c3.woff +0 -0
  11. package/__mf/font/inter-cyrillic-700-normal.e9e5b2dc.woff2 +0 -0
  12. package/__mf/font/inter-cyrillic-900-normal.f285bd7a.woff2 +0 -0
  13. package/__mf/font/inter-cyrillic-900-normal.ffbd8a3a.woff +0 -0
  14. package/__mf/font/inter-cyrillic-ext-300-normal.95bb9038.woff2 +0 -0
  15. package/__mf/font/inter-cyrillic-ext-300-normal.cfc143a9.woff +0 -0
  16. package/__mf/font/inter-cyrillic-ext-400-normal.2a31c04b.woff +0 -0
  17. package/__mf/font/inter-cyrillic-ext-400-normal.f572b170.woff2 +0 -0
  18. package/__mf/font/inter-cyrillic-ext-500-normal.5a6bb1da.woff +0 -0
  19. package/__mf/font/inter-cyrillic-ext-500-normal.fe0d9b14.woff2 +0 -0
  20. package/__mf/font/inter-cyrillic-ext-600-normal.ecbdecad.woff +0 -0
  21. package/__mf/font/inter-cyrillic-ext-600-normal.f7b3c15b.woff2 +0 -0
  22. package/__mf/font/inter-cyrillic-ext-700-normal.4b4022a6.woff +0 -0
  23. package/__mf/font/inter-cyrillic-ext-700-normal.74b516d2.woff2 +0 -0
  24. package/__mf/font/inter-cyrillic-ext-900-normal.9970ddb5.woff +0 -0
  25. package/__mf/font/inter-cyrillic-ext-900-normal.a0d59adc.woff2 +0 -0
  26. package/__mf/font/inter-greek-300-normal.0d7be683.woff2 +0 -0
  27. package/__mf/font/inter-greek-300-normal.8f0b988e.woff +0 -0
  28. package/__mf/font/inter-greek-400-normal.cc58c11b.woff +0 -0
  29. package/__mf/font/inter-greek-400-normal.d7020e3c.woff2 +0 -0
  30. package/__mf/font/inter-greek-500-normal.d9a33207.woff +0 -0
  31. package/__mf/font/inter-greek-500-normal.f41f43db.woff2 +0 -0
  32. package/__mf/font/inter-greek-600-normal.4ec0c1c1.woff +0 -0
  33. package/__mf/font/inter-greek-600-normal.cc532937.woff2 +0 -0
  34. package/__mf/font/inter-greek-700-normal.5ec6c758.woff +0 -0
  35. package/__mf/font/inter-greek-700-normal.97f0eeeb.woff2 +0 -0
  36. package/__mf/font/inter-greek-900-normal.46b66369.woff2 +0 -0
  37. package/__mf/font/inter-greek-900-normal.9ae3a3c5.woff +0 -0
  38. package/__mf/font/inter-greek-ext-300-normal.10247a66.woff2 +0 -0
  39. package/__mf/font/inter-greek-ext-300-normal.4668e5cb.woff +0 -0
  40. package/__mf/font/inter-greek-ext-400-normal.4ce1df5d.woff2 +0 -0
  41. package/__mf/font/inter-greek-ext-400-normal.88ede1ea.woff +0 -0
  42. package/__mf/font/inter-greek-ext-500-normal.7a4aa726.woff +0 -0
  43. package/__mf/font/inter-greek-ext-500-normal.cbd51e2d.woff2 +0 -0
  44. package/__mf/font/inter-greek-ext-600-normal.089a95ee.woff +0 -0
  45. package/__mf/font/inter-greek-ext-600-normal.1f33d317.woff2 +0 -0
  46. package/__mf/font/inter-greek-ext-700-normal.31f1075d.woff +0 -0
  47. package/__mf/font/inter-greek-ext-700-normal.827cd618.woff2 +0 -0
  48. package/__mf/font/inter-greek-ext-900-normal.531bcee7.woff +0 -0
  49. package/__mf/font/inter-greek-ext-900-normal.8a9b36b9.woff2 +0 -0
  50. package/__mf/font/inter-latin-300-normal.15fb600d.woff2 +0 -0
  51. package/__mf/font/inter-latin-300-normal.6f95f590.woff +0 -0
  52. package/__mf/font/inter-latin-400-normal.2c7a775c.woff +0 -0
  53. package/__mf/font/inter-latin-400-normal.ef6d3f52.woff2 +0 -0
  54. package/__mf/font/inter-latin-500-normal.b7b43ace.woff2 +0 -0
  55. package/__mf/font/inter-latin-500-normal.cb4c8ceb.woff +0 -0
  56. package/__mf/font/inter-latin-600-normal.8fb1a964.woff2 +0 -0
  57. package/__mf/font/inter-latin-600-normal.ce0f5f43.woff +0 -0
  58. package/__mf/font/inter-latin-700-normal.953b7aa5.woff2 +0 -0
  59. package/__mf/font/inter-latin-700-normal.9c21d4dc.woff +0 -0
  60. package/__mf/font/inter-latin-900-normal.2a8028ec.woff2 +0 -0
  61. package/__mf/font/inter-latin-900-normal.fa252135.woff +0 -0
  62. package/__mf/font/inter-latin-ext-300-normal.167cc8c9.woff2 +0 -0
  63. package/__mf/font/inter-latin-ext-300-normal.f695be66.woff +0 -0
  64. package/__mf/font/inter-latin-ext-400-normal.32a25442.woff2 +0 -0
  65. package/__mf/font/inter-latin-ext-400-normal.4edcaace.woff +0 -0
  66. package/__mf/font/inter-latin-ext-500-normal.a19a84a6.woff +0 -0
  67. package/__mf/font/inter-latin-ext-500-normal.d9b491de.woff2 +0 -0
  68. package/__mf/font/inter-latin-ext-600-normal.38b075d8.woff2 +0 -0
  69. package/__mf/font/inter-latin-ext-600-normal.49faa47a.woff +0 -0
  70. package/__mf/font/inter-latin-ext-700-normal.93534b50.woff +0 -0
  71. package/__mf/font/inter-latin-ext-700-normal.b63daa1a.woff2 +0 -0
  72. package/__mf/font/inter-latin-ext-900-normal.0efdb307.woff +0 -0
  73. package/__mf/font/inter-latin-ext-900-normal.9c0fc2c7.woff2 +0 -0
  74. package/__mf/font/inter-vietnamese-300-normal.aad496d8.woff +0 -0
  75. package/__mf/font/inter-vietnamese-300-normal.ad9ef503.woff2 +0 -0
  76. package/__mf/font/inter-vietnamese-400-normal.a9dd2faf.woff +0 -0
  77. package/__mf/font/inter-vietnamese-400-normal.de4fc44f.woff2 +0 -0
  78. package/__mf/font/inter-vietnamese-500-normal.7c0a695f.woff2 +0 -0
  79. package/__mf/font/inter-vietnamese-500-normal.a3a73b95.woff +0 -0
  80. package/__mf/font/inter-vietnamese-600-normal.9d518599.woff2 +0 -0
  81. package/__mf/font/inter-vietnamese-600-normal.c5ce3fcb.woff +0 -0
  82. package/__mf/font/inter-vietnamese-700-normal.bc68b199.woff +0 -0
  83. package/__mf/font/inter-vietnamese-700-normal.faf12809.woff2 +0 -0
  84. package/__mf/font/inter-vietnamese-900-normal.2b782045.woff +0 -0
  85. package/__mf/font/inter-vietnamese-900-normal.e639b65a.woff2 +0 -0
  86. package/__mf/js/Table.216368cb.js +7 -0
  87. package/__mf/js/async/1432.47ca9bc7.js +1 -0
  88. package/__mf/js/async/1616.29b0085e.js +1 -0
  89. package/__mf/js/async/2043.0b0ffaef.js +2 -0
  90. package/__mf/js/async/2082.c0b3db38.js +1 -0
  91. package/__mf/js/async/2842.cee1ed42.js +1 -0
  92. package/__mf/js/async/339.db885c93.js +1 -0
  93. package/__mf/js/async/3613.83b242dc.js +22 -0
  94. package/__mf/js/async/362.4a21f6da.js +7 -0
  95. package/__mf/js/async/{550.8bab52fc.js.LICENSE.txt → 362.4a21f6da.js.LICENSE.txt} +19 -1
  96. package/__mf/js/async/392.eef36bcd.js +2 -0
  97. package/__mf/js/async/4121.403fdade.js +2 -0
  98. package/__mf/js/async/4320.5cbfbd1c.js +1 -0
  99. package/__mf/js/async/5002.fd6ad994.js +1 -0
  100. package/__mf/js/async/5071.1684b9fd.js +1 -0
  101. package/__mf/js/async/5587.966d92d2.js +1 -0
  102. package/__mf/js/async/6274.71776a1d.js +2 -0
  103. package/__mf/js/async/6811.6a011de7.js +38 -0
  104. package/__mf/js/async/7177.f0c1cf85.js +1 -0
  105. package/__mf/js/async/7192.f9d57dbb.js +1 -0
  106. package/__mf/js/async/7413.a78d135c.js +1 -0
  107. package/__mf/js/async/7862.de8ef786.js +2 -0
  108. package/__mf/js/async/7968.545aab42.js +1 -0
  109. package/__mf/js/async/7978.61f7fc2d.js +1 -0
  110. package/__mf/js/async/8002.0a3e62a4.js +3 -0
  111. package/__mf/js/async/8356.7a060c2c.js +1 -0
  112. package/__mf/js/async/8470.dac32d6a.js +2 -0
  113. package/__mf/js/async/868.a08b9f5f.js +110 -0
  114. package/__mf/js/async/{868.9f710584.js.LICENSE.txt → 868.a08b9f5f.js.LICENSE.txt} +1 -1
  115. package/__mf/js/async/873.bb80627c.js +1 -0
  116. package/__mf/js/async/9051.2db4f8e5.js +1 -0
  117. package/__mf/js/async/9235.35b8884a.js +1 -0
  118. package/__mf/js/async/941.97799379.js +2 -0
  119. package/__mf/js/async/9546.f3c1cf02.js +2 -0
  120. package/__mf/js/async/{1117.b21b0ae4.js.LICENSE.txt → 9546.f3c1cf02.js.LICENSE.txt} +1 -1
  121. package/__mf/js/async/9588.178c0b3f.js +1 -0
  122. package/__mf/js/async/9701.4ae63d2f.js +1 -0
  123. package/__mf/js/async/__federation_expose_Table.a4d61f93.js +1 -0
  124. package/__mf/js/async/lib-router.5fad6e02.js +2 -0
  125. package/__mf/js/async/{lib-router.2e1dec85.js.LICENSE.txt → lib-router.5fad6e02.js.LICENSE.txt} +3 -3
  126. package/__mf/js/main.db87300f.js +7 -0
  127. package/lib/TableExportAction.d.ts +1 -1
  128. package/lib/TableExportAction.d.ts.map +1 -1
  129. package/lib/TableExportAction.js +1 -2
  130. package/lib/TableExportAction.js.map +1 -1
  131. package/lib/cjs/TableExportAction.js +1 -2
  132. package/lib/cjs/components/ColumnsEditor/ColumnEditor.js +60 -22
  133. package/lib/cjs/components/ColumnsEditor/EmbeddedPanelOptionsEditor.js +124 -0
  134. package/lib/cjs/components/TablePanel.js +243 -21
  135. package/lib/cjs/models/table-model.js +32 -6
  136. package/lib/components/ColumnsEditor/ColumnEditor.d.ts.map +1 -1
  137. package/lib/components/ColumnsEditor/ColumnEditor.js +61 -23
  138. package/lib/components/ColumnsEditor/ColumnEditor.js.map +1 -1
  139. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.d.ts +13 -0
  140. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.d.ts.map +1 -0
  141. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.js +114 -0
  142. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.js.map +1 -0
  143. package/lib/components/EmbeddedPanel.d.ts +1 -1
  144. package/lib/components/EmbeddedPanel.d.ts.map +1 -1
  145. package/lib/components/EmbeddedPanel.js.map +1 -1
  146. package/lib/components/TablePanel.d.ts +1 -1
  147. package/lib/components/TablePanel.d.ts.map +1 -1
  148. package/lib/components/TablePanel.js +243 -21
  149. package/lib/components/TablePanel.js.map +1 -1
  150. package/lib/components/TableTransformsEditor.d.ts.map +1 -1
  151. package/lib/components/TableTransformsEditor.js.map +1 -1
  152. package/lib/models/table-model.d.ts +2 -2
  153. package/lib/models/table-model.d.ts.map +1 -1
  154. package/lib/models/table-model.js +32 -6
  155. package/lib/models/table-model.js.map +1 -1
  156. package/lib/table-data-utils.d.ts +1 -1
  157. package/lib/table-data-utils.d.ts.map +1 -1
  158. package/lib/table-data-utils.js.map +1 -1
  159. package/lib/test/mock-query-results.d.ts +1 -1
  160. package/lib/test/mock-query-results.js.map +1 -1
  161. package/mf-manifest.json +91 -75
  162. package/mf-stats.json +106 -78
  163. package/package.json +6 -5
  164. package/__mf/css/async/3061.d3010b86.css +0 -1
  165. package/__mf/css/async/5442.d3010b86.css +0 -1
  166. package/__mf/css/async/7823.d3010b86.css +0 -1
  167. package/__mf/font/lato-all-300-normal.322bdf14.woff +0 -0
  168. package/__mf/font/lato-all-400-normal.63513b00.woff +0 -0
  169. package/__mf/font/lato-all-700-normal.bb27db94.woff +0 -0
  170. package/__mf/font/lato-all-900-normal.a27049a3.woff +0 -0
  171. package/__mf/font/lato-latin-300-normal.c5195215.woff2 +0 -0
  172. package/__mf/font/lato-latin-400-normal.b7ffde23.woff2 +0 -0
  173. package/__mf/font/lato-latin-700-normal.d5eb20bc.woff2 +0 -0
  174. package/__mf/font/lato-latin-900-normal.d884a71c.woff2 +0 -0
  175. package/__mf/font/lato-latin-ext-300-normal.abcc64a9.woff2 +0 -0
  176. package/__mf/font/lato-latin-ext-400-normal.6ebed106.woff2 +0 -0
  177. package/__mf/font/lato-latin-ext-700-normal.8697d1d5.woff2 +0 -0
  178. package/__mf/font/lato-latin-ext-900-normal.20a2b415.woff2 +0 -0
  179. package/__mf/js/Table.e34e0ae1.js +0 -6
  180. package/__mf/js/async/1103.ffbc2bec.js +0 -1
  181. package/__mf/js/async/1117.b21b0ae4.js +0 -2
  182. package/__mf/js/async/1432.acd0ad59.js +0 -1
  183. package/__mf/js/async/1616.7a74f4ef.js +0 -1
  184. package/__mf/js/async/2043.fdebf89c.js +0 -2
  185. package/__mf/js/async/208.2b17c08c.js +0 -3
  186. package/__mf/js/async/2082.78532c3c.js +0 -1
  187. package/__mf/js/async/272.3bc7825c.js +0 -1
  188. package/__mf/js/async/392.49e51fc5.js +0 -2
  189. package/__mf/js/async/4121.8e97ef88.js +0 -2
  190. package/__mf/js/async/5002.3189d214.js +0 -1
  191. package/__mf/js/async/5019.5318688a.js +0 -1
  192. package/__mf/js/async/5071.91e1c002.js +0 -1
  193. package/__mf/js/async/54.8b007a26.js +0 -22
  194. package/__mf/js/async/550.8bab52fc.js +0 -7
  195. package/__mf/js/async/5587.f5f2b0cc.js +0 -1
  196. package/__mf/js/async/6274.14683c28.js +0 -2
  197. package/__mf/js/async/6283.e044c368.js +0 -2
  198. package/__mf/js/async/6753.032ce611.js +0 -1
  199. package/__mf/js/async/6811.4e18bc66.js +0 -38
  200. package/__mf/js/async/7177.356298ae.js +0 -1
  201. package/__mf/js/async/7192.66c9e3a5.js +0 -1
  202. package/__mf/js/async/7968.a66bfadb.js +0 -1
  203. package/__mf/js/async/7978.a19f5a4f.js +0 -1
  204. package/__mf/js/async/8356.8ae40b6a.js +0 -1
  205. package/__mf/js/async/8470.1b8b20ff.js +0 -2
  206. package/__mf/js/async/868.9f710584.js +0 -110
  207. package/__mf/js/async/873.a7310675.js +0 -1
  208. package/__mf/js/async/9051.e3054e02.js +0 -1
  209. package/__mf/js/async/9235.eee50e10.js +0 -1
  210. package/__mf/js/async/941.333875f4.js +0 -2
  211. package/__mf/js/async/9588.7b021071.js +0 -1
  212. package/__mf/js/async/9701.3b068d23.js +0 -1
  213. package/__mf/js/async/__federation_expose_Table.894a962f.js +0 -1
  214. package/__mf/js/async/lib-router.2e1dec85.js +0 -2
  215. package/__mf/js/main.5b8b137b.js +0 -6
  216. /package/__mf/js/async/{2043.fdebf89c.js.LICENSE.txt → 2043.0b0ffaef.js.LICENSE.txt} +0 -0
  217. /package/__mf/js/async/{54.8b007a26.js.LICENSE.txt → 3613.83b242dc.js.LICENSE.txt} +0 -0
  218. /package/__mf/js/async/{392.49e51fc5.js.LICENSE.txt → 392.eef36bcd.js.LICENSE.txt} +0 -0
  219. /package/__mf/js/async/{4121.8e97ef88.js.LICENSE.txt → 4121.403fdade.js.LICENSE.txt} +0 -0
  220. /package/__mf/js/async/{6274.14683c28.js.LICENSE.txt → 6274.71776a1d.js.LICENSE.txt} +0 -0
  221. /package/__mf/js/async/{6283.e044c368.js.LICENSE.txt → 7862.de8ef786.js.LICENSE.txt} +0 -0
  222. /package/__mf/js/async/{8470.1b8b20ff.js.LICENSE.txt → 8470.dac32d6a.js.LICENSE.txt} +0 -0
  223. /package/__mf/js/async/{941.333875f4.js.LICENSE.txt → 941.97799379.js.LICENSE.txt} +0 -0
@@ -12,20 +12,164 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
  import { Box, Typography, useTheme } from '@mui/material';
15
- import { Table, useSelection } from '@perses-dev/components';
16
- import { formatValue, transformData } from '@perses-dev/core';
15
+ import { formatValue, Table, transformData, useSelection } from '@perses-dev/components';
17
16
  import { useSelectionItemActions } from '@perses-dev/dashboards';
18
- import { replaceVariablesInString, useAllVariableValues } from '@perses-dev/plugin-system';
17
+ import { CalculationsMap, replaceVariablesInString, useAllVariableValues } from '@perses-dev/plugin-system';
19
18
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
20
19
  import { evaluateConditionalFormatting } from '../models';
21
20
  import { buildRawTableData, getTablePanelQueryMode } from '../table-data-utils';
22
21
  import { EmbeddedPanel } from './EmbeddedPanel';
23
- function generateCellContentConfig(column) {
22
+ function parseNumericCellValue(value) {
23
+ if (typeof value === 'number' && Number.isFinite(value)) {
24
+ return value;
25
+ }
26
+ if (typeof value === 'string') {
27
+ const parsed = Number(value);
28
+ if (Number.isFinite(parsed)) {
29
+ return parsed;
30
+ }
31
+ }
32
+ return undefined;
33
+ }
34
+ function isPanelData(value) {
35
+ if (typeof value !== 'object' || value === null) {
36
+ return false;
37
+ }
38
+ const candidate = value;
39
+ return candidate.definition !== undefined && candidate.data !== undefined;
40
+ }
41
+ function createSyntheticPanelData(value, columnName) {
42
+ const numericValue = parseNumericCellValue(value);
43
+ if (numericValue === undefined) {
44
+ return undefined;
45
+ }
46
+ const now = Date.now();
47
+ return {
48
+ definition: {
49
+ kind: 'TimeSeriesQuery',
50
+ spec: {
51
+ plugin: {
52
+ kind: 'PrometheusTimeSeriesQuery',
53
+ spec: {
54
+ query: ''
55
+ }
56
+ }
57
+ }
58
+ },
59
+ data: {
60
+ timeRange: {
61
+ start: new Date(now),
62
+ end: new Date(now)
63
+ },
64
+ stepMs: 1,
65
+ series: [
66
+ {
67
+ name: columnName,
68
+ values: [
69
+ [
70
+ now,
71
+ numericValue
72
+ ]
73
+ ],
74
+ labels: {}
75
+ }
76
+ ]
77
+ }
78
+ };
79
+ }
80
+ function getGaugeNumericValue(value) {
81
+ if (isPanelData(value)) {
82
+ const series = value.data?.series;
83
+ const firstSeries = series?.[0];
84
+ if (!firstSeries?.values?.length) {
85
+ return undefined;
86
+ }
87
+ const calc = CalculationsMap['last-number'];
88
+ if (typeof calc !== 'function') {
89
+ return undefined;
90
+ }
91
+ const calculatedValue = calc(firstSeries.values);
92
+ return typeof calculatedValue === 'number' ? calculatedValue : undefined;
93
+ }
94
+ return parseNumericCellValue(value);
95
+ }
96
+ function InlineGaugeCellWithRange({ value, range, fillColor, format }) {
97
+ if (value === undefined) {
98
+ return /*#__PURE__*/ _jsx(_Fragment, {});
99
+ }
100
+ let percent = 0;
101
+ if (range !== undefined) {
102
+ if (range.max === range.min) {
103
+ percent = 100;
104
+ } else {
105
+ percent = (value - range.min) / (range.max - range.min) * 100;
106
+ }
107
+ }
108
+ percent = Math.max(0, Math.min(100, percent));
109
+ const trackColor = 'rgba(127,127,127,0.20)';
110
+ return /*#__PURE__*/ _jsxs(Box, {
111
+ sx: {
112
+ display: 'flex',
113
+ alignItems: 'center',
114
+ width: '100%',
115
+ gap: 1
116
+ },
117
+ children: [
118
+ /*#__PURE__*/ _jsx(Box, {
119
+ sx: {
120
+ flexGrow: 1,
121
+ borderRadius: 1,
122
+ backgroundColor: trackColor,
123
+ height: 24,
124
+ overflow: 'hidden'
125
+ },
126
+ children: /*#__PURE__*/ _jsx(Box, {
127
+ sx: {
128
+ width: `${percent}%`,
129
+ height: '100%',
130
+ backgroundColor: fillColor ?? 'success.main',
131
+ borderRadius: 1
132
+ }
133
+ })
134
+ }),
135
+ /*#__PURE__*/ _jsx(Typography, {
136
+ variant: "body2",
137
+ sx: {
138
+ minWidth: 52,
139
+ textAlign: 'right'
140
+ },
141
+ children: format ? formatValue(value, format) : value.toFixed(2)
142
+ })
143
+ ]
144
+ });
145
+ }
146
+ function resolveGaugeFillColor(value, globalCellSettings, columnCellSettings) {
147
+ let cellConfig = evaluateConditionalFormatting(value, globalCellSettings);
148
+ if (columnCellSettings?.length) {
149
+ const columnCellConfig = evaluateConditionalFormatting(value, columnCellSettings);
150
+ if (columnCellConfig) {
151
+ cellConfig = columnCellConfig;
152
+ }
153
+ }
154
+ return cellConfig?.backgroundColor ?? cellConfig?.textColor;
155
+ }
156
+ function generateCellContentConfig(column, gaugeRange, globalCellSettings = []) {
24
157
  const plugin = column.plugin;
25
158
  if (plugin !== undefined) {
26
159
  return {
27
160
  cell: (ctx)=>{
28
- const panelData = ctx.getValue();
161
+ const cellValue = ctx.getValue();
162
+ if (plugin.kind === 'GaugeChart') {
163
+ const gaugeValue = getGaugeNumericValue(cellValue);
164
+ const gaugeFillColor = resolveGaugeFillColor(gaugeValue, globalCellSettings, column.cellSettings);
165
+ return /*#__PURE__*/ _jsx(InlineGaugeCellWithRange, {
166
+ value: gaugeValue,
167
+ range: gaugeRange,
168
+ fillColor: gaugeFillColor,
169
+ format: plugin.spec?.format ?? column.format
170
+ });
171
+ }
172
+ const panelData = isPanelData(cellValue) ? cellValue : createSyntheticPanelData(cellValue, column.name);
29
173
  if (!panelData) return /*#__PURE__*/ _jsx(_Fragment, {});
30
174
  return /*#__PURE__*/ _jsx(EmbeddedPanel, {
31
175
  kind: plugin.kind,
@@ -47,9 +191,11 @@ function generateCellContentConfig(column) {
47
191
  };
48
192
  }
49
193
  function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme }) {
194
+ const [searchTerm, setSearchTerm] = useState('');
50
195
  const values = [
51
196
  ...new Set(allValues)
52
197
  ].filter((v)=>v !== null).sort();
198
+ const filteredValues = searchTerm ? values.filter((v)=>String(v).toLowerCase().includes(searchTerm.toLowerCase())) : values;
53
199
  if (values.length === 0) {
54
200
  return /*#__PURE__*/ _jsx("div", {
55
201
  "data-filter-dropdown": true,
@@ -83,6 +229,23 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
83
229
  overflowY: 'auto'
84
230
  },
85
231
  children: [
232
+ /*#__PURE__*/ _jsx("input", {
233
+ type: "text",
234
+ placeholder: "Search...",
235
+ value: searchTerm,
236
+ onChange: (e)=>setSearchTerm(e.target.value),
237
+ style: {
238
+ width: '100%',
239
+ padding: '6px 8px',
240
+ marginBottom: 8,
241
+ fontSize: 13,
242
+ border: `1px solid ${theme.palette.divider}`,
243
+ borderRadius: 4,
244
+ backgroundColor: theme.palette.background.default,
245
+ color: theme.palette.text.primary,
246
+ boxSizing: 'border-box'
247
+ }
248
+ }),
86
249
  /*#__PURE__*/ _jsx("div", {
87
250
  style: {
88
251
  marginBottom: 8,
@@ -99,7 +262,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
99
262
  /*#__PURE__*/ _jsx("input", {
100
263
  type: "checkbox",
101
264
  checked: selectedValues.length === values.length && values.length > 0,
102
- onChange: (e)=>onFilterChange(e.target.checked ? values : []),
265
+ onChange: (e)=>onFilterChange(e.target.checked ? values.map((v)=>v.original) : []),
103
266
  style: {
104
267
  marginRight: 8
105
268
  }
@@ -124,7 +287,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
124
287
  borderTop: `1px solid ${theme.palette.divider}`
125
288
  }
126
289
  }),
127
- values.map((value, index)=>/*#__PURE__*/ _jsx("div", {
290
+ filteredValues.map((value, index)=>/*#__PURE__*/ _jsx("div", {
128
291
  style: {
129
292
  marginBottom: 4
130
293
  },
@@ -145,15 +308,15 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
145
308
  children: [
146
309
  /*#__PURE__*/ _jsx("input", {
147
310
  type: "checkbox",
148
- checked: selectedValues.includes(value),
311
+ checked: selectedValues.includes(value.original),
149
312
  onChange: (e)=>{
150
313
  if (e.target.checked) {
151
314
  onFilterChange([
152
315
  ...selectedValues,
153
- value
316
+ value.original
154
317
  ]);
155
318
  } else {
156
- onFilterChange(selectedValues.filter((v)=>v !== value));
319
+ onFilterChange(selectedValues.filter((v)=>v !== value.original));
157
320
  }
158
321
  },
159
322
  style: {
@@ -165,7 +328,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
165
328
  fontSize: 14,
166
329
  color: theme.palette.text.primary
167
330
  },
168
- children: value === null || value === undefined || value === '' ? '(empty)' : String(value)
331
+ children: value === null || value === undefined || value.formatted === '' ? '(empty)' : String(value.formatted)
169
332
  })
170
333
  ]
171
334
  })
@@ -177,7 +340,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
177
340
  * Generate column config from column definitions, if a column has multiple definitions, the first one will be used.
178
341
  * If column is hidden, return undefined.
179
342
  * If column do not have a definition, return a default column config.
180
- */ function generateColumnConfig(name, columnSettings, allVariables) {
343
+ */ function generateColumnConfig(name, columnSettings, allVariables, gaugeRangeByColumn, globalCellSettings = []) {
181
344
  for (const column of columnSettings){
182
345
  if (column.name === name) {
183
346
  if (column.hide) {
@@ -196,7 +359,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
196
359
  width,
197
360
  align,
198
361
  dataLink: modifiedDataLink,
199
- ...generateCellContentConfig(column)
362
+ ...generateCellContentConfig(column, gaugeRangeByColumn[name], globalCellSettings)
200
363
  };
201
364
  }
202
365
  }
@@ -281,14 +444,71 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
281
444
  }, [
282
445
  data
283
446
  ]);
284
- // fetch unique values for each column of filtering
447
+ const columnsFormat = useMemo(()=>{
448
+ const columnsFormat = {};
449
+ const settings = spec?.columnSettings;
450
+ if (settings) {
451
+ for(let i = 0; i < settings.length; i++){
452
+ const { name, format } = settings[i] || {};
453
+ if (name && format) {
454
+ columnsFormat[name] = format;
455
+ }
456
+ }
457
+ }
458
+ return columnsFormat;
459
+ }, [
460
+ spec
461
+ ]);
285
462
  const columnUniqueValues = useMemo(()=>{
286
463
  const uniqueValues = {};
287
- keys.forEach((key)=>{
288
- const values = data.map((row)=>row[key]).filter((val)=>val !== null && val !== undefined && val !== '');
289
- uniqueValues[key] = Array.from(new Set(values));
290
- });
464
+ for (const key of keys){
465
+ const formatOption = columnsFormat?.[key];
466
+ uniqueValues[key] = [];
467
+ const usedValues = new Map();
468
+ for (const row of data){
469
+ const val = row[key];
470
+ if (val === '' || val === null || val === undefined) {
471
+ continue;
472
+ }
473
+ if (usedValues.get(String(val))) {
474
+ continue;
475
+ }
476
+ if (typeof val === 'string' || typeof val === 'number') {
477
+ uniqueValues[key].push({
478
+ original: val,
479
+ formatted: formatOption && typeof val === 'number' ? formatValue(val, formatOption) : val
480
+ });
481
+ usedValues.set(String(val), true);
482
+ }
483
+ }
484
+ }
291
485
  return uniqueValues;
486
+ }, [
487
+ data,
488
+ keys,
489
+ columnsFormat
490
+ ]);
491
+ const gaugeRangeByColumn = useMemo(()=>{
492
+ const result = {};
493
+ for (const key of keys){
494
+ let min = Number.POSITIVE_INFINITY;
495
+ let max = Number.NEGATIVE_INFINITY;
496
+ for (const row of data){
497
+ const numericValue = getGaugeNumericValue(row[key]);
498
+ if (numericValue === undefined) {
499
+ continue;
500
+ }
501
+ min = Math.min(min, numericValue);
502
+ max = Math.max(max, numericValue);
503
+ }
504
+ if (min !== Number.POSITIVE_INFINITY && max !== Number.NEGATIVE_INFINITY) {
505
+ result[key] = {
506
+ min,
507
+ max
508
+ };
509
+ }
510
+ }
511
+ return result;
292
512
  }, [
293
513
  data,
294
514
  keys
@@ -300,7 +520,7 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
300
520
  // Process columnSettings if they exist
301
521
  for (const columnSetting of spec.columnSettings ?? []){
302
522
  if (customizedColumns.has(columnSetting.name)) continue; // Skip duplicates
303
- const columnConfig = generateColumnConfig(columnSetting.name, spec.columnSettings ?? [], allVariables);
523
+ const columnConfig = generateColumnConfig(columnSetting.name, spec.columnSettings ?? [], allVariables, gaugeRangeByColumn, spec.cellSettings ?? []);
304
524
  if (columnConfig !== undefined) {
305
525
  columns.push(columnConfig);
306
526
  customizedColumns.add(columnSetting.name);
@@ -310,7 +530,7 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
310
530
  if (!spec.defaultColumnHidden) {
311
531
  for (const key of keys){
312
532
  if (!customizedColumns.has(key)) {
313
- const columnConfig = generateColumnConfig(key, spec.columnSettings ?? [], allVariables);
533
+ const columnConfig = generateColumnConfig(key, spec.columnSettings ?? [], allVariables, gaugeRangeByColumn, spec.cellSettings ?? []);
314
534
  if (columnConfig !== undefined) {
315
535
  columns.push(columnConfig);
316
536
  }
@@ -322,7 +542,9 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
322
542
  keys,
323
543
  spec.columnSettings,
324
544
  spec.defaultColumnHidden,
325
- allVariables
545
+ allVariables,
546
+ gaugeRangeByColumn,
547
+ spec.cellSettings
326
548
  ]);
327
549
  // Generate cell settings that will be used by the table to render cells (text color, background color, ...)
328
550
  const cellConfigs = useMemo(()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TablePanel.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Box, Theme, Typography, useTheme } from '@mui/material';\nimport { Table, TableCellConfigs, TableColumnConfig, useSelection } from '@perses-dev/components';\nimport { formatValue, QueryDataType, TimeSeriesData, transformData } from '@perses-dev/core';\nimport { useSelectionItemActions } from '@perses-dev/dashboards';\nimport {\n ActionOptions,\n PanelData,\n PanelProps,\n replaceVariablesInString,\n useAllVariableValues,\n VariableStateMap,\n} from '@perses-dev/plugin-system';\nimport { ColumnFiltersState, PaginationState, RowSelectionState, SortingState } from '@tanstack/react-table';\nimport { ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ColumnSettings, evaluateConditionalFormatting, TableOptions } from '../models';\nimport { buildRawTableData, getTablePanelQueryMode } from '../table-data-utils';\nimport { EmbeddedPanel } from './EmbeddedPanel';\n\nfunction generateCellContentConfig(\n column: ColumnSettings\n): Pick<TableColumnConfig<unknown>, 'cellDescription' | 'cell'> {\n const plugin = column.plugin;\n if (plugin !== undefined) {\n return {\n cell: (ctx): ReactElement => {\n const panelData: PanelData<QueryDataType> | undefined = ctx.getValue();\n if (!panelData) return <></>;\n return <EmbeddedPanel kind={plugin.kind} spec={plugin.spec} queryResults={[panelData]} />;\n },\n cellDescription: column.cellDescription ? (): string => `${column.cellDescription}` : (): string => '', // disable hover text\n };\n }\n\n return {\n cell: (ctx): ReactElement | string => {\n const cellValue = ctx.getValue();\n return typeof cellValue === 'number' && column.format ? formatValue(cellValue, column.format) : cellValue;\n },\n cellDescription: column.cellDescription ? (): string => `${column.cellDescription}` : undefined, // TODO: variable rendering + cell value\n };\n}\n\ninterface ColumnFilterDropdownProps {\n allValues: Array<string | number>;\n selectedValues: Array<string | number>;\n onFilterChange: (values: Array<string | number>) => void;\n theme: Theme;\n}\n\nfunction ColumnFilterDropdown({\n allValues,\n selectedValues,\n onFilterChange,\n theme,\n}: ColumnFilterDropdownProps): ReactElement {\n const values = [...new Set(allValues)].filter((v) => v !== null).sort();\n if (values.length === 0) {\n return (\n <div\n data-filter-dropdown\n style={{\n width: 200,\n padding: 10,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n boxShadow: theme.shadows[4],\n }}\n >\n <div style={{ color: theme.palette.text.secondary, fontSize: 14 }}>No values found</div>\n </div>\n );\n }\n\n return (\n <div\n data-filter-dropdown\n style={{\n width: 200,\n padding: 10,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n boxShadow: theme.shadows[4],\n maxHeight: 250,\n overflowY: 'auto',\n }}\n >\n <div style={{ marginBottom: 8, fontSize: 14, fontWeight: 'bold' }}>\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={selectedValues.length === values.length && values.length > 0}\n onChange={(e) => onFilterChange(e.target.checked ? values : [])}\n style={{ marginRight: 8 }}\n />\n <span style={{ color: theme.palette.text.primary }}>Select All ({values.length})</span>\n </label>\n </div>\n <hr\n style={{\n margin: '8px 0',\n border: 'none',\n borderTop: `1px solid ${theme.palette.divider}`,\n }}\n />\n {values.map((value, index) => (\n <div key={`value-${index}`} style={{ marginBottom: 4 }}>\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n padding: '2px 0',\n borderRadius: 2,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.palette.action.hover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <input\n type=\"checkbox\"\n checked={selectedValues.includes(value)}\n onChange={(e) => {\n if (e.target.checked) {\n onFilterChange([...selectedValues, value]);\n } else {\n onFilterChange(selectedValues.filter((v) => v !== value));\n }\n }}\n style={{ marginRight: 8 }}\n />\n <span\n style={{\n fontSize: 14,\n color: theme.palette.text.primary,\n }}\n >\n {value === null || value === undefined || value === '' ? '(empty)' : String(value)}\n </span>\n </label>\n </div>\n ))}\n </div>\n );\n}\n\n/*\n * Generate column config from column definitions, if a column has multiple definitions, the first one will be used.\n * If column is hidden, return undefined.\n * If column do not have a definition, return a default column config.\n */\nfunction generateColumnConfig(\n name: string,\n columnSettings: ColumnSettings[],\n allVariables: VariableStateMap\n): TableColumnConfig<unknown> | undefined {\n for (const column of columnSettings) {\n if (column.name === name) {\n if (column.hide) {\n return undefined;\n }\n\n const { name, header, headerDescription, enableSorting, width, align, dataLink } = column;\n const modifiedDataLink = dataLink\n ? { ...dataLink, url: replaceVariablesInString(dataLink.url, allVariables) }\n : undefined;\n\n return {\n accessorKey: name,\n header: header ?? name,\n headerDescription,\n enableSorting,\n width,\n align,\n dataLink: modifiedDataLink,\n ...generateCellContentConfig(column),\n };\n }\n }\n\n return {\n accessorKey: name,\n header: name,\n };\n}\n\nexport function getTablePanelQueryOptions(spec: TableOptions): { mode: 'instant' | 'range' } {\n // if any cell renders a panel plugin, perform a range query instead of an instant query\n return {\n mode: getTablePanelQueryMode(spec),\n };\n}\n\nexport type TableProps = PanelProps<TableOptions, TimeSeriesData>;\n\nexport function TablePanel({ contentDimensions, spec, queryResults }: TableProps): ReactElement | null {\n const theme = useTheme();\n const allVariables = useAllVariableValues();\n\n const selectionEnabled = spec.selection?.enabled ?? false;\n const { selectionMap, setSelection, clearSelection } = useSelection<Record<string, unknown>, string>();\n\n const itemActionsConfig = spec.actions ? (spec.actions as ActionOptions) : undefined;\n const itemActionsListConfig =\n itemActionsConfig?.enabled && itemActionsConfig.displayWithItem ? itemActionsConfig.actionsList : [];\n\n const { getItemActionButtons, confirmDialog, actionButtons } = useSelectionItemActions({\n actions: itemActionsListConfig,\n variableState: allVariables,\n });\n\n const filteredDataRef = useRef<Array<Record<string, unknown>>>([]);\n\n // Convert selectionMap to TanStack's RowSelectionState format\n const rowSelection = useMemo((): RowSelectionState => {\n const result: RowSelectionState = {};\n selectionMap.forEach((_, id) => {\n result[id] = true;\n });\n return result;\n }, [selectionMap]);\n\n const handleRowSelectionChange = useCallback(\n (newRowSelection: RowSelectionState) => {\n const newSelection: Array<{ id: string; item: Record<string, unknown> }> = [];\n for (const [id, isSelected] of Object.entries(newRowSelection)) {\n if (isSelected) {\n const index = parseInt(id, 10);\n if (filteredDataRef.current[index] !== undefined) {\n newSelection.push({ id, item: filteredDataRef.current[index] });\n }\n }\n }\n\n if (newSelection.length === 0) {\n clearSelection();\n } else {\n setSelection(newSelection);\n }\n },\n [setSelection, clearSelection]\n );\n\n // TODO: handle other query types\n const rawData: Array<Record<string, unknown>> = useMemo(() => {\n // Transform query results to a tabular format using shared utility\n return buildRawTableData(queryResults, spec);\n }, [queryResults, spec]);\n\n // Transform will be applied by their orders on the original data\n const data = useMemo(() => transformData(rawData, spec.transforms ?? []), [rawData, spec.transforms]);\n\n const keys: string[] = useMemo(() => {\n const result: string[] = [];\n\n for (const entry of data) {\n for (const key of Object.keys(entry)) {\n if (!result.includes(key)) {\n result.push(key);\n }\n }\n }\n\n return result;\n }, [data]);\n\n // fetch unique values for each column of filtering\n const columnUniqueValues = useMemo(() => {\n const uniqueValues: Record<string, Array<string | number>> = {};\n\n keys.forEach((key) => {\n const values = data.map((row) => row[key]).filter((val) => val !== null && val !== undefined && val !== '');\n uniqueValues[key] = Array.from(new Set(values as Array<string | number>));\n });\n\n return uniqueValues;\n }, [data, keys]);\n\n // Generate columns and map each column accessor to its settings index and data key\n const columns: Array<TableColumnConfig<unknown>> = useMemo(() => {\n const columns: Array<TableColumnConfig<unknown>> = [];\n const customizedColumns = new Set<string>();\n\n // Process columnSettings if they exist\n for (const columnSetting of spec.columnSettings ?? []) {\n if (customizedColumns.has(columnSetting.name)) continue; // Skip duplicates\n\n const columnConfig = generateColumnConfig(columnSetting.name, spec.columnSettings ?? [], allVariables);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n customizedColumns.add(columnSetting.name);\n }\n }\n\n // Add remaining columns if defaultColumnHidden is false\n if (!spec.defaultColumnHidden) {\n for (const key of keys) {\n if (!customizedColumns.has(key)) {\n const columnConfig = generateColumnConfig(key, spec.columnSettings ?? [], allVariables);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n }\n }\n\n return columns;\n }, [keys, spec.columnSettings, spec.defaultColumnHidden, allVariables]);\n\n // Generate cell settings that will be used by the table to render cells (text color, background color, ...)\n const cellConfigs: TableCellConfigs = useMemo(() => {\n // If there are no cell settings globally or per column, return an empty object\n if (spec.cellSettings === undefined && !spec.columnSettings?.some((col) => col.cellSettings !== undefined)) {\n return {};\n }\n\n const result: TableCellConfigs = {};\n\n let index = 0;\n for (const row of data) {\n // Transforming key to object to extend the row with undefined values if the key is not present\n // for checking the cell config \"Misc\" condition with \"null\"\n const keysAsObj = keys.reduce(\n (acc, key) => {\n acc[key] = undefined;\n return acc;\n },\n {} as Record<string, undefined>\n );\n\n const extendRow = {\n ...keysAsObj,\n ...row,\n };\n\n // Generate cellConfigs for each column (including duplicates with different headers)\n for (const [key, value] of Object.entries(extendRow)) {\n // First, try to get cell config from global cell settings\n let cellConfig = evaluateConditionalFormatting(value, spec.cellSettings ?? []);\n\n // Then, try to get cell config from column-specific cell settings\n const columnSetting = spec.columnSettings?.find((col) => col.name === key);\n if (columnSetting?.cellSettings?.length) {\n const columnCellConfig = evaluateConditionalFormatting(value, columnSetting.cellSettings);\n // Column-specific settings take precedence over global settings\n if (columnCellConfig) {\n cellConfig = columnCellConfig;\n }\n }\n\n if (cellConfig) {\n result[`${index}_${key}`] = cellConfig;\n }\n }\n index++;\n }\n\n return result;\n }, [data, keys, spec.cellSettings, spec.columnSettings]);\n\n function generateDefaultSortingState(): SortingState {\n return (\n spec.columnSettings\n ?.filter((column) => column.sort !== undefined)\n .map((column) => {\n return {\n id: column.name,\n desc: column.sort === 'desc',\n };\n }) ?? []\n );\n }\n\n const [sorting, setSorting] = useState<SortingState>(generateDefaultSortingState());\n\n // Filtering state\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [filterAnchorEl, setFilterAnchorEl] = useState<{ [key: string]: HTMLElement | null }>({});\n const [openFilterColumn, setOpenFilterColumn] = useState<string | null>(null);\n\n // get selected values for a column\n const getSelectedFilterValues = (columnId: string): Array<string | number> => {\n const filter = columnFilters.find((f) => f.id === columnId);\n return filter ? (filter.value as Array<string | number>) : [];\n };\n\n // update column filter\n const updateColumnFilter = (columnId: string, values: Array<string | number>): void => {\n const newFilters = columnFilters.filter((f) => f.id !== columnId);\n if (values.length > 0) {\n newFilters.push({ id: columnId, value: values });\n }\n setColumnFilters(newFilters);\n };\n\n // Handle filter clicks\n const handleFilterClick = (event: React.MouseEvent<HTMLButtonElement>, columnId: string): void => {\n event.preventDefault();\n event.stopPropagation();\n setFilterAnchorEl({ ...filterAnchorEl, [columnId]: event.currentTarget });\n setOpenFilterColumn(columnId);\n };\n\n const handleFilterClose = (): void => {\n setFilterAnchorEl({});\n setOpenFilterColumn(null);\n };\n\n // Close filter when clicking outside\n useEffect(() => {\n if (!openFilterColumn) return;\n\n const handleClick = (e: MouseEvent): void => {\n const target = e.target as Element;\n if (!target.closest('[data-filter-dropdown]') && !target.closest('button')) {\n handleFilterClose();\n }\n };\n\n const timer = setTimeout(() => {\n document.addEventListener('click', handleClick);\n }, 100);\n\n return (): void => {\n clearTimeout(timer);\n document.removeEventListener('click', handleClick);\n };\n }, [openFilterColumn]);\n\n // filter data based on the current filters\n const filteredData = useMemo(() => {\n let filtered = [...data];\n\n // apply column filters if enabled\n if (spec.enableFiltering && columnFilters.length > 0) {\n filtered = filtered.filter((row) => {\n return columnFilters.every((filter) => {\n const value = row[filter.id];\n const filterValues = filter.value as Array<string | number>;\n\n if (!filterValues || filterValues.length === 0) return true; // No filter values means no filtering\n\n // Check if the row value is in the selected filter values\n return filterValues.includes(value as string | number);\n });\n });\n }\n\n return filtered;\n }, [data, columnFilters, spec.enableFiltering]);\n\n // Keep ref in sync with filtered data for use in selection handler\n filteredDataRef.current = filteredData;\n\n const [pagination, setPagination] = useState<PaginationState | undefined>(\n spec.pagination ? { pageIndex: 0, pageSize: 10 } : undefined\n );\n\n useEffect(() => {\n // If the pagination setting changes from no pagination to pagination, but the pagination state is undefined, update the pagination state\n if (spec.pagination && !pagination) {\n setPagination({ pageIndex: 0, pageSize: 10 });\n } else if (!spec.pagination && pagination) {\n setPagination(undefined);\n }\n }, [spec.pagination, pagination]);\n\n if (contentDimensions === undefined) {\n return null;\n }\n\n if (!data?.length) {\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n }}\n >\n <Typography>No data</Typography>\n </Box>\n );\n }\n\n return (\n <>\n {confirmDialog}\n {spec.enableFiltering && (\n <div\n style={{\n display: 'flex',\n background: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n width: contentDimensions.width,\n boxSizing: 'border-box',\n }}\n >\n {columns.map((column, idx) => {\n const filters = getSelectedFilterValues(column.accessorKey as string);\n const columnWidth = column.width || spec.defaultColumnWidth;\n return (\n <div\n key={`filter-${idx}`}\n style={{\n padding: '8px',\n borderRight: idx < columns.length - 1 ? `1px solid ${theme.palette.divider}` : 'none',\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n flex: typeof columnWidth === 'number' ? 'none' : '1 1 auto',\n }}\n >\n <span\n style={{\n marginRight: 8,\n fontSize: '12px',\n color: theme.palette.text.secondary,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {filters.length ? `${filters.length} items` : 'All'}\n </span>\n <button\n onClick={(e) => {\n handleFilterClick(e, column.accessorKey as string);\n }}\n style={{\n border: `1px solid ${theme.palette.divider}`,\n background: theme.palette.background.paper,\n cursor: 'pointer',\n fontSize: '12px',\n color: filters.length ? theme.palette.primary.main : theme.palette.text.secondary,\n padding: '4px 8px',\n borderRadius: '4px',\n minWidth: '20px',\n height: '24px',\n flexShrink: 0,\n transition: 'all 0.2s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = theme.palette.action.hover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = theme.palette.background.paper;\n }}\n type=\"button\"\n >\n ▼\n </button>\n\n {openFilterColumn === column.accessorKey && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n zIndex: 1000,\n marginTop: 4,\n }}\n >\n <ColumnFilterDropdown\n allValues={columnUniqueValues[column.accessorKey as string] || []}\n selectedValues={filters}\n onFilterChange={(values) => updateColumnFilter(column.accessorKey as string, values)}\n theme={theme}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n <Table\n data={filteredData}\n columns={columns}\n cellConfigs={cellConfigs}\n height={spec.enableFiltering ? contentDimensions.height - 40 : contentDimensions.height}\n width={contentDimensions.width}\n density={spec.density}\n defaultColumnWidth={spec.defaultColumnWidth}\n defaultColumnHeight={spec.defaultColumnHeight}\n sorting={sorting}\n onSortingChange={setSorting}\n pagination={pagination}\n onPaginationChange={setPagination}\n checkboxSelection={selectionEnabled}\n rowSelection={rowSelection}\n onRowSelectionChange={handleRowSelectionChange}\n getItemActions={({ id, data }) => getItemActionButtons({ id, data: data as Record<string, unknown> })}\n hasItemActions={actionButtons && actionButtons.length > 0}\n />\n </>\n );\n}\n"],"names":["Box","Typography","useTheme","Table","useSelection","formatValue","transformData","useSelectionItemActions","replaceVariablesInString","useAllVariableValues","useCallback","useEffect","useMemo","useRef","useState","evaluateConditionalFormatting","buildRawTableData","getTablePanelQueryMode","EmbeddedPanel","generateCellContentConfig","column","plugin","undefined","cell","ctx","panelData","getValue","kind","spec","queryResults","cellDescription","cellValue","format","ColumnFilterDropdown","allValues","selectedValues","onFilterChange","theme","values","Set","filter","v","sort","length","div","data-filter-dropdown","style","width","padding","backgroundColor","palette","background","paper","border","divider","borderRadius","boxShadow","shadows","color","text","secondary","fontSize","maxHeight","overflowY","marginBottom","fontWeight","label","display","alignItems","cursor","input","type","checked","onChange","e","target","marginRight","span","primary","hr","margin","borderTop","map","value","index","onMouseEnter","currentTarget","action","hover","onMouseLeave","includes","String","generateColumnConfig","name","columnSettings","allVariables","hide","header","headerDescription","enableSorting","align","dataLink","modifiedDataLink","url","accessorKey","getTablePanelQueryOptions","mode","TablePanel","contentDimensions","selectionEnabled","selection","enabled","selectionMap","setSelection","clearSelection","itemActionsConfig","actions","itemActionsListConfig","displayWithItem","actionsList","getItemActionButtons","confirmDialog","actionButtons","variableState","filteredDataRef","rowSelection","result","forEach","_","id","handleRowSelectionChange","newRowSelection","newSelection","isSelected","Object","entries","parseInt","current","push","item","rawData","data","transforms","keys","entry","key","columnUniqueValues","uniqueValues","row","val","Array","from","columns","customizedColumns","columnSetting","has","columnConfig","add","defaultColumnHidden","cellConfigs","cellSettings","some","col","keysAsObj","reduce","acc","extendRow","cellConfig","find","columnCellConfig","generateDefaultSortingState","desc","sorting","setSorting","columnFilters","setColumnFilters","filterAnchorEl","setFilterAnchorEl","openFilterColumn","setOpenFilterColumn","getSelectedFilterValues","columnId","f","updateColumnFilter","newFilters","handleFilterClick","event","preventDefault","stopPropagation","handleFilterClose","handleClick","closest","timer","setTimeout","document","addEventListener","clearTimeout","removeEventListener","filteredData","filtered","enableFiltering","every","filterValues","pagination","setPagination","pageIndex","pageSize","sx","justifyContent","height","default","borderBottom","boxSizing","idx","filters","columnWidth","defaultColumnWidth","borderRight","minWidth","maxWidth","position","flex","overflow","textOverflow","whiteSpace","button","onClick","main","flexShrink","transition","top","left","zIndex","marginTop","density","defaultColumnHeight","onSortingChange","onPaginationChange","checkboxSelection","onRowSelectionChange","getItemActions","hasItemActions"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/TablePanel.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Box, Theme, Typography, useTheme } from '@mui/material';\nimport {\n FormatOptions,\n formatValue,\n Table,\n TableCellConfigs,\n TableColumnConfig,\n transformData,\n useSelection,\n} from '@perses-dev/components';\nimport { useSelectionItemActions } from '@perses-dev/dashboards';\nimport {\n ActionOptions,\n CalculationsMap,\n PanelData,\n PanelProps,\n replaceVariablesInString,\n useAllVariableValues,\n VariableStateMap,\n} from '@perses-dev/plugin-system';\nimport { ColumnFiltersState, PaginationState, RowSelectionState, SortingState } from '@tanstack/react-table';\nimport { ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { QueryDataType, TimeSeriesData } from '@perses-dev/spec';\nimport { CellSettings, ColumnSettings, evaluateConditionalFormatting, TableOptions } from '../models';\nimport { buildRawTableData, getTablePanelQueryMode } from '../table-data-utils';\nimport { EmbeddedPanel } from './EmbeddedPanel';\n\ntype FilterValuesType<T> = Array<{ original: T; formatted: T }>;\n\nfunction parseNumericCellValue(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction isPanelData(value: unknown): value is PanelData<QueryDataType> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as { definition?: unknown; data?: unknown };\n return candidate.definition !== undefined && candidate.data !== undefined;\n}\n\nfunction createSyntheticPanelData(value: unknown, columnName: string): PanelData<TimeSeriesData> | undefined {\n const numericValue = parseNumericCellValue(value);\n if (numericValue === undefined) {\n return undefined;\n }\n\n const now = Date.now();\n return {\n definition: {\n kind: 'TimeSeriesQuery',\n spec: { plugin: { kind: 'PrometheusTimeSeriesQuery', spec: { query: '' } } },\n },\n data: {\n timeRange: { start: new Date(now), end: new Date(now) },\n stepMs: 1,\n series: [{ name: columnName, values: [[now, numericValue]], labels: {} }],\n },\n };\n}\n\nfunction getGaugeNumericValue(value: unknown): number | undefined {\n if (isPanelData(value)) {\n const series = (value.data as TimeSeriesData)?.series;\n const firstSeries = series?.[0];\n if (!firstSeries?.values?.length) {\n return undefined;\n }\n const calc = CalculationsMap['last-number'];\n if (typeof calc !== 'function') {\n return undefined;\n }\n const calculatedValue = calc(firstSeries.values);\n return typeof calculatedValue === 'number' ? calculatedValue : undefined;\n }\n\n return parseNumericCellValue(value);\n}\n\ninterface GaugeRange {\n min: number;\n max: number;\n}\n\nfunction InlineGaugeCellWithRange({\n value,\n range,\n fillColor,\n format,\n}: {\n value?: number;\n range?: GaugeRange;\n fillColor?: string;\n format?: ColumnSettings['format'];\n}): ReactElement {\n if (value === undefined) {\n return <></>;\n }\n\n let percent = 0;\n if (range !== undefined) {\n if (range.max === range.min) {\n percent = 100;\n } else {\n percent = ((value - range.min) / (range.max - range.min)) * 100;\n }\n }\n percent = Math.max(0, Math.min(100, percent));\n\n const trackColor = 'rgba(127,127,127,0.20)';\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', width: '100%', gap: 1 }}>\n <Box sx={{ flexGrow: 1, borderRadius: 1, backgroundColor: trackColor, height: 24, overflow: 'hidden' }}>\n <Box\n sx={{\n width: `${percent}%`,\n height: '100%',\n backgroundColor: fillColor ?? 'success.main',\n borderRadius: 1,\n }}\n />\n </Box>\n <Typography variant=\"body2\" sx={{ minWidth: 52, textAlign: 'right' }}>\n {format ? formatValue(value, format) : value.toFixed(2)}\n </Typography>\n </Box>\n );\n}\n\nfunction resolveGaugeFillColor(\n value: unknown,\n globalCellSettings: CellSettings[],\n columnCellSettings: CellSettings[] | undefined\n): string | undefined {\n let cellConfig = evaluateConditionalFormatting(value, globalCellSettings);\n if (columnCellSettings?.length) {\n const columnCellConfig = evaluateConditionalFormatting(value, columnCellSettings);\n if (columnCellConfig) {\n cellConfig = columnCellConfig;\n }\n }\n return cellConfig?.backgroundColor ?? cellConfig?.textColor;\n}\n\nfunction generateCellContentConfig(\n column: ColumnSettings,\n gaugeRange?: GaugeRange,\n globalCellSettings: CellSettings[] = []\n): Pick<TableColumnConfig<unknown>, 'cellDescription' | 'cell'> {\n const plugin = column.plugin;\n if (plugin !== undefined) {\n return {\n cell: (ctx): ReactElement => {\n const cellValue = ctx.getValue();\n if (plugin.kind === 'GaugeChart') {\n const gaugeValue = getGaugeNumericValue(cellValue);\n const gaugeFillColor = resolveGaugeFillColor(gaugeValue, globalCellSettings, column.cellSettings);\n return (\n <InlineGaugeCellWithRange\n value={gaugeValue}\n range={gaugeRange}\n fillColor={gaugeFillColor}\n format={plugin.spec?.format ?? column.format}\n />\n );\n }\n const panelData = isPanelData(cellValue) ? cellValue : createSyntheticPanelData(cellValue, column.name);\n if (!panelData) return <></>;\n return <EmbeddedPanel kind={plugin.kind} spec={plugin.spec} queryResults={[panelData]} />;\n },\n cellDescription: column.cellDescription ? (): string => `${column.cellDescription}` : (): string => '', // disable hover text\n };\n }\n\n return {\n cell: (ctx): ReactElement | string => {\n const cellValue = ctx.getValue();\n return typeof cellValue === 'number' && column.format ? formatValue(cellValue, column.format) : cellValue;\n },\n cellDescription: column.cellDescription ? (): string => `${column.cellDescription}` : undefined, // TODO: variable rendering + cell value\n };\n}\n\ninterface ColumnFilterDropdownProps {\n allValues: FilterValuesType<string | number>;\n selectedValues: Array<string | number>;\n onFilterChange: (values: Array<string | number>) => void;\n theme: Theme;\n}\n\nfunction ColumnFilterDropdown({\n allValues,\n selectedValues,\n onFilterChange,\n theme,\n}: ColumnFilterDropdownProps): ReactElement {\n const [searchTerm, setSearchTerm] = useState('');\n const values = [...new Set(allValues)].filter((v) => v !== null).sort();\n const filteredValues = searchTerm\n ? values.filter((v) => String(v).toLowerCase().includes(searchTerm.toLowerCase()))\n : values;\n if (values.length === 0) {\n return (\n <div\n data-filter-dropdown\n style={{\n width: 200,\n padding: 10,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n boxShadow: theme.shadows[4],\n }}\n >\n <div style={{ color: theme.palette.text.secondary, fontSize: 14 }}>No values found</div>\n </div>\n );\n }\n\n return (\n <div\n data-filter-dropdown\n style={{\n width: 200,\n padding: 10,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n boxShadow: theme.shadows[4],\n maxHeight: 250,\n overflowY: 'auto',\n }}\n >\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n style={{\n width: '100%',\n padding: '6px 8px',\n marginBottom: 8,\n fontSize: 13,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n boxSizing: 'border-box',\n }}\n />\n <div style={{ marginBottom: 8, fontSize: 14, fontWeight: 'bold' }}>\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={selectedValues.length === values.length && values.length > 0}\n onChange={(e) => onFilterChange(e.target.checked ? values.map((v) => v.original) : [])}\n style={{ marginRight: 8 }}\n />\n <span style={{ color: theme.palette.text.primary }}>Select All ({values.length})</span>\n </label>\n </div>\n <hr\n style={{\n margin: '8px 0',\n border: 'none',\n borderTop: `1px solid ${theme.palette.divider}`,\n }}\n />\n {filteredValues.map((value, index) => (\n <div key={`value-${index}`} style={{ marginBottom: 4 }}>\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n padding: '2px 0',\n borderRadius: 2,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.palette.action.hover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <input\n type=\"checkbox\"\n checked={selectedValues.includes(value.original)}\n onChange={(e) => {\n if (e.target.checked) {\n onFilterChange([...selectedValues, value.original]);\n } else {\n onFilterChange(selectedValues.filter((v) => v !== value.original));\n }\n }}\n style={{ marginRight: 8 }}\n />\n <span\n style={{\n fontSize: 14,\n color: theme.palette.text.primary,\n }}\n >\n {value === null || value === undefined || value.formatted === '' ? '(empty)' : String(value.formatted)}\n </span>\n </label>\n </div>\n ))}\n </div>\n );\n}\n\n/*\n * Generate column config from column definitions, if a column has multiple definitions, the first one will be used.\n * If column is hidden, return undefined.\n * If column do not have a definition, return a default column config.\n */\nfunction generateColumnConfig(\n name: string,\n columnSettings: ColumnSettings[],\n allVariables: VariableStateMap,\n gaugeRangeByColumn: Record<string, GaugeRange>,\n globalCellSettings: CellSettings[] = []\n): TableColumnConfig<unknown> | undefined {\n for (const column of columnSettings) {\n if (column.name === name) {\n if (column.hide) {\n return undefined;\n }\n\n const { name, header, headerDescription, enableSorting, width, align, dataLink } = column;\n const modifiedDataLink = dataLink\n ? { ...dataLink, url: replaceVariablesInString(dataLink.url, allVariables) }\n : undefined;\n\n return {\n accessorKey: name,\n header: header ?? name,\n headerDescription,\n enableSorting,\n width,\n align,\n dataLink: modifiedDataLink,\n ...generateCellContentConfig(column, gaugeRangeByColumn[name], globalCellSettings),\n };\n }\n }\n\n return {\n accessorKey: name,\n header: name,\n };\n}\n\nexport function getTablePanelQueryOptions(spec: TableOptions): { mode: 'instant' | 'range' } {\n // if any cell renders a panel plugin, perform a range query instead of an instant query\n return {\n mode: getTablePanelQueryMode(spec),\n };\n}\n\nexport type TableProps = PanelProps<TableOptions, TimeSeriesData>;\n\nexport function TablePanel({ contentDimensions, spec, queryResults }: TableProps): ReactElement | null {\n const theme = useTheme();\n const allVariables = useAllVariableValues();\n\n const selectionEnabled = spec.selection?.enabled ?? false;\n const { selectionMap, setSelection, clearSelection } = useSelection<Record<string, unknown>, string>();\n\n const itemActionsConfig = spec.actions ? (spec.actions as ActionOptions) : undefined;\n const itemActionsListConfig =\n itemActionsConfig?.enabled && itemActionsConfig.displayWithItem ? itemActionsConfig.actionsList : [];\n\n const { getItemActionButtons, confirmDialog, actionButtons } = useSelectionItemActions({\n actions: itemActionsListConfig,\n variableState: allVariables,\n });\n\n const filteredDataRef = useRef<Array<Record<string, unknown>>>([]);\n\n // Convert selectionMap to TanStack's RowSelectionState format\n const rowSelection = useMemo((): RowSelectionState => {\n const result: RowSelectionState = {};\n selectionMap.forEach((_, id) => {\n result[id] = true;\n });\n return result;\n }, [selectionMap]);\n\n const handleRowSelectionChange = useCallback(\n (newRowSelection: RowSelectionState) => {\n const newSelection: Array<{ id: string; item: Record<string, unknown> }> = [];\n for (const [id, isSelected] of Object.entries(newRowSelection)) {\n if (isSelected) {\n const index = parseInt(id, 10);\n if (filteredDataRef.current[index] !== undefined) {\n newSelection.push({ id, item: filteredDataRef.current[index] });\n }\n }\n }\n\n if (newSelection.length === 0) {\n clearSelection();\n } else {\n setSelection(newSelection);\n }\n },\n [setSelection, clearSelection]\n );\n\n // TODO: handle other query types\n const rawData: Array<Record<string, unknown>> = useMemo(() => {\n // Transform query results to a tabular format using shared utility\n return buildRawTableData(queryResults, spec);\n }, [queryResults, spec]);\n\n // Transform will be applied by their orders on the original data\n const data = useMemo(() => transformData(rawData, spec.transforms ?? []), [rawData, spec.transforms]);\n\n const keys: string[] = useMemo(() => {\n const result: string[] = [];\n\n for (const entry of data) {\n for (const key of Object.keys(entry)) {\n if (!result.includes(key)) {\n result.push(key);\n }\n }\n }\n\n return result;\n }, [data]);\n\n const columnsFormat = useMemo(() => {\n const columnsFormat: Record<string, FormatOptions> = {};\n const settings = spec?.columnSettings;\n if (settings) {\n for (let i = 0; i < settings.length; i++) {\n const { name, format } = settings[i] || {};\n if (name && format) {\n columnsFormat[name] = format;\n }\n }\n }\n\n return columnsFormat;\n }, [spec]);\n\n const columnUniqueValues = useMemo(() => {\n const uniqueValues: Record<string, FilterValuesType<string | number>> = {};\n\n for (const key of keys) {\n const formatOption = columnsFormat?.[key];\n uniqueValues[key] = [];\n const usedValues: Map<string, true> = new Map();\n for (const row of data) {\n const val = row[key];\n if (val === '' || val === null || val === undefined) {\n continue;\n }\n if (usedValues.get(String(val))) {\n continue;\n }\n\n if (typeof val === 'string' || typeof val === 'number') {\n uniqueValues[key].push({\n original: val,\n formatted: formatOption && typeof val === 'number' ? formatValue(val, formatOption) : val,\n });\n usedValues.set(String(val), true);\n }\n }\n }\n return uniqueValues;\n }, [data, keys, columnsFormat]);\n\n const gaugeRangeByColumn = useMemo(() => {\n const result: Record<string, GaugeRange> = {};\n\n for (const key of keys) {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (const row of data) {\n const numericValue = getGaugeNumericValue(row[key]);\n if (numericValue === undefined) {\n continue;\n }\n min = Math.min(min, numericValue);\n max = Math.max(max, numericValue);\n }\n\n if (min !== Number.POSITIVE_INFINITY && max !== Number.NEGATIVE_INFINITY) {\n result[key] = { min, max };\n }\n }\n\n return result;\n }, [data, keys]);\n\n // Generate columns and map each column accessor to its settings index and data key\n const columns: Array<TableColumnConfig<unknown>> = useMemo(() => {\n const columns: Array<TableColumnConfig<unknown>> = [];\n const customizedColumns = new Set<string>();\n\n // Process columnSettings if they exist\n for (const columnSetting of spec.columnSettings ?? []) {\n if (customizedColumns.has(columnSetting.name)) continue; // Skip duplicates\n\n const columnConfig = generateColumnConfig(\n columnSetting.name,\n spec.columnSettings ?? [],\n allVariables,\n gaugeRangeByColumn,\n spec.cellSettings ?? []\n );\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n customizedColumns.add(columnSetting.name);\n }\n }\n\n // Add remaining columns if defaultColumnHidden is false\n if (!spec.defaultColumnHidden) {\n for (const key of keys) {\n if (!customizedColumns.has(key)) {\n const columnConfig = generateColumnConfig(\n key,\n spec.columnSettings ?? [],\n allVariables,\n gaugeRangeByColumn,\n spec.cellSettings ?? []\n );\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n }\n }\n\n return columns;\n }, [keys, spec.columnSettings, spec.defaultColumnHidden, allVariables, gaugeRangeByColumn, spec.cellSettings]);\n\n // Generate cell settings that will be used by the table to render cells (text color, background color, ...)\n const cellConfigs: TableCellConfigs = useMemo(() => {\n // If there are no cell settings globally or per column, return an empty object\n if (spec.cellSettings === undefined && !spec.columnSettings?.some((col) => col.cellSettings !== undefined)) {\n return {};\n }\n\n const result: TableCellConfigs = {};\n\n let index = 0;\n for (const row of data) {\n // Transforming key to object to extend the row with undefined values if the key is not present\n // for checking the cell config \"Misc\" condition with \"null\"\n const keysAsObj = keys.reduce(\n (acc, key) => {\n acc[key] = undefined;\n return acc;\n },\n {} as Record<string, undefined>\n );\n\n const extendRow = {\n ...keysAsObj,\n ...row,\n };\n\n // Generate cellConfigs for each column (including duplicates with different headers)\n for (const [key, value] of Object.entries(extendRow)) {\n // First, try to get cell config from global cell settings\n let cellConfig = evaluateConditionalFormatting(value, spec.cellSettings ?? []);\n\n // Then, try to get cell config from column-specific cell settings\n const columnSetting = spec.columnSettings?.find((col) => col.name === key);\n if (columnSetting?.cellSettings?.length) {\n const columnCellConfig = evaluateConditionalFormatting(value, columnSetting.cellSettings);\n // Column-specific settings take precedence over global settings\n if (columnCellConfig) {\n cellConfig = columnCellConfig;\n }\n }\n\n if (cellConfig) {\n result[`${index}_${key}`] = cellConfig;\n }\n }\n index++;\n }\n\n return result;\n }, [data, keys, spec.cellSettings, spec.columnSettings]);\n\n function generateDefaultSortingState(): SortingState {\n return (\n spec.columnSettings\n ?.filter((column) => column.sort !== undefined)\n .map((column) => {\n return {\n id: column.name,\n desc: column.sort === 'desc',\n };\n }) ?? []\n );\n }\n\n const [sorting, setSorting] = useState<SortingState>(generateDefaultSortingState());\n\n // Filtering state\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [filterAnchorEl, setFilterAnchorEl] = useState<{ [key: string]: HTMLElement | null }>({});\n const [openFilterColumn, setOpenFilterColumn] = useState<string | null>(null);\n\n // get selected values for a column\n const getSelectedFilterValues = (columnId: string): Array<string | number> => {\n const filter = columnFilters.find((f) => f.id === columnId);\n return filter ? (filter.value as Array<string | number>) : [];\n };\n\n // update column filter\n const updateColumnFilter = (columnId: string, values: Array<string | number>): void => {\n const newFilters = columnFilters.filter((f) => f.id !== columnId);\n if (values.length > 0) {\n newFilters.push({ id: columnId, value: values });\n }\n setColumnFilters(newFilters);\n };\n\n // Handle filter clicks\n const handleFilterClick = (event: React.MouseEvent<HTMLButtonElement>, columnId: string): void => {\n event.preventDefault();\n event.stopPropagation();\n setFilterAnchorEl({ ...filterAnchorEl, [columnId]: event.currentTarget });\n setOpenFilterColumn(columnId);\n };\n\n const handleFilterClose = (): void => {\n setFilterAnchorEl({});\n setOpenFilterColumn(null);\n };\n\n // Close filter when clicking outside\n useEffect(() => {\n if (!openFilterColumn) return;\n\n const handleClick = (e: MouseEvent): void => {\n const target = e.target as Element;\n if (!target.closest('[data-filter-dropdown]') && !target.closest('button')) {\n handleFilterClose();\n }\n };\n\n const timer = setTimeout(() => {\n document.addEventListener('click', handleClick);\n }, 100);\n\n return (): void => {\n clearTimeout(timer);\n document.removeEventListener('click', handleClick);\n };\n }, [openFilterColumn]);\n\n // filter data based on the current filters\n const filteredData = useMemo(() => {\n let filtered = [...data];\n\n // apply column filters if enabled\n if (spec.enableFiltering && columnFilters.length > 0) {\n filtered = filtered.filter((row) => {\n return columnFilters.every((filter) => {\n const value = row[filter.id];\n const filterValues = filter.value as Array<string | number>;\n\n if (!filterValues || filterValues.length === 0) return true; // No filter values means no filtering\n\n // Check if the row value is in the selected filter values\n return filterValues.includes(value as string | number);\n });\n });\n }\n\n return filtered;\n }, [data, columnFilters, spec.enableFiltering]);\n\n // Keep ref in sync with filtered data for use in selection handler\n filteredDataRef.current = filteredData;\n\n const [pagination, setPagination] = useState<PaginationState | undefined>(\n spec.pagination ? { pageIndex: 0, pageSize: 10 } : undefined\n );\n\n useEffect(() => {\n // If the pagination setting changes from no pagination to pagination, but the pagination state is undefined, update the pagination state\n if (spec.pagination && !pagination) {\n setPagination({ pageIndex: 0, pageSize: 10 });\n } else if (!spec.pagination && pagination) {\n setPagination(undefined);\n }\n }, [spec.pagination, pagination]);\n\n if (contentDimensions === undefined) {\n return null;\n }\n\n if (!data?.length) {\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n }}\n >\n <Typography>No data</Typography>\n </Box>\n );\n }\n\n return (\n <>\n {confirmDialog}\n {spec.enableFiltering && (\n <div\n style={{\n display: 'flex',\n background: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n width: contentDimensions.width,\n boxSizing: 'border-box',\n }}\n >\n {columns.map((column, idx) => {\n const filters = getSelectedFilterValues(column.accessorKey as string);\n const columnWidth = column.width || spec.defaultColumnWidth;\n return (\n <div\n key={`filter-${idx}`}\n style={{\n padding: '8px',\n borderRight: idx < columns.length - 1 ? `1px solid ${theme.palette.divider}` : 'none',\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n flex: typeof columnWidth === 'number' ? 'none' : '1 1 auto',\n }}\n >\n <span\n style={{\n marginRight: 8,\n fontSize: '12px',\n color: theme.palette.text.secondary,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {filters.length ? `${filters.length} items` : 'All'}\n </span>\n <button\n onClick={(e) => {\n handleFilterClick(e, column.accessorKey as string);\n }}\n style={{\n border: `1px solid ${theme.palette.divider}`,\n background: theme.palette.background.paper,\n cursor: 'pointer',\n fontSize: '12px',\n color: filters.length ? theme.palette.primary.main : theme.palette.text.secondary,\n padding: '4px 8px',\n borderRadius: '4px',\n minWidth: '20px',\n height: '24px',\n flexShrink: 0,\n transition: 'all 0.2s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = theme.palette.action.hover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = theme.palette.background.paper;\n }}\n type=\"button\"\n >\n ▼\n </button>\n\n {openFilterColumn === column.accessorKey && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n zIndex: 1000,\n marginTop: 4,\n }}\n >\n <ColumnFilterDropdown\n allValues={columnUniqueValues[column.accessorKey as string] || []}\n selectedValues={filters}\n onFilterChange={(values) => updateColumnFilter(column.accessorKey as string, values)}\n theme={theme}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n <Table\n data={filteredData}\n columns={columns}\n cellConfigs={cellConfigs}\n height={spec.enableFiltering ? contentDimensions.height - 40 : contentDimensions.height}\n width={contentDimensions.width}\n density={spec.density}\n defaultColumnWidth={spec.defaultColumnWidth}\n defaultColumnHeight={spec.defaultColumnHeight}\n sorting={sorting}\n onSortingChange={setSorting}\n pagination={pagination}\n onPaginationChange={setPagination}\n checkboxSelection={selectionEnabled}\n rowSelection={rowSelection}\n onRowSelectionChange={handleRowSelectionChange}\n getItemActions={({ id, data }) => getItemActionButtons({ id, data: data as Record<string, unknown> })}\n hasItemActions={actionButtons && actionButtons.length > 0}\n />\n </>\n );\n}\n"],"names":["Box","Typography","useTheme","formatValue","Table","transformData","useSelection","useSelectionItemActions","CalculationsMap","replaceVariablesInString","useAllVariableValues","useCallback","useEffect","useMemo","useRef","useState","evaluateConditionalFormatting","buildRawTableData","getTablePanelQueryMode","EmbeddedPanel","parseNumericCellValue","value","Number","isFinite","parsed","undefined","isPanelData","candidate","definition","data","createSyntheticPanelData","columnName","numericValue","now","Date","kind","spec","plugin","query","timeRange","start","end","stepMs","series","name","values","labels","getGaugeNumericValue","firstSeries","length","calc","calculatedValue","InlineGaugeCellWithRange","range","fillColor","format","percent","max","min","Math","trackColor","sx","display","alignItems","width","gap","flexGrow","borderRadius","backgroundColor","height","overflow","variant","minWidth","textAlign","toFixed","resolveGaugeFillColor","globalCellSettings","columnCellSettings","cellConfig","columnCellConfig","textColor","generateCellContentConfig","column","gaugeRange","cell","ctx","cellValue","getValue","gaugeValue","gaugeFillColor","cellSettings","panelData","queryResults","cellDescription","ColumnFilterDropdown","allValues","selectedValues","onFilterChange","theme","searchTerm","setSearchTerm","Set","filter","v","sort","filteredValues","String","toLowerCase","includes","div","data-filter-dropdown","style","padding","palette","background","paper","border","divider","boxShadow","shadows","color","text","secondary","fontSize","maxHeight","overflowY","input","type","placeholder","onChange","e","target","marginBottom","default","primary","boxSizing","fontWeight","label","cursor","checked","map","original","marginRight","span","hr","margin","borderTop","index","onMouseEnter","currentTarget","action","hover","onMouseLeave","formatted","generateColumnConfig","columnSettings","allVariables","gaugeRangeByColumn","hide","header","headerDescription","enableSorting","align","dataLink","modifiedDataLink","url","accessorKey","getTablePanelQueryOptions","mode","TablePanel","contentDimensions","selectionEnabled","selection","enabled","selectionMap","setSelection","clearSelection","itemActionsConfig","actions","itemActionsListConfig","displayWithItem","actionsList","getItemActionButtons","confirmDialog","actionButtons","variableState","filteredDataRef","rowSelection","result","forEach","_","id","handleRowSelectionChange","newRowSelection","newSelection","isSelected","Object","entries","parseInt","current","push","item","rawData","transforms","keys","entry","key","columnsFormat","settings","i","columnUniqueValues","uniqueValues","formatOption","usedValues","Map","row","val","get","set","POSITIVE_INFINITY","NEGATIVE_INFINITY","columns","customizedColumns","columnSetting","has","columnConfig","add","defaultColumnHidden","cellConfigs","some","col","keysAsObj","reduce","acc","extendRow","find","generateDefaultSortingState","desc","sorting","setSorting","columnFilters","setColumnFilters","filterAnchorEl","setFilterAnchorEl","openFilterColumn","setOpenFilterColumn","getSelectedFilterValues","columnId","f","updateColumnFilter","newFilters","handleFilterClick","event","preventDefault","stopPropagation","handleFilterClose","handleClick","closest","timer","setTimeout","document","addEventListener","clearTimeout","removeEventListener","filteredData","filtered","enableFiltering","every","filterValues","pagination","setPagination","pageIndex","pageSize","justifyContent","borderBottom","idx","filters","columnWidth","defaultColumnWidth","borderRight","maxWidth","position","flex","textOverflow","whiteSpace","button","onClick","main","flexShrink","transition","top","left","zIndex","marginTop","density","defaultColumnHeight","onSortingChange","onPaginationChange","checkboxSelection","onRowSelectionChange","getItemActions","hasItemActions"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableTransformsEditor.d.ts","sourceRoot":"","sources":["../../../src/components/TableTransformsEditor.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,wBAAwB,GAAG,YAAY,CAMjG"}
1
+ {"version":3,"file":"TableTransformsEditor.d.ts","sourceRoot":"","sources":["../../../src/components/TableTransformsEditor.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,wBAAwB,GAAG,YAAY,CAMjG"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TableTransformsEditor.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TransformsEditor } from '@perses-dev/components';\nimport { Transform } from '@perses-dev/core';\nimport { ReactElement } from 'react';\nimport { TableSettingsEditorProps } from '../models';\n\nexport function TableTransformsEditor({ value, onChange }: TableSettingsEditorProps): ReactElement {\n function handleTransformsChange(transforms: Transform[]): void {\n onChange({ ...value, transforms: transforms });\n }\n\n return <TransformsEditor value={value.transforms ?? []} onChange={handleTransformsChange} />;\n}\n"],"names":["TransformsEditor","TableTransformsEditor","value","onChange","handleTransformsChange","transforms"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,gBAAgB,QAAQ,yBAAyB;AAK1D,OAAO,SAASC,sBAAsB,EAAEC,KAAK,EAAEC,QAAQ,EAA4B;IACjF,SAASC,uBAAuBC,UAAuB;QACrDF,SAAS;YAAE,GAAGD,KAAK;YAAEG,YAAYA;QAAW;IAC9C;IAEA,qBAAO,KAACL;QAAiBE,OAAOA,MAAMG,UAAU,IAAI,EAAE;QAAEF,UAAUC;;AACpE"}
1
+ {"version":3,"sources":["../../../src/components/TableTransformsEditor.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Transform, TransformsEditor } from '@perses-dev/components';\nimport { ReactElement } from 'react';\nimport { TableSettingsEditorProps } from '../models';\n\nexport function TableTransformsEditor({ value, onChange }: TableSettingsEditorProps): ReactElement {\n function handleTransformsChange(transforms: Transform[]): void {\n onChange({ ...value, transforms: transforms });\n }\n\n return <TransformsEditor value={value.transforms ?? []} onChange={handleTransformsChange} />;\n}\n"],"names":["TransformsEditor","TableTransformsEditor","value","onChange","handleTransformsChange","transforms"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAAoBA,gBAAgB,QAAQ,yBAAyB;AAIrE,OAAO,SAASC,sBAAsB,EAAEC,KAAK,EAAEC,QAAQ,EAA4B;IACjF,SAASC,uBAAuBC,UAAuB;QACrDF,SAAS;YAAE,GAAGD,KAAK;YAAEG,YAAYA;QAAW;IAC9C;IAEA,qBAAO,KAACL;QAAiBE,OAAOA,MAAMG,UAAU,IAAI,EAAE;QAAEF,UAAUC;;AACpE"}
@@ -1,7 +1,7 @@
1
- import { Definition, FormatOptions, Transform, UnknownSpec } from '@perses-dev/core';
2
- import { TableDensity, TableCellConfig } from '@perses-dev/components';
1
+ import { TableDensity, TableCellConfig, FormatOptions, Transform } from '@perses-dev/components';
3
2
  import { ActionOptions, OptionsEditorProps, SelectionOptions } from '@perses-dev/plugin-system';
4
3
  import React from 'react';
4
+ import { Definition, UnknownSpec } from '@perses-dev/spec';
5
5
  export interface ColumnSettings {
6
6
  name: string;
7
7
  header?: string;