@perses-dev/table-plugin 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/__mf/js/{Table.2fc0ce5e.js → Table.057041ac.js} +3 -3
  2. package/__mf/js/async/208.2b17c08c.js +3 -0
  3. package/__mf/js/async/2082.78532c3c.js +1 -0
  4. package/__mf/js/async/54.8b007a26.js +22 -0
  5. package/__mf/js/async/550.8bab52fc.js +7 -0
  6. package/__mf/js/async/9701.3b068d23.js +1 -0
  7. package/__mf/js/async/__federation_expose_Table.5e9f3060.js +1 -0
  8. package/__mf/js/{main.83aeba98.js → main.2181a7b4.js} +3 -3
  9. package/lib/Table.d.ts.map +1 -1
  10. package/lib/Table.js +8 -1
  11. package/lib/Table.js.map +1 -1
  12. package/lib/TableExportAction.d.ts +4 -0
  13. package/lib/TableExportAction.d.ts.map +1 -0
  14. package/lib/TableExportAction.js +70 -0
  15. package/lib/TableExportAction.js.map +1 -0
  16. package/lib/cjs/Table.js +8 -1
  17. package/lib/cjs/TableExportAction.js +124 -0
  18. package/lib/cjs/components/TablePanel.js +1 -1
  19. package/lib/components/ConditionalPanel.d.ts +3 -2
  20. package/lib/components/ConditionalPanel.d.ts.map +1 -1
  21. package/lib/components/ConditionalPanel.js.map +1 -1
  22. package/lib/components/EmbeddedPanel.d.ts +2 -1
  23. package/lib/components/EmbeddedPanel.d.ts.map +1 -1
  24. package/lib/components/EmbeddedPanel.js.map +1 -1
  25. package/lib/components/TablePanel.js +1 -1
  26. package/lib/components/TablePanel.js.map +1 -1
  27. package/mf-manifest.json +15 -15
  28. package/mf-stats.json +16 -16
  29. package/package.json +5 -5
  30. package/__mf/js/async/4510.a0a1dd48.js +0 -7
  31. package/__mf/js/async/54.467c4f98.js +0 -22
  32. package/__mf/js/async/5413.6d8fc766.js +0 -1
  33. package/__mf/js/async/7794.0374cd38.js +0 -1
  34. package/__mf/js/async/9010.fd805430.js +0 -1
  35. package/__mf/js/async/__federation_expose_Table.b3466cfe.js +0 -1
  36. /package/__mf/js/async/{54.467c4f98.js.LICENSE.txt → 54.8b007a26.js.LICENSE.txt} +0 -0
  37. /package/__mf/js/async/{4510.a0a1dd48.js.LICENSE.txt → 550.8bab52fc.js.LICENSE.txt} +0 -0
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { TableProps } from './components';
3
+ export declare const TableExportAction: React.FC<TableProps>;
4
+ //# sourceMappingURL=TableExportAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableExportAction.d.ts","sourceRoot":"","sources":["../../src/TableExportAction.tsx"],"names":[],"mappings":"AAaA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAKpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CA6ClD,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx } 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 React, { useCallback, useMemo } from 'react';
15
+ import { exportDataAsCSV, extractExportableData, isExportableData, sanitizeFilename } from '@perses-dev/plugin-system';
16
+ import { InfoTooltip } from '@perses-dev/components';
17
+ import { IconButton } from '@mui/material';
18
+ import DownloadIcon from 'mdi-material-ui/Download';
19
+ export const TableExportAction = ({ queryResults, definition })=>{
20
+ const exportableData = useMemo(()=>{
21
+ return extractExportableData(queryResults);
22
+ }, [
23
+ queryResults
24
+ ]);
25
+ const canExport = useMemo(()=>{
26
+ return isExportableData(exportableData);
27
+ }, [
28
+ exportableData
29
+ ]);
30
+ const handleExport = useCallback(()=>{
31
+ if (!exportableData || !canExport) return;
32
+ try {
33
+ const title = definition?.spec?.display?.name || 'Time Series Data';
34
+ const csvBlob = exportDataAsCSV({
35
+ data: exportableData
36
+ });
37
+ const baseFilename = sanitizeFilename(title);
38
+ const filename = `${baseFilename}_data.csv`;
39
+ const link = document.createElement('a');
40
+ link.href = URL.createObjectURL(csvBlob);
41
+ link.download = filename;
42
+ document.body.appendChild(link);
43
+ link.click();
44
+ document.body.removeChild(link);
45
+ URL.revokeObjectURL(link.href);
46
+ } catch (error) {
47
+ console.error('Time series export failed:', error);
48
+ }
49
+ }, [
50
+ exportableData,
51
+ canExport,
52
+ definition
53
+ ]);
54
+ if (!canExport) {
55
+ return null;
56
+ }
57
+ return /*#__PURE__*/ _jsx(InfoTooltip, {
58
+ description: "Export as CSV",
59
+ children: /*#__PURE__*/ _jsx(IconButton, {
60
+ size: "small",
61
+ onClick: handleExport,
62
+ "aria-label": "Export time series data as CSV",
63
+ children: /*#__PURE__*/ _jsx(DownloadIcon, {
64
+ fontSize: "inherit"
65
+ })
66
+ })
67
+ });
68
+ };
69
+
70
+ //# sourceMappingURL=TableExportAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/TableExportAction.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 React, { useCallback, useMemo } from 'react';\nimport { exportDataAsCSV, extractExportableData, isExportableData, sanitizeFilename } from '@perses-dev/plugin-system';\nimport { InfoTooltip } from '@perses-dev/components';\nimport { IconButton } from '@mui/material';\nimport DownloadIcon from 'mdi-material-ui/Download';\nimport { TableProps } from './components';\n\nexport const TableExportAction: React.FC<TableProps> = ({ queryResults, definition }) => {\n const exportableData = useMemo(() => {\n return extractExportableData(queryResults);\n }, [queryResults]);\n\n const canExport = useMemo(() => {\n return isExportableData(exportableData);\n }, [exportableData]);\n\n const handleExport = useCallback(() => {\n if (!exportableData || !canExport) return;\n\n try {\n const title = definition?.spec?.display?.name || 'Time Series Data';\n\n const csvBlob = exportDataAsCSV({\n data: exportableData,\n });\n\n const baseFilename = sanitizeFilename(title);\n const filename = `${baseFilename}_data.csv`;\n\n const link = document.createElement('a');\n link.href = URL.createObjectURL(csvBlob);\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(link.href);\n } catch (error) {\n console.error('Time series export failed:', error);\n }\n }, [exportableData, canExport, definition]);\n\n if (!canExport) {\n return null;\n }\n\n return (\n <InfoTooltip description=\"Export as CSV\">\n <IconButton size=\"small\" onClick={handleExport} aria-label=\"Export time series data as CSV\">\n <DownloadIcon fontSize=\"inherit\" />\n </IconButton>\n </InfoTooltip>\n );\n};\n"],"names":["React","useCallback","useMemo","exportDataAsCSV","extractExportableData","isExportableData","sanitizeFilename","InfoTooltip","IconButton","DownloadIcon","TableExportAction","queryResults","definition","exportableData","canExport","handleExport","title","spec","display","name","csvBlob","data","baseFilename","filename","link","document","createElement","href","URL","createObjectURL","download","body","appendChild","click","removeChild","revokeObjectURL","error","console","description","size","onClick","aria-label","fontSize"],"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,OAAOA,SAASC,WAAW,EAAEC,OAAO,QAAQ,QAAQ;AACpD,SAASC,eAAe,EAAEC,qBAAqB,EAAEC,gBAAgB,EAAEC,gBAAgB,QAAQ,4BAA4B;AACvH,SAASC,WAAW,QAAQ,yBAAyB;AACrD,SAASC,UAAU,QAAQ,gBAAgB;AAC3C,OAAOC,kBAAkB,2BAA2B;AAGpD,OAAO,MAAMC,oBAA0C,CAAC,EAAEC,YAAY,EAAEC,UAAU,EAAE;IAClF,MAAMC,iBAAiBX,QAAQ;QAC7B,OAAOE,sBAAsBO;IAC/B,GAAG;QAACA;KAAa;IAEjB,MAAMG,YAAYZ,QAAQ;QACxB,OAAOG,iBAAiBQ;IAC1B,GAAG;QAACA;KAAe;IAEnB,MAAME,eAAed,YAAY;QAC/B,IAAI,CAACY,kBAAkB,CAACC,WAAW;QAEnC,IAAI;YACF,MAAME,QAAQJ,YAAYK,MAAMC,SAASC,QAAQ;YAEjD,MAAMC,UAAUjB,gBAAgB;gBAC9BkB,MAAMR;YACR;YAEA,MAAMS,eAAehB,iBAAiBU;YACtC,MAAMO,WAAW,GAAGD,aAAa,SAAS,CAAC;YAE3C,MAAME,OAAOC,SAASC,aAAa,CAAC;YACpCF,KAAKG,IAAI,GAAGC,IAAIC,eAAe,CAACT;YAChCI,KAAKM,QAAQ,GAAGP;YAChBE,SAASM,IAAI,CAACC,WAAW,CAACR;YAC1BA,KAAKS,KAAK;YACVR,SAASM,IAAI,CAACG,WAAW,CAACV;YAC1BI,IAAIO,eAAe,CAACX,KAAKG,IAAI;QAC/B,EAAE,OAAOS,OAAO;YACdC,QAAQD,KAAK,CAAC,8BAA8BA;QAC9C;IACF,GAAG;QAACvB;QAAgBC;QAAWF;KAAW;IAE1C,IAAI,CAACE,WAAW;QACd,OAAO;IACT;IAEA,qBACE,KAACP;QAAY+B,aAAY;kBACvB,cAAA,KAAC9B;YAAW+B,MAAK;YAAQC,SAASzB;YAAc0B,cAAW;sBACzD,cAAA,KAAChC;gBAAaiC,UAAS;;;;AAI/B,EAAE"}
package/lib/cjs/Table.js CHANGED
@@ -23,6 +23,7 @@ Object.defineProperty(exports, "Table", {
23
23
  const _components = require("./components");
24
24
  const _TableItemSelectionActionsEditor = require("./components/TableItemSelectionActionsEditor");
25
25
  const _models = require("./models");
26
+ const _TableExportAction = require("./TableExportAction");
26
27
  const Table = {
27
28
  PanelComponent: _components.TablePanel,
28
29
  supportedQueryTypes: [
@@ -51,5 +52,11 @@ const Table = {
51
52
  content: _TableItemSelectionActionsEditor.TableItemSelectionActionsEditor
52
53
  }
53
54
  ],
54
- createInitialOptions: _models.createInitialTableOptions
55
+ createInitialOptions: _models.createInitialTableOptions,
56
+ actions: [
57
+ {
58
+ component: _TableExportAction.TableExportAction,
59
+ location: 'header'
60
+ }
61
+ ]
55
62
  };
@@ -0,0 +1,124 @@
1
+ // Copyright The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ "use strict";
14
+ Object.defineProperty(exports, "__esModule", {
15
+ value: true
16
+ });
17
+ Object.defineProperty(exports, "TableExportAction", {
18
+ enumerable: true,
19
+ get: function() {
20
+ return TableExportAction;
21
+ }
22
+ });
23
+ const _jsxruntime = require("react/jsx-runtime");
24
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
25
+ const _pluginsystem = require("@perses-dev/plugin-system");
26
+ const _components = require("@perses-dev/components");
27
+ const _material = require("@mui/material");
28
+ const _Download = /*#__PURE__*/ _interop_require_default(require("mdi-material-ui/Download"));
29
+ function _interop_require_default(obj) {
30
+ return obj && obj.__esModule ? obj : {
31
+ default: obj
32
+ };
33
+ }
34
+ function _getRequireWildcardCache(nodeInterop) {
35
+ if (typeof WeakMap !== "function") return null;
36
+ var cacheBabelInterop = new WeakMap();
37
+ var cacheNodeInterop = new WeakMap();
38
+ return (_getRequireWildcardCache = function(nodeInterop) {
39
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
40
+ })(nodeInterop);
41
+ }
42
+ function _interop_require_wildcard(obj, nodeInterop) {
43
+ if (!nodeInterop && obj && obj.__esModule) {
44
+ return obj;
45
+ }
46
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
47
+ return {
48
+ default: obj
49
+ };
50
+ }
51
+ var cache = _getRequireWildcardCache(nodeInterop);
52
+ if (cache && cache.has(obj)) {
53
+ return cache.get(obj);
54
+ }
55
+ var newObj = {
56
+ __proto__: null
57
+ };
58
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
59
+ for(var key in obj){
60
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
61
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
62
+ if (desc && (desc.get || desc.set)) {
63
+ Object.defineProperty(newObj, key, desc);
64
+ } else {
65
+ newObj[key] = obj[key];
66
+ }
67
+ }
68
+ }
69
+ newObj.default = obj;
70
+ if (cache) {
71
+ cache.set(obj, newObj);
72
+ }
73
+ return newObj;
74
+ }
75
+ const TableExportAction = ({ queryResults, definition })=>{
76
+ const exportableData = (0, _react.useMemo)(()=>{
77
+ return (0, _pluginsystem.extractExportableData)(queryResults);
78
+ }, [
79
+ queryResults
80
+ ]);
81
+ const canExport = (0, _react.useMemo)(()=>{
82
+ return (0, _pluginsystem.isExportableData)(exportableData);
83
+ }, [
84
+ exportableData
85
+ ]);
86
+ const handleExport = (0, _react.useCallback)(()=>{
87
+ if (!exportableData || !canExport) return;
88
+ try {
89
+ const title = definition?.spec?.display?.name || 'Time Series Data';
90
+ const csvBlob = (0, _pluginsystem.exportDataAsCSV)({
91
+ data: exportableData
92
+ });
93
+ const baseFilename = (0, _pluginsystem.sanitizeFilename)(title);
94
+ const filename = `${baseFilename}_data.csv`;
95
+ const link = document.createElement('a');
96
+ link.href = URL.createObjectURL(csvBlob);
97
+ link.download = filename;
98
+ document.body.appendChild(link);
99
+ link.click();
100
+ document.body.removeChild(link);
101
+ URL.revokeObjectURL(link.href);
102
+ } catch (error) {
103
+ console.error('Time series export failed:', error);
104
+ }
105
+ }, [
106
+ exportableData,
107
+ canExport,
108
+ definition
109
+ ]);
110
+ if (!canExport) {
111
+ return null;
112
+ }
113
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_components.InfoTooltip, {
114
+ description: "Export as CSV",
115
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.IconButton, {
116
+ size: "small",
117
+ onClick: handleExport,
118
+ "aria-label": "Export time series data as CSV",
119
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Download.default, {
120
+ fontSize: "inherit"
121
+ })
122
+ })
123
+ });
124
+ };
@@ -66,7 +66,7 @@ function generateCellContentConfig(column) {
66
66
  function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme }) {
67
67
  const values = [
68
68
  ...new Set(allValues)
69
- ].filter((v)=>v != null).sort();
69
+ ].filter((v)=>v !== null).sort();
70
70
  if (values.length === 0) {
71
71
  return /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
72
72
  "data-filter-dropdown": true,
@@ -1,3 +1,4 @@
1
+ import { ReactElement } from 'react';
1
2
  import { Grid2Props as GridProps } from '@mui/material';
2
3
  import { CellSettings } from '../models';
3
4
  export interface ConditionalRuleProps extends Omit<GridProps, 'onChange'> {
@@ -5,11 +6,11 @@ export interface ConditionalRuleProps extends Omit<GridProps, 'onChange'> {
5
6
  onChange: (cell: CellSettings) => void;
6
7
  onDelete: () => void;
7
8
  }
8
- export declare function ConditionalRule({ cell, onChange, onDelete, ...props }: ConditionalRuleProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function ConditionalRule({ cell, onChange, onDelete, ...props }: ConditionalRuleProps): ReactElement;
9
10
  export interface ConditionalPanelProps {
10
11
  cellSettings?: CellSettings[];
11
12
  onChange: (cellSettings: CellSettings[] | undefined) => void;
12
13
  addButtonText?: string;
13
14
  }
14
- export declare function ConditionalPanel({ cellSettings, onChange, addButtonText, }: ConditionalPanelProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function ConditionalPanel({ cellSettings, onChange, addButtonText, }: ConditionalPanelProps): ReactElement;
15
16
  //# sourceMappingURL=ConditionalPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionalPanel.d.ts","sourceRoot":"","sources":["../../../src/components/ConditionalPanel.tsx"],"names":[],"mappings":"AAcA,OAAO,EAGL,UAAU,IAAI,SAAS,EAQxB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,YAAY,EAAyB,MAAM,WAAW,CAAC;AAGhE,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IACvE,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,2CAyH3F;AAGD,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,YAAiB,EACjB,QAAQ,EACR,aAAwC,GACzC,EAAE,qBAAqB,2CAmDvB"}
1
+ {"version":3,"file":"ConditionalPanel.d.ts","sourceRoot":"","sources":["../../../src/components/ConditionalPanel.tsx"],"names":[],"mappings":"AAaA,OAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAGL,UAAU,IAAI,SAAS,EAQxB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,YAAY,EAAyB,MAAM,WAAW,CAAC;AAGhE,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IACvE,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,GAAG,YAAY,CAyH1G;AAGD,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,YAAiB,EACjB,QAAQ,EACR,aAAwC,GACzC,EAAE,qBAAqB,GAAG,YAAY,CAmDtC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ConditionalPanel.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 React from 'react';\nimport {\n Button,\n Divider,\n Grid2Props as GridProps,\n IconButton,\n MenuItem,\n Stack,\n TextField,\n Tooltip,\n Typography,\n Grid2 as Grid,\n} from '@mui/material';\nimport DeleteIcon from 'mdi-material-ui/DeleteOutline';\nimport AddIcon from 'mdi-material-ui/Plus';\nimport { OptionsColorPicker } from '@perses-dev/components';\nimport { CellSettings, renderConditionEditor } from '../models';\n\n// Individual conditional formatting rule component\nexport interface ConditionalRuleProps extends Omit<GridProps, 'onChange'> {\n cell: CellSettings;\n onChange: (cell: CellSettings) => void;\n onDelete: () => void;\n}\n\nexport function ConditionalRule({ cell, onChange, onDelete, ...props }: ConditionalRuleProps) {\n return (\n <Grid container spacing={2} {...props}>\n <Grid size={{ xs: 5 }}>\n <Stack direction=\"row\" gap={1} width=\"100%\">\n <TextField\n select\n label=\"Type\"\n value={cell.condition.kind}\n onChange={(e) => onChange({ ...cell, condition: { kind: e.target.value } } as CellSettings)}\n required\n sx={{ width: '120px' }}\n >\n <MenuItem value=\"Value\">\n <Stack>\n <Typography>Value</Typography>\n {cell.condition.kind !== 'Value' && (\n <Typography variant=\"caption\">Matches an exact text value</Typography>\n )}\n </Stack>\n </MenuItem>\n <MenuItem value=\"Range\">\n <Stack>\n <Typography>Range</Typography>\n {cell.condition.kind !== 'Range' && (\n <Typography variant=\"caption\">Matches against a numerical range</Typography>\n )}\n </Stack>\n </MenuItem>\n <MenuItem value=\"Regex\">\n <Stack>\n <Typography>Regex</Typography>\n {cell.condition.kind !== 'Regex' && (\n <Typography variant=\"caption\">Matches against a regular expression</Typography>\n )}\n </Stack>\n </MenuItem>\n <MenuItem value=\"Misc\">\n <Stack>\n <Typography>Misc</Typography>\n {cell.condition.kind !== 'Misc' && (\n <Typography variant=\"caption\">Matches against empty, null and NaN values</Typography>\n )}\n </Stack>\n </MenuItem>\n </TextField>\n {renderConditionEditor(\n cell.condition,\n (updatedCondition) => onChange({ ...cell, condition: updatedCondition }),\n 'small'\n )}\n </Stack>\n </Grid>\n <Grid size={{ xs: 4 }}>\n <Stack spacing={1}>\n <TextField\n label=\"Display text\"\n value={cell.text}\n onChange={(e) => onChange({ ...cell, text: e.target.value })}\n fullWidth\n size=\"small\"\n />\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"Prefix\"\n placeholder=\"$\"\n value={cell.prefix ?? ''}\n onChange={(e) => onChange({ ...cell, prefix: e.target.value })}\n size=\"small\"\n />\n <TextField\n label=\"Suffix\"\n placeholder=\"%\"\n value={cell.suffix ?? ''}\n onChange={(e) => onChange({ ...cell, suffix: e.target.value })}\n size=\"small\"\n />\n </Stack>\n </Stack>\n </Grid>\n <Grid size={{ xs: 1 }}>\n <Stack direction=\"row\" justifyContent=\"center\" gap={1}>\n {cell.textColor ? (\n <OptionsColorPicker\n label=\"Text Color\"\n color={cell.textColor ?? '#000'}\n onColorChange={(color) => onChange({ ...cell, textColor: color } as CellSettings)}\n onClear={() => onChange({ ...cell, textColor: undefined } as CellSettings)}\n />\n ) : (\n <IconButton onClick={() => onChange({ ...cell, textColor: '#000' })}>\n <AddIcon />\n </IconButton>\n )}\n </Stack>\n </Grid>\n <Grid size={{ xs: 1 }}>\n <Stack direction=\"row\" justifyContent=\"center\">\n {cell.backgroundColor ? (\n <OptionsColorPicker\n label=\"Background Color\"\n color={cell.backgroundColor ?? '#fff'}\n onColorChange={(color) => onChange({ ...cell, backgroundColor: color } as CellSettings)}\n onClear={() => onChange({ ...cell, backgroundColor: undefined } as CellSettings)}\n />\n ) : (\n <IconButton onClick={() => onChange({ ...cell, backgroundColor: '#000' })}>\n <AddIcon />\n </IconButton>\n )}\n </Stack>\n </Grid>\n <Grid size={{ xs: 1 }} textAlign=\"end\">\n <Tooltip title=\"Remove cell settings\" placement=\"top\">\n <IconButton size=\"small\" sx={{ marginLeft: 'auto' }} onClick={onDelete} key=\"delete-cell-button\">\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n </Grid>\n );\n}\n\n// Complete conditional formatting panel with headers and list management\nexport interface ConditionalPanelProps {\n cellSettings?: CellSettings[];\n onChange: (cellSettings: CellSettings[] | undefined) => void;\n addButtonText?: string;\n}\n\nexport function ConditionalPanel({\n cellSettings = [],\n onChange,\n addButtonText = 'Add Conditional Format',\n}: ConditionalPanelProps) {\n const handleCellChange = (index: number, updatedCell: CellSettings) => {\n const updatedCells = [...cellSettings];\n updatedCells[index] = updatedCell;\n onChange(updatedCells);\n };\n\n const handleCellDelete = (index: number) => {\n const updatedCells = [...cellSettings];\n updatedCells.splice(index, 1);\n onChange(updatedCells.length > 0 ? updatedCells : undefined);\n };\n\n const handleAddCell = () => {\n const updatedCells = [...cellSettings];\n updatedCells.push({ condition: { kind: 'Value', spec: { value: '' } } });\n onChange(updatedCells);\n };\n\n return (\n <Stack spacing={3} sx={{ mt: 2 }}>\n <Grid container spacing={3}>\n <Grid size={{ xs: 5 }}>\n <Typography variant=\"subtitle1\">Condition</Typography>\n </Grid>\n <Grid size={{ xs: 4 }}>\n <Typography variant=\"subtitle1\">Display Text</Typography>\n </Grid>\n <Grid size={{ xs: 1 }} textAlign=\"center\">\n <Typography variant=\"subtitle1\">Color</Typography>\n </Grid>\n <Grid size={{ xs: 1 }} textAlign=\"center\">\n <Typography variant=\"subtitle1\">Background</Typography>\n </Grid>\n <Grid size={{ xs: 1 }}></Grid>\n </Grid>\n <Stack gap={1.5} divider={<Divider flexItem orientation=\"horizontal\" />}>\n {cellSettings.map((cell, i) => (\n <ConditionalRule\n key={i}\n cell={cell}\n onChange={(updatedCell: CellSettings) => handleCellChange(i, updatedCell)}\n onDelete={() => handleCellDelete(i)}\n />\n ))}\n </Stack>\n <Button variant=\"outlined\" startIcon={<AddIcon />} sx={{ marginTop: 1 }} onClick={handleAddCell}>\n {addButtonText}\n </Button>\n </Stack>\n );\n}\n"],"names":["React","Button","Divider","IconButton","MenuItem","Stack","TextField","Tooltip","Typography","Grid2","Grid","DeleteIcon","AddIcon","OptionsColorPicker","renderConditionEditor","ConditionalRule","cell","onChange","onDelete","props","container","spacing","size","xs","direction","gap","width","select","label","value","condition","kind","e","target","required","sx","variant","updatedCondition","text","fullWidth","placeholder","prefix","suffix","justifyContent","textColor","color","onColorChange","onClear","undefined","onClick","backgroundColor","textAlign","title","placement","marginLeft","ConditionalPanel","cellSettings","addButtonText","handleCellChange","index","updatedCell","updatedCells","handleCellDelete","splice","length","handleAddCell","push","spec","mt","divider","flexItem","orientation","map","i","startIcon","marginTop"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/ConditionalPanel.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 React, { ReactElement } from 'react';\nimport {\n Button,\n Divider,\n Grid2Props as GridProps,\n IconButton,\n MenuItem,\n Stack,\n TextField,\n Tooltip,\n Typography,\n Grid2 as Grid,\n} from '@mui/material';\nimport DeleteIcon from 'mdi-material-ui/DeleteOutline';\nimport AddIcon from 'mdi-material-ui/Plus';\nimport { OptionsColorPicker } from '@perses-dev/components';\nimport { CellSettings, renderConditionEditor } from '../models';\n\n// Individual conditional formatting rule component\nexport interface ConditionalRuleProps extends Omit<GridProps, 'onChange'> {\n cell: CellSettings;\n onChange: (cell: CellSettings) => void;\n onDelete: () => void;\n}\n\nexport function ConditionalRule({ cell, onChange, onDelete, ...props }: ConditionalRuleProps): ReactElement {\n return (\n <Grid container spacing={2} {...props}>\n <Grid size={{ xs: 5 }}>\n <Stack direction=\"row\" gap={1} width=\"100%\">\n <TextField\n select\n label=\"Type\"\n value={cell.condition.kind}\n onChange={(e) => onChange({ ...cell, condition: { kind: e.target.value } } as CellSettings)}\n required\n sx={{ width: '120px' }}\n >\n <MenuItem value=\"Value\">\n <Stack>\n <Typography>Value</Typography>\n {cell.condition.kind !== 'Value' && (\n <Typography variant=\"caption\">Matches an exact text value</Typography>\n )}\n </Stack>\n </MenuItem>\n <MenuItem value=\"Range\">\n <Stack>\n <Typography>Range</Typography>\n {cell.condition.kind !== 'Range' && (\n <Typography variant=\"caption\">Matches against a numerical range</Typography>\n )}\n </Stack>\n </MenuItem>\n <MenuItem value=\"Regex\">\n <Stack>\n <Typography>Regex</Typography>\n {cell.condition.kind !== 'Regex' && (\n <Typography variant=\"caption\">Matches against a regular expression</Typography>\n )}\n </Stack>\n </MenuItem>\n <MenuItem value=\"Misc\">\n <Stack>\n <Typography>Misc</Typography>\n {cell.condition.kind !== 'Misc' && (\n <Typography variant=\"caption\">Matches against empty, null and NaN values</Typography>\n )}\n </Stack>\n </MenuItem>\n </TextField>\n {renderConditionEditor(\n cell.condition,\n (updatedCondition) => onChange({ ...cell, condition: updatedCondition }),\n 'small'\n )}\n </Stack>\n </Grid>\n <Grid size={{ xs: 4 }}>\n <Stack spacing={1}>\n <TextField\n label=\"Display text\"\n value={cell.text}\n onChange={(e) => onChange({ ...cell, text: e.target.value })}\n fullWidth\n size=\"small\"\n />\n <Stack direction=\"row\" spacing={1}>\n <TextField\n label=\"Prefix\"\n placeholder=\"$\"\n value={cell.prefix ?? ''}\n onChange={(e) => onChange({ ...cell, prefix: e.target.value })}\n size=\"small\"\n />\n <TextField\n label=\"Suffix\"\n placeholder=\"%\"\n value={cell.suffix ?? ''}\n onChange={(e) => onChange({ ...cell, suffix: e.target.value })}\n size=\"small\"\n />\n </Stack>\n </Stack>\n </Grid>\n <Grid size={{ xs: 1 }}>\n <Stack direction=\"row\" justifyContent=\"center\" gap={1}>\n {cell.textColor ? (\n <OptionsColorPicker\n label=\"Text Color\"\n color={cell.textColor ?? '#000'}\n onColorChange={(color) => onChange({ ...cell, textColor: color } as CellSettings)}\n onClear={() => onChange({ ...cell, textColor: undefined } as CellSettings)}\n />\n ) : (\n <IconButton onClick={() => onChange({ ...cell, textColor: '#000' })}>\n <AddIcon />\n </IconButton>\n )}\n </Stack>\n </Grid>\n <Grid size={{ xs: 1 }}>\n <Stack direction=\"row\" justifyContent=\"center\">\n {cell.backgroundColor ? (\n <OptionsColorPicker\n label=\"Background Color\"\n color={cell.backgroundColor ?? '#fff'}\n onColorChange={(color) => onChange({ ...cell, backgroundColor: color } as CellSettings)}\n onClear={() => onChange({ ...cell, backgroundColor: undefined } as CellSettings)}\n />\n ) : (\n <IconButton onClick={() => onChange({ ...cell, backgroundColor: '#000' })}>\n <AddIcon />\n </IconButton>\n )}\n </Stack>\n </Grid>\n <Grid size={{ xs: 1 }} textAlign=\"end\">\n <Tooltip title=\"Remove cell settings\" placement=\"top\">\n <IconButton size=\"small\" sx={{ marginLeft: 'auto' }} onClick={onDelete} key=\"delete-cell-button\">\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n </Grid>\n </Grid>\n );\n}\n\n// Complete conditional formatting panel with headers and list management\nexport interface ConditionalPanelProps {\n cellSettings?: CellSettings[];\n onChange: (cellSettings: CellSettings[] | undefined) => void;\n addButtonText?: string;\n}\n\nexport function ConditionalPanel({\n cellSettings = [],\n onChange,\n addButtonText = 'Add Conditional Format',\n}: ConditionalPanelProps): ReactElement {\n const handleCellChange = (index: number, updatedCell: CellSettings): void => {\n const updatedCells = [...cellSettings];\n updatedCells[index] = updatedCell;\n onChange(updatedCells);\n };\n\n const handleCellDelete = (index: number): void => {\n const updatedCells = [...cellSettings];\n updatedCells.splice(index, 1);\n onChange(updatedCells.length > 0 ? updatedCells : undefined);\n };\n\n const handleAddCell = (): void => {\n const updatedCells = [...cellSettings];\n updatedCells.push({ condition: { kind: 'Value', spec: { value: '' } } });\n onChange(updatedCells);\n };\n\n return (\n <Stack spacing={3} sx={{ mt: 2 }}>\n <Grid container spacing={3}>\n <Grid size={{ xs: 5 }}>\n <Typography variant=\"subtitle1\">Condition</Typography>\n </Grid>\n <Grid size={{ xs: 4 }}>\n <Typography variant=\"subtitle1\">Display Text</Typography>\n </Grid>\n <Grid size={{ xs: 1 }} textAlign=\"center\">\n <Typography variant=\"subtitle1\">Color</Typography>\n </Grid>\n <Grid size={{ xs: 1 }} textAlign=\"center\">\n <Typography variant=\"subtitle1\">Background</Typography>\n </Grid>\n <Grid size={{ xs: 1 }}></Grid>\n </Grid>\n <Stack gap={1.5} divider={<Divider flexItem orientation=\"horizontal\" />}>\n {cellSettings.map((cell, i) => (\n <ConditionalRule\n key={i}\n cell={cell}\n onChange={(updatedCell: CellSettings) => handleCellChange(i, updatedCell)}\n onDelete={() => handleCellDelete(i)}\n />\n ))}\n </Stack>\n <Button variant=\"outlined\" startIcon={<AddIcon />} sx={{ marginTop: 1 }} onClick={handleAddCell}>\n {addButtonText}\n </Button>\n </Stack>\n );\n}\n"],"names":["React","Button","Divider","IconButton","MenuItem","Stack","TextField","Tooltip","Typography","Grid2","Grid","DeleteIcon","AddIcon","OptionsColorPicker","renderConditionEditor","ConditionalRule","cell","onChange","onDelete","props","container","spacing","size","xs","direction","gap","width","select","label","value","condition","kind","e","target","required","sx","variant","updatedCondition","text","fullWidth","placeholder","prefix","suffix","justifyContent","textColor","color","onColorChange","onClear","undefined","onClick","backgroundColor","textAlign","title","placement","marginLeft","ConditionalPanel","cellSettings","addButtonText","handleCellChange","index","updatedCell","updatedCells","handleCellDelete","splice","length","handleAddCell","push","spec","mt","divider","flexItem","orientation","map","i","startIcon","marginTop"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import { PanelData } from '@perses-dev/plugin-system';
2
2
  import { QueryDataType, UnknownSpec } from '@perses-dev/core';
3
+ import { ReactElement } from 'react';
3
4
  interface EmbeddedPanelProps {
4
5
  kind: string;
5
6
  spec: UnknownSpec;
6
7
  queryResults: Array<PanelData<QueryDataType>>;
7
8
  }
8
- export declare function EmbeddedPanel({ kind, spec, queryResults }: EmbeddedPanelProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function EmbeddedPanel({ kind, spec, queryResults }: EmbeddedPanelProps): ReactElement;
9
10
  export {};
10
11
  //# sourceMappingURL=EmbeddedPanel.d.ts.map
@@ -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;AAK9D,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,2CAS7E"}
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 +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';\n\ninterface EmbeddedPanelProps {\n kind: string;\n spec: UnknownSpec;\n queryResults: Array<PanelData<QueryDataType>>;\n}\n\nexport function EmbeddedPanel({ kind, spec, queryResults }: EmbeddedPanelProps) {\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;AAQnE,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 { 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"}
@@ -48,7 +48,7 @@ function generateCellContentConfig(column) {
48
48
  function ColumnFilterDropdown({ allValues, selectedValues, onFilterChange, theme }) {
49
49
  const values = [
50
50
  ...new Set(allValues)
51
- ].filter((v)=>v != null).sort();
51
+ ].filter((v)=>v !== null).sort();
52
52
  if (values.length === 0) {
53
53
  return /*#__PURE__*/ _jsx("div", {
54
54
  "data-filter-dropdown": true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TablePanel.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Box, Theme, Typography, useTheme } from '@mui/material';\nimport { Table, TableCellConfigs, TableColumnConfig, useSelection } from '@perses-dev/components';\nimport { formatValue, Labels, QueryDataType, TimeSeries, TimeSeriesData, transformData } from '@perses-dev/core';\nimport { useSelectionItemActions } from '@perses-dev/dashboards';\nimport {\n ActionOptions,\n PanelData,\n PanelProps,\n replaceVariablesInString,\n useAllVariableValues,\n VariableStateMap,\n} from '@perses-dev/plugin-system';\nimport { ColumnFiltersState, PaginationState, RowSelectionState, SortingState } from '@tanstack/react-table';\nimport { ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ColumnSettings, evaluateConditionalFormatting, TableOptions } from '../models';\nimport { EmbeddedPanel } from './EmbeddedPanel';\n\nfunction generateCellContentConfig(\n column: ColumnSettings\n): Pick<TableColumnConfig<unknown>, 'cellDescription' | 'cell'> {\n const plugin = column.plugin;\n if (plugin !== undefined) {\n return {\n cell: (ctx) => {\n const panelData: PanelData<QueryDataType> | undefined = ctx.getValue();\n if (!panelData) return <></>;\n return <EmbeddedPanel kind={plugin.kind} spec={plugin.spec} queryResults={[panelData]} />;\n },\n cellDescription: column.cellDescription ? () => `${column.cellDescription}` : () => '', // disable hover text\n };\n }\n\n return {\n cell: (ctx) => {\n const cellValue = ctx.getValue();\n return typeof cellValue === 'number' && column.format ? formatValue(cellValue, column.format) : cellValue;\n },\n cellDescription: column.cellDescription ? (): string => `${column.cellDescription}` : undefined, // TODO: variable rendering + cell value\n };\n}\n\ninterface ColumnFilterDropdownProps {\n allValues: Array<string | number>;\n selectedValues: Array<string | number>;\n onFilterChange: (values: Array<string | number>) => void;\n theme: Theme;\n}\n\nfunction ColumnFilterDropdown({\n allValues,\n selectedValues,\n onFilterChange,\n theme,\n}: ColumnFilterDropdownProps): ReactElement {\n const values = [...new Set(allValues)].filter((v) => v != null).sort();\n if (values.length === 0) {\n return (\n <div\n data-filter-dropdown\n style={{\n width: 200,\n padding: 10,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n boxShadow: theme.shadows[4],\n }}\n >\n <div style={{ color: theme.palette.text.secondary, fontSize: 14 }}>No values found</div>\n </div>\n );\n }\n\n return (\n <div\n data-filter-dropdown\n style={{\n width: 200,\n padding: 10,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n boxShadow: theme.shadows[4],\n maxHeight: 250,\n overflowY: 'auto',\n }}\n >\n <div style={{ marginBottom: 8, fontSize: 14, fontWeight: 'bold' }}>\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={selectedValues.length === values.length && values.length > 0}\n onChange={(e) => onFilterChange(e.target.checked ? values : [])}\n style={{ marginRight: 8 }}\n />\n <span style={{ color: theme.palette.text.primary }}>Select All ({values.length})</span>\n </label>\n </div>\n <hr\n style={{\n margin: '8px 0',\n border: 'none',\n borderTop: `1px solid ${theme.palette.divider}`,\n }}\n />\n {values.map((value, index) => (\n <div key={`value-${index}`} style={{ marginBottom: 4 }}>\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n padding: '2px 0',\n borderRadius: 2,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.palette.action.hover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <input\n type=\"checkbox\"\n checked={selectedValues.includes(value)}\n onChange={(e) => {\n if (e.target.checked) {\n onFilterChange([...selectedValues, value]);\n } else {\n onFilterChange(selectedValues.filter((v) => v !== value));\n }\n }}\n style={{ marginRight: 8 }}\n />\n <span\n style={{\n fontSize: 14,\n color: theme.palette.text.primary,\n }}\n >\n {value === null || value === undefined || value === '' ? '(empty)' : String(value)}\n </span>\n </label>\n </div>\n ))}\n </div>\n );\n}\n\n/*\n * Generate column config from column definitions, if a column has multiple definitions, the first one will be used.\n * If column is hidden, return undefined.\n * If column do not have a definition, return a default column config.\n */\nfunction generateColumnConfig(\n name: string,\n columnSettings: ColumnSettings[],\n allVariables: VariableStateMap\n): TableColumnConfig<unknown> | undefined {\n for (const column of columnSettings) {\n if (column.name === name) {\n if (column.hide) {\n return undefined;\n }\n\n const { name, header, headerDescription, enableSorting, width, align, dataLink } = column;\n const modifiedDataLink = dataLink\n ? { ...dataLink, url: replaceVariablesInString(dataLink.url, allVariables) }\n : undefined;\n\n return {\n accessorKey: name,\n header: header ?? name,\n headerDescription,\n enableSorting,\n width,\n align,\n dataLink: modifiedDataLink,\n ...generateCellContentConfig(column),\n };\n }\n }\n\n return {\n accessorKey: name,\n header: name,\n };\n}\n\nexport function getTablePanelQueryOptions(spec: TableOptions): { mode: 'instant' | 'range' } {\n // if any cell renders a panel plugin, perform a range query instead of an instant query\n return {\n mode: (spec.columnSettings ?? []).some((c) => c.plugin) ? 'range' : 'instant',\n };\n}\n\nexport type TableProps = PanelProps<TableOptions, TimeSeriesData>;\n\nexport function TablePanel({ contentDimensions, spec, queryResults }: TableProps): ReactElement | null {\n const theme = useTheme();\n const allVariables = useAllVariableValues();\n\n const selectionEnabled = spec.selection?.enabled ?? false;\n const { selectionMap, setSelection, clearSelection } = useSelection<Record<string, unknown>, string>();\n\n const itemActionsConfig = spec.actions ? (spec.actions as ActionOptions) : undefined;\n const itemActionsListConfig =\n itemActionsConfig?.enabled && itemActionsConfig.displayWithItem ? itemActionsConfig.actionsList : [];\n\n const { getItemActionButtons, confirmDialog, actionButtons } = useSelectionItemActions({\n actions: itemActionsListConfig,\n variableState: allVariables,\n });\n\n const filteredDataRef = useRef<Array<Record<string, unknown>>>([]);\n\n // Convert selectionMap to TanStack's RowSelectionState format\n const rowSelection = useMemo((): RowSelectionState => {\n const result: RowSelectionState = {};\n selectionMap.forEach((_, id) => {\n result[id] = true;\n });\n return result;\n }, [selectionMap]);\n\n const handleRowSelectionChange = useCallback(\n (newRowSelection: RowSelectionState) => {\n const newSelection: Array<{ id: string; item: Record<string, unknown> }> = [];\n for (const [id, isSelected] of Object.entries(newRowSelection)) {\n if (isSelected) {\n const index = parseInt(id, 10);\n if (filteredDataRef.current[index] !== undefined) {\n newSelection.push({ id, item: filteredDataRef.current[index] });\n }\n }\n }\n\n if (newSelection.length === 0) {\n clearSelection();\n } else {\n setSelection(newSelection);\n }\n },\n [setSelection, clearSelection]\n );\n\n // TODO: handle other query types\n const queryMode = getTablePanelQueryOptions(spec).mode;\n const rawData: Array<Record<string, unknown>> = useMemo(() => {\n // Transform query results to a tabular format:\n // [ { timestamp: 123, value: 456, labelName1: labelValue1 }, ... ]\n return queryResults\n .flatMap((data: PanelData<TimeSeriesData>, queryIndex: number) =>\n data.data.series.map((ts: TimeSeries) => ({ data, ts, queryIndex }))\n )\n .map(({ data, ts, queryIndex }: { data: PanelData<TimeSeriesData>; ts: TimeSeries; queryIndex: number }) => {\n if (ts.values[0] === undefined) {\n return { ...ts.labels };\n }\n\n // If there are multiple queries, we need to add the query index to the value key and label key to avoid conflicts\n const valueColumnName = queryResults.length === 1 ? 'value' : `value #${queryIndex + 1}`;\n const labels =\n queryResults.length === 1\n ? ts.labels\n : Object.entries(ts.labels ?? {}).reduce((acc, [key, value]) => {\n if (key) acc[`${key} #${queryIndex + 1}`] = value;\n return acc;\n }, {} as Labels);\n\n // If the cell visualization is a panel plugin, filter the data by the current series\n const columnValue = (spec.columnSettings ?? []).find((x) => x.name === valueColumnName)?.plugin\n ? { ...data, data: { ...data.data, series: data.data.series.filter((s) => s === ts) } }\n : ts.values[0][1];\n\n if (queryMode === 'instant') {\n // Timestamp is not indexed as it will be the same for all queries\n return { timestamp: ts.values[0][0], [valueColumnName]: columnValue, ...labels };\n } else {\n // Don't add a timestamp for range queries\n return { [valueColumnName]: columnValue, ...labels };\n }\n });\n }, [queryResults, queryMode, spec.columnSettings]);\n\n // Transform will be applied by their orders on the original data\n const data = useMemo(() => transformData(rawData, spec.transforms ?? []), [rawData, spec.transforms]);\n\n const keys: string[] = useMemo(() => {\n const result: string[] = [];\n\n for (const entry of data) {\n for (const key of Object.keys(entry)) {\n if (!result.includes(key)) {\n result.push(key);\n }\n }\n }\n\n return result;\n }, [data]);\n\n // fetch unique values for each column of filtering\n const columnUniqueValues = useMemo(() => {\n const uniqueValues: Record<string, Array<string | number>> = {};\n\n keys.forEach((key) => {\n const values = data.map((row) => row[key]).filter((val) => val !== null && val !== undefined && val !== '');\n uniqueValues[key] = Array.from(new Set(values as Array<string | number>));\n });\n\n return uniqueValues;\n }, [data, keys]);\n\n // Generate columns and map each column accessor to its settings index and data key\n const columns: Array<TableColumnConfig<unknown>> = useMemo(() => {\n const columns: Array<TableColumnConfig<unknown>> = [];\n const customizedColumns = new Set<string>();\n\n // Process columnSettings if they exist\n for (const columnSetting of spec.columnSettings ?? []) {\n if (customizedColumns.has(columnSetting.name)) continue; // Skip duplicates\n\n const columnConfig = generateColumnConfig(columnSetting.name, spec.columnSettings ?? [], allVariables);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n customizedColumns.add(columnSetting.name);\n }\n }\n\n // Add remaining columns if defaultColumnHidden is false\n if (!spec.defaultColumnHidden) {\n for (const key of keys) {\n if (!customizedColumns.has(key)) {\n const columnConfig = generateColumnConfig(key, spec.columnSettings ?? [], allVariables);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n }\n }\n\n return columns;\n }, [keys, spec.columnSettings, spec.defaultColumnHidden, allVariables]);\n\n // Generate cell settings that will be used by the table to render cells (text color, background color, ...)\n const cellConfigs: TableCellConfigs = useMemo(() => {\n // If there are no cell settings globally or per column, return an empty object\n if (spec.cellSettings === undefined && !spec.columnSettings?.some((col) => col.cellSettings !== undefined)) {\n return {};\n }\n\n const result: TableCellConfigs = {};\n\n let index = 0;\n for (const row of data) {\n // Transforming key to object to extend the row with undefined values if the key is not present\n // for checking the cell config \"Misc\" condition with \"null\"\n const keysAsObj = keys.reduce(\n (acc, key) => {\n acc[key] = undefined;\n return acc;\n },\n {} as Record<string, undefined>\n );\n\n const extendRow = {\n ...keysAsObj,\n ...row,\n };\n\n // Generate cellConfigs for each column (including duplicates with different headers)\n for (const [key, value] of Object.entries(extendRow)) {\n // First, try to get cell config from global cell settings\n let cellConfig = evaluateConditionalFormatting(value, spec.cellSettings ?? []);\n\n // Then, try to get cell config from column-specific cell settings\n const columnSetting = spec.columnSettings?.find((col) => col.name === key);\n if (columnSetting?.cellSettings?.length) {\n const columnCellConfig = evaluateConditionalFormatting(value, columnSetting.cellSettings);\n // Column-specific settings take precedence over global settings\n if (columnCellConfig) {\n cellConfig = columnCellConfig;\n }\n }\n\n if (cellConfig) {\n result[`${index}_${key}`] = cellConfig;\n }\n }\n index++;\n }\n\n return result;\n }, [data, keys, spec.cellSettings, spec.columnSettings]);\n\n function generateDefaultSortingState(): SortingState {\n return (\n spec.columnSettings\n ?.filter((column) => column.sort !== undefined)\n .map((column) => {\n return {\n id: column.name,\n desc: column.sort === 'desc',\n };\n }) ?? []\n );\n }\n\n const [sorting, setSorting] = useState<SortingState>(generateDefaultSortingState());\n\n // Filtering state\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [filterAnchorEl, setFilterAnchorEl] = useState<{ [key: string]: HTMLElement | null }>({});\n const [openFilterColumn, setOpenFilterColumn] = useState<string | null>(null);\n\n // get selected values for a column\n const getSelectedFilterValues = (columnId: string): Array<string | number> => {\n const filter = columnFilters.find((f) => f.id === columnId);\n return filter ? (filter.value as Array<string | number>) : [];\n };\n\n // update column filter\n const updateColumnFilter = (columnId: string, values: Array<string | number>) => {\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) => {\n event.preventDefault();\n event.stopPropagation();\n setFilterAnchorEl({ ...filterAnchorEl, [columnId]: event.currentTarget });\n setOpenFilterColumn(columnId);\n };\n\n const handleFilterClose = () => {\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) => {\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 () => {\n clearTimeout(timer);\n document.removeEventListener('click', handleClick);\n };\n }, [openFilterColumn]);\n\n // filter data based on the current filters\n const filteredData = useMemo(() => {\n let filtered = [...data];\n\n // apply column filters if enabled\n if (spec.enableFiltering && columnFilters.length > 0) {\n filtered = filtered.filter((row) => {\n return columnFilters.every((filter) => {\n const value = row[filter.id];\n const filterValues = filter.value as Array<string | number>;\n\n if (!filterValues || filterValues.length === 0) return true; // No filter values means no filtering\n\n // Check if the row value is in the selected filter values\n return filterValues.includes(value as string | number);\n });\n });\n }\n\n return filtered;\n }, [data, columnFilters, spec.enableFiltering]);\n\n // Keep ref in sync with filtered data for use in selection handler\n filteredDataRef.current = filteredData;\n\n const [pagination, setPagination] = useState<PaginationState | undefined>(\n spec.pagination ? { pageIndex: 0, pageSize: 10 } : undefined\n );\n\n useEffect(() => {\n // If the pagination setting changes from no pagination to pagination, but the pagination state is undefined, update the pagination state\n if (spec.pagination && !pagination) {\n setPagination({ pageIndex: 0, pageSize: 10 });\n } else if (!spec.pagination && pagination) {\n setPagination(undefined);\n }\n }, [spec.pagination, pagination]);\n\n if (contentDimensions === undefined) {\n return null;\n }\n\n if (!data?.length) {\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n }}\n >\n <Typography>No data</Typography>\n </Box>\n );\n }\n\n return (\n <>\n {confirmDialog}\n {spec.enableFiltering && (\n <div\n style={{\n display: 'flex',\n background: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n width: contentDimensions.width,\n boxSizing: 'border-box',\n }}\n >\n {columns.map((column, idx) => {\n const filters = getSelectedFilterValues(column.accessorKey as string);\n const columnWidth = column.width || spec.defaultColumnWidth;\n return (\n <div\n key={`filter-${idx}`}\n style={{\n padding: '8px',\n borderRight: idx < columns.length - 1 ? `1px solid ${theme.palette.divider}` : 'none',\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n flex: typeof columnWidth === 'number' ? 'none' : '1 1 auto',\n }}\n >\n <span\n style={{\n marginRight: 8,\n fontSize: '12px',\n color: theme.palette.text.secondary,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {filters.length ? `${filters.length} items` : 'All'}\n </span>\n <button\n onClick={(e) => {\n handleFilterClick(e, column.accessorKey as string);\n }}\n style={{\n border: `1px solid ${theme.palette.divider}`,\n background: theme.palette.background.paper,\n cursor: 'pointer',\n fontSize: '12px',\n color: filters.length ? theme.palette.primary.main : theme.palette.text.secondary,\n padding: '4px 8px',\n borderRadius: '4px',\n minWidth: '20px',\n height: '24px',\n flexShrink: 0,\n transition: 'all 0.2s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = theme.palette.action.hover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = theme.palette.background.paper;\n }}\n type=\"button\"\n >\n ▼\n </button>\n\n {openFilterColumn === column.accessorKey && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n zIndex: 1000,\n marginTop: 4,\n }}\n >\n <ColumnFilterDropdown\n allValues={columnUniqueValues[column.accessorKey as string] || []}\n selectedValues={filters}\n onFilterChange={(values) => updateColumnFilter(column.accessorKey as string, values)}\n theme={theme}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n <Table\n data={filteredData}\n columns={columns}\n cellConfigs={cellConfigs}\n height={spec.enableFiltering ? contentDimensions.height - 40 : contentDimensions.height}\n width={contentDimensions.width}\n density={spec.density}\n defaultColumnWidth={spec.defaultColumnWidth}\n defaultColumnHeight={spec.defaultColumnHeight}\n sorting={sorting}\n onSortingChange={setSorting}\n pagination={pagination}\n onPaginationChange={setPagination}\n checkboxSelection={selectionEnabled}\n rowSelection={rowSelection}\n onRowSelectionChange={handleRowSelectionChange}\n getItemActions={({ id, data }) => getItemActionButtons({ id, data: data as Record<string, unknown> })}\n hasItemActions={actionButtons && actionButtons.length > 0}\n />\n </>\n );\n}\n"],"names":["Box","Typography","useTheme","Table","useSelection","formatValue","transformData","useSelectionItemActions","replaceVariablesInString","useAllVariableValues","useCallback","useEffect","useMemo","useRef","useState","evaluateConditionalFormatting","EmbeddedPanel","generateCellContentConfig","column","plugin","undefined","cell","ctx","panelData","getValue","kind","spec","queryResults","cellDescription","cellValue","format","ColumnFilterDropdown","allValues","selectedValues","onFilterChange","theme","values","Set","filter","v","sort","length","div","data-filter-dropdown","style","width","padding","backgroundColor","palette","background","paper","border","divider","borderRadius","boxShadow","shadows","color","text","secondary","fontSize","maxHeight","overflowY","marginBottom","fontWeight","label","display","alignItems","cursor","input","type","checked","onChange","e","target","marginRight","span","primary","hr","margin","borderTop","map","value","index","onMouseEnter","currentTarget","action","hover","onMouseLeave","includes","String","generateColumnConfig","name","columnSettings","allVariables","hide","header","headerDescription","enableSorting","align","dataLink","modifiedDataLink","url","accessorKey","getTablePanelQueryOptions","mode","some","c","TablePanel","contentDimensions","selectionEnabled","selection","enabled","selectionMap","setSelection","clearSelection","itemActionsConfig","actions","itemActionsListConfig","displayWithItem","actionsList","getItemActionButtons","confirmDialog","actionButtons","variableState","filteredDataRef","rowSelection","result","forEach","_","id","handleRowSelectionChange","newRowSelection","newSelection","isSelected","Object","entries","parseInt","current","push","item","queryMode","rawData","flatMap","data","queryIndex","series","ts","labels","valueColumnName","reduce","acc","key","columnValue","find","x","s","timestamp","transforms","keys","entry","columnUniqueValues","uniqueValues","row","val","Array","from","columns","customizedColumns","columnSetting","has","columnConfig","add","defaultColumnHidden","cellConfigs","cellSettings","col","keysAsObj","extendRow","cellConfig","columnCellConfig","generateDefaultSortingState","desc","sorting","setSorting","columnFilters","setColumnFilters","filterAnchorEl","setFilterAnchorEl","openFilterColumn","setOpenFilterColumn","getSelectedFilterValues","columnId","f","updateColumnFilter","newFilters","handleFilterClick","event","preventDefault","stopPropagation","handleFilterClose","handleClick","closest","timer","setTimeout","document","addEventListener","clearTimeout","removeEventListener","filteredData","filtered","enableFiltering","every","filterValues","pagination","setPagination","pageIndex","pageSize","sx","justifyContent","height","default","borderBottom","boxSizing","idx","filters","columnWidth","defaultColumnWidth","borderRight","minWidth","maxWidth","position","flex","overflow","textOverflow","whiteSpace","button","onClick","main","flexShrink","transition","top","left","zIndex","marginTop","density","defaultColumnHeight","onSortingChange","onPaginationChange","checkboxSelection","onRowSelectionChange","getItemActions","hasItemActions"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/TablePanel.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Box, Theme, Typography, useTheme } from '@mui/material';\nimport { Table, TableCellConfigs, TableColumnConfig, useSelection } from '@perses-dev/components';\nimport { formatValue, Labels, QueryDataType, TimeSeries, TimeSeriesData, transformData } from '@perses-dev/core';\nimport { useSelectionItemActions } from '@perses-dev/dashboards';\nimport {\n ActionOptions,\n PanelData,\n PanelProps,\n replaceVariablesInString,\n useAllVariableValues,\n VariableStateMap,\n} from '@perses-dev/plugin-system';\nimport { ColumnFiltersState, PaginationState, RowSelectionState, SortingState } from '@tanstack/react-table';\nimport { ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ColumnSettings, evaluateConditionalFormatting, TableOptions } from '../models';\nimport { EmbeddedPanel } from './EmbeddedPanel';\n\nfunction generateCellContentConfig(\n column: ColumnSettings\n): Pick<TableColumnConfig<unknown>, 'cellDescription' | 'cell'> {\n const plugin = column.plugin;\n if (plugin !== undefined) {\n return {\n cell: (ctx): ReactElement => {\n const panelData: PanelData<QueryDataType> | undefined = ctx.getValue();\n if (!panelData) return <></>;\n return <EmbeddedPanel kind={plugin.kind} spec={plugin.spec} queryResults={[panelData]} />;\n },\n cellDescription: column.cellDescription ? (): string => `${column.cellDescription}` : (): string => '', // disable hover text\n };\n }\n\n return {\n cell: (ctx): ReactElement | string => {\n const cellValue = ctx.getValue();\n return typeof cellValue === 'number' && column.format ? formatValue(cellValue, column.format) : cellValue;\n },\n cellDescription: column.cellDescription ? (): string => `${column.cellDescription}` : undefined, // TODO: variable rendering + cell value\n };\n}\n\ninterface ColumnFilterDropdownProps {\n allValues: Array<string | number>;\n selectedValues: Array<string | number>;\n onFilterChange: (values: Array<string | number>) => void;\n theme: Theme;\n}\n\nfunction ColumnFilterDropdown({\n allValues,\n selectedValues,\n onFilterChange,\n theme,\n}: ColumnFilterDropdownProps): ReactElement {\n const values = [...new Set(allValues)].filter((v) => v !== null).sort();\n if (values.length === 0) {\n return (\n <div\n data-filter-dropdown\n style={{\n width: 200,\n padding: 10,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n boxShadow: theme.shadows[4],\n }}\n >\n <div style={{ color: theme.palette.text.secondary, fontSize: 14 }}>No values found</div>\n </div>\n );\n }\n\n return (\n <div\n data-filter-dropdown\n style={{\n width: 200,\n padding: 10,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 4,\n boxShadow: theme.shadows[4],\n maxHeight: 250,\n overflowY: 'auto',\n }}\n >\n <div style={{ marginBottom: 8, fontSize: 14, fontWeight: 'bold' }}>\n <label style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={selectedValues.length === values.length && values.length > 0}\n onChange={(e) => onFilterChange(e.target.checked ? values : [])}\n style={{ marginRight: 8 }}\n />\n <span style={{ color: theme.palette.text.primary }}>Select All ({values.length})</span>\n </label>\n </div>\n <hr\n style={{\n margin: '8px 0',\n border: 'none',\n borderTop: `1px solid ${theme.palette.divider}`,\n }}\n />\n {values.map((value, index) => (\n <div key={`value-${index}`} style={{ marginBottom: 4 }}>\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n padding: '2px 0',\n borderRadius: 2,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.palette.action.hover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <input\n type=\"checkbox\"\n checked={selectedValues.includes(value)}\n onChange={(e) => {\n if (e.target.checked) {\n onFilterChange([...selectedValues, value]);\n } else {\n onFilterChange(selectedValues.filter((v) => v !== value));\n }\n }}\n style={{ marginRight: 8 }}\n />\n <span\n style={{\n fontSize: 14,\n color: theme.palette.text.primary,\n }}\n >\n {value === null || value === undefined || value === '' ? '(empty)' : String(value)}\n </span>\n </label>\n </div>\n ))}\n </div>\n );\n}\n\n/*\n * Generate column config from column definitions, if a column has multiple definitions, the first one will be used.\n * If column is hidden, return undefined.\n * If column do not have a definition, return a default column config.\n */\nfunction generateColumnConfig(\n name: string,\n columnSettings: ColumnSettings[],\n allVariables: VariableStateMap\n): TableColumnConfig<unknown> | undefined {\n for (const column of columnSettings) {\n if (column.name === name) {\n if (column.hide) {\n return undefined;\n }\n\n const { name, header, headerDescription, enableSorting, width, align, dataLink } = column;\n const modifiedDataLink = dataLink\n ? { ...dataLink, url: replaceVariablesInString(dataLink.url, allVariables) }\n : undefined;\n\n return {\n accessorKey: name,\n header: header ?? name,\n headerDescription,\n enableSorting,\n width,\n align,\n dataLink: modifiedDataLink,\n ...generateCellContentConfig(column),\n };\n }\n }\n\n return {\n accessorKey: name,\n header: name,\n };\n}\n\nexport function getTablePanelQueryOptions(spec: TableOptions): { mode: 'instant' | 'range' } {\n // if any cell renders a panel plugin, perform a range query instead of an instant query\n return {\n mode: (spec.columnSettings ?? []).some((c) => c.plugin) ? 'range' : 'instant',\n };\n}\n\nexport type TableProps = PanelProps<TableOptions, TimeSeriesData>;\n\nexport function TablePanel({ contentDimensions, spec, queryResults }: TableProps): ReactElement | null {\n const theme = useTheme();\n const allVariables = useAllVariableValues();\n\n const selectionEnabled = spec.selection?.enabled ?? false;\n const { selectionMap, setSelection, clearSelection } = useSelection<Record<string, unknown>, string>();\n\n const itemActionsConfig = spec.actions ? (spec.actions as ActionOptions) : undefined;\n const itemActionsListConfig =\n itemActionsConfig?.enabled && itemActionsConfig.displayWithItem ? itemActionsConfig.actionsList : [];\n\n const { getItemActionButtons, confirmDialog, actionButtons } = useSelectionItemActions({\n actions: itemActionsListConfig,\n variableState: allVariables,\n });\n\n const filteredDataRef = useRef<Array<Record<string, unknown>>>([]);\n\n // Convert selectionMap to TanStack's RowSelectionState format\n const rowSelection = useMemo((): RowSelectionState => {\n const result: RowSelectionState = {};\n selectionMap.forEach((_, id) => {\n result[id] = true;\n });\n return result;\n }, [selectionMap]);\n\n const handleRowSelectionChange = useCallback(\n (newRowSelection: RowSelectionState) => {\n const newSelection: Array<{ id: string; item: Record<string, unknown> }> = [];\n for (const [id, isSelected] of Object.entries(newRowSelection)) {\n if (isSelected) {\n const index = parseInt(id, 10);\n if (filteredDataRef.current[index] !== undefined) {\n newSelection.push({ id, item: filteredDataRef.current[index] });\n }\n }\n }\n\n if (newSelection.length === 0) {\n clearSelection();\n } else {\n setSelection(newSelection);\n }\n },\n [setSelection, clearSelection]\n );\n\n // TODO: handle other query types\n const queryMode = getTablePanelQueryOptions(spec).mode;\n const rawData: Array<Record<string, unknown>> = useMemo(() => {\n // Transform query results to a tabular format:\n // [ { timestamp: 123, value: 456, labelName1: labelValue1 }, ... ]\n return queryResults\n .flatMap((data: PanelData<TimeSeriesData>, queryIndex: number) =>\n data.data.series.map((ts: TimeSeries) => ({ data, ts, queryIndex }))\n )\n .map(({ data, ts, queryIndex }: { data: PanelData<TimeSeriesData>; ts: TimeSeries; queryIndex: number }) => {\n if (ts.values[0] === undefined) {\n return { ...ts.labels };\n }\n\n // If there are multiple queries, we need to add the query index to the value key and label key to avoid conflicts\n const valueColumnName = queryResults.length === 1 ? 'value' : `value #${queryIndex + 1}`;\n const labels =\n queryResults.length === 1\n ? ts.labels\n : Object.entries(ts.labels ?? {}).reduce((acc, [key, value]) => {\n if (key) acc[`${key} #${queryIndex + 1}`] = value;\n return acc;\n }, {} as Labels);\n\n // If the cell visualization is a panel plugin, filter the data by the current series\n const columnValue = (spec.columnSettings ?? []).find((x) => x.name === valueColumnName)?.plugin\n ? { ...data, data: { ...data.data, series: data.data.series.filter((s) => s === ts) } }\n : ts.values[0][1];\n\n if (queryMode === 'instant') {\n // Timestamp is not indexed as it will be the same for all queries\n return { timestamp: ts.values[0][0], [valueColumnName]: columnValue, ...labels };\n } else {\n // Don't add a timestamp for range queries\n return { [valueColumnName]: columnValue, ...labels };\n }\n });\n }, [queryResults, queryMode, spec.columnSettings]);\n\n // Transform will be applied by their orders on the original data\n const data = useMemo(() => transformData(rawData, spec.transforms ?? []), [rawData, spec.transforms]);\n\n const keys: string[] = useMemo(() => {\n const result: string[] = [];\n\n for (const entry of data) {\n for (const key of Object.keys(entry)) {\n if (!result.includes(key)) {\n result.push(key);\n }\n }\n }\n\n return result;\n }, [data]);\n\n // fetch unique values for each column of filtering\n const columnUniqueValues = useMemo(() => {\n const uniqueValues: Record<string, Array<string | number>> = {};\n\n keys.forEach((key) => {\n const values = data.map((row) => row[key]).filter((val) => val !== null && val !== undefined && val !== '');\n uniqueValues[key] = Array.from(new Set(values as Array<string | number>));\n });\n\n return uniqueValues;\n }, [data, keys]);\n\n // Generate columns and map each column accessor to its settings index and data key\n const columns: Array<TableColumnConfig<unknown>> = useMemo(() => {\n const columns: Array<TableColumnConfig<unknown>> = [];\n const customizedColumns = new Set<string>();\n\n // Process columnSettings if they exist\n for (const columnSetting of spec.columnSettings ?? []) {\n if (customizedColumns.has(columnSetting.name)) continue; // Skip duplicates\n\n const columnConfig = generateColumnConfig(columnSetting.name, spec.columnSettings ?? [], allVariables);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n customizedColumns.add(columnSetting.name);\n }\n }\n\n // Add remaining columns if defaultColumnHidden is false\n if (!spec.defaultColumnHidden) {\n for (const key of keys) {\n if (!customizedColumns.has(key)) {\n const columnConfig = generateColumnConfig(key, spec.columnSettings ?? [], allVariables);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n }\n }\n\n return columns;\n }, [keys, spec.columnSettings, spec.defaultColumnHidden, allVariables]);\n\n // Generate cell settings that will be used by the table to render cells (text color, background color, ...)\n const cellConfigs: TableCellConfigs = useMemo(() => {\n // If there are no cell settings globally or per column, return an empty object\n if (spec.cellSettings === undefined && !spec.columnSettings?.some((col) => col.cellSettings !== undefined)) {\n return {};\n }\n\n const result: TableCellConfigs = {};\n\n let index = 0;\n for (const row of data) {\n // Transforming key to object to extend the row with undefined values if the key is not present\n // for checking the cell config \"Misc\" condition with \"null\"\n const keysAsObj = keys.reduce(\n (acc, key) => {\n acc[key] = undefined;\n return acc;\n },\n {} as Record<string, undefined>\n );\n\n const extendRow = {\n ...keysAsObj,\n ...row,\n };\n\n // Generate cellConfigs for each column (including duplicates with different headers)\n for (const [key, value] of Object.entries(extendRow)) {\n // First, try to get cell config from global cell settings\n let cellConfig = evaluateConditionalFormatting(value, spec.cellSettings ?? []);\n\n // Then, try to get cell config from column-specific cell settings\n const columnSetting = spec.columnSettings?.find((col) => col.name === key);\n if (columnSetting?.cellSettings?.length) {\n const columnCellConfig = evaluateConditionalFormatting(value, columnSetting.cellSettings);\n // Column-specific settings take precedence over global settings\n if (columnCellConfig) {\n cellConfig = columnCellConfig;\n }\n }\n\n if (cellConfig) {\n result[`${index}_${key}`] = cellConfig;\n }\n }\n index++;\n }\n\n return result;\n }, [data, keys, spec.cellSettings, spec.columnSettings]);\n\n function generateDefaultSortingState(): SortingState {\n return (\n spec.columnSettings\n ?.filter((column) => column.sort !== undefined)\n .map((column) => {\n return {\n id: column.name,\n desc: column.sort === 'desc',\n };\n }) ?? []\n );\n }\n\n const [sorting, setSorting] = useState<SortingState>(generateDefaultSortingState());\n\n // Filtering state\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [filterAnchorEl, setFilterAnchorEl] = useState<{ [key: string]: HTMLElement | null }>({});\n const [openFilterColumn, setOpenFilterColumn] = useState<string | null>(null);\n\n // get selected values for a column\n const getSelectedFilterValues = (columnId: string): Array<string | number> => {\n const filter = columnFilters.find((f) => f.id === columnId);\n return filter ? (filter.value as Array<string | number>) : [];\n };\n\n // update column filter\n const updateColumnFilter = (columnId: string, values: Array<string | number>): void => {\n const newFilters = columnFilters.filter((f) => f.id !== columnId);\n if (values.length > 0) {\n newFilters.push({ id: columnId, value: values });\n }\n setColumnFilters(newFilters);\n };\n\n // Handle filter clicks\n const handleFilterClick = (event: React.MouseEvent<HTMLButtonElement>, columnId: string): void => {\n event.preventDefault();\n event.stopPropagation();\n setFilterAnchorEl({ ...filterAnchorEl, [columnId]: event.currentTarget });\n setOpenFilterColumn(columnId);\n };\n\n const handleFilterClose = (): void => {\n setFilterAnchorEl({});\n setOpenFilterColumn(null);\n };\n\n // Close filter when clicking outside\n useEffect(() => {\n if (!openFilterColumn) return;\n\n const handleClick = (e: MouseEvent): void => {\n const target = e.target as Element;\n if (!target.closest('[data-filter-dropdown]') && !target.closest('button')) {\n handleFilterClose();\n }\n };\n\n const timer = setTimeout(() => {\n document.addEventListener('click', handleClick);\n }, 100);\n\n return (): void => {\n clearTimeout(timer);\n document.removeEventListener('click', handleClick);\n };\n }, [openFilterColumn]);\n\n // filter data based on the current filters\n const filteredData = useMemo(() => {\n let filtered = [...data];\n\n // apply column filters if enabled\n if (spec.enableFiltering && columnFilters.length > 0) {\n filtered = filtered.filter((row) => {\n return columnFilters.every((filter) => {\n const value = row[filter.id];\n const filterValues = filter.value as Array<string | number>;\n\n if (!filterValues || filterValues.length === 0) return true; // No filter values means no filtering\n\n // Check if the row value is in the selected filter values\n return filterValues.includes(value as string | number);\n });\n });\n }\n\n return filtered;\n }, [data, columnFilters, spec.enableFiltering]);\n\n // Keep ref in sync with filtered data for use in selection handler\n filteredDataRef.current = filteredData;\n\n const [pagination, setPagination] = useState<PaginationState | undefined>(\n spec.pagination ? { pageIndex: 0, pageSize: 10 } : undefined\n );\n\n useEffect(() => {\n // If the pagination setting changes from no pagination to pagination, but the pagination state is undefined, update the pagination state\n if (spec.pagination && !pagination) {\n setPagination({ pageIndex: 0, pageSize: 10 });\n } else if (!spec.pagination && pagination) {\n setPagination(undefined);\n }\n }, [spec.pagination, pagination]);\n\n if (contentDimensions === undefined) {\n return null;\n }\n\n if (!data?.length) {\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n }}\n >\n <Typography>No data</Typography>\n </Box>\n );\n }\n\n return (\n <>\n {confirmDialog}\n {spec.enableFiltering && (\n <div\n style={{\n display: 'flex',\n background: theme.palette.background.default,\n borderBottom: `1px solid ${theme.palette.divider}`,\n width: contentDimensions.width,\n boxSizing: 'border-box',\n }}\n >\n {columns.map((column, idx) => {\n const filters = getSelectedFilterValues(column.accessorKey as string);\n const columnWidth = column.width || spec.defaultColumnWidth;\n return (\n <div\n key={`filter-${idx}`}\n style={{\n padding: '8px',\n borderRight: idx < columns.length - 1 ? `1px solid ${theme.palette.divider}` : 'none',\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n boxSizing: 'border-box',\n flex: typeof columnWidth === 'number' ? 'none' : '1 1 auto',\n }}\n >\n <span\n style={{\n marginRight: 8,\n fontSize: '12px',\n color: theme.palette.text.secondary,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {filters.length ? `${filters.length} items` : 'All'}\n </span>\n <button\n onClick={(e) => {\n handleFilterClick(e, column.accessorKey as string);\n }}\n style={{\n border: `1px solid ${theme.palette.divider}`,\n background: theme.palette.background.paper,\n cursor: 'pointer',\n fontSize: '12px',\n color: filters.length ? theme.palette.primary.main : theme.palette.text.secondary,\n padding: '4px 8px',\n borderRadius: '4px',\n minWidth: '20px',\n height: '24px',\n flexShrink: 0,\n transition: 'all 0.2s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = theme.palette.action.hover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = theme.palette.background.paper;\n }}\n type=\"button\"\n >\n ▼\n </button>\n\n {openFilterColumn === column.accessorKey && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n zIndex: 1000,\n marginTop: 4,\n }}\n >\n <ColumnFilterDropdown\n allValues={columnUniqueValues[column.accessorKey as string] || []}\n selectedValues={filters}\n onFilterChange={(values) => updateColumnFilter(column.accessorKey as string, values)}\n theme={theme}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n <Table\n data={filteredData}\n columns={columns}\n cellConfigs={cellConfigs}\n height={spec.enableFiltering ? contentDimensions.height - 40 : contentDimensions.height}\n width={contentDimensions.width}\n density={spec.density}\n defaultColumnWidth={spec.defaultColumnWidth}\n defaultColumnHeight={spec.defaultColumnHeight}\n sorting={sorting}\n onSortingChange={setSorting}\n pagination={pagination}\n onPaginationChange={setPagination}\n checkboxSelection={selectionEnabled}\n rowSelection={rowSelection}\n onRowSelectionChange={handleRowSelectionChange}\n getItemActions={({ id, data }) => getItemActionButtons({ id, data: data as Record<string, unknown> })}\n hasItemActions={actionButtons && actionButtons.length > 0}\n />\n </>\n );\n}\n"],"names":["Box","Typography","useTheme","Table","useSelection","formatValue","transformData","useSelectionItemActions","replaceVariablesInString","useAllVariableValues","useCallback","useEffect","useMemo","useRef","useState","evaluateConditionalFormatting","EmbeddedPanel","generateCellContentConfig","column","plugin","undefined","cell","ctx","panelData","getValue","kind","spec","queryResults","cellDescription","cellValue","format","ColumnFilterDropdown","allValues","selectedValues","onFilterChange","theme","values","Set","filter","v","sort","length","div","data-filter-dropdown","style","width","padding","backgroundColor","palette","background","paper","border","divider","borderRadius","boxShadow","shadows","color","text","secondary","fontSize","maxHeight","overflowY","marginBottom","fontWeight","label","display","alignItems","cursor","input","type","checked","onChange","e","target","marginRight","span","primary","hr","margin","borderTop","map","value","index","onMouseEnter","currentTarget","action","hover","onMouseLeave","includes","String","generateColumnConfig","name","columnSettings","allVariables","hide","header","headerDescription","enableSorting","align","dataLink","modifiedDataLink","url","accessorKey","getTablePanelQueryOptions","mode","some","c","TablePanel","contentDimensions","selectionEnabled","selection","enabled","selectionMap","setSelection","clearSelection","itemActionsConfig","actions","itemActionsListConfig","displayWithItem","actionsList","getItemActionButtons","confirmDialog","actionButtons","variableState","filteredDataRef","rowSelection","result","forEach","_","id","handleRowSelectionChange","newRowSelection","newSelection","isSelected","Object","entries","parseInt","current","push","item","queryMode","rawData","flatMap","data","queryIndex","series","ts","labels","valueColumnName","reduce","acc","key","columnValue","find","x","s","timestamp","transforms","keys","entry","columnUniqueValues","uniqueValues","row","val","Array","from","columns","customizedColumns","columnSetting","has","columnConfig","add","defaultColumnHidden","cellConfigs","cellSettings","col","keysAsObj","extendRow","cellConfig","columnCellConfig","generateDefaultSortingState","desc","sorting","setSorting","columnFilters","setColumnFilters","filterAnchorEl","setFilterAnchorEl","openFilterColumn","setOpenFilterColumn","getSelectedFilterValues","columnId","f","updateColumnFilter","newFilters","handleFilterClick","event","preventDefault","stopPropagation","handleFilterClose","handleClick","closest","timer","setTimeout","document","addEventListener","clearTimeout","removeEventListener","filteredData","filtered","enableFiltering","every","filterValues","pagination","setPagination","pageIndex","pageSize","sx","justifyContent","height","default","borderBottom","boxSizing","idx","filters","columnWidth","defaultColumnWidth","borderRight","minWidth","maxWidth","position","flex","overflow","textOverflow","whiteSpace","button","onClick","main","flexShrink","transition","top","left","zIndex","marginTop","density","defaultColumnHeight","onSortingChange","onPaginationChange","checkboxSelection","onRowSelectionChange","getItemActions","hasItemActions"],"mappings":"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"}