@perses-dev/table-plugin 0.11.1 → 0.13.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/__mf/css/async/5286.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.5ec41996.js +7 -0
  87. package/__mf/js/async/1432.47ca9bc7.js +1 -0
  88. package/__mf/js/async/1519.446ee3b5.js +1 -0
  89. package/__mf/js/async/1616.29b0085e.js +1 -0
  90. package/__mf/js/async/1805.b4a1e768.js +1 -0
  91. package/__mf/js/async/2043.0b0ffaef.js +2 -0
  92. package/__mf/js/async/2082.c0b3db38.js +1 -0
  93. package/__mf/js/async/256.7929d7f5.js +1 -0
  94. package/__mf/js/async/2842.cee1ed42.js +1 -0
  95. package/__mf/js/async/392.eef36bcd.js +2 -0
  96. package/__mf/js/async/4121.403fdade.js +2 -0
  97. package/__mf/js/async/4320.5cbfbd1c.js +1 -0
  98. package/__mf/js/async/5002.fd6ad994.js +1 -0
  99. package/__mf/js/async/5071.1684b9fd.js +1 -0
  100. package/__mf/js/async/5183.acc536f9.js +22 -0
  101. package/__mf/js/async/5286.1b3a5a62.js +7 -0
  102. package/__mf/js/async/{550.8bab52fc.js.LICENSE.txt → 5286.1b3a5a62.js.LICENSE.txt} +19 -1
  103. package/__mf/js/async/5587.966d92d2.js +1 -0
  104. package/__mf/js/async/6274.71776a1d.js +2 -0
  105. package/__mf/js/async/6753.5632301a.js +1 -0
  106. package/__mf/js/async/6811.6a011de7.js +38 -0
  107. package/__mf/js/async/7177.f0c1cf85.js +1 -0
  108. package/__mf/js/async/7192.f9d57dbb.js +1 -0
  109. package/__mf/js/async/7413.a78d135c.js +1 -0
  110. package/__mf/js/async/7862.de8ef786.js +2 -0
  111. package/__mf/js/async/7968.545aab42.js +1 -0
  112. package/__mf/js/async/7978.61f7fc2d.js +1 -0
  113. package/__mf/js/async/8356.7a060c2c.js +1 -0
  114. package/__mf/js/async/8470.dac32d6a.js +2 -0
  115. package/__mf/js/async/868.a08b9f5f.js +110 -0
  116. package/__mf/js/async/{868.9f710584.js.LICENSE.txt → 868.a08b9f5f.js.LICENSE.txt} +1 -1
  117. package/__mf/js/async/873.bb80627c.js +1 -0
  118. package/__mf/js/async/8750.8dc0b93d.js +3 -0
  119. package/__mf/js/async/9051.2db4f8e5.js +1 -0
  120. package/__mf/js/async/9235.35b8884a.js +1 -0
  121. package/__mf/js/async/941.97799379.js +2 -0
  122. package/__mf/js/async/9546.f3c1cf02.js +2 -0
  123. package/__mf/js/async/{1117.b21b0ae4.js.LICENSE.txt → 9546.f3c1cf02.js.LICENSE.txt} +1 -1
  124. package/__mf/js/async/9588.178c0b3f.js +1 -0
  125. package/__mf/js/async/9701.4ae63d2f.js +1 -0
  126. package/__mf/js/async/__federation_expose_Table.7060f62e.js +1 -0
  127. package/__mf/js/async/lib-router.96861d20.js +2 -0
  128. package/__mf/js/main.8677f3d2.js +7 -0
  129. package/lib/TableExportAction.d.ts +16 -0
  130. package/lib/TableExportAction.d.ts.map +1 -1
  131. package/lib/TableExportAction.js +78 -26
  132. package/lib/TableExportAction.js.map +1 -1
  133. package/lib/cjs/TableExportAction.js +83 -27
  134. package/lib/cjs/components/ColumnsEditor/ColumnEditor.js +60 -22
  135. package/lib/cjs/components/ColumnsEditor/EmbeddedPanelOptionsEditor.js +124 -0
  136. package/lib/cjs/components/TablePanel.js +206 -56
  137. package/lib/cjs/models/table-model.js +32 -6
  138. package/lib/cjs/table-data-utils.js +83 -0
  139. package/lib/components/ColumnsEditor/ColumnEditor.d.ts.map +1 -1
  140. package/lib/components/ColumnsEditor/ColumnEditor.js +61 -23
  141. package/lib/components/ColumnsEditor/ColumnEditor.js.map +1 -1
  142. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.d.ts +13 -0
  143. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.d.ts.map +1 -0
  144. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.js +114 -0
  145. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.js.map +1 -0
  146. package/lib/components/EmbeddedPanel.d.ts +1 -1
  147. package/lib/components/EmbeddedPanel.d.ts.map +1 -1
  148. package/lib/components/EmbeddedPanel.js.map +1 -1
  149. package/lib/components/TablePanel.d.ts +1 -1
  150. package/lib/components/TablePanel.d.ts.map +1 -1
  151. package/lib/components/TablePanel.js +206 -56
  152. package/lib/components/TablePanel.js.map +1 -1
  153. package/lib/components/TableTransformsEditor.d.ts.map +1 -1
  154. package/lib/components/TableTransformsEditor.js.map +1 -1
  155. package/lib/models/table-model.d.ts +2 -2
  156. package/lib/models/table-model.d.ts.map +1 -1
  157. package/lib/models/table-model.js +32 -6
  158. package/lib/models/table-model.js.map +1 -1
  159. package/lib/table-data-utils.d.ts +32 -0
  160. package/lib/table-data-utils.d.ts.map +1 -0
  161. package/lib/table-data-utils.js +81 -0
  162. package/lib/table-data-utils.js.map +1 -0
  163. package/lib/test/mock-query-results.d.ts +1 -1
  164. package/lib/test/mock-query-results.js.map +1 -1
  165. package/mf-manifest.json +94 -75
  166. package/mf-stats.json +110 -79
  167. package/package.json +5 -5
  168. package/__mf/css/async/3061.d3010b86.css +0 -1
  169. package/__mf/css/async/5442.d3010b86.css +0 -1
  170. package/__mf/css/async/7823.d3010b86.css +0 -1
  171. package/__mf/font/lato-all-300-normal.322bdf14.woff +0 -0
  172. package/__mf/font/lato-all-400-normal.63513b00.woff +0 -0
  173. package/__mf/font/lato-all-700-normal.bb27db94.woff +0 -0
  174. package/__mf/font/lato-all-900-normal.a27049a3.woff +0 -0
  175. package/__mf/font/lato-latin-300-normal.c5195215.woff2 +0 -0
  176. package/__mf/font/lato-latin-400-normal.b7ffde23.woff2 +0 -0
  177. package/__mf/font/lato-latin-700-normal.d5eb20bc.woff2 +0 -0
  178. package/__mf/font/lato-latin-900-normal.d884a71c.woff2 +0 -0
  179. package/__mf/font/lato-latin-ext-300-normal.abcc64a9.woff2 +0 -0
  180. package/__mf/font/lato-latin-ext-400-normal.6ebed106.woff2 +0 -0
  181. package/__mf/font/lato-latin-ext-700-normal.8697d1d5.woff2 +0 -0
  182. package/__mf/font/lato-latin-ext-900-normal.20a2b415.woff2 +0 -0
  183. package/__mf/js/Table.057041ac.js +0 -6
  184. package/__mf/js/async/1103.ffbc2bec.js +0 -1
  185. package/__mf/js/async/1117.b21b0ae4.js +0 -2
  186. package/__mf/js/async/1432.acd0ad59.js +0 -1
  187. package/__mf/js/async/1616.7a74f4ef.js +0 -1
  188. package/__mf/js/async/2043.fdebf89c.js +0 -2
  189. package/__mf/js/async/208.2b17c08c.js +0 -3
  190. package/__mf/js/async/2082.78532c3c.js +0 -1
  191. package/__mf/js/async/272.3bc7825c.js +0 -1
  192. package/__mf/js/async/392.49e51fc5.js +0 -2
  193. package/__mf/js/async/4121.8e97ef88.js +0 -2
  194. package/__mf/js/async/5002.3189d214.js +0 -1
  195. package/__mf/js/async/5019.5318688a.js +0 -1
  196. package/__mf/js/async/5071.91e1c002.js +0 -1
  197. package/__mf/js/async/54.8b007a26.js +0 -22
  198. package/__mf/js/async/550.8bab52fc.js +0 -7
  199. package/__mf/js/async/5587.f5f2b0cc.js +0 -1
  200. package/__mf/js/async/6274.14683c28.js +0 -2
  201. package/__mf/js/async/6283.e044c368.js +0 -2
  202. package/__mf/js/async/6753.032ce611.js +0 -1
  203. package/__mf/js/async/6811.4e18bc66.js +0 -38
  204. package/__mf/js/async/7177.356298ae.js +0 -1
  205. package/__mf/js/async/7192.66c9e3a5.js +0 -1
  206. package/__mf/js/async/7968.a66bfadb.js +0 -1
  207. package/__mf/js/async/7978.a19f5a4f.js +0 -1
  208. package/__mf/js/async/8356.8ae40b6a.js +0 -1
  209. package/__mf/js/async/8470.1b8b20ff.js +0 -2
  210. package/__mf/js/async/868.9f710584.js +0 -110
  211. package/__mf/js/async/873.a7310675.js +0 -1
  212. package/__mf/js/async/9051.e3054e02.js +0 -1
  213. package/__mf/js/async/9235.eee50e10.js +0 -1
  214. package/__mf/js/async/941.333875f4.js +0 -2
  215. package/__mf/js/async/9588.7b021071.js +0 -1
  216. package/__mf/js/async/9701.3b068d23.js +0 -1
  217. package/__mf/js/async/__federation_expose_Table.5e9f3060.js +0 -1
  218. package/__mf/js/async/lib-router.2e1dec85.js +0 -2
  219. package/__mf/js/main.2181a7b4.js +0 -6
  220. /package/__mf/js/async/{2043.fdebf89c.js.LICENSE.txt → 2043.0b0ffaef.js.LICENSE.txt} +0 -0
  221. /package/__mf/js/async/{392.49e51fc5.js.LICENSE.txt → 392.eef36bcd.js.LICENSE.txt} +0 -0
  222. /package/__mf/js/async/{4121.8e97ef88.js.LICENSE.txt → 4121.403fdade.js.LICENSE.txt} +0 -0
  223. /package/__mf/js/async/{54.8b007a26.js.LICENSE.txt → 5183.acc536f9.js.LICENSE.txt} +0 -0
  224. /package/__mf/js/async/{6274.14683c28.js.LICENSE.txt → 6274.71776a1d.js.LICENSE.txt} +0 -0
  225. /package/__mf/js/async/{6283.e044c368.js.LICENSE.txt → 7862.de8ef786.js.LICENSE.txt} +0 -0
  226. /package/__mf/js/async/{8470.1b8b20ff.js.LICENSE.txt → 8470.dac32d6a.js.LICENSE.txt} +0 -0
  227. /package/__mf/js/async/{941.333875f4.js.LICENSE.txt → 941.97799379.js.LICENSE.txt} +0 -0
  228. /package/__mf/js/async/{lib-router.2e1dec85.js.LICENSE.txt → lib-router.96861d20.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ColumnsEditor/ColumnEditor.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 { Button, ButtonGroup, Stack, StackProps, Switch, TextField } from '@mui/material';\nimport { ReactElement, useState } from 'react';\nimport {\n AlignSelector,\n FormatControls,\n OptionsEditorColumn,\n OptionsEditorControl,\n OptionsEditorGrid,\n OptionsEditorGroup,\n SortSelectorButtons,\n} from '@perses-dev/components';\nimport { FormatOptions } from '@perses-dev/core';\nimport { PluginKindSelect } from '@perses-dev/plugin-system';\n\nimport { ColumnSettings } from '../../models';\nimport { ConditionalPanel } from '../ConditionalPanel';\nimport { DataLinkEditor } from './DataLinkEditorDialog';\n\nconst DEFAULT_FORMAT: FormatOptions = {\n unit: 'decimal',\n shortValues: true,\n};\n\ntype OmittedMuiProps = 'children' | 'value' | 'onChange';\n\nexport interface ColumnEditorProps extends Omit<StackProps, OmittedMuiProps> {\n column: ColumnSettings;\n onChange: (column: ColumnSettings) => void;\n}\n\nexport function ColumnEditor({ column, onChange, ...others }: ColumnEditorProps): ReactElement {\n const [width, setWidth] = useState<number>(\n column.width === undefined || column.width === 'auto' ? 100 : column.width\n );\n\n return (\n <Stack {...others}>\n <OptionsEditorGrid>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Column\">\n <OptionsEditorControl\n label=\"Name*\"\n control={\n <TextField\n value={column.name}\n onChange={(e) => onChange({ ...column, name: e.target.value })}\n required\n />\n }\n />\n <OptionsEditorControl\n label=\"Header\"\n control={\n <TextField\n value={column.header ?? ''}\n onChange={(e) => onChange({ ...column, header: e.target.value ? e.target.value : undefined })}\n />\n }\n />\n <OptionsEditorControl\n label=\"Header Tooltip\"\n control={\n <TextField\n value={column.headerDescription ?? ''}\n onChange={(e) =>\n onChange({ ...column, headerDescription: e.target.value ? e.target.value : undefined })\n }\n />\n }\n />\n <OptionsEditorControl\n label=\"Cell Tooltip\"\n control={\n <TextField\n value={column.cellDescription ?? ''}\n onChange={(e) =>\n onChange({ ...column, cellDescription: e.target.value ? e.target.value : undefined })\n }\n />\n }\n />\n <OptionsEditorControl\n label=\"Enable sorting\"\n control={\n <Switch\n checked={column.enableSorting ?? false}\n onChange={(e) => onChange({ ...column, enableSorting: e.target.checked })}\n />\n }\n />\n {column.enableSorting && (\n <OptionsEditorControl\n label=\"Default Sort\"\n control={\n <SortSelectorButtons\n size=\"medium\"\n value={column.sort}\n sx={{\n margin: 0.5,\n }}\n onChange={(sort) => onChange({ ...column, sort: sort })}\n />\n }\n />\n )}\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Visual\">\n <OptionsEditorControl\n label=\"Show column\"\n control={\n <Switch\n checked={!(column.hide ?? false)}\n onChange={(e) => onChange({ ...column, hide: !e.target.checked })}\n />\n }\n />\n <OptionsEditorControl\n label=\"Display\"\n control={\n <ButtonGroup aria-label=\"Display\" size=\"small\">\n <Button\n variant={!column.plugin ? 'contained' : 'outlined'}\n onClick={() => onChange({ ...column, plugin: undefined })}\n >\n Text\n </Button>\n <Button\n variant={column.plugin ? 'contained' : 'outlined'}\n onClick={() => onChange({ ...column, plugin: { kind: 'StatChart', spec: {} } })}\n >\n Embedded Panel\n </Button>\n </ButtonGroup>\n }\n />\n {column.plugin ? (\n <OptionsEditorControl\n label=\"Panel Type\"\n control={\n <PluginKindSelect\n pluginTypes={['Panel']}\n value={{ type: 'Panel', kind: column.plugin.kind }}\n onChange={(event) => onChange({ ...column, plugin: { kind: event.kind, spec: {} } })}\n />\n }\n />\n ) : (\n <FormatControls\n value={column.format ?? DEFAULT_FORMAT}\n onChange={(newFormat): void =>\n onChange({\n ...column,\n format: newFormat,\n })\n }\n />\n )}\n <OptionsEditorControl\n label=\"Alignment\"\n control={\n <AlignSelector\n size=\"small\"\n value={column.align ?? 'left'}\n onChange={(align) => onChange({ ...column, align: align })}\n />\n }\n />\n <OptionsEditorControl\n label=\"Custom width\"\n control={\n <Switch\n checked={column.width !== undefined && column.width !== 'auto'}\n onChange={(e) => onChange({ ...column, width: e.target.checked ? width : 'auto' })}\n />\n }\n />\n {column.width !== undefined && column.width !== 'auto' && (\n <OptionsEditorControl\n label=\"Width\"\n control={\n <TextField\n type=\"number\"\n value={width}\n slotProps={{ htmlInput: { min: 1 } }}\n onChange={(e) => {\n setWidth(+e.target.value);\n onChange({ ...column, width: +e.target.value });\n }}\n />\n }\n />\n )}\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Link\">\n <DataLinkEditor column={column} onChange={onChange} />\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n </OptionsEditorGrid>\n <Stack sx={{ px: 8 }}>\n <OptionsEditorGroup title=\"Conditional Cell Format\">\n <ConditionalPanel\n cellSettings={column.cellSettings}\n onChange={(cellSettings) => onChange({ ...column, cellSettings })}\n />\n </OptionsEditorGroup>\n </Stack>\n </Stack>\n );\n}\n"],"names":["Button","ButtonGroup","Stack","Switch","TextField","useState","AlignSelector","FormatControls","OptionsEditorColumn","OptionsEditorControl","OptionsEditorGrid","OptionsEditorGroup","SortSelectorButtons","PluginKindSelect","ConditionalPanel","DataLinkEditor","DEFAULT_FORMAT","unit","shortValues","ColumnEditor","column","onChange","others","width","setWidth","undefined","title","label","control","value","name","e","target","required","header","headerDescription","cellDescription","checked","enableSorting","size","sort","sx","margin","hide","aria-label","variant","plugin","onClick","kind","spec","pluginTypes","type","event","format","newFormat","align","slotProps","htmlInput","min","px","cellSettings"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/ColumnsEditor/ColumnEditor.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 { Button, ButtonGroup, Stack, StackProps, Switch, TextField, Typography } from '@mui/material';\nimport { ReactElement, useState } from 'react';\nimport {\n AlignSelector,\n FormatControls,\n FormatOptions,\n OptionsEditorColumn,\n OptionsEditorControl,\n OptionsEditorGrid,\n OptionsEditorGroup,\n SortSelectorButtons,\n} from '@perses-dev/components';\nimport { PluginKindSelect } from '@perses-dev/plugin-system';\n\nimport { ColumnSettings } from '../../models';\nimport { ConditionalPanel } from '../ConditionalPanel';\nimport { DataLinkEditor } from './DataLinkEditorDialog';\nimport { EmbeddedPanelOptionsEditor } from './EmbeddedPanelOptionsEditor';\n\nconst DEFAULT_FORMAT: FormatOptions = {\n unit: 'decimal',\n shortValues: true,\n};\n\ntype OmittedMuiProps = 'children' | 'value' | 'onChange';\n\nexport interface ColumnEditorProps extends Omit<StackProps, OmittedMuiProps> {\n column: ColumnSettings;\n onChange: (column: ColumnSettings) => void;\n}\n\nexport function ColumnEditor({ column, onChange, ...others }: ColumnEditorProps): ReactElement {\n const [width, setWidth] = useState<number>(\n column.width === undefined || column.width === 'auto' ? 100 : column.width\n );\n\n return (\n <Stack {...others}>\n <OptionsEditorGrid>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Column\">\n <OptionsEditorControl\n label=\"Name*\"\n control={\n <TextField\n value={column.name}\n onChange={(e) => onChange({ ...column, name: e.target.value })}\n required\n />\n }\n />\n <OptionsEditorControl\n label=\"Header\"\n control={\n <TextField\n value={column.header ?? ''}\n onChange={(e) => onChange({ ...column, header: e.target.value ? e.target.value : undefined })}\n />\n }\n />\n <OptionsEditorControl\n label=\"Header Tooltip\"\n control={\n <TextField\n value={column.headerDescription ?? ''}\n onChange={(e) =>\n onChange({ ...column, headerDescription: e.target.value ? e.target.value : undefined })\n }\n />\n }\n />\n <OptionsEditorControl\n label=\"Cell Tooltip\"\n control={\n <TextField\n value={column.cellDescription ?? ''}\n onChange={(e) =>\n onChange({ ...column, cellDescription: e.target.value ? e.target.value : undefined })\n }\n />\n }\n />\n <OptionsEditorControl\n label=\"Enable sorting\"\n control={\n <Switch\n checked={column.enableSorting ?? false}\n onChange={(e) => onChange({ ...column, enableSorting: e.target.checked })}\n />\n }\n />\n {column.enableSorting && (\n <OptionsEditorControl\n label=\"Default Sort\"\n control={\n <SortSelectorButtons\n size=\"medium\"\n value={column.sort}\n sx={{\n margin: 0.5,\n }}\n onChange={(sort) => onChange({ ...column, sort: sort })}\n />\n }\n />\n )}\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Visual\">\n <OptionsEditorControl\n label=\"Show column\"\n control={\n <Switch\n checked={!(column.hide ?? false)}\n onChange={(e) => onChange({ ...column, hide: !e.target.checked })}\n />\n }\n />\n <OptionsEditorControl\n label=\"Cell display\"\n control={\n <Stack spacing={1}>\n <ButtonGroup aria-label=\"Cell display\" size=\"small\">\n <Button\n variant={!column.plugin ? 'contained' : 'outlined'}\n onClick={() => onChange({ ...column, plugin: undefined })}\n >\n Text\n </Button>\n <Button\n variant={column.plugin ? 'contained' : 'outlined'}\n onClick={() => onChange({ ...column, plugin: { kind: 'GaugeChart', spec: {} } })}\n >\n Visualization\n </Button>\n </ButtonGroup>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ maxWidth: 360 }}>\n Visualizations reuse panel settings (thresholds, units, colors). Text mode uses value formatting\n below.\n </Typography>\n </Stack>\n }\n />\n {column.plugin ? (\n <OptionsEditorControl\n label=\"Visualization type\"\n control={\n <PluginKindSelect\n pluginTypes={['Panel']}\n size=\"small\"\n value={{ type: 'Panel', kind: column.plugin.kind }}\n onChange={(event) => onChange({ ...column, plugin: { kind: event.kind, spec: {} } })}\n />\n }\n />\n ) : (\n <FormatControls\n value={column.format ?? DEFAULT_FORMAT}\n onChange={(newFormat): void =>\n onChange({\n ...column,\n format: newFormat,\n })\n }\n />\n )}\n <OptionsEditorControl\n label=\"Alignment\"\n control={\n <AlignSelector\n size=\"small\"\n value={column.align ?? 'left'}\n onChange={(align) => onChange({ ...column, align: align })}\n />\n }\n />\n <OptionsEditorControl\n label=\"Custom width\"\n control={\n <Switch\n checked={column.width !== undefined && column.width !== 'auto'}\n onChange={(e) => onChange({ ...column, width: e.target.checked ? width : 'auto' })}\n />\n }\n />\n {column.width !== undefined && column.width !== 'auto' && (\n <OptionsEditorControl\n label=\"Width\"\n control={\n <TextField\n type=\"number\"\n value={width}\n slotProps={{ htmlInput: { min: 1 } }}\n onChange={(e) => {\n setWidth(+e.target.value);\n onChange({ ...column, width: +e.target.value });\n }}\n />\n }\n />\n )}\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Link\">\n <DataLinkEditor column={column} onChange={onChange} />\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n </OptionsEditorGrid>\n {column.plugin?.kind === 'GaugeChart' && (\n <Stack sx={{ px: 8, mt: 4, width: '100%' }} spacing={2}>\n <OptionsEditorGroup title=\"Visualization settings\">\n <EmbeddedPanelOptionsEditor\n kind=\"GaugeChart\"\n spec={column.plugin.spec}\n onChange={(nextSpec) =>\n onChange({\n ...column,\n plugin: { kind: 'GaugeChart', spec: nextSpec },\n })\n }\n />\n </OptionsEditorGroup>\n </Stack>\n )}\n <Stack sx={{ px: 8, mt: column.plugin?.kind === 'GaugeChart' ? 3 : 0 }}>\n <OptionsEditorGroup title=\"Conditional Cell Format\">\n <ConditionalPanel\n cellSettings={column.cellSettings}\n onChange={(cellSettings) => onChange({ ...column, cellSettings })}\n />\n </OptionsEditorGroup>\n </Stack>\n </Stack>\n );\n}\n"],"names":["Button","ButtonGroup","Stack","Switch","TextField","Typography","useState","AlignSelector","FormatControls","OptionsEditorColumn","OptionsEditorControl","OptionsEditorGrid","OptionsEditorGroup","SortSelectorButtons","PluginKindSelect","ConditionalPanel","DataLinkEditor","EmbeddedPanelOptionsEditor","DEFAULT_FORMAT","unit","shortValues","ColumnEditor","column","onChange","others","width","setWidth","undefined","title","label","control","value","name","e","target","required","header","headerDescription","cellDescription","checked","enableSorting","size","sort","sx","margin","hide","spacing","aria-label","variant","plugin","onClick","kind","spec","color","maxWidth","pluginTypes","type","event","format","newFormat","align","slotProps","htmlInput","min","px","mt","nextSpec","cellSettings"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { UnknownSpec } from '@perses-dev/spec';
2
+ import { ReactElement } from 'react';
3
+ export interface EmbeddedPanelOptionsEditorProps {
4
+ kind: string;
5
+ spec: UnknownSpec;
6
+ onChange: (next: UnknownSpec) => void;
7
+ }
8
+ /**
9
+ * Renders a panel plugin's settings tabs (thresholds, units, colors, …).
10
+ * Used for embedded GaugeChart columns only; other embedded panel kinds use defaults.
11
+ */
12
+ export declare function EmbeddedPanelOptionsEditor({ kind, spec, onChange }: EmbeddedPanelOptionsEditorProps): ReactElement;
13
+ //# sourceMappingURL=EmbeddedPanelOptionsEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddedPanelOptionsEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/ColumnsEditor/EmbeddedPanelOptionsEditor.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAA8B,MAAM,OAAO,CAAC;AAEjE,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;CACvC;AAaD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,+BAA+B,GAAG,YAAY,CAyElH"}
@@ -0,0 +1,114 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright The Perses Authors
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ import { CircularProgress, Stack, Typography } from '@mui/material';
15
+ import { OptionsEditorTabs, usePlugin } from '@perses-dev/plugin-system';
16
+ import merge from 'lodash/merge';
17
+ import { useEffect, useMemo, useRef } from 'react';
18
+ function isSpecEmpty(spec) {
19
+ if (spec === undefined || spec === null) return true;
20
+ if (typeof spec !== 'object') return false;
21
+ return Object.keys(spec).length === 0;
22
+ }
23
+ function mergeWithPluginDefaults(plugin, spec) {
24
+ const initial = plugin.createInitialOptions() ?? {};
25
+ return merge({}, initial, spec ?? {});
26
+ }
27
+ /**
28
+ * Renders a panel plugin's settings tabs (thresholds, units, colors, …).
29
+ * Used for embedded GaugeChart columns only; other embedded panel kinds use defaults.
30
+ */ export function EmbeddedPanelOptionsEditor({ kind, spec, onChange }) {
31
+ const { data: plugin, isLoading, isError, error } = usePlugin('Panel', kind);
32
+ const panelPlugin = plugin;
33
+ const mergedSpec = useMemo(()=>{
34
+ if (!panelPlugin) {
35
+ return spec;
36
+ }
37
+ return mergeWithPluginDefaults(panelPlugin, spec);
38
+ }, [
39
+ panelPlugin,
40
+ spec
41
+ ]);
42
+ const onChangeRef = useRef(onChange);
43
+ onChangeRef.current = onChange;
44
+ // Persist plugin defaults when the column still has an empty spec (e.g. after switching panel kind).
45
+ useEffect(()=>{
46
+ if (!panelPlugin || !isSpecEmpty(spec)) {
47
+ return;
48
+ }
49
+ onChangeRef.current(mergeWithPluginDefaults(panelPlugin, spec));
50
+ }, [
51
+ panelPlugin,
52
+ kind,
53
+ spec
54
+ ]);
55
+ if (isLoading) {
56
+ return /*#__PURE__*/ _jsxs(Stack, {
57
+ direction: "row",
58
+ alignItems: "center",
59
+ spacing: 1,
60
+ sx: {
61
+ py: 1
62
+ },
63
+ children: [
64
+ /*#__PURE__*/ _jsx(CircularProgress, {
65
+ size: 22
66
+ }),
67
+ /*#__PURE__*/ _jsx(Typography, {
68
+ variant: "body2",
69
+ color: "text.secondary",
70
+ children: "Loading panel settings…"
71
+ })
72
+ ]
73
+ });
74
+ }
75
+ if (isError || !plugin) {
76
+ return /*#__PURE__*/ _jsx(Typography, {
77
+ variant: "body2",
78
+ color: "error",
79
+ children: error?.message ?? 'Could not load panel plugin.'
80
+ });
81
+ }
82
+ const loadedPlugin = plugin;
83
+ const editorTabs = loadedPlugin.panelOptionsEditorComponents ?? [];
84
+ if (editorTabs.length === 0) {
85
+ return /*#__PURE__*/ _jsx(Typography, {
86
+ variant: "body2",
87
+ color: "text.secondary",
88
+ children: "This visualization has no editable settings."
89
+ });
90
+ }
91
+ return /*#__PURE__*/ _jsx(Stack, {
92
+ spacing: 2.5,
93
+ sx: {
94
+ width: '100%',
95
+ py: 1
96
+ },
97
+ children: /*#__PURE__*/ _jsx(OptionsEditorTabs, {
98
+ tabs: editorTabs.map((tab)=>{
99
+ const Content = tab.content;
100
+ return {
101
+ label: tab.label,
102
+ content: /*#__PURE__*/ _jsx(Content, {
103
+ value: mergedSpec,
104
+ onChange: (next)=>{
105
+ onChange(next);
106
+ }
107
+ })
108
+ };
109
+ })
110
+ })
111
+ });
112
+ }
113
+
114
+ //# sourceMappingURL=EmbeddedPanelOptionsEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/ColumnsEditor/EmbeddedPanelOptionsEditor.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 { CircularProgress, Stack, Typography } from '@mui/material';\nimport { OptionsEditorTabs, PanelPlugin, usePlugin } from '@perses-dev/plugin-system';\nimport { UnknownSpec } from '@perses-dev/spec';\nimport merge from 'lodash/merge';\nimport { ReactElement, useEffect, useMemo, useRef } from 'react';\n\nexport interface EmbeddedPanelOptionsEditorProps {\n kind: string;\n spec: UnknownSpec;\n onChange: (next: UnknownSpec) => void;\n}\n\nfunction isSpecEmpty(spec: UnknownSpec | undefined): boolean {\n if (spec === undefined || spec === null) return true;\n if (typeof spec !== 'object') return false;\n return Object.keys(spec as object).length === 0;\n}\n\nfunction mergeWithPluginDefaults(plugin: PanelPlugin, spec: UnknownSpec | undefined): UnknownSpec {\n const initial = plugin.createInitialOptions() ?? {};\n return merge({}, initial, spec ?? {}) as UnknownSpec;\n}\n\n/**\n * Renders a panel plugin's settings tabs (thresholds, units, colors, …).\n * Used for embedded GaugeChart columns only; other embedded panel kinds use defaults.\n */\nexport function EmbeddedPanelOptionsEditor({ kind, spec, onChange }: EmbeddedPanelOptionsEditorProps): ReactElement {\n const { data: plugin, isLoading, isError, error } = usePlugin('Panel', kind);\n\n const panelPlugin = plugin as PanelPlugin | undefined;\n\n const mergedSpec = useMemo(() => {\n if (!panelPlugin) {\n return spec;\n }\n return mergeWithPluginDefaults(panelPlugin, spec);\n }, [panelPlugin, spec]);\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Persist plugin defaults when the column still has an empty spec (e.g. after switching panel kind).\n useEffect(() => {\n if (!panelPlugin || !isSpecEmpty(spec)) {\n return;\n }\n onChangeRef.current(mergeWithPluginDefaults(panelPlugin, spec));\n }, [panelPlugin, kind, spec]);\n\n if (isLoading) {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ py: 1 }}>\n <CircularProgress size={22} />\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading panel settings…\n </Typography>\n </Stack>\n );\n }\n\n if (isError || !plugin) {\n return (\n <Typography variant=\"body2\" color=\"error\">\n {error?.message ?? 'Could not load panel plugin.'}\n </Typography>\n );\n }\n\n const loadedPlugin = plugin as PanelPlugin;\n const editorTabs = loadedPlugin.panelOptionsEditorComponents ?? [];\n\n if (editorTabs.length === 0) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n This visualization has no editable settings.\n </Typography>\n );\n }\n\n return (\n <Stack spacing={2.5} sx={{ width: '100%', py: 1 }}>\n <OptionsEditorTabs\n tabs={editorTabs.map((tab) => {\n const Content = tab.content;\n return {\n label: tab.label,\n content: (\n <Content\n value={mergedSpec}\n onChange={(next) => {\n onChange(next as UnknownSpec);\n }}\n />\n ),\n };\n })}\n />\n </Stack>\n );\n}\n"],"names":["CircularProgress","Stack","Typography","OptionsEditorTabs","usePlugin","merge","useEffect","useMemo","useRef","isSpecEmpty","spec","undefined","Object","keys","length","mergeWithPluginDefaults","plugin","initial","createInitialOptions","EmbeddedPanelOptionsEditor","kind","onChange","data","isLoading","isError","error","panelPlugin","mergedSpec","onChangeRef","current","direction","alignItems","spacing","sx","py","size","variant","color","message","loadedPlugin","editorTabs","panelOptionsEditorComponents","width","tabs","map","tab","Content","content","label","value","next"],"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,EAAEC,KAAK,EAAEC,UAAU,QAAQ,gBAAgB;AACpE,SAASC,iBAAiB,EAAeC,SAAS,QAAQ,4BAA4B;AAEtF,OAAOC,WAAW,eAAe;AACjC,SAAuBC,SAAS,EAAEC,OAAO,EAAEC,MAAM,QAAQ,QAAQ;AAQjE,SAASC,YAAYC,IAA6B;IAChD,IAAIA,SAASC,aAAaD,SAAS,MAAM,OAAO;IAChD,IAAI,OAAOA,SAAS,UAAU,OAAO;IACrC,OAAOE,OAAOC,IAAI,CAACH,MAAgBI,MAAM,KAAK;AAChD;AAEA,SAASC,wBAAwBC,MAAmB,EAAEN,IAA6B;IACjF,MAAMO,UAAUD,OAAOE,oBAAoB,MAAM,CAAC;IAClD,OAAOb,MAAM,CAAC,GAAGY,SAASP,QAAQ,CAAC;AACrC;AAEA;;;CAGC,GACD,OAAO,SAASS,2BAA2B,EAAEC,IAAI,EAAEV,IAAI,EAAEW,QAAQ,EAAmC;IAClG,MAAM,EAAEC,MAAMN,MAAM,EAAEO,SAAS,EAAEC,OAAO,EAAEC,KAAK,EAAE,GAAGrB,UAAU,SAASgB;IAEvE,MAAMM,cAAcV;IAEpB,MAAMW,aAAapB,QAAQ;QACzB,IAAI,CAACmB,aAAa;YAChB,OAAOhB;QACT;QACA,OAAOK,wBAAwBW,aAAahB;IAC9C,GAAG;QAACgB;QAAahB;KAAK;IAEtB,MAAMkB,cAAcpB,OAAOa;IAC3BO,YAAYC,OAAO,GAAGR;IAEtB,qGAAqG;IACrGf,UAAU;QACR,IAAI,CAACoB,eAAe,CAACjB,YAAYC,OAAO;YACtC;QACF;QACAkB,YAAYC,OAAO,CAACd,wBAAwBW,aAAahB;IAC3D,GAAG;QAACgB;QAAaN;QAAMV;KAAK;IAE5B,IAAIa,WAAW;QACb,qBACE,MAACtB;YAAM6B,WAAU;YAAMC,YAAW;YAASC,SAAS;YAAGC,IAAI;gBAAEC,IAAI;YAAE;;8BACjE,KAAClC;oBAAiBmC,MAAM;;8BACxB,KAACjC;oBAAWkC,SAAQ;oBAAQC,OAAM;8BAAiB;;;;IAKzD;IAEA,IAAIb,WAAW,CAACR,QAAQ;QACtB,qBACE,KAACd;YAAWkC,SAAQ;YAAQC,OAAM;sBAC/BZ,OAAOa,WAAW;;IAGzB;IAEA,MAAMC,eAAevB;IACrB,MAAMwB,aAAaD,aAAaE,4BAA4B,IAAI,EAAE;IAElE,IAAID,WAAW1B,MAAM,KAAK,GAAG;QAC3B,qBACE,KAACZ;YAAWkC,SAAQ;YAAQC,OAAM;sBAAiB;;IAIvD;IAEA,qBACE,KAACpC;QAAM+B,SAAS;QAAKC,IAAI;YAAES,OAAO;YAAQR,IAAI;QAAE;kBAC9C,cAAA,KAAC/B;YACCwC,MAAMH,WAAWI,GAAG,CAAC,CAACC;gBACpB,MAAMC,UAAUD,IAAIE,OAAO;gBAC3B,OAAO;oBACLC,OAAOH,IAAIG,KAAK;oBAChBD,uBACE,KAACD;wBACCG,OAAOtB;wBACPN,UAAU,CAAC6B;4BACT7B,SAAS6B;wBACX;;gBAGN;YACF;;;AAIR"}
@@ -1,6 +1,6 @@
1
1
  import { PanelData } from '@perses-dev/plugin-system';
2
- import { QueryDataType, UnknownSpec } from '@perses-dev/core';
3
2
  import { ReactElement } from 'react';
3
+ import { QueryDataType, UnknownSpec } from '@perses-dev/spec';
4
4
  interface EmbeddedPanelProps {
5
5
  kind: string;
6
6
  spec: UnknownSpec;
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddedPanel.d.ts","sourceRoot":"","sources":["../../../src/components/EmbeddedPanel.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI9D,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;CAC/C;AAED,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,kBAAkB,GAAG,YAAY,CAS5F"}
1
+ {"version":3,"file":"EmbeddedPanel.d.ts","sourceRoot":"","sources":["../../../src/components/EmbeddedPanel.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAItD,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;CAC/C;AAED,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,kBAAkB,GAAG,YAAY,CAS5F"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/EmbeddedPanel.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 { PanelData } from '@perses-dev/plugin-system';\nimport { QueryDataType, UnknownSpec } from '@perses-dev/core';\nimport { PanelPluginLoader } from '@perses-dev/dashboards';\nimport useResizeObserver from 'use-resize-observer';\nimport { ErrorAlert, ErrorBoundary } from '@perses-dev/components';\nimport { ReactElement } from 'react';\n\ninterface EmbeddedPanelProps {\n kind: string;\n spec: UnknownSpec;\n queryResults: Array<PanelData<QueryDataType>>;\n}\n\nexport function EmbeddedPanel({ kind, spec, queryResults }: EmbeddedPanelProps): ReactElement {\n const { ref, width = 1, height = 1 } = useResizeObserver<HTMLDivElement>();\n return (\n <div ref={ref} style={{ height: '100%' }}>\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <PanelPluginLoader kind={kind} contentDimensions={{ width, height }} spec={spec} queryResults={queryResults} />\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["PanelPluginLoader","useResizeObserver","ErrorAlert","ErrorBoundary","EmbeddedPanel","kind","spec","queryResults","ref","width","height","div","style","FallbackComponent","contentDimensions"],"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;;AAIjC,SAASA,iBAAiB,QAAQ,yBAAyB;AAC3D,OAAOC,uBAAuB,sBAAsB;AACpD,SAASC,UAAU,EAAEC,aAAa,QAAQ,yBAAyB;AASnE,OAAO,SAASC,cAAc,EAAEC,IAAI,EAAEC,IAAI,EAAEC,YAAY,EAAsB;IAC5E,MAAM,EAAEC,GAAG,EAAEC,QAAQ,CAAC,EAAEC,SAAS,CAAC,EAAE,GAAGT;IACvC,qBACE,KAACU;QAAIH,KAAKA;QAAKI,OAAO;YAAEF,QAAQ;QAAO;kBACrC,cAAA,KAACP;YAAcU,mBAAmBX;sBAChC,cAAA,KAACF;gBAAkBK,MAAMA;gBAAMS,mBAAmB;oBAAEL;oBAAOC;gBAAO;gBAAGJ,MAAMA;gBAAMC,cAAcA;;;;AAIvG"}
1
+ {"version":3,"sources":["../../../src/components/EmbeddedPanel.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 { PanelData } from '@perses-dev/plugin-system';\nimport { PanelPluginLoader } from '@perses-dev/dashboards';\nimport useResizeObserver from 'use-resize-observer';\nimport { ErrorAlert, ErrorBoundary } from '@perses-dev/components';\nimport { ReactElement } from 'react';\nimport { QueryDataType, UnknownSpec } from '@perses-dev/spec';\n\ninterface EmbeddedPanelProps {\n kind: string;\n spec: UnknownSpec;\n queryResults: Array<PanelData<QueryDataType>>;\n}\n\nexport function EmbeddedPanel({ kind, spec, queryResults }: EmbeddedPanelProps): ReactElement {\n const { ref, width = 1, height = 1 } = useResizeObserver<HTMLDivElement>();\n return (\n <div ref={ref} style={{ height: '100%' }}>\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <PanelPluginLoader kind={kind} contentDimensions={{ width, height }} spec={spec} queryResults={queryResults} />\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["PanelPluginLoader","useResizeObserver","ErrorAlert","ErrorBoundary","EmbeddedPanel","kind","spec","queryResults","ref","width","height","div","style","FallbackComponent","contentDimensions"],"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;;AAGjC,SAASA,iBAAiB,QAAQ,yBAAyB;AAC3D,OAAOC,uBAAuB,sBAAsB;AACpD,SAASC,UAAU,EAAEC,aAAa,QAAQ,yBAAyB;AAUnE,OAAO,SAASC,cAAc,EAAEC,IAAI,EAAEC,IAAI,EAAEC,YAAY,EAAsB;IAC5E,MAAM,EAAEC,GAAG,EAAEC,QAAQ,CAAC,EAAEC,SAAS,CAAC,EAAE,GAAGT;IACvC,qBACE,KAACU;QAAIH,KAAKA;QAAKI,OAAO;YAAEF,QAAQ;QAAO;kBACrC,cAAA,KAACP;YAAcU,mBAAmBX;sBAChC,cAAA,KAACF;gBAAkBK,MAAMA;gBAAMS,mBAAmB;oBAAEL;oBAAOC;gBAAO;gBAAGJ,MAAMA;gBAAMC,cAAcA;;;;AAIvG"}
@@ -1,6 +1,6 @@
1
- import { TimeSeriesData } from '@perses-dev/core';
2
1
  import { PanelProps } from '@perses-dev/plugin-system';
3
2
  import { ReactElement } from 'react';
3
+ import { TimeSeriesData } from '@perses-dev/spec';
4
4
  import { TableOptions } from '../models';
5
5
  export declare function getTablePanelQueryOptions(spec: TableOptions): {
6
6
  mode: 'instant' | 'range';
@@ -1 +1 @@
1
- {"version":3,"file":"TablePanel.d.ts","sourceRoot":"","sources":["../../../src/components/TablePanel.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAkD,cAAc,EAAiB,MAAM,kBAAkB,CAAC;AAEjH,OAAO,EAGL,UAAU,EAIX,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAqD,MAAM,OAAO,CAAC;AACxF,OAAO,EAAiD,YAAY,EAAE,MAAM,WAAW,CAAC;AA+KxF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAA;CAAE,CAK3F;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AAElE,wBAAgB,UAAU,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAybrG"}
1
+ {"version":3,"file":"TablePanel.d.ts","sourceRoot":"","sources":["../../../src/components/TablePanel.tsx"],"names":[],"mappings":"AAuBA,OAAO,EAIL,UAAU,EAIX,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAqD,MAAM,OAAO,CAAC;AACxF,OAAO,EAAiB,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAA+D,YAAY,EAAE,MAAM,WAAW,CAAC;AAmVtG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAA;CAAE,CAK3F;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AAElE,wBAAgB,UAAU,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CA4brG"}
@@ -12,19 +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';
20
+ import { buildRawTableData, getTablePanelQueryMode } from '../table-data-utils';
21
21
  import { EmbeddedPanel } from './EmbeddedPanel';
22
- 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 = []) {
23
157
  const plugin = column.plugin;
24
158
  if (plugin !== undefined) {
25
159
  return {
26
160
  cell: (ctx)=>{
27
- 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);
28
173
  if (!panelData) return /*#__PURE__*/ _jsx(_Fragment, {});
29
174
  return /*#__PURE__*/ _jsx(EmbeddedPanel, {
30
175
  kind: plugin.kind,
@@ -46,9 +191,11 @@ function generateCellContentConfig(column) {
46
191
  };
47
192
  }
48
193
  function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme }) {
194
+ const [searchTerm, setSearchTerm] = useState('');
49
195
  const values = [
50
196
  ...new Set(allValues)
51
197
  ].filter((v)=>v !== null).sort();
198
+ const filteredValues = searchTerm ? values.filter((v)=>String(v).toLowerCase().includes(searchTerm.toLowerCase())) : values;
52
199
  if (values.length === 0) {
53
200
  return /*#__PURE__*/ _jsx("div", {
54
201
  "data-filter-dropdown": true,
@@ -82,6 +229,23 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
82
229
  overflowY: 'auto'
83
230
  },
84
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
+ }),
85
249
  /*#__PURE__*/ _jsx("div", {
86
250
  style: {
87
251
  marginBottom: 8,
@@ -123,7 +287,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
123
287
  borderTop: `1px solid ${theme.palette.divider}`
124
288
  }
125
289
  }),
126
- values.map((value, index)=>/*#__PURE__*/ _jsx("div", {
290
+ filteredValues.map((value, index)=>/*#__PURE__*/ _jsx("div", {
127
291
  style: {
128
292
  marginBottom: 4
129
293
  },
@@ -176,7 +340,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
176
340
  * Generate column config from column definitions, if a column has multiple definitions, the first one will be used.
177
341
  * If column is hidden, return undefined.
178
342
  * If column do not have a definition, return a default column config.
179
- */ function generateColumnConfig(name, columnSettings, allVariables) {
343
+ */ function generateColumnConfig(name, columnSettings, allVariables, gaugeRangeByColumn, globalCellSettings = []) {
180
344
  for (const column of columnSettings){
181
345
  if (column.name === name) {
182
346
  if (column.hide) {
@@ -195,7 +359,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
195
359
  width,
196
360
  align,
197
361
  dataLink: modifiedDataLink,
198
- ...generateCellContentConfig(column)
362
+ ...generateCellContentConfig(column, gaugeRangeByColumn[name], globalCellSettings)
199
363
  };
200
364
  }
201
365
  }
@@ -207,7 +371,7 @@ function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme
207
371
  export function getTablePanelQueryOptions(spec) {
208
372
  // if any cell renders a panel plugin, perform a range query instead of an instant query
209
373
  return {
210
- mode: (spec.columnSettings ?? []).some((c)=>c.plugin) ? 'range' : 'instant'
374
+ mode: getTablePanelQueryMode(spec)
211
375
  };
212
376
  }
213
377
  export function TablePanel({ contentDimensions, spec, queryResults }) {
@@ -255,53 +419,12 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
255
419
  clearSelection
256
420
  ]);
257
421
  // TODO: handle other query types
258
- const queryMode = getTablePanelQueryOptions(spec).mode;
259
422
  const rawData = useMemo(()=>{
260
- // Transform query results to a tabular format:
261
- // [ { timestamp: 123, value: 456, labelName1: labelValue1 }, ... ]
262
- return queryResults.flatMap((data, queryIndex)=>data.data.series.map((ts)=>({
263
- data,
264
- ts,
265
- queryIndex
266
- }))).map(({ data, ts, queryIndex })=>{
267
- if (ts.values[0] === undefined) {
268
- return {
269
- ...ts.labels
270
- };
271
- }
272
- // If there are multiple queries, we need to add the query index to the value key and label key to avoid conflicts
273
- const valueColumnName = queryResults.length === 1 ? 'value' : `value #${queryIndex + 1}`;
274
- const labels = queryResults.length === 1 ? ts.labels : Object.entries(ts.labels ?? {}).reduce((acc, [key, value])=>{
275
- if (key) acc[`${key} #${queryIndex + 1}`] = value;
276
- return acc;
277
- }, {});
278
- // If the cell visualization is a panel plugin, filter the data by the current series
279
- const columnValue = (spec.columnSettings ?? []).find((x)=>x.name === valueColumnName)?.plugin ? {
280
- ...data,
281
- data: {
282
- ...data.data,
283
- series: data.data.series.filter((s)=>s === ts)
284
- }
285
- } : ts.values[0][1];
286
- if (queryMode === 'instant') {
287
- // Timestamp is not indexed as it will be the same for all queries
288
- return {
289
- timestamp: ts.values[0][0],
290
- [valueColumnName]: columnValue,
291
- ...labels
292
- };
293
- } else {
294
- // Don't add a timestamp for range queries
295
- return {
296
- [valueColumnName]: columnValue,
297
- ...labels
298
- };
299
- }
300
- });
423
+ // Transform query results to a tabular format using shared utility
424
+ return buildRawTableData(queryResults, spec);
301
425
  }, [
302
426
  queryResults,
303
- queryMode,
304
- spec.columnSettings
427
+ spec
305
428
  ]);
306
429
  // Transform will be applied by their orders on the original data
307
430
  const data = useMemo(()=>transformData(rawData, spec.transforms ?? []), [
@@ -333,6 +456,31 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
333
456
  data,
334
457
  keys
335
458
  ]);
459
+ const gaugeRangeByColumn = useMemo(()=>{
460
+ const result = {};
461
+ for (const key of keys){
462
+ let min = Number.POSITIVE_INFINITY;
463
+ let max = Number.NEGATIVE_INFINITY;
464
+ for (const row of data){
465
+ const numericValue = getGaugeNumericValue(row[key]);
466
+ if (numericValue === undefined) {
467
+ continue;
468
+ }
469
+ min = Math.min(min, numericValue);
470
+ max = Math.max(max, numericValue);
471
+ }
472
+ if (min !== Number.POSITIVE_INFINITY && max !== Number.NEGATIVE_INFINITY) {
473
+ result[key] = {
474
+ min,
475
+ max
476
+ };
477
+ }
478
+ }
479
+ return result;
480
+ }, [
481
+ data,
482
+ keys
483
+ ]);
336
484
  // Generate columns and map each column accessor to its settings index and data key
337
485
  const columns = useMemo(()=>{
338
486
  const columns = [];
@@ -340,7 +488,7 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
340
488
  // Process columnSettings if they exist
341
489
  for (const columnSetting of spec.columnSettings ?? []){
342
490
  if (customizedColumns.has(columnSetting.name)) continue; // Skip duplicates
343
- const columnConfig = generateColumnConfig(columnSetting.name, spec.columnSettings ?? [], allVariables);
491
+ const columnConfig = generateColumnConfig(columnSetting.name, spec.columnSettings ?? [], allVariables, gaugeRangeByColumn, spec.cellSettings ?? []);
344
492
  if (columnConfig !== undefined) {
345
493
  columns.push(columnConfig);
346
494
  customizedColumns.add(columnSetting.name);
@@ -350,7 +498,7 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
350
498
  if (!spec.defaultColumnHidden) {
351
499
  for (const key of keys){
352
500
  if (!customizedColumns.has(key)) {
353
- const columnConfig = generateColumnConfig(key, spec.columnSettings ?? [], allVariables);
501
+ const columnConfig = generateColumnConfig(key, spec.columnSettings ?? [], allVariables, gaugeRangeByColumn, spec.cellSettings ?? []);
354
502
  if (columnConfig !== undefined) {
355
503
  columns.push(columnConfig);
356
504
  }
@@ -362,7 +510,9 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
362
510
  keys,
363
511
  spec.columnSettings,
364
512
  spec.defaultColumnHidden,
365
- allVariables
513
+ allVariables,
514
+ gaugeRangeByColumn,
515
+ spec.cellSettings
366
516
  ]);
367
517
  // Generate cell settings that will be used by the table to render cells (text color, background color, ...)
368
518
  const cellConfigs = useMemo(()=>{