@grafana/ui
Version:
Grafana Components Library
1 lines • 17.9 kB
Source Map (JSON)
{"version":3,"file":"TableCellNG.mjs","sources":["../../../../../../src/components/Table/TableNG/Cells/TableCellNG.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { WKT } from 'ol/format';\nimport { Geometry } from 'ol/geom';\nimport { ReactNode, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { FieldType, GrafanaTheme2, isDataFrame, isTimeSeriesFrame } from '@grafana/data';\nimport { TableAutoCellOptions, TableCellDisplayMode } from '@grafana/schema';\n\nimport { useStyles2 } from '../../../../themes';\nimport { t } from '../../../../utils/i18n';\nimport { IconButton } from '../../../IconButton/IconButton';\n// import { GeoCell } from '../../Cells/GeoCell';\nimport { TableCellInspectorMode } from '../../TableCellInspector';\nimport {\n CellColors,\n CustomCellRendererProps,\n FILTER_FOR_OPERATOR,\n FILTER_OUT_OPERATOR,\n TableCellNGProps,\n} from '../types';\nimport { getCellColors, getDisplayName, getTextAlign } from '../utils';\n\nimport { ActionsCell } from './ActionsCell';\nimport AutoCell from './AutoCell';\nimport { BarGaugeCell } from './BarGaugeCell';\nimport { DataLinksCell } from './DataLinksCell';\nimport { GeoCell } from './GeoCell';\nimport { ImageCell } from './ImageCell';\nimport { JSONCell } from './JSONCell';\nimport { SparklineCell } from './SparklineCell';\n\nexport function TableCellNG(props: TableCellNGProps) {\n const {\n field,\n frame,\n value,\n theme,\n timeRange,\n height,\n rowIdx,\n justifyContent,\n shouldTextOverflow,\n setIsInspecting,\n setContextMenuProps,\n getActions,\n rowBg,\n onCellFilterAdded,\n replaceVariables,\n } = props;\n\n const cellInspect = field.config?.custom?.inspect ?? false;\n const displayName = getDisplayName(field);\n\n const { config: fieldConfig } = field;\n const defaultCellOptions: TableAutoCellOptions = { type: TableCellDisplayMode.Auto };\n const cellOptions = fieldConfig.custom?.cellOptions ?? defaultCellOptions;\n const { type: cellType } = cellOptions;\n\n const showFilters = field.config.filterable && onCellFilterAdded;\n\n const isRightAligned = getTextAlign(field) === 'flex-end';\n const displayValue = field.display!(value);\n let colors: CellColors = { bgColor: '', textColor: '', bgHoverColor: '' };\n if (rowBg) {\n colors = rowBg(rowIdx);\n } else {\n colors = useMemo(() => getCellColors(theme, cellOptions, displayValue), [theme, cellOptions, displayValue]);\n }\n const styles = useStyles2(getStyles, isRightAligned, colors);\n\n // TODO\n // TableNG provides either an overridden cell width or 'auto' as the cell width value.\n // While the overridden value gives the exact cell width, 'auto' does not.\n // Therefore, we need to determine the actual cell width from the DOM.\n const divWidthRef = useRef<HTMLDivElement>(null);\n const [divWidth, setDivWidth] = useState(0);\n const [isHovered, setIsHovered] = useState(false);\n\n const actions = getActions ? getActions(frame, field, rowIdx, replaceVariables) : [];\n\n useLayoutEffect(() => {\n if (divWidthRef.current && divWidthRef.current.clientWidth !== 0) {\n setDivWidth(divWidthRef.current.clientWidth);\n }\n }, [divWidthRef.current]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Common props for all cells\n const commonProps = {\n value,\n field,\n rowIdx,\n justifyContent,\n };\n\n // Get the correct cell type\n let cell: ReactNode = null;\n switch (cellType) {\n case TableCellDisplayMode.Sparkline:\n cell = <SparklineCell {...commonProps} theme={theme} timeRange={timeRange} width={divWidth} />;\n break;\n case TableCellDisplayMode.Gauge:\n case TableCellDisplayMode.BasicGauge:\n case TableCellDisplayMode.GradientGauge:\n case TableCellDisplayMode.LcdGauge:\n cell = <BarGaugeCell {...commonProps} theme={theme} timeRange={timeRange} height={height} width={divWidth} />;\n break;\n case TableCellDisplayMode.Image:\n cell = <ImageCell {...commonProps} cellOptions={cellOptions} height={height} />;\n break;\n case TableCellDisplayMode.JSONView:\n cell = <JSONCell {...commonProps} />;\n break;\n case TableCellDisplayMode.DataLinks:\n cell = <DataLinksCell field={field} rowIdx={rowIdx} />;\n break;\n case TableCellDisplayMode.Actions:\n cell = <ActionsCell actions={actions} />;\n break;\n case TableCellDisplayMode.Custom:\n const CustomCellComponent: React.ComponentType<CustomCellRendererProps> = cellOptions.cellComponent;\n cell = <CustomCellComponent field={field} value={value} rowIndex={rowIdx} frame={frame} />;\n break;\n case TableCellDisplayMode.Auto:\n default:\n // Handle auto cell type detection\n if (field.type === FieldType.geo) {\n cell = <GeoCell {...commonProps} height={height} />;\n } else if (field.type === FieldType.frame) {\n const firstValue = field.values[0];\n if (isDataFrame(firstValue) && isTimeSeriesFrame(firstValue)) {\n cell = <SparklineCell {...commonProps} theme={theme} timeRange={timeRange} width={divWidth} />;\n } else {\n cell = <JSONCell {...commonProps} />;\n }\n } else if (field.type === FieldType.other) {\n cell = <JSONCell {...commonProps} />;\n } else {\n cell = <AutoCell {...commonProps} cellOptions={cellOptions} />;\n }\n break;\n }\n\n const handleMouseEnter = () => {\n setIsHovered(true);\n if (shouldTextOverflow()) {\n // TODO: The table cell styles in TableNG do not update dynamically even if we change the state\n const div = divWidthRef.current;\n const tableCellDiv = div?.parentElement;\n tableCellDiv?.style.setProperty('z-index', String(theme.zIndex.tooltip));\n tableCellDiv?.style.setProperty('white-space', 'pre-line');\n tableCellDiv?.style.setProperty('min-height', `100%`);\n tableCellDiv?.style.setProperty('height', `fit-content`);\n tableCellDiv?.style.setProperty('background', colors.bgHoverColor || 'none');\n tableCellDiv?.style.setProperty('min-width', 'min-content');\n }\n };\n\n const handleMouseLeave = () => {\n setIsHovered(false);\n if (shouldTextOverflow()) {\n // TODO: The table cell styles in TableNG do not update dynamically even if we change the state\n const div = divWidthRef.current;\n const tableCellDiv = div?.parentElement;\n tableCellDiv?.style.removeProperty('z-index');\n tableCellDiv?.style.removeProperty('white-space');\n tableCellDiv?.style.removeProperty('min-height');\n tableCellDiv?.style.removeProperty('height');\n tableCellDiv?.style.removeProperty('background');\n tableCellDiv?.style.removeProperty('min-width');\n }\n };\n\n const onFilterFor = useCallback(() => {\n if (onCellFilterAdded) {\n onCellFilterAdded({\n key: displayName,\n operator: FILTER_FOR_OPERATOR,\n value: String(value ?? ''),\n });\n }\n }, [displayName, onCellFilterAdded, value]);\n\n const onFilterOut = useCallback(() => {\n if (onCellFilterAdded) {\n onCellFilterAdded({\n key: displayName,\n operator: FILTER_OUT_OPERATOR,\n value: String(value ?? ''),\n });\n }\n }, [displayName, onCellFilterAdded, value]);\n\n return (\n <div ref={divWidthRef} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} className={styles.cell}>\n {cell}\n {isHovered && (cellInspect || showFilters) && (\n <div className={styles.cellActions}>\n {cellInspect && (\n <IconButton\n name=\"eye\"\n tooltip={t('grafana-ui.table.cell-inspect-tooltip', 'Inspect value')}\n onClick={() => {\n let inspectValue = value;\n let mode = TableCellInspectorMode.text;\n\n if (field.type === FieldType.geo && value instanceof Geometry) {\n inspectValue = new WKT().writeGeometry(value, {\n featureProjection: 'EPSG:3857',\n dataProjection: 'EPSG:4326',\n });\n mode = TableCellInspectorMode.code;\n } else if (cellType === TableCellDisplayMode.JSONView) {\n mode = TableCellInspectorMode.code;\n }\n\n setContextMenuProps({\n value: String(inspectValue ?? ''),\n mode,\n });\n setIsInspecting(true);\n }}\n />\n )}\n {showFilters && (\n <>\n <IconButton\n name={'search-plus'}\n onClick={onFilterFor}\n tooltip={t('grafana-ui.table.cell-filter-on', 'Filter for value')}\n />\n <IconButton\n name={'search-minus'}\n onClick={onFilterOut}\n tooltip={t('grafana-ui.table.cell-filter-out', 'Filter out value')}\n />\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2, isRightAligned: boolean, color: CellColors) => ({\n cell: css({\n height: '100%',\n alignContent: 'center',\n paddingInline: '8px',\n // TODO: follow-up on this: change styles on hover on table row level\n background: color.bgColor || 'none',\n color: color.textColor,\n '&:hover': { background: color.bgHoverColor },\n }),\n cellActions: css({\n display: 'flex',\n position: 'absolute',\n top: '1px',\n left: isRightAligned ? 0 : undefined,\n right: isRightAligned ? undefined : 0,\n margin: 'auto',\n height: '100%',\n background: theme.colors.background.secondary,\n color: theme.colors.text.primary,\n padding: '4px 0px 4px 4px',\n }),\n});\n"],"names":[],"mappings":"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"}