{"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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"}