@perses-dev/table-plugin 0.14.0-beta.6 → 0.14.0-rc.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 (102) hide show
  1. package/__mf/js/Table.c23fd033.js +7 -0
  2. package/__mf/js/async/1186.20c267af.js +2 -0
  3. package/__mf/js/async/1616.d84cbee4.js +1 -0
  4. package/__mf/js/async/2035.bd661dc8.js +1 -0
  5. package/__mf/js/async/2043.42caf083.js +2 -0
  6. package/__mf/js/async/2062.78b46b95.js +7 -0
  7. package/__mf/js/async/2465.78ed2ed4.js +1 -0
  8. package/__mf/js/async/{3632.b51abb95.js → 3632.f993c12e.js} +1 -1
  9. package/__mf/js/async/392.aea1604d.js +2 -0
  10. package/__mf/js/async/3923.faa624e3.js +1 -0
  11. package/__mf/js/async/4077.3efe0733.js +1 -0
  12. package/__mf/js/async/4121.bf225014.js +2 -0
  13. package/__mf/js/async/4122.b42350f8.js +37 -0
  14. package/__mf/js/async/4496.51793ebb.js +1 -0
  15. package/__mf/js/async/5002.2b1c913a.js +1 -0
  16. package/__mf/js/async/5054.012a111a.js +1 -0
  17. package/__mf/js/async/5071.a517db6c.js +1 -0
  18. package/__mf/js/async/5153.15ce82f3.js +1 -0
  19. package/__mf/js/async/5587.5ac6f61c.js +1 -0
  20. package/__mf/js/async/{5741.85edbe7a.js → 5741.313f45ac.js} +2 -2
  21. package/__mf/js/async/6274.b289bb41.js +2 -0
  22. package/__mf/js/async/7192.46722bc5.js +1 -0
  23. package/__mf/js/async/7534.8bbed71e.js +1 -0
  24. package/__mf/js/async/7862.d18b2d65.js +2 -0
  25. package/__mf/js/async/7893.95e3ddcb.js +88 -0
  26. package/__mf/js/async/7968.8eb91d0d.js +1 -0
  27. package/__mf/js/async/7978.7d4b6ba3.js +1 -0
  28. package/__mf/js/async/8356.29e11868.js +1 -0
  29. package/__mf/js/async/8470.17fe6f67.js +2 -0
  30. package/__mf/js/async/873.a1e99612.js +1 -0
  31. package/__mf/js/async/9207.0e27e1e4.js +1 -0
  32. package/__mf/js/async/9235.c86dc0fb.js +1 -0
  33. package/__mf/js/async/9321.b2a5b9a4.js +1 -0
  34. package/__mf/js/async/941.a29ad240.js +2 -0
  35. package/__mf/js/async/9588.ff3ecfc2.js +1 -0
  36. package/__mf/js/async/9996.4f056fd7.js +3 -0
  37. package/__mf/js/async/__federation_expose_Table.59726d0b.js +1 -0
  38. package/__mf/js/async/lib-router.81d60ade.js +2 -0
  39. package/__mf/js/async/{lib-router.2e723a54.js.LICENSE.txt → lib-router.81d60ade.js.LICENSE.txt} +3 -3
  40. package/__mf/js/main.c67a6e17.js +7 -0
  41. package/lib/TableExportAction.d.ts.map +1 -1
  42. package/lib/TableExportAction.js +14 -11
  43. package/lib/TableExportAction.js.map +1 -1
  44. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.d.ts.map +1 -1
  45. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.js +6 -7
  46. package/lib/components/ColumnsEditor/EmbeddedPanelOptionsEditor.js.map +1 -1
  47. package/lib/components/TablePanel.d.ts.map +1 -1
  48. package/lib/components/TablePanel.js +52 -40
  49. package/lib/components/TablePanel.js.map +1 -1
  50. package/lib/models/model.d.ts.map +1 -1
  51. package/lib/models/model.js.map +1 -1
  52. package/mf-manifest.json +49 -49
  53. package/mf-stats.json +49 -49
  54. package/package.json +5 -5
  55. package/__mf/js/Table.74ce68d2.js +0 -7
  56. package/__mf/js/async/1186.b30cd7c2.js +0 -2
  57. package/__mf/js/async/1616.616e3e86.js +0 -1
  58. package/__mf/js/async/2035.6ce5a9e8.js +0 -1
  59. package/__mf/js/async/2043.73864be1.js +0 -2
  60. package/__mf/js/async/2465.6d0201a3.js +0 -1
  61. package/__mf/js/async/2880.991512a2.js +0 -7
  62. package/__mf/js/async/3487.82720bc5.js +0 -88
  63. package/__mf/js/async/392.88ef848b.js +0 -2
  64. package/__mf/js/async/3923.4b1923c4.js +0 -1
  65. package/__mf/js/async/4077.8b903aa1.js +0 -1
  66. package/__mf/js/async/4121.1dced672.js +0 -2
  67. package/__mf/js/async/4122.930ddc34.js +0 -37
  68. package/__mf/js/async/4496.02bca694.js +0 -1
  69. package/__mf/js/async/5002.75c8a96d.js +0 -1
  70. package/__mf/js/async/5054.1d9577f4.js +0 -1
  71. package/__mf/js/async/5071.252afd92.js +0 -1
  72. package/__mf/js/async/5153.2905f2df.js +0 -1
  73. package/__mf/js/async/5587.b1eef6c0.js +0 -1
  74. package/__mf/js/async/5812.a68c6304.js +0 -3
  75. package/__mf/js/async/6274.6ab8db5f.js +0 -2
  76. package/__mf/js/async/7192.fc0b0127.js +0 -1
  77. package/__mf/js/async/7534.144929ed.js +0 -1
  78. package/__mf/js/async/7862.b6a49907.js +0 -2
  79. package/__mf/js/async/7968.89dd6052.js +0 -1
  80. package/__mf/js/async/7978.69b64cf0.js +0 -1
  81. package/__mf/js/async/8356.8e40018e.js +0 -1
  82. package/__mf/js/async/8470.1c46d427.js +0 -2
  83. package/__mf/js/async/873.0df02e24.js +0 -1
  84. package/__mf/js/async/9207.96c0a1de.js +0 -1
  85. package/__mf/js/async/9235.73b7aea4.js +0 -1
  86. package/__mf/js/async/9321.cabceee6.js +0 -1
  87. package/__mf/js/async/941.1b6190a2.js +0 -2
  88. package/__mf/js/async/9588.4fe4576b.js +0 -1
  89. package/__mf/js/async/__federation_expose_Table.9d473452.js +0 -1
  90. package/__mf/js/async/lib-router.2e723a54.js +0 -2
  91. package/__mf/js/main.749ef1fe.js +0 -7
  92. /package/__mf/css/async/{2880.85c2cbf6.css → 2062.85c2cbf6.css} +0 -0
  93. /package/__mf/js/async/{2043.73864be1.js.LICENSE.txt → 2043.42caf083.js.LICENSE.txt} +0 -0
  94. /package/__mf/js/async/{2880.991512a2.js.LICENSE.txt → 2062.78b46b95.js.LICENSE.txt} +0 -0
  95. /package/__mf/js/async/{392.88ef848b.js.LICENSE.txt → 392.aea1604d.js.LICENSE.txt} +0 -0
  96. /package/__mf/js/async/{4121.1dced672.js.LICENSE.txt → 4121.bf225014.js.LICENSE.txt} +0 -0
  97. /package/__mf/js/async/{5741.85edbe7a.js.LICENSE.txt → 5741.313f45ac.js.LICENSE.txt} +0 -0
  98. /package/__mf/js/async/{6274.6ab8db5f.js.LICENSE.txt → 6274.b289bb41.js.LICENSE.txt} +0 -0
  99. /package/__mf/js/async/{7862.b6a49907.js.LICENSE.txt → 7862.d18b2d65.js.LICENSE.txt} +0 -0
  100. /package/__mf/js/async/{3487.82720bc5.js.LICENSE.txt → 7893.95e3ddcb.js.LICENSE.txt} +0 -0
  101. /package/__mf/js/async/{8470.1c46d427.js.LICENSE.txt → 8470.17fe6f67.js.LICENSE.txt} +0 -0
  102. /package/__mf/js/async/{941.1b6190a2.js.LICENSE.txt → 941.a29ad240.js.LICENSE.txt} +0 -0
@@ -15,7 +15,7 @@ import { Box, Typography, useTheme } from "@mui/material";
15
15
  import { formatValue, Table, transformData, useSelection } from "@perses-dev/components";
16
16
  import { useSelectionItemActions } from "@perses-dev/dashboards";
17
17
  import { CalculationsMap, replaceVariablesInString, useAllVariableValues } from "@perses-dev/plugin-system";
18
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
18
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
19
19
  import { createPortal } from "react-dom";
20
20
  import { evaluateConditionalFormatting } from "../models/index.js";
21
21
  import { buildRawTableData, getTablePanelQueryMode } from "../table-data-utils.js";
@@ -387,7 +387,7 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
387
387
  });
388
388
  const filteredDataRef = useRef([]);
389
389
  // Refs used to keep the filter row in sync with the table's horizontal
390
- const panelContainerRef = useRef(null);
390
+ const [panelContainer, setPanelContainer] = useState(null);
391
391
  const filterRowInnerRef = useRef(null);
392
392
  const filterCellRefs = useRef([]);
393
393
  // Convert selectionMap to TanStack's RowSelectionState format
@@ -665,10 +665,10 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
665
665
  });
666
666
  setOpenFilterColumn(columnId);
667
667
  };
668
- const handleFilterClose = ()=>{
668
+ const handleFilterClose = useCallback(()=>{
669
669
  setFilterAnchorEl({});
670
670
  setOpenFilterColumn(null);
671
- };
671
+ }, []);
672
672
  // Close filter when clicking outside
673
673
  useEffect(()=>{
674
674
  if (!openFilterColumn) return;
@@ -686,34 +686,33 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
686
686
  document.removeEventListener('click', handleClick);
687
687
  };
688
688
  }, [
689
- openFilterColumn
689
+ openFilterColumn,
690
+ handleFilterClose
690
691
  ]);
691
692
  // Keep ref in sync with filtered data for use in selection handler
692
- filteredDataRef.current = filteredData;
693
+ useLayoutEffect(()=>{
694
+ filteredDataRef.current = filteredData;
695
+ }, [
696
+ filteredData
697
+ ]);
693
698
  const [pagination, setPagination] = useState(spec.pagination ? {
694
699
  pageIndex: 0,
695
700
  pageSize: 10
696
701
  } : undefined);
697
- useEffect(()=>{
698
- // If the pagination setting changes from no pagination to pagination, but the pagination state is undefined, update the pagination state
699
- if (spec.pagination && !pagination) {
700
- setPagination({
701
- pageIndex: 0,
702
- pageSize: 10
703
- });
704
- } else if (!spec.pagination && pagination) {
705
- setPagination(undefined);
706
- }
707
- }, [
708
- spec.pagination,
709
- pagination
710
- ]);
702
+ if (spec.pagination && !pagination) {
703
+ setPagination({
704
+ pageIndex: 0,
705
+ pageSize: 10
706
+ });
707
+ } else if (!spec.pagination && pagination) {
708
+ setPagination(undefined);
709
+ }
711
710
  // Sync the filter row's horizontal position with the table scroll.
712
711
  useEffect(()=>{
713
712
  if (!spec.enableFiltering) {
714
713
  return;
715
714
  }
716
- const scrollContainer = panelContainerRef.current?.querySelector('.MuiTableContainer-root');
715
+ const scrollContainer = panelContainer?.querySelector('.MuiTableContainer-root');
717
716
  const filterRowInner = filterRowInnerRef.current;
718
717
  if (!scrollContainer || !filterRowInner) {
719
718
  return;
@@ -723,7 +722,7 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
723
722
  setOpenFilterColumn((current)=>current === null ? current : null);
724
723
  setFilterAnchorEl((current)=>Object.keys(current).length === 0 ? current : {});
725
724
  };
726
- syncFilterRowScroll();
725
+ filterRowInner.style.transform = `translateX(-${scrollContainer.scrollLeft}px)`;
727
726
  scrollContainer.addEventListener('scroll', syncFilterRowScroll, {
728
727
  passive: true
729
728
  });
@@ -731,23 +730,18 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
731
730
  scrollContainer.removeEventListener('scroll', syncFilterRowScroll);
732
731
  };
733
732
  }, [
734
- spec.enableFiltering,
735
- columns,
736
- contentDimensions
733
+ panelContainer,
734
+ spec.enableFiltering
737
735
  ]);
738
736
  // Sync filter cell widths with the actual rendered table column widths to keep them aligned.
739
737
  useEffect(()=>{
740
738
  if (!spec.enableFiltering) {
741
739
  return;
742
740
  }
743
- const scrollContainer = panelContainerRef.current?.querySelector('.MuiTableContainer-root');
741
+ const scrollContainer = panelContainer?.querySelector('.MuiTableContainer-root');
744
742
  if (!scrollContainer) {
745
743
  return;
746
744
  }
747
- const headerRow = scrollContainer.querySelector('thead tr');
748
- if (!headerRow) {
749
- return;
750
- }
751
745
  const syncColumnWidths = ()=>{
752
746
  const headerCells = scrollContainer.querySelectorAll('thead tr th');
753
747
  columns.forEach((_, idx)=>{
@@ -762,21 +756,39 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
762
756
  filterCell.style.maxWidth = width;
763
757
  });
764
758
  };
765
- syncColumnWidths();
766
- // Re-sync whenever the header row's size changes
759
+ // Re-sync whenever the header row's size changes.
767
760
  const resizeObserver = new ResizeObserver(syncColumnWidths);
768
- if (headerRow) {
769
- resizeObserver.observe(headerRow);
770
- }
761
+ // The virtualized table remounts its header row when its width, rows, or columns change,
762
+ // so follow the current header row instead of observing a detached one.
763
+ let headerRow = null;
764
+ const observeHeaderRow = ()=>{
765
+ const currentHeaderRow = scrollContainer.querySelector('thead tr');
766
+ if (currentHeaderRow === headerRow) {
767
+ return;
768
+ }
769
+ if (headerRow) {
770
+ resizeObserver.unobserve(headerRow);
771
+ }
772
+ headerRow = currentHeaderRow;
773
+ if (headerRow) {
774
+ resizeObserver.observe(headerRow);
775
+ }
776
+ syncColumnWidths();
777
+ };
778
+ observeHeaderRow();
779
+ const mutationObserver = new MutationObserver(observeHeaderRow);
780
+ mutationObserver.observe(scrollContainer, {
781
+ childList: true,
782
+ subtree: true
783
+ });
771
784
  return ()=>{
785
+ mutationObserver.disconnect();
772
786
  resizeObserver.disconnect();
773
787
  };
774
788
  }, [
789
+ panelContainer,
775
790
  spec.enableFiltering,
776
- columns,
777
- contentDimensions,
778
- selectionEnabled,
779
- actionButtons
791
+ columns
780
792
  ]);
781
793
  if (contentDimensions === undefined) {
782
794
  return null;
@@ -795,7 +807,7 @@ export function TablePanel({ contentDimensions, spec, queryResults }) {
795
807
  });
796
808
  }
797
809
  return /*#__PURE__*/ _jsxs("div", {
798
- ref: panelContainerRef,
810
+ ref: setPanelContainer,
799
811
  style: {
800
812
  display: 'contents'
801
813
  },
@@ -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 type { Theme } from '@mui/material';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport type { FormatOptions, TableCellConfigs, TableColumnConfig } from '@perses-dev/components';\nimport { formatValue, Table, transformData, useSelection } from '@perses-dev/components';\nimport { useSelectionItemActions } from '@perses-dev/dashboards';\nimport type { ActionOptions, PanelData, PanelProps, VariableStateMap } from '@perses-dev/plugin-system';\nimport { CalculationsMap, replaceVariablesInString, useAllVariableValues } from '@perses-dev/plugin-system';\nimport type { JsonData, QueryDataType, TimeSeriesData } from '@perses-dev/spec';\nimport type { ColumnFiltersState, PaginationState, RowSelectionState, SortingState } from '@tanstack/react-table';\nimport type { ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport type { CellSettings, ColumnSettings, TableOptions } from '../models';\nimport { evaluateConditionalFormatting } 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).toSorted();\n const filteredValues = searchTerm\n ? values.filter((v) => String(v.formatted).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 <Box\n component=\"label\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n padding: '2px 0',\n borderRadius: '2px',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\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 </Box>\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 defaultEnableSorting = false,\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: enableSorting ?? defaultEnableSorting,\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 enableSorting: defaultEnableSorting,\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 | JsonData>;\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 // Refs used to keep the filter row in sync with the table's horizontal\n const panelContainerRef = useRef<HTMLDivElement>(null);\n const filterRowInnerRef = useRef<HTMLDivElement>(null);\n const filterCellRefs = useRef<Array<HTMLDivElement | null>>([]);\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 // Include column names from columnSettings so that columns with no data\n // are still extended with undefined for cellSettings evaluation (e.g. N/A for null)\n for (const col of spec.columnSettings ?? []) {\n if (!result.includes(col.name)) {\n result.push(col.name);\n }\n }\n\n return result;\n }, [data, spec.columnSettings]);\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 spec.enableSorting ?? false,\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 spec.enableSorting ?? false,\n );\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n }\n }\n\n return columns;\n }, [\n keys,\n spec.columnSettings,\n spec.defaultColumnHidden,\n spec.enableSorting,\n allVariables,\n gaugeRangeByColumn,\n spec.cellSettings,\n ]);\n\n // Filtering state — declared before cellConfigs so filteredData is available for cell config evaluation\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n\n // filter data based on the current filters\n const filteredData = useMemo(() => {\n if (!spec.enableFiltering || columnFilters.length === 0) {\n return data;\n }\n\n return data.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;\n\n return filterValues.includes(value as string | number);\n });\n });\n }, [data, columnFilters, spec.enableFiltering]);\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 filteredData) {\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 }, [filteredData, 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 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\n if (openFilterColumn === columnId) {\n handleFilterClose();\n return;\n }\n\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 // 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 // Sync the filter row's horizontal position with the table scroll.\n useEffect(() => {\n if (!spec.enableFiltering) {\n return;\n }\n\n const scrollContainer = panelContainerRef.current?.querySelector<HTMLElement>('.MuiTableContainer-root');\n const filterRowInner = filterRowInnerRef.current;\n\n if (!scrollContainer || !filterRowInner) {\n return;\n }\n\n const syncFilterRowScroll = (): void => {\n filterRowInner.style.transform = `translateX(-${scrollContainer.scrollLeft}px)`;\n\n setOpenFilterColumn((current) => (current === null ? current : null));\n setFilterAnchorEl((current) => (Object.keys(current).length === 0 ? current : {}));\n };\n\n syncFilterRowScroll();\n\n scrollContainer.addEventListener('scroll', syncFilterRowScroll, { passive: true });\n return (): void => {\n scrollContainer.removeEventListener('scroll', syncFilterRowScroll);\n };\n }, [spec.enableFiltering, columns, contentDimensions]);\n\n // Sync filter cell widths with the actual rendered table column widths to keep them aligned.\n useEffect(() => {\n if (!spec.enableFiltering) {\n return;\n }\n\n const scrollContainer = panelContainerRef.current?.querySelector<HTMLElement>('.MuiTableContainer-root');\n if (!scrollContainer) {\n return;\n }\n\n const headerRow = scrollContainer.querySelector('thead tr');\n if (!headerRow) {\n return;\n }\n\n const syncColumnWidths = (): void => {\n const headerCells = scrollContainer.querySelectorAll<HTMLElement>('thead tr th');\n\n columns.forEach((_, idx) => {\n const headerCell = headerCells[idx];\n const filterCell = filterCellRefs.current[idx];\n if (!headerCell || !filterCell) {\n return;\n }\n\n const width = `${headerCell.getBoundingClientRect().width}px`;\n filterCell.style.width = width;\n filterCell.style.minWidth = width;\n filterCell.style.maxWidth = width;\n });\n };\n\n syncColumnWidths();\n\n // Re-sync whenever the header row's size changes\n const resizeObserver = new ResizeObserver(syncColumnWidths);\n if (headerRow) {\n resizeObserver.observe(headerRow);\n }\n\n return (): void => {\n resizeObserver.disconnect();\n };\n }, [spec.enableFiltering, columns, contentDimensions, selectionEnabled, actionButtons]);\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 <div ref={panelContainerRef} style={{ display: 'contents' }}>\n {confirmDialog}\n {spec.enableFiltering && (\n <div\n style={{\n overflow: 'hidden',\n background: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n width: contentDimensions.width,\n boxSizing: 'border-box',\n }}\n >\n <div\n ref={filterRowInnerRef}\n style={{\n display: 'flex',\n width: 'max-content',\n willChange: 'transform',\n }}\n >\n {columns.map((column, idx) => {\n const filters = getSelectedFilterValues(column.accessorKey as string);\n const columnWidth = column.width || spec.defaultColumnWidth;\n const anchorEl = filterAnchorEl[column.accessorKey as string];\n\n return (\n <div\n key={`column-${column.accessorKey}`}\n ref={(el) => {\n filterCellRefs.current[idx] = el;\n }}\n style={{\n padding: '8px',\n borderRight: idx < columns.length - 1 ? `1px solid ${theme.palette.divider}` : 'none',\n // These are just a starting size for the first paint —\n // the width-sync effect above overwrites them with the\n // table's actual rendered column widths.\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n flex: 'none',\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 anchorEl &&\n createPortal(\n <div\n style={{\n position: 'fixed',\n top: anchorEl.getBoundingClientRect().bottom + 4,\n left: anchorEl.getBoundingClientRect().left,\n zIndex: theme.zIndex.modal,\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 document.body,\n )}\n </div>\n );\n })}\n </div>\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 </div>\n );\n}\n"],"names":["Box","Typography","useTheme","formatValue","Table","transformData","useSelection","useSelectionItemActions","CalculationsMap","replaceVariablesInString","useAllVariableValues","useCallback","useEffect","useMemo","useRef","useState","createPortal","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","toSorted","filteredValues","String","formatted","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","component","action","hover","generateColumnConfig","columnSettings","allVariables","gaugeRangeByColumn","defaultEnableSorting","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","panelContainerRef","filterRowInnerRef","filterCellRefs","rowSelection","result","forEach","_","id","handleRowSelectionChange","newRowSelection","newSelection","isSelected","Object","entries","parseInt","current","push","item","rawData","transforms","keys","entry","key","col","columnsFormat","settings","i","columnUniqueValues","uniqueValues","formatOption","usedValues","Map","row","val","get","set","POSITIVE_INFINITY","NEGATIVE_INFINITY","columns","customizedColumns","columnSetting","has","columnConfig","add","defaultColumnHidden","columnFilters","setColumnFilters","filteredData","enableFiltering","every","filterValues","cellConfigs","some","keysAsObj","reduce","acc","extendRow","find","generateDefaultSortingState","sort","desc","sorting","setSorting","filterAnchorEl","setFilterAnchorEl","openFilterColumn","setOpenFilterColumn","getSelectedFilterValues","columnId","f","updateColumnFilter","newFilters","handleFilterClick","event","preventDefault","stopPropagation","handleFilterClose","currentTarget","handleClick","closest","timer","setTimeout","document","addEventListener","clearTimeout","removeEventListener","pagination","setPagination","pageIndex","pageSize","scrollContainer","querySelector","filterRowInner","syncFilterRowScroll","transform","scrollLeft","passive","headerRow","syncColumnWidths","headerCells","querySelectorAll","idx","headerCell","filterCell","getBoundingClientRect","maxWidth","resizeObserver","ResizeObserver","observe","disconnect","justifyContent","ref","borderBottom","willChange","filters","columnWidth","defaultColumnWidth","anchorEl","el","borderRight","position","flex","textOverflow","whiteSpace","button","onClick","main","flexShrink","transition","onMouseEnter","onMouseLeave","top","bottom","left","zIndex","modal","body","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 type { Theme } from '@mui/material';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport type { FormatOptions, TableCellConfigs, TableColumnConfig } from '@perses-dev/components';\nimport { formatValue, Table, transformData, useSelection } from '@perses-dev/components';\nimport { useSelectionItemActions } from '@perses-dev/dashboards';\nimport type { ActionOptions, PanelData, PanelProps, VariableStateMap } from '@perses-dev/plugin-system';\nimport { CalculationsMap, replaceVariablesInString, useAllVariableValues } from '@perses-dev/plugin-system';\nimport type { JsonData, QueryDataType, TimeSeriesData } from '@perses-dev/spec';\nimport type { ColumnFiltersState, PaginationState, RowSelectionState, SortingState } from '@tanstack/react-table';\nimport type { ReactElement } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport type { CellSettings, ColumnSettings, TableOptions } from '../models';\nimport { evaluateConditionalFormatting } 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<ReactElement | string | number>();\n return typeof cellValue === 'number' && column.format\n ? formatValue(cellValue, column.format)\n : (cellValue as ReactElement | string);\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).toSorted();\n const filteredValues = searchTerm\n ? values.filter((v) => String(v.formatted).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 <Box\n component=\"label\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n padding: '2px 0',\n borderRadius: '2px',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\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 </Box>\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 defaultEnableSorting = false,\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: enableSorting ?? defaultEnableSorting,\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 enableSorting: defaultEnableSorting,\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 | JsonData>;\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 // Refs used to keep the filter row in sync with the table's horizontal\n const [panelContainer, setPanelContainer] = useState<HTMLDivElement | null>(null);\n const filterRowInnerRef = useRef<HTMLDivElement>(null);\n const filterCellRefs = useRef<Array<HTMLDivElement | null>>([]);\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 // Include column names from columnSettings so that columns with no data\n // are still extended with undefined for cellSettings evaluation (e.g. N/A for null)\n for (const col of spec.columnSettings ?? []) {\n if (!result.includes(col.name)) {\n result.push(col.name);\n }\n }\n\n return result;\n }, [data, spec.columnSettings]);\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 spec.enableSorting ?? false,\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 spec.enableSorting ?? false,\n );\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n }\n }\n\n return columns;\n }, [\n keys,\n spec.columnSettings,\n spec.defaultColumnHidden,\n spec.enableSorting,\n allVariables,\n gaugeRangeByColumn,\n spec.cellSettings,\n ]);\n\n // Filtering state — declared before cellConfigs so filteredData is available for cell config evaluation\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n\n // filter data based on the current filters\n const filteredData = useMemo(() => {\n if (!spec.enableFiltering || columnFilters.length === 0) {\n return data;\n }\n\n return data.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;\n\n return filterValues.includes(value as string | number);\n });\n });\n }, [data, columnFilters, spec.enableFiltering]);\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 filteredData) {\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 }, [filteredData, 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 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\n if (openFilterColumn === columnId) {\n handleFilterClose();\n return;\n }\n\n setFilterAnchorEl({ ...filterAnchorEl, [columnId]: event.currentTarget });\n setOpenFilterColumn(columnId);\n };\n\n const handleFilterClose = useCallback((): 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, handleFilterClose]);\n\n // Keep ref in sync with filtered data for use in selection handler\n useLayoutEffect(() => {\n filteredDataRef.current = filteredData;\n }, [filteredData]);\n\n const [pagination, setPagination] = useState<PaginationState | undefined>(\n spec.pagination ? { pageIndex: 0, pageSize: 10 } : undefined,\n );\n\n if (spec.pagination && !pagination) {\n setPagination({ pageIndex: 0, pageSize: 10 });\n } else if (!spec.pagination && pagination) {\n setPagination(undefined);\n }\n\n // Sync the filter row's horizontal position with the table scroll.\n useEffect(() => {\n if (!spec.enableFiltering) {\n return;\n }\n\n const scrollContainer = panelContainer?.querySelector<HTMLElement>('.MuiTableContainer-root');\n const filterRowInner = filterRowInnerRef.current;\n\n if (!scrollContainer || !filterRowInner) {\n return;\n }\n\n const syncFilterRowScroll = (): void => {\n filterRowInner.style.transform = `translateX(-${scrollContainer.scrollLeft}px)`;\n\n setOpenFilterColumn((current) => (current === null ? current : null));\n setFilterAnchorEl((current) => (Object.keys(current).length === 0 ? current : {}));\n };\n\n filterRowInner.style.transform = `translateX(-${scrollContainer.scrollLeft}px)`;\n\n scrollContainer.addEventListener('scroll', syncFilterRowScroll, { passive: true });\n return (): void => {\n scrollContainer.removeEventListener('scroll', syncFilterRowScroll);\n };\n }, [panelContainer, spec.enableFiltering]);\n\n // Sync filter cell widths with the actual rendered table column widths to keep them aligned.\n useEffect(() => {\n if (!spec.enableFiltering) {\n return;\n }\n\n const scrollContainer = panelContainer?.querySelector<HTMLElement>('.MuiTableContainer-root');\n if (!scrollContainer) {\n return;\n }\n\n const syncColumnWidths = (): void => {\n const headerCells = scrollContainer.querySelectorAll<HTMLElement>('thead tr th');\n\n columns.forEach((_, idx) => {\n const headerCell = headerCells[idx];\n const filterCell = filterCellRefs.current[idx];\n if (!headerCell || !filterCell) {\n return;\n }\n\n const width = `${headerCell.getBoundingClientRect().width}px`;\n filterCell.style.width = width;\n filterCell.style.minWidth = width;\n filterCell.style.maxWidth = width;\n });\n };\n\n // Re-sync whenever the header row's size changes.\n const resizeObserver = new ResizeObserver(syncColumnWidths);\n // The virtualized table remounts its header row when its width, rows, or columns change,\n // so follow the current header row instead of observing a detached one.\n let headerRow: Element | null = null;\n const observeHeaderRow = (): void => {\n const currentHeaderRow = scrollContainer.querySelector('thead tr');\n if (currentHeaderRow === headerRow) {\n return;\n }\n if (headerRow) {\n resizeObserver.unobserve(headerRow);\n }\n headerRow = currentHeaderRow;\n if (headerRow) {\n resizeObserver.observe(headerRow);\n }\n syncColumnWidths();\n };\n\n observeHeaderRow();\n const mutationObserver = new MutationObserver(observeHeaderRow);\n mutationObserver.observe(scrollContainer, { childList: true, subtree: true });\n\n return (): void => {\n mutationObserver.disconnect();\n resizeObserver.disconnect();\n };\n }, [panelContainer, spec.enableFiltering, columns]);\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 <div ref={setPanelContainer} style={{ display: 'contents' }}>\n {confirmDialog}\n {spec.enableFiltering && (\n <div\n style={{\n overflow: 'hidden',\n background: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n width: contentDimensions.width,\n boxSizing: 'border-box',\n }}\n >\n <div\n ref={filterRowInnerRef}\n style={{\n display: 'flex',\n width: 'max-content',\n willChange: 'transform',\n }}\n >\n {columns.map((column, idx) => {\n const filters = getSelectedFilterValues(column.accessorKey as string);\n const columnWidth = column.width || spec.defaultColumnWidth;\n const anchorEl = filterAnchorEl[column.accessorKey as string];\n\n return (\n <div\n key={`column-${column.accessorKey}`}\n ref={(el) => {\n filterCellRefs.current[idx] = el;\n }}\n style={{\n padding: '8px',\n borderRight: idx < columns.length - 1 ? `1px solid ${theme.palette.divider}` : 'none',\n // These are just a starting size for the first paint —\n // the width-sync effect above overwrites them with the\n // table's actual rendered column widths.\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n flex: 'none',\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 anchorEl &&\n createPortal(\n <div\n style={{\n position: 'fixed',\n top: anchorEl.getBoundingClientRect().bottom + 4,\n left: anchorEl.getBoundingClientRect().left,\n zIndex: theme.zIndex.modal,\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 document.body,\n )}\n </div>\n );\n })}\n </div>\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 </div>\n );\n}\n"],"names":["Box","Typography","useTheme","formatValue","Table","transformData","useSelection","useSelectionItemActions","CalculationsMap","replaceVariablesInString","useAllVariableValues","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","createPortal","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","toSorted","filteredValues","String","formatted","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","component","action","hover","generateColumnConfig","columnSettings","allVariables","gaugeRangeByColumn","defaultEnableSorting","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","panelContainer","setPanelContainer","filterRowInnerRef","filterCellRefs","rowSelection","result","forEach","_","id","handleRowSelectionChange","newRowSelection","newSelection","isSelected","Object","entries","parseInt","current","push","item","rawData","transforms","keys","entry","key","col","columnsFormat","settings","i","columnUniqueValues","uniqueValues","formatOption","usedValues","Map","row","val","get","set","POSITIVE_INFINITY","NEGATIVE_INFINITY","columns","customizedColumns","columnSetting","has","columnConfig","add","defaultColumnHidden","columnFilters","setColumnFilters","filteredData","enableFiltering","every","filterValues","cellConfigs","some","keysAsObj","reduce","acc","extendRow","find","generateDefaultSortingState","sort","desc","sorting","setSorting","filterAnchorEl","setFilterAnchorEl","openFilterColumn","setOpenFilterColumn","getSelectedFilterValues","columnId","f","updateColumnFilter","newFilters","handleFilterClick","event","preventDefault","stopPropagation","handleFilterClose","currentTarget","handleClick","closest","timer","setTimeout","document","addEventListener","clearTimeout","removeEventListener","pagination","setPagination","pageIndex","pageSize","scrollContainer","querySelector","filterRowInner","syncFilterRowScroll","transform","scrollLeft","passive","syncColumnWidths","headerCells","querySelectorAll","idx","headerCell","filterCell","getBoundingClientRect","maxWidth","resizeObserver","ResizeObserver","headerRow","observeHeaderRow","currentHeaderRow","unobserve","observe","mutationObserver","MutationObserver","childList","subtree","disconnect","justifyContent","ref","borderBottom","willChange","filters","columnWidth","defaultColumnWidth","anchorEl","el","borderRight","position","flex","textOverflow","whiteSpace","button","onClick","main","flexShrink","transition","onMouseEnter","onMouseLeave","top","bottom","left","zIndex","modal","body","density","defaultColumnHeight","onSortingChange","onPaginationChange","checkboxSelection","onRowSelectionChange","getItemActions","hasItemActions"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/models/model.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5D,UAAU,sBAAsB;CAAG;AAEnC,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/models/model.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,UAAU,sBAAsB;CAAG;AAEnC,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/models/model.ts"],"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 type { PanelProps } from '@perses-dev/plugin-system';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface TimeSeriesTableOptions {}\n\nexport type TimeSeriesTableProps = PanelProps<TimeSeriesTableOptions>;\n"],"names":[],"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;AAOjC,WAAsE"}
1
+ {"version":3,"sources":["../../../src/models/model.ts"],"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 type { PanelProps } from '@perses-dev/plugin-system';\n\ninterface TimeSeriesTableOptions {}\n\nexport type TimeSeriesTableProps = PanelProps<TimeSeriesTableOptions>;\n"],"names":[],"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;AAMjC,WAAsE"}