@perses-dev/table-plugin 0.10.1 → 0.11.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.
- package/__mf/js/{Table.7e37b83d.js → Table.7c94517d.js} +5 -5
- package/__mf/js/async/{8728.546704f2.js → 1103.ffbc2bec.js} +1 -1
- package/__mf/js/async/1117.87be49e9.js +2 -0
- package/__mf/js/async/1490.9d97e5d1.js +22 -0
- package/__mf/js/async/2473.2c502914.js +1 -0
- package/__mf/js/async/{7208.125848cf.js → 3919.927efb3c.js} +5 -5
- package/__mf/js/async/5413.6d8fc766.js +1 -0
- package/__mf/js/async/5501.bc363348.js +1 -0
- package/__mf/js/async/7794.0374cd38.js +1 -0
- package/__mf/js/async/{7417.86d0bc09.js → 8094.c02682f3.js} +1 -1
- package/__mf/js/async/{6587.d2b9768c.js → 868.9f710584.js} +2 -2
- package/__mf/js/async/__federation_expose_Table.61be353a.js +1 -0
- package/__mf/js/{main.289caaea.js → main.1250232e.js} +5 -5
- package/lib/cjs/components/ColumnsEditor/ColumnEditor.js +10 -0
- package/lib/cjs/components/ColumnsEditor/DataLinkEditorDialog.js +139 -0
- package/lib/cjs/components/TablePanel.js +37 -16
- package/lib/components/ColumnsEditor/ColumnEditor.d.ts.map +1 -1
- package/lib/components/ColumnsEditor/ColumnEditor.js +10 -0
- package/lib/components/ColumnsEditor/ColumnEditor.js.map +1 -1
- package/lib/components/ColumnsEditor/DataLinkEditorDialog.d.ts +5 -0
- package/lib/components/ColumnsEditor/DataLinkEditorDialog.d.ts.map +1 -0
- package/lib/components/ColumnsEditor/DataLinkEditorDialog.js +126 -0
- package/lib/components/ColumnsEditor/DataLinkEditorDialog.js.map +1 -0
- package/lib/components/TablePanel.d.ts.map +1 -1
- package/lib/components/TablePanel.js +38 -17
- package/lib/components/TablePanel.js.map +1 -1
- package/lib/models/table-model.d.ts +6 -0
- package/lib/models/table-model.d.ts.map +1 -1
- package/lib/models/table-model.js.map +1 -1
- package/mf-manifest.json +20 -20
- package/mf-stats.json +20 -20
- package/package.json +5 -5
- package/__mf/js/async/1490.7aa42bc8.js +0 -22
- package/__mf/js/async/4761.08da9107.js +0 -1
- package/__mf/js/async/5501.fa3f80e1.js +0 -1
- package/__mf/js/async/5806.44fbc2a8.js +0 -1
- package/__mf/js/async/7142.5d923107.js +0 -1
- package/__mf/js/async/9355.8b0c6885.js +0 -2
- package/__mf/js/async/__federation_expose_Table.4836d198.js +0 -1
- /package/__mf/js/async/{9355.8b0c6885.js.LICENSE.txt → 1117.87be49e9.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{1490.7aa42bc8.js.LICENSE.txt → 1490.9d97e5d1.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{7208.125848cf.js.LICENSE.txt → 3919.927efb3c.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{6587.d2b9768c.js.LICENSE.txt → 868.9f710584.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/TablePanel.tsx"],"sourcesContent":["// Copyright 2024 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, PanelProps } from '@perses-dev/plugin-system';\nimport { Table, TableCellConfigs, TableColumnConfig } from '@perses-dev/components';\nimport { ReactElement, useEffect, useMemo, useState } from 'react';\nimport { formatValue, Labels, QueryDataType, TimeSeries, TimeSeriesData, transformData } from '@perses-dev/core';\nimport { PaginationState, SortingState, ColumnFiltersState } from '@tanstack/react-table';\nimport { useTheme, Theme } from '@mui/material';\nimport { ColumnSettings, TableOptions, evaluateConditionalFormatting } 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(name: string, columnSettings: ColumnSettings[]): TableColumnConfig<unknown> | undefined {\n for (const column of columnSettings) {\n if (column.name === name) {\n if (column.hide) {\n return undefined;\n }\n\n return {\n accessorKey: name,\n header: column.header ?? name,\n headerDescription: column.headerDescription,\n enableSorting: column.enableSorting,\n width: column.width,\n align: column.align,\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\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 = transformData(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 const columns: Array<TableColumnConfig<unknown>> = useMemo(() => {\n const columns: Array<TableColumnConfig<unknown>> = [];\n\n // Taking the customized columns first for the ordering of the columns in the table\n const customizedColumns =\n spec.columnSettings?.map((column) => column.name).filter((name) => keys.includes(name)) ?? [];\n const defaultColumns = keys.filter((key) => !customizedColumns.includes(key));\n\n for (const key of customizedColumns) {\n const columnConfig = generateColumnConfig(key, spec.columnSettings ?? []);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n\n if (!spec.defaultColumnHidden) {\n for (const key of defaultColumns) {\n const columnConfig = generateColumnConfig(key, spec.columnSettings ?? []);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n }\n\n return columns;\n }, [keys, spec.columnSettings, spec.defaultColumnHidden]);\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 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 if conditional formatting is enabled\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 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 return (\n <div>\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\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 />\n </div>\n );\n}\n"],"names":["Table","useEffect","useMemo","useState","formatValue","transformData","useTheme","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","hide","accessorKey","header","headerDescription","enableSorting","align","getTablePanelQueryOptions","mode","some","c","TablePanel","contentDimensions","queryMode","rawData","flatMap","data","queryIndex","series","ts","labels","valueColumnName","Object","entries","reduce","acc","key","columnValue","find","x","s","timestamp","transforms","keys","result","entry","push","columnUniqueValues","uniqueValues","forEach","row","val","Array","from","columns","customizedColumns","defaultColumns","columnConfig","defaultColumnHidden","cellConfigs","cellSettings","col","keysAsObj","extendRow","cellConfig","columnSetting","columnCellConfig","generateDefaultSortingState","id","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","default","borderBottom","boxSizing","idx","filters","columnWidth","defaultColumnWidth","borderRight","minWidth","maxWidth","position","flex","overflow","textOverflow","whiteSpace","button","onClick","main","height","flexShrink","transition","top","left","zIndex","marginTop","density","defaultColumnHeight","onSortingChange","onPaginationChange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/TablePanel.tsx"],"sourcesContent":["// Copyright 2024 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, PanelProps } from '@perses-dev/plugin-system';\nimport { Table, TableCellConfigs, TableColumnConfig } from '@perses-dev/components';\nimport { ReactElement, useEffect, useMemo, useState } from 'react';\nimport { formatValue, Labels, QueryDataType, TimeSeries, TimeSeriesData, transformData } from '@perses-dev/core';\nimport { PaginationState, SortingState, ColumnFiltersState } from '@tanstack/react-table';\nimport { useTheme, Theme, Typography, Box } from '@mui/material';\nimport { ColumnSettings, TableOptions, evaluateConditionalFormatting } 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(name: string, columnSettings: ColumnSettings[]): 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 return {\n accessorKey: name,\n header: header ?? name,\n headerDescription,\n enableSorting,\n width,\n align,\n dataLink,\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\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 = transformData(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 ?? []);\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 ?? []);\n if (columnConfig !== undefined) {\n columns.push(columnConfig);\n }\n }\n }\n }\n\n return columns;\n }, [keys, spec.columnSettings, spec.defaultColumnHidden]);\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 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 {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 />\n </>\n );\n}\n"],"names":["Table","useEffect","useMemo","useState","formatValue","transformData","useTheme","Typography","Box","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","hide","header","headerDescription","enableSorting","align","dataLink","accessorKey","getTablePanelQueryOptions","mode","some","c","TablePanel","contentDimensions","queryMode","rawData","flatMap","data","queryIndex","series","ts","labels","valueColumnName","Object","entries","reduce","acc","key","columnValue","find","x","s","timestamp","transforms","keys","result","entry","push","columnUniqueValues","uniqueValues","forEach","row","val","Array","from","columns","customizedColumns","columnSetting","has","columnConfig","add","defaultColumnHidden","cellConfigs","cellSettings","col","keysAsObj","extendRow","cellConfig","columnCellConfig","generateDefaultSortingState","id","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"],"mappings":"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"}
|
|
@@ -35,6 +35,12 @@ export interface ColumnSettings {
|
|
|
35
35
|
width?: number | 'auto';
|
|
36
36
|
hide?: boolean;
|
|
37
37
|
cellSettings?: CellSettings[];
|
|
38
|
+
dataLink?: DataLink;
|
|
39
|
+
}
|
|
40
|
+
export interface DataLink {
|
|
41
|
+
url: string;
|
|
42
|
+
title?: string;
|
|
43
|
+
openNewTab: boolean;
|
|
38
44
|
}
|
|
39
45
|
export interface ValueCondition {
|
|
40
46
|
kind: 'Value';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-model.d.ts","sourceRoot":"","sources":["../../../src/models/table-model.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IAGb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAEjC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,aAAa,CAAC;IAGvB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAGpC,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAEtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"table-model.d.ts","sourceRoot":"","sources":["../../../src/models/table-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/models/table-model.ts"],"sourcesContent":["// Copyright 2024 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 { Definition, FormatOptions, Transform, UnknownSpec } from '@perses-dev/core';\nimport { TableDensity, TableCellConfig } from '@perses-dev/components';\nimport { OptionsEditorProps } from '@perses-dev/plugin-system';\nimport React from 'react';\nimport { TextField, Stack, MenuItem, Typography } from '@mui/material';\n\nexport interface ColumnSettings {\n name: string;\n\n // Text to display in the header for the column.\n header?: string;\n /**\n * Text to display when hovering over the header text. This can be useful for\n * providing additional information about the column when you want to keep the\n * header text relatively short to manage the column width.\n */\n headerDescription?: string;\n /**\n * Text to display when hovering over a cell. This can be useful for\n * providing additional information about the column when the content is\n * ellipsized to fit in the space.\n */\n cellDescription?: string;\n\n /**\n * Panel plugin to render.\n * By default, the cells are rendered as text.\n */\n plugin?: Definition<UnknownSpec>;\n\n /** Formatting options. Only applicable if plugin is unset. */\n format?: FormatOptions;\n\n // Alignment of the content in the cell.\n align?: 'left' | 'center' | 'right';\n\n // When `true`, the column will be sortable.\n enableSorting?: boolean;\n\n // Default sort order for the column.\n sort?: 'asc' | 'desc';\n\n /**\n * Width of the column when rendered in a table. It should be a number in pixels\n * or \"auto\" to allow the table to automatically adjust the width to fill\n * space.\n */\n width?: number | 'auto';\n // When `true`, the column will not be displayed.\n hide?: boolean;\n // Customize cell display based on their value for this specific column.\n cellSettings?: CellSettings[];\n}\n\nexport interface ValueCondition {\n kind: 'Value';\n spec: {\n value: string;\n };\n}\n\nexport interface RangeCondition {\n kind: 'Range';\n spec: {\n min?: number;\n max?: number;\n };\n}\n\nexport interface RegexCondition {\n kind: 'Regex';\n spec: {\n expr: string;\n };\n}\n\nexport interface MiscCondition {\n kind: 'Misc';\n spec: {\n value: 'empty' | 'null' | 'NaN' | 'true' | 'false';\n };\n}\n\nexport type Condition = ValueCondition | RangeCondition | RegexCondition | MiscCondition;\n\nexport interface CellSettings {\n condition: Condition;\n text?: string;\n prefix?: string;\n suffix?: string;\n textColor?: `#${string}`;\n backgroundColor?: `#${string}`;\n}\n\n/**\n * The schema for a Table panel.\n */\nexport interface TableDefinition extends Definition<TableOptions> {\n kind: 'Table';\n}\n\n/**\n * The Options object type supported by the Table panel plugin.\n */\nexport interface TableOptions {\n // Change row height.\n density?: TableDensity;\n // When set to 'auto', the table will try to automatically adjust the width of columns to fit without overflowing.\n // Only for column without custom width specified in columnSettings.\n defaultColumnWidth?: 'auto' | number;\n // When set to 'auto', the table will calculate the cell height based on the line height of the theme and the density setting of the table.\n // Only for column without custom height specified in columnSettings.\n defaultColumnHeight?: 'auto' | number;\n // When true, columns are hidden by default unless specified in columnSettings.\n defaultColumnHidden?: boolean;\n // Enable pagination.\n pagination?: boolean;\n // Enable filtering for individual columns.\n enableFiltering?: boolean;\n // Customize column display and order them by their index in the array.\n columnSettings?: ColumnSettings[];\n // Customize cell display based on their value.\n cellSettings?: CellSettings[];\n // Apply transforms to the data before rendering the table.\n transforms?: Transform[];\n}\n\n/**\n * Creates the initial/empty options for a Table panel.\n */\nexport function createInitialTableOptions(): TableOptions {\n return {\n density: 'standard',\n enableFiltering: true,\n };\n}\n\nexport type TableSettingsEditorProps = OptionsEditorProps<TableOptions>;\n\n/**\n * Formats the display text and colors based on cell settings\n */\nexport function formatCellDisplay(value: unknown, setting: CellSettings, defaultText?: string): TableCellConfig {\n const baseText = setting.text || defaultText || String(value);\n const displayText = `${setting.prefix ?? ''}${baseText}${setting.suffix ?? ''}`;\n return {\n text: displayText,\n textColor: setting.textColor,\n backgroundColor: setting.backgroundColor,\n };\n}\n\n/**\n * Evaluates if a condition matches the given value\n */\nexport function evaluateCondition(condition: Condition, value: unknown): boolean {\n switch (condition.kind) {\n case 'Value':\n return condition.spec?.value === String(value);\n\n case 'Range': {\n if (Number.isNaN(Number(value))) return false;\n const numericValue = Number(value);\n\n // Both min and max defined\n if (condition.spec?.min !== undefined && condition.spec?.max !== undefined) {\n return numericValue >= +condition.spec.min && numericValue <= +condition.spec.max;\n }\n\n // Only min defined\n if (condition.spec?.min !== undefined) {\n return numericValue >= +condition.spec.min;\n }\n\n // Only max defined\n if (condition.spec?.max !== undefined) {\n return numericValue <= +condition.spec.max;\n }\n\n return false;\n }\n\n case 'Regex':\n if (!condition.spec?.expr) return false;\n try {\n const regex = new RegExp(condition.spec.expr);\n return regex.test(String(value));\n } catch {\n return false; // Invalid regex\n }\n\n case 'Misc':\n switch (condition.spec?.value) {\n case 'empty':\n return value === '';\n case 'null':\n return value === null || value === undefined;\n case 'NaN':\n return Number.isNaN(value);\n case 'true':\n return value === true;\n case 'false':\n return value === false;\n default:\n return false;\n }\n\n default:\n return false;\n }\n}\n\n/**\n * Evaluates all conditions and returns the cell config for the first matching condition\n */\nexport function evaluateConditionalFormatting(value: unknown, settings: CellSettings[]): TableCellConfig | undefined {\n for (const setting of settings) {\n if (evaluateCondition(setting.condition, value)) {\n // Handle special default text cases\n let defaultText: string | undefined;\n if (setting.condition.kind === 'Misc') {\n switch (setting.condition.spec?.value) {\n case 'null':\n defaultText = 'null';\n break;\n case 'NaN':\n defaultText = 'NaN';\n break;\n }\n }\n\n return formatCellDisplay(value, setting, defaultText);\n }\n }\n\n return undefined; // No conditions matched\n}\n\n/**\n * Renders the condition editor component for a given condition\n * This function can be used by both CellEditor and ColumnEditor to maintain consistency\n */\nexport function renderConditionEditor(\n condition: Condition,\n onChange: (condition: Condition) => void,\n size: 'small' | 'medium' = 'small'\n): React.ReactElement | null {\n if (condition.kind === 'Value') {\n return React.createElement(TextField, {\n label: 'Value',\n placeholder: 'Exact value',\n value: condition.spec?.value ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { value: e.target.value } } as ValueCondition),\n fullWidth: true,\n size: size,\n });\n } else if (condition.kind === 'Range') {\n return React.createElement(\n Stack,\n {\n gap: 1,\n direction: 'row',\n },\n [\n React.createElement(TextField, {\n key: 'min',\n label: 'From',\n placeholder: 'Start of range',\n value: condition.spec?.min ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { ...condition.spec, min: +e.target.value } } as RangeCondition),\n fullWidth: true,\n size: size,\n }),\n React.createElement(TextField, {\n key: 'max',\n label: 'To',\n placeholder: 'End of range (inclusive)',\n value: condition.spec?.max ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { ...condition.spec, max: +e.target.value } } as RangeCondition),\n fullWidth: true,\n size: size,\n }),\n ]\n );\n } else if (condition.kind === 'Regex') {\n return React.createElement(TextField, {\n label: 'Regular Expression',\n placeholder: 'JavaScript regular expression',\n value: condition.spec?.expr ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { expr: e.target.value } } as RegexCondition),\n fullWidth: true,\n size: size,\n });\n } else if (condition.kind === 'Misc') {\n const options = [\n { value: 'empty', label: 'Empty', caption: 'Matches empty string' },\n { value: 'null', label: 'Null', caption: 'Matches null or undefined' },\n { value: 'NaN', label: 'NaN', caption: 'Matches Not a Number value' },\n { value: 'true', label: 'True', caption: 'Matches true boolean' },\n { value: 'false', label: 'False', caption: 'Matches false boolean' },\n ];\n\n return React.createElement(\n TextField,\n {\n select: true,\n label: 'Value',\n value: condition.spec?.value ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { value: e.target.value } } as MiscCondition),\n fullWidth: true,\n size: size,\n },\n options.map((option) =>\n React.createElement(\n MenuItem,\n {\n key: option.value,\n value: option.value,\n },\n React.createElement(Stack, { key: 'stack' }, [\n React.createElement(Typography, { key: 'title' }, option.label),\n React.createElement(\n Typography,\n {\n key: 'caption',\n variant: 'caption',\n },\n option.caption\n ),\n ])\n )\n )\n );\n }\n return null;\n}\n"],"names":["React","TextField","Stack","MenuItem","Typography","createInitialTableOptions","density","enableFiltering","formatCellDisplay","value","setting","defaultText","baseText","text","String","displayText","prefix","suffix","textColor","backgroundColor","evaluateCondition","condition","kind","spec","Number","isNaN","numericValue","min","undefined","max","expr","regex","RegExp","test","evaluateConditionalFormatting","settings","renderConditionEditor","onChange","size","createElement","label","placeholder","e","target","fullWidth","gap","direction","key","options","caption","select","map","option","variant"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/models/table-model.ts"],"sourcesContent":["// Copyright 2024 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 { Definition, FormatOptions, Transform, UnknownSpec } from '@perses-dev/core';\nimport { TableDensity, TableCellConfig } from '@perses-dev/components';\nimport { OptionsEditorProps } from '@perses-dev/plugin-system';\nimport React from 'react';\nimport { TextField, Stack, MenuItem, Typography } from '@mui/material';\n\nexport interface ColumnSettings {\n name: string;\n\n // Text to display in the header for the column.\n header?: string;\n /**\n * Text to display when hovering over the header text. This can be useful for\n * providing additional information about the column when you want to keep the\n * header text relatively short to manage the column width.\n */\n headerDescription?: string;\n /**\n * Text to display when hovering over a cell. This can be useful for\n * providing additional information about the column when the content is\n * ellipsized to fit in the space.\n */\n cellDescription?: string;\n\n /**\n * Panel plugin to render.\n * By default, the cells are rendered as text.\n */\n plugin?: Definition<UnknownSpec>;\n\n /** Formatting options. Only applicable if plugin is unset. */\n format?: FormatOptions;\n\n // Alignment of the content in the cell.\n align?: 'left' | 'center' | 'right';\n\n // When `true`, the column will be sortable.\n enableSorting?: boolean;\n\n // Default sort order for the column.\n sort?: 'asc' | 'desc';\n\n /**\n * Width of the column when rendered in a table. It should be a number in pixels\n * or \"auto\" to allow the table to automatically adjust the width to fill\n * space.\n */\n width?: number | 'auto';\n // When `true`, the column will not be displayed.\n hide?: boolean;\n // Customize cell display based on their value for this specific column.\n cellSettings?: CellSettings[];\n\n dataLink?: DataLink;\n}\n\nexport interface DataLink {\n url: string;\n title?: string;\n openNewTab: boolean;\n}\n\nexport interface ValueCondition {\n kind: 'Value';\n spec: {\n value: string;\n };\n}\n\nexport interface RangeCondition {\n kind: 'Range';\n spec: {\n min?: number;\n max?: number;\n };\n}\n\nexport interface RegexCondition {\n kind: 'Regex';\n spec: {\n expr: string;\n };\n}\n\nexport interface MiscCondition {\n kind: 'Misc';\n spec: {\n value: 'empty' | 'null' | 'NaN' | 'true' | 'false';\n };\n}\n\nexport type Condition = ValueCondition | RangeCondition | RegexCondition | MiscCondition;\n\nexport interface CellSettings {\n condition: Condition;\n text?: string;\n prefix?: string;\n suffix?: string;\n textColor?: `#${string}`;\n backgroundColor?: `#${string}`;\n}\n\n/**\n * The schema for a Table panel.\n */\nexport interface TableDefinition extends Definition<TableOptions> {\n kind: 'Table';\n}\n\n/**\n * The Options object type supported by the Table panel plugin.\n */\nexport interface TableOptions {\n // Change row height.\n density?: TableDensity;\n // When set to 'auto', the table will try to automatically adjust the width of columns to fit without overflowing.\n // Only for column without custom width specified in columnSettings.\n defaultColumnWidth?: 'auto' | number;\n // When set to 'auto', the table will calculate the cell height based on the line height of the theme and the density setting of the table.\n // Only for column without custom height specified in columnSettings.\n defaultColumnHeight?: 'auto' | number;\n // When true, columns are hidden by default unless specified in columnSettings.\n defaultColumnHidden?: boolean;\n // Enable pagination.\n pagination?: boolean;\n // Enable filtering for individual columns.\n enableFiltering?: boolean;\n // Customize column display and order them by their index in the array.\n columnSettings?: ColumnSettings[];\n // Customize cell display based on their value.\n cellSettings?: CellSettings[];\n // Apply transforms to the data before rendering the table.\n transforms?: Transform[];\n}\n\n/**\n * Creates the initial/empty options for a Table panel.\n */\nexport function createInitialTableOptions(): TableOptions {\n return {\n density: 'standard',\n enableFiltering: true,\n };\n}\n\nexport type TableSettingsEditorProps = OptionsEditorProps<TableOptions>;\n\n/**\n * Formats the display text and colors based on cell settings\n */\nexport function formatCellDisplay(value: unknown, setting: CellSettings, defaultText?: string): TableCellConfig {\n const baseText = setting.text || defaultText || String(value);\n const displayText = `${setting.prefix ?? ''}${baseText}${setting.suffix ?? ''}`;\n return {\n text: displayText,\n textColor: setting.textColor,\n backgroundColor: setting.backgroundColor,\n };\n}\n\n/**\n * Evaluates if a condition matches the given value\n */\nexport function evaluateCondition(condition: Condition, value: unknown): boolean {\n switch (condition.kind) {\n case 'Value':\n return condition.spec?.value === String(value);\n\n case 'Range': {\n if (Number.isNaN(Number(value))) return false;\n const numericValue = Number(value);\n\n // Both min and max defined\n if (condition.spec?.min !== undefined && condition.spec?.max !== undefined) {\n return numericValue >= +condition.spec.min && numericValue <= +condition.spec.max;\n }\n\n // Only min defined\n if (condition.spec?.min !== undefined) {\n return numericValue >= +condition.spec.min;\n }\n\n // Only max defined\n if (condition.spec?.max !== undefined) {\n return numericValue <= +condition.spec.max;\n }\n\n return false;\n }\n\n case 'Regex':\n if (!condition.spec?.expr) return false;\n try {\n const regex = new RegExp(condition.spec.expr);\n return regex.test(String(value));\n } catch {\n return false; // Invalid regex\n }\n\n case 'Misc':\n switch (condition.spec?.value) {\n case 'empty':\n return value === '';\n case 'null':\n return value === null || value === undefined;\n case 'NaN':\n return Number.isNaN(value);\n case 'true':\n return value === true;\n case 'false':\n return value === false;\n default:\n return false;\n }\n\n default:\n return false;\n }\n}\n\n/**\n * Evaluates all conditions and returns the cell config for the first matching condition\n */\nexport function evaluateConditionalFormatting(value: unknown, settings: CellSettings[]): TableCellConfig | undefined {\n for (const setting of settings) {\n if (evaluateCondition(setting.condition, value)) {\n // Handle special default text cases\n let defaultText: string | undefined;\n if (setting.condition.kind === 'Misc') {\n switch (setting.condition.spec?.value) {\n case 'null':\n defaultText = 'null';\n break;\n case 'NaN':\n defaultText = 'NaN';\n break;\n }\n }\n\n return formatCellDisplay(value, setting, defaultText);\n }\n }\n\n return undefined; // No conditions matched\n}\n\n/**\n * Renders the condition editor component for a given condition\n * This function can be used by both CellEditor and ColumnEditor to maintain consistency\n */\nexport function renderConditionEditor(\n condition: Condition,\n onChange: (condition: Condition) => void,\n size: 'small' | 'medium' = 'small'\n): React.ReactElement | null {\n if (condition.kind === 'Value') {\n return React.createElement(TextField, {\n label: 'Value',\n placeholder: 'Exact value',\n value: condition.spec?.value ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { value: e.target.value } } as ValueCondition),\n fullWidth: true,\n size: size,\n });\n } else if (condition.kind === 'Range') {\n return React.createElement(\n Stack,\n {\n gap: 1,\n direction: 'row',\n },\n [\n React.createElement(TextField, {\n key: 'min',\n label: 'From',\n placeholder: 'Start of range',\n value: condition.spec?.min ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { ...condition.spec, min: +e.target.value } } as RangeCondition),\n fullWidth: true,\n size: size,\n }),\n React.createElement(TextField, {\n key: 'max',\n label: 'To',\n placeholder: 'End of range (inclusive)',\n value: condition.spec?.max ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { ...condition.spec, max: +e.target.value } } as RangeCondition),\n fullWidth: true,\n size: size,\n }),\n ]\n );\n } else if (condition.kind === 'Regex') {\n return React.createElement(TextField, {\n label: 'Regular Expression',\n placeholder: 'JavaScript regular expression',\n value: condition.spec?.expr ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { expr: e.target.value } } as RegexCondition),\n fullWidth: true,\n size: size,\n });\n } else if (condition.kind === 'Misc') {\n const options = [\n { value: 'empty', label: 'Empty', caption: 'Matches empty string' },\n { value: 'null', label: 'Null', caption: 'Matches null or undefined' },\n { value: 'NaN', label: 'NaN', caption: 'Matches Not a Number value' },\n { value: 'true', label: 'True', caption: 'Matches true boolean' },\n { value: 'false', label: 'False', caption: 'Matches false boolean' },\n ];\n\n return React.createElement(\n TextField,\n {\n select: true,\n label: 'Value',\n value: condition.spec?.value ?? '',\n onChange: (e: { target: { value: string } }) =>\n onChange({ ...condition, spec: { value: e.target.value } } as MiscCondition),\n fullWidth: true,\n size: size,\n },\n options.map((option) =>\n React.createElement(\n MenuItem,\n {\n key: option.value,\n value: option.value,\n },\n React.createElement(Stack, { key: 'stack' }, [\n React.createElement(Typography, { key: 'title' }, option.label),\n React.createElement(\n Typography,\n {\n key: 'caption',\n variant: 'caption',\n },\n option.caption\n ),\n ])\n )\n )\n );\n }\n return null;\n}\n"],"names":["React","TextField","Stack","MenuItem","Typography","createInitialTableOptions","density","enableFiltering","formatCellDisplay","value","setting","defaultText","baseText","text","String","displayText","prefix","suffix","textColor","backgroundColor","evaluateCondition","condition","kind","spec","Number","isNaN","numericValue","min","undefined","max","expr","regex","RegExp","test","evaluateConditionalFormatting","settings","renderConditionEditor","onChange","size","createElement","label","placeholder","e","target","fullWidth","gap","direction","key","options","caption","select","map","option","variant"],"mappings":"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"}
|
package/mf-manifest.json
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"name": "Table",
|
|
6
6
|
"type": "app",
|
|
7
7
|
"buildInfo": {
|
|
8
|
-
"buildVersion": "0.
|
|
8
|
+
"buildVersion": "0.11.0-rc.0",
|
|
9
9
|
"buildName": "@perses-dev/table-plugin"
|
|
10
10
|
},
|
|
11
11
|
"remoteEntry": {
|
|
12
|
-
"name": "__mf/js/Table.
|
|
12
|
+
"name": "__mf/js/Table.7c94517d.js",
|
|
13
13
|
"path": "",
|
|
14
14
|
"type": "global"
|
|
15
15
|
},
|
|
@@ -87,14 +87,14 @@
|
|
|
87
87
|
{
|
|
88
88
|
"id": "Table:@perses-dev/components",
|
|
89
89
|
"name": "@perses-dev/components",
|
|
90
|
-
"version": "0.53.0-
|
|
90
|
+
"version": "0.53.0-rc.1",
|
|
91
91
|
"singleton": true,
|
|
92
|
-
"requiredVersion": "^0.53.0-
|
|
92
|
+
"requiredVersion": "^0.53.0-rc.1",
|
|
93
93
|
"assets": {
|
|
94
94
|
"js": {
|
|
95
95
|
"async": [],
|
|
96
96
|
"sync": [
|
|
97
|
-
"__mf/js/async/
|
|
97
|
+
"__mf/js/async/3919.927efb3c.js"
|
|
98
98
|
]
|
|
99
99
|
},
|
|
100
100
|
"css": {
|
|
@@ -106,14 +106,14 @@
|
|
|
106
106
|
{
|
|
107
107
|
"id": "Table:@perses-dev/core",
|
|
108
108
|
"name": "@perses-dev/core",
|
|
109
|
-
"version": "0.53.0-beta.
|
|
109
|
+
"version": "0.53.0-beta.4",
|
|
110
110
|
"singleton": true,
|
|
111
|
-
"requiredVersion": "^0.53.0-beta.
|
|
111
|
+
"requiredVersion": "^0.53.0-beta.4",
|
|
112
112
|
"assets": {
|
|
113
113
|
"js": {
|
|
114
114
|
"async": [],
|
|
115
115
|
"sync": [
|
|
116
|
-
"__mf/js/async/
|
|
116
|
+
"__mf/js/async/1117.87be49e9.js"
|
|
117
117
|
]
|
|
118
118
|
},
|
|
119
119
|
"css": {
|
|
@@ -125,14 +125,14 @@
|
|
|
125
125
|
{
|
|
126
126
|
"id": "Table:@perses-dev/dashboards",
|
|
127
127
|
"name": "@perses-dev/dashboards",
|
|
128
|
-
"version": "0.53.0-
|
|
128
|
+
"version": "0.53.0-rc.1",
|
|
129
129
|
"singleton": true,
|
|
130
|
-
"requiredVersion": "^0.53.0-
|
|
130
|
+
"requiredVersion": "^0.53.0-rc.1",
|
|
131
131
|
"assets": {
|
|
132
132
|
"js": {
|
|
133
133
|
"async": [],
|
|
134
134
|
"sync": [
|
|
135
|
-
"__mf/js/async/1490.
|
|
135
|
+
"__mf/js/async/1490.9d97e5d1.js"
|
|
136
136
|
]
|
|
137
137
|
},
|
|
138
138
|
"css": {
|
|
@@ -144,14 +144,14 @@
|
|
|
144
144
|
{
|
|
145
145
|
"id": "Table:@perses-dev/plugin-system",
|
|
146
146
|
"name": "@perses-dev/plugin-system",
|
|
147
|
-
"version": "0.53.0-
|
|
147
|
+
"version": "0.53.0-rc.1",
|
|
148
148
|
"singleton": true,
|
|
149
|
-
"requiredVersion": "^0.53.0-
|
|
149
|
+
"requiredVersion": "^0.53.0-rc.1",
|
|
150
150
|
"assets": {
|
|
151
151
|
"js": {
|
|
152
152
|
"async": [],
|
|
153
153
|
"sync": [
|
|
154
|
-
"__mf/js/async/5501.
|
|
154
|
+
"__mf/js/async/5501.bc363348.js"
|
|
155
155
|
]
|
|
156
156
|
},
|
|
157
157
|
"css": {
|
|
@@ -322,20 +322,20 @@
|
|
|
322
322
|
"js": {
|
|
323
323
|
"sync": [
|
|
324
324
|
"__mf/js/async/1432.4dcbe7e3.js",
|
|
325
|
-
"__mf/js/async/
|
|
326
|
-
"__mf/js/async/
|
|
327
|
-
"__mf/js/async/__federation_expose_Table.
|
|
325
|
+
"__mf/js/async/868.9f710584.js",
|
|
326
|
+
"__mf/js/async/1103.ffbc2bec.js",
|
|
327
|
+
"__mf/js/async/__federation_expose_Table.61be353a.js"
|
|
328
328
|
],
|
|
329
329
|
"async": [
|
|
330
330
|
"__mf/js/async/lib-router.8fd59130.js",
|
|
331
|
-
"__mf/js/async/
|
|
331
|
+
"__mf/js/async/2473.2c502914.js",
|
|
332
332
|
"__mf/js/async/3827.1b39b042.js",
|
|
333
333
|
"__mf/js/async/6753.032ce611.js",
|
|
334
|
-
"__mf/js/async/
|
|
334
|
+
"__mf/js/async/8094.c02682f3.js",
|
|
335
335
|
"__mf/js/async/9588.7b021071.js",
|
|
336
336
|
"__mf/js/async/5071.91e1c002.js",
|
|
337
337
|
"__mf/js/async/2043.fdebf89c.js",
|
|
338
|
-
"__mf/js/async/
|
|
338
|
+
"__mf/js/async/5413.6d8fc766.js",
|
|
339
339
|
"__mf/js/async/7177.356298ae.js"
|
|
340
340
|
]
|
|
341
341
|
},
|
package/mf-stats.json
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"name": "Table",
|
|
6
6
|
"type": "app",
|
|
7
7
|
"buildInfo": {
|
|
8
|
-
"buildVersion": "0.
|
|
8
|
+
"buildVersion": "0.11.0-rc.0",
|
|
9
9
|
"buildName": "@perses-dev/table-plugin"
|
|
10
10
|
},
|
|
11
11
|
"remoteEntry": {
|
|
12
|
-
"name": "__mf/js/Table.
|
|
12
|
+
"name": "__mf/js/Table.7c94517d.js",
|
|
13
13
|
"path": "",
|
|
14
14
|
"type": "global"
|
|
15
15
|
},
|
|
@@ -95,17 +95,17 @@
|
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
"singleton": true,
|
|
98
|
-
"requiredVersion": "^0.53.0-
|
|
98
|
+
"requiredVersion": "^0.53.0-rc.1",
|
|
99
99
|
"shareScope": "default",
|
|
100
100
|
"name": "@perses-dev/components",
|
|
101
|
-
"version": "0.53.0-
|
|
101
|
+
"version": "0.53.0-rc.1",
|
|
102
102
|
"eager": false,
|
|
103
103
|
"id": "Table:@perses-dev/components",
|
|
104
104
|
"assets": {
|
|
105
105
|
"js": {
|
|
106
106
|
"async": [],
|
|
107
107
|
"sync": [
|
|
108
|
-
"__mf/js/async/
|
|
108
|
+
"__mf/js/async/3919.927efb3c.js"
|
|
109
109
|
]
|
|
110
110
|
},
|
|
111
111
|
"css": {
|
|
@@ -119,17 +119,17 @@
|
|
|
119
119
|
},
|
|
120
120
|
{
|
|
121
121
|
"singleton": true,
|
|
122
|
-
"requiredVersion": "^0.53.0-beta.
|
|
122
|
+
"requiredVersion": "^0.53.0-beta.4",
|
|
123
123
|
"shareScope": "default",
|
|
124
124
|
"name": "@perses-dev/core",
|
|
125
|
-
"version": "0.53.0-beta.
|
|
125
|
+
"version": "0.53.0-beta.4",
|
|
126
126
|
"eager": false,
|
|
127
127
|
"id": "Table:@perses-dev/core",
|
|
128
128
|
"assets": {
|
|
129
129
|
"js": {
|
|
130
130
|
"async": [],
|
|
131
131
|
"sync": [
|
|
132
|
-
"__mf/js/async/
|
|
132
|
+
"__mf/js/async/1117.87be49e9.js"
|
|
133
133
|
]
|
|
134
134
|
},
|
|
135
135
|
"css": {
|
|
@@ -143,17 +143,17 @@
|
|
|
143
143
|
},
|
|
144
144
|
{
|
|
145
145
|
"singleton": true,
|
|
146
|
-
"requiredVersion": "^0.53.0-
|
|
146
|
+
"requiredVersion": "^0.53.0-rc.1",
|
|
147
147
|
"shareScope": "default",
|
|
148
148
|
"name": "@perses-dev/dashboards",
|
|
149
|
-
"version": "0.53.0-
|
|
149
|
+
"version": "0.53.0-rc.1",
|
|
150
150
|
"eager": false,
|
|
151
151
|
"id": "Table:@perses-dev/dashboards",
|
|
152
152
|
"assets": {
|
|
153
153
|
"js": {
|
|
154
154
|
"async": [],
|
|
155
155
|
"sync": [
|
|
156
|
-
"__mf/js/async/1490.
|
|
156
|
+
"__mf/js/async/1490.9d97e5d1.js"
|
|
157
157
|
]
|
|
158
158
|
},
|
|
159
159
|
"css": {
|
|
@@ -167,17 +167,17 @@
|
|
|
167
167
|
},
|
|
168
168
|
{
|
|
169
169
|
"singleton": true,
|
|
170
|
-
"requiredVersion": "^0.53.0-
|
|
170
|
+
"requiredVersion": "^0.53.0-rc.1",
|
|
171
171
|
"shareScope": "default",
|
|
172
172
|
"name": "@perses-dev/plugin-system",
|
|
173
|
-
"version": "0.53.0-
|
|
173
|
+
"version": "0.53.0-rc.1",
|
|
174
174
|
"eager": false,
|
|
175
175
|
"id": "Table:@perses-dev/plugin-system",
|
|
176
176
|
"assets": {
|
|
177
177
|
"js": {
|
|
178
178
|
"async": [],
|
|
179
179
|
"sync": [
|
|
180
|
-
"__mf/js/async/5501.
|
|
180
|
+
"__mf/js/async/5501.bc363348.js"
|
|
181
181
|
]
|
|
182
182
|
},
|
|
183
183
|
"css": {
|
|
@@ -386,20 +386,20 @@
|
|
|
386
386
|
"js": {
|
|
387
387
|
"sync": [
|
|
388
388
|
"__mf/js/async/1432.4dcbe7e3.js",
|
|
389
|
-
"__mf/js/async/
|
|
390
|
-
"__mf/js/async/
|
|
391
|
-
"__mf/js/async/__federation_expose_Table.
|
|
389
|
+
"__mf/js/async/868.9f710584.js",
|
|
390
|
+
"__mf/js/async/1103.ffbc2bec.js",
|
|
391
|
+
"__mf/js/async/__federation_expose_Table.61be353a.js"
|
|
392
392
|
],
|
|
393
393
|
"async": [
|
|
394
394
|
"__mf/js/async/lib-router.8fd59130.js",
|
|
395
|
-
"__mf/js/async/
|
|
395
|
+
"__mf/js/async/2473.2c502914.js",
|
|
396
396
|
"__mf/js/async/3827.1b39b042.js",
|
|
397
397
|
"__mf/js/async/6753.032ce611.js",
|
|
398
|
-
"__mf/js/async/
|
|
398
|
+
"__mf/js/async/8094.c02682f3.js",
|
|
399
399
|
"__mf/js/async/9588.7b021071.js",
|
|
400
400
|
"__mf/js/async/5071.91e1c002.js",
|
|
401
401
|
"__mf/js/async/2043.fdebf89c.js",
|
|
402
|
-
"__mf/js/async/
|
|
402
|
+
"__mf/js/async/5413.6d8fc766.js",
|
|
403
403
|
"__mf/js/async/7177.356298ae.js"
|
|
404
404
|
]
|
|
405
405
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@perses-dev/table-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0-rc.0",
|
|
4
4
|
"homepage": "https://github.com/perses/plugins/blob/main/README.md",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"@emotion/react": "^11.7.1",
|
|
28
28
|
"@emotion/styled": "^11.6.0",
|
|
29
29
|
"@hookform/resolvers": "^3.2.0",
|
|
30
|
-
"@perses-dev/components": "^0.53.0-
|
|
31
|
-
"@perses-dev/core": "^0.53.0-beta.
|
|
32
|
-
"@perses-dev/plugin-system": "^0.53.0-
|
|
33
|
-
"@perses-dev/dashboards": "^0.53.0-
|
|
30
|
+
"@perses-dev/components": "^0.53.0-rc.1",
|
|
31
|
+
"@perses-dev/core": "^0.53.0-beta.4",
|
|
32
|
+
"@perses-dev/plugin-system": "^0.53.0-rc.1",
|
|
33
|
+
"@perses-dev/dashboards": "^0.53.0-rc.1",
|
|
34
34
|
"date-fns": "^4.1.0",
|
|
35
35
|
"date-fns-tz": "^3.2.0",
|
|
36
36
|
"echarts": "5.5.0",
|