{"version":3,"file":"BarGauge.cjs","sources":["../../../../src/components/BarGauge/BarGauge.tsx"],"sourcesContent":["// Library\nimport { cx } from '@emotion/css';\nimport { CSSProperties, PureComponent, ReactNode, type JSX } from 'react';\nimport * as React from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport {\n  DisplayProcessor,\n  DisplayValue,\n  DisplayValueAlignmentFactors,\n  FALLBACK_COLOR,\n  FieldColorModeId,\n  FieldConfig,\n  FormattedValue,\n  formattedValueToString,\n  GAUGE_DEFAULT_MAXIMUM,\n  GAUGE_DEFAULT_MINIMUM,\n  getFieldColorMode,\n  ThresholdsMode,\n  TimeSeriesValue,\n  VizOrientation,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { BarGaugeDisplayMode, BarGaugeNamePlacement, BarGaugeValueMode, VizTextDisplayOptions } from '@grafana/schema';\n\nimport { Themeable2 } from '../../types/theme';\nimport { calculateFontSize, measureText } from '../../utils/measureText';\nimport { clearButtonStyles } from '../Button/Button';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\n\nconst MIN_VALUE_HEIGHT = 18;\nconst MAX_VALUE_HEIGHT = 50;\nconst MAX_VALUE_WIDTH = 150;\nconst TITLE_LINE_HEIGHT = 1.5;\nconst VALUE_LINE_HEIGHT = 1;\nconst VALUE_LEFT_PADDING = 10;\nconst VALUE_RIGHT_OVERFLOW_PADDING = 15;\n\nexport interface Props extends Themeable2 {\n  height: number;\n  width: number;\n  field: FieldConfig;\n  display?: DisplayProcessor;\n  value: DisplayValue;\n  orientation: VizOrientation;\n  text?: VizTextDisplayOptions;\n  itemSpacing?: number;\n  lcdCellWidth?: number;\n  displayMode: BarGaugeDisplayMode;\n  onClick?: React.MouseEventHandler<HTMLElement>;\n  className?: string;\n  showUnfilled?: boolean;\n  alignmentFactors?: DisplayValueAlignmentFactors;\n  valueDisplayMode?: BarGaugeValueMode;\n  namePlacement?: BarGaugeNamePlacement;\n  isOverflow: boolean;\n}\n\n/**\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/plugins-bargauge--docs\n */\nexport class BarGauge extends PureComponent<Props> {\n  static defaultProps: Partial<Props> = {\n    lcdCellWidth: 12,\n    value: {\n      text: '100',\n      numeric: 100,\n    },\n    displayMode: BarGaugeDisplayMode.Gradient,\n    orientation: VizOrientation.Horizontal,\n    field: {\n      min: 0,\n      max: 100,\n      thresholds: {\n        mode: ThresholdsMode.Absolute,\n        steps: [],\n      },\n    },\n    itemSpacing: 8,\n    showUnfilled: true,\n    isOverflow: false,\n  };\n\n  render() {\n    const { onClick, className, theme } = this.props;\n    const { title } = this.props.value;\n    const styles = getTitleStyles(this.props);\n\n    if (onClick) {\n      return (\n        <button\n          type=\"button\"\n          style={styles.wrapper}\n          onClick={onClick}\n          className={cx(clearButtonStyles(theme), className)}\n        >\n          <div style={styles.title}>{title}</div>\n          {this.renderBarAndValue()}\n        </button>\n      );\n    }\n\n    return (\n      <div style={styles.wrapper} className={className}>\n        {title && <div style={styles.title}>{title}</div>}\n        {this.renderBarAndValue()}\n      </div>\n    );\n  }\n\n  renderBarAndValue() {\n    switch (this.props.displayMode) {\n      case 'lcd':\n        return this.renderRetroBars();\n      case 'basic':\n      case 'gradient':\n      default:\n        return this.renderBasicAndGradientBars();\n    }\n  }\n\n  renderBasicAndGradientBars(): ReactNode {\n    const { value, showUnfilled, valueDisplayMode } = this.props;\n\n    const styles = getBasicAndGradientStyles(this.props);\n\n    return (\n      <div style={styles.wrapper}>\n        {valueDisplayMode !== BarGaugeValueMode.Hidden && (\n          <FormattedValueDisplay\n            data-testid={selectors.components.Panels.Visualization.BarGauge.valueV2}\n            value={value}\n            style={styles.value}\n          />\n        )}\n        {showUnfilled && <div style={styles.emptyBar} />}\n        <div style={styles.bar} />\n      </div>\n    );\n  }\n\n  renderRetroBars(): ReactNode {\n    const {\n      display,\n      field,\n      value,\n      itemSpacing,\n      alignmentFactors,\n      orientation,\n      lcdCellWidth,\n      text,\n      valueDisplayMode,\n      isOverflow,\n    } = this.props;\n    const { valueHeight, valueWidth, maxBarHeight, maxBarWidth, wrapperWidth, wrapperHeight } =\n      calculateBarAndValueDimensions(this.props);\n    const minValue = field.min ?? GAUGE_DEFAULT_MINIMUM;\n    const maxValue = field.max ?? GAUGE_DEFAULT_MAXIMUM;\n\n    const isVert = isVertical(orientation);\n    const valueRange = maxValue - minValue;\n    const maxSize = isVert ? maxBarHeight : maxBarWidth;\n    const cellSpacing = itemSpacing!;\n    const cellCount = Math.floor(maxSize / lcdCellWidth!);\n    const cellSize = Math.floor((maxSize - cellSpacing * cellCount) / cellCount);\n    const valueColor = getTextValueColor(this.props);\n\n    const valueToBaseSizeOn = alignmentFactors ? alignmentFactors : value;\n    const valueStyles = getValueStyles(\n      valueToBaseSizeOn,\n      valueColor,\n      valueWidth,\n      valueHeight,\n      orientation,\n      isOverflow,\n      text\n    );\n\n    const containerStyles: CSSProperties = {\n      width: `${wrapperWidth}px`,\n      height: `${wrapperHeight}px`,\n      display: 'flex',\n    };\n\n    if (isVert) {\n      containerStyles.flexDirection = 'column-reverse';\n      containerStyles.alignItems = 'center';\n    } else {\n      containerStyles.flexDirection = 'row';\n      containerStyles.alignItems = 'center';\n      valueStyles.justifyContent = 'flex-end';\n    }\n\n    const cells: JSX.Element[] = [];\n\n    for (let i = 0; i < cellCount; i++) {\n      const currentValue = minValue + (valueRange / cellCount) * i;\n      const cellColor = getCellColor(currentValue, value, display);\n      const cellStyles: CSSProperties = {\n        borderRadius: '2px',\n      };\n\n      if (cellColor.isLit) {\n        cellStyles.backgroundImage = `radial-gradient(${cellColor.background} 10%, ${cellColor.backgroundShade})`;\n      } else {\n        cellStyles.backgroundColor = cellColor.background;\n      }\n\n      if (isVert) {\n        cellStyles.height = `${cellSize}px`;\n        cellStyles.width = `${maxBarWidth}px`;\n        cellStyles.marginTop = `${cellSpacing}px`;\n      } else {\n        cellStyles.width = `${cellSize}px`;\n        cellStyles.height = `${maxBarHeight}px`;\n        cellStyles.marginRight = `${cellSpacing}px`;\n      }\n\n      cells.push(<div key={i.toString()} style={cellStyles} />);\n    }\n\n    return (\n      <div style={containerStyles}>\n        {cells}\n        {valueDisplayMode !== BarGaugeValueMode.Hidden && (\n          <FormattedValueDisplay\n            data-testid={selectors.components.Panels.Visualization.BarGauge.valueV2}\n            value={value}\n            style={valueStyles}\n          />\n        )}\n      </div>\n    );\n  }\n}\n\ninterface CellColors {\n  background: string;\n  backgroundShade?: string;\n  border: string;\n  isLit?: boolean;\n}\n\ninterface TitleDimensions {\n  fontSize: number;\n  placement: 'above' | 'left' | 'below' | 'hidden';\n  width: number;\n  height: number;\n}\n\nfunction isVertical(orientation: VizOrientation) {\n  return orientation === VizOrientation.Vertical;\n}\n\nfunction calculateTitleDimensions(props: Props): TitleDimensions {\n  const { height, width, alignmentFactors, orientation, text, namePlacement } = props;\n  const title = alignmentFactors ? alignmentFactors.title : props.value.title;\n\n  if (!title) {\n    return { fontSize: 0, width: 0, height: 0, placement: 'above' };\n  }\n\n  if (namePlacement === BarGaugeNamePlacement.Hidden) {\n    return {\n      fontSize: 0,\n      width: 0,\n      height: 0,\n      placement: BarGaugeNamePlacement.Hidden,\n    };\n  }\n\n  if (isVertical(orientation)) {\n    const fontSize = text?.titleSize ?? 14;\n    return {\n      fontSize: fontSize,\n      width: width,\n      height: fontSize * TITLE_LINE_HEIGHT,\n      placement: 'below',\n    };\n  }\n\n  const shouldDisplayValueAbove =\n    (height > 40 && namePlacement === BarGaugeNamePlacement.Auto) || namePlacement === BarGaugeNamePlacement.Top;\n\n  if (shouldDisplayValueAbove) {\n    if (text?.titleSize) {\n      return {\n        fontSize: text?.titleSize,\n        width: 0,\n        height: text.titleSize * TITLE_LINE_HEIGHT,\n        placement: 'above',\n      };\n    }\n\n    const maxTitleHeightRatio = 0.45;\n    const titleHeight = Math.max(Math.min(height * maxTitleHeightRatio, MAX_VALUE_HEIGHT), 17);\n\n    return {\n      fontSize: titleHeight / TITLE_LINE_HEIGHT,\n      width: 0,\n      height: titleHeight,\n      placement: 'above',\n    };\n  }\n\n  // title to left of bar scenario\n  const maxTitleHeightRatio = 0.6;\n  const titleHeight = Math.max(height * maxTitleHeightRatio, MIN_VALUE_HEIGHT);\n  const titleFontSize = titleHeight / TITLE_LINE_HEIGHT;\n  const textSize = measureText(title, titleFontSize);\n\n  // Do not allow title to take up more than 40% width\n  const textWidth = Math.min(textSize.width + 15, width * 0.4);\n\n  return {\n    fontSize: text?.titleSize ?? titleFontSize,\n    height: 0,\n    width: textWidth,\n    placement: 'left',\n  };\n}\n\nexport function getTitleStyles(props: Props): { wrapper: CSSProperties; title: CSSProperties } {\n  const wrapperStyles: CSSProperties = {\n    display: 'flex',\n    overflow: 'hidden',\n    width: '100%',\n  };\n\n  const titleDim = calculateTitleDimensions(props);\n\n  const titleStyles: CSSProperties = {\n    fontSize: `${titleDim.fontSize}px`,\n    whiteSpace: 'nowrap',\n    overflow: 'hidden',\n    textOverflow: 'ellipsis',\n    width: '100%',\n    alignItems: 'center',\n    alignSelf: 'center',\n  };\n\n  if (titleDim.placement === 'hidden') {\n    titleStyles.display = 'none';\n  } else {\n    if (isVertical(props.orientation)) {\n      wrapperStyles.flexDirection = 'column-reverse';\n      titleStyles.textAlign = 'center';\n    } else {\n      if (titleDim.placement === 'above') {\n        wrapperStyles.flexDirection = 'column';\n      } else {\n        wrapperStyles.flexDirection = 'row';\n\n        titleStyles.width = `${titleDim.width}px`;\n        titleStyles.textAlign = 'right';\n        titleStyles.paddingRight = '10px';\n      }\n    }\n  }\n\n  return {\n    wrapper: wrapperStyles,\n    title: titleStyles,\n  };\n}\n\ninterface BasicAndGradientStyles {\n  wrapper: CSSProperties;\n  bar: CSSProperties;\n  emptyBar: CSSProperties;\n  value: CSSProperties;\n}\n\ninterface BarAndValueDimensions {\n  valueWidth: number;\n  valueHeight: number;\n  maxBarWidth: number;\n  maxBarHeight: number;\n  wrapperHeight: number;\n  wrapperWidth: number;\n}\n\n/**\n * @internal\n * Only exported for unit tests\n **/\nexport function calculateBarAndValueDimensions(props: Props): BarAndValueDimensions {\n  const { height, width, orientation, text, alignmentFactors, valueDisplayMode } = props;\n  const titleDim = calculateTitleDimensions(props);\n  const value = alignmentFactors ?? props.value;\n  const valueString = formattedValueToString(value);\n\n  let maxBarHeight = 0;\n  let maxBarWidth = 0;\n  let valueHeight = 0;\n  let valueWidth = 0;\n  let wrapperWidth = 0;\n  let wrapperHeight = 0;\n\n  // measure text with title font size or min 14px\n  const fontSizeToMeasureWith = text?.valueSize ?? Math.max(titleDim.fontSize, 12);\n  const realTextSize = measureText(valueString, fontSizeToMeasureWith);\n  const realValueWidth = realTextSize.width + VALUE_LEFT_PADDING * 2;\n\n  if (isVertical(orientation)) {\n    if (text?.valueSize) {\n      valueHeight = text.valueSize * VALUE_LINE_HEIGHT;\n    } else {\n      valueHeight = Math.min(Math.max(height * 0.1, MIN_VALUE_HEIGHT), MAX_VALUE_HEIGHT);\n    }\n\n    valueWidth = width;\n\n    if (valueDisplayMode === BarGaugeValueMode.Hidden) {\n      valueHeight = 0;\n      valueWidth = 0;\n    }\n\n    maxBarHeight = height - (titleDim.height + valueHeight);\n    maxBarWidth = width;\n    wrapperWidth = width;\n    wrapperHeight = height - titleDim.height;\n  } else {\n    // Calculate the width and the height of the given values\n    if (valueDisplayMode === BarGaugeValueMode.Hidden) {\n      valueHeight = 0;\n      valueWidth = 0;\n    } else {\n      valueHeight = height - titleDim.height;\n      valueWidth = Math.max(Math.min(width * 0.2, MAX_VALUE_WIDTH), realValueWidth);\n    }\n\n    maxBarHeight = height - titleDim.height;\n    maxBarWidth = width - valueWidth - titleDim.width;\n\n    if (titleDim.placement === 'above') {\n      wrapperWidth = width;\n      wrapperHeight = height - titleDim.height;\n    } else {\n      wrapperWidth = width - titleDim.width;\n      wrapperHeight = height;\n    }\n  }\n\n  return {\n    valueWidth,\n    valueHeight,\n    maxBarWidth,\n    maxBarHeight,\n    wrapperHeight,\n    wrapperWidth,\n  };\n}\n\nexport function getCellColor(\n  positionValue: TimeSeriesValue,\n  value: Props['value'],\n  display: Props['display']\n): CellColors {\n  if (positionValue === null) {\n    return {\n      background: FALLBACK_COLOR,\n      border: FALLBACK_COLOR,\n    };\n  }\n\n  const color = display ? display(positionValue).color : null;\n\n  if (color) {\n    // if we are past real value the cell is not \"on\"\n    if (value === null || isNaN(value.numeric) || (positionValue !== null && positionValue > value.numeric)) {\n      return {\n        background: tinycolor(color).setAlpha(0.18).toRgbString(),\n        border: 'transparent',\n        isLit: false,\n      };\n    } else {\n      return {\n        background: tinycolor(color).setAlpha(0.95).toRgbString(),\n        backgroundShade: tinycolor(color).setAlpha(0.55).toRgbString(),\n        border: tinycolor(color).setAlpha(0.9).toRgbString(),\n        isLit: true,\n      };\n    }\n  }\n\n  return {\n    background: FALLBACK_COLOR,\n    border: FALLBACK_COLOR,\n  };\n}\n\nexport function getValuePercent(value: number, minValue: number, maxValue: number): number {\n  // Need special logic for when minValue === maxValue === value to prevent returning NaN\n  const valueRatio = Math.min((value - minValue) / (maxValue - minValue), 1);\n  return isNaN(valueRatio) ? 0 : valueRatio;\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getBasicAndGradientStyles(props: Props): BasicAndGradientStyles {\n  const { displayMode, field, value, alignmentFactors, orientation, theme, text, isOverflow } = props;\n  const { valueWidth, valueHeight, maxBarHeight, maxBarWidth } = calculateBarAndValueDimensions(props);\n\n  const minValue = field.min ?? GAUGE_DEFAULT_MINIMUM;\n  const maxValue = field.max ?? GAUGE_DEFAULT_MAXIMUM;\n  const valuePercent = getValuePercent(value.numeric, minValue, maxValue);\n  const textColor = getTextValueColor(props);\n  const barColor = value.color ?? FALLBACK_COLOR;\n\n  const valueToBaseSizeOn = alignmentFactors ? alignmentFactors : value;\n  const valueStyles = getValueStyles(\n    valueToBaseSizeOn,\n    textColor,\n    valueWidth,\n    valueHeight,\n    orientation,\n    isOverflow,\n    text\n  );\n\n  const isBasic = displayMode === 'basic';\n  const wrapperStyles: CSSProperties = {\n    display: 'flex',\n    flexGrow: 1,\n  };\n\n  const barStyles: CSSProperties = {\n    borderRadius: theme.shape.radius.sm,\n    position: 'relative',\n  };\n\n  const emptyBar: CSSProperties = {\n    background: theme.colors.background.secondary,\n    flexGrow: 1,\n    display: 'flex',\n    borderRadius: theme.shape.radius.sm,\n    position: 'relative',\n  };\n\n  if (isVertical(orientation)) {\n    const barHeight = Math.max(valuePercent * maxBarHeight, 1);\n\n    // vertical styles\n    wrapperStyles.flexDirection = 'column';\n    wrapperStyles.justifyContent = 'flex-end';\n\n    barStyles.transition = 'height 1s';\n    barStyles.height = `${barHeight}px`;\n    barStyles.width = `${maxBarWidth}px`;\n\n    // adjust so that filled in bar is at the bottom\n    emptyBar.bottom = '-3px';\n\n    //adjust empty region to always have same width as colored bar\n    emptyBar.width = `${valueWidth}px`;\n\n    if (isBasic) {\n      // Basic styles\n      barStyles.background = `${tinycolor(barColor).setAlpha(0.35).toRgbString()}`;\n      barStyles.borderTop = `2px solid ${barColor}`;\n    } else {\n      // Gradient styles\n      barStyles.background = getBarGradient(props, maxBarHeight);\n    }\n  } else {\n    const barWidth = Math.max(valuePercent * maxBarWidth, 1);\n\n    // Custom styles for horizontal orientation\n    wrapperStyles.flexDirection = 'row-reverse';\n    wrapperStyles.justifyContent = 'flex-end';\n    wrapperStyles.alignItems = 'stretch';\n\n    barStyles.transition = 'width 1s';\n    barStyles.height = `${maxBarHeight}px`;\n    barStyles.width = `${barWidth}px`;\n\n    // shift empty region back to fill gaps due to border radius\n    emptyBar.left = '-3px';\n\n    //adjust empty region to always have same height as colored bar\n    emptyBar.height = `${valueHeight}px`;\n\n    if (isBasic) {\n      // Basic styles\n      barStyles.background = `${tinycolor(barColor).setAlpha(0.35).toRgbString()}`;\n      barStyles.borderRight = `2px solid ${barColor}`;\n    } else {\n      // Gradient styles\n      barStyles.background = getBarGradient(props, maxBarWidth);\n    }\n  }\n\n  return {\n    wrapper: wrapperStyles,\n    bar: barStyles,\n    value: valueStyles,\n    emptyBar,\n  };\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getBarGradient(props: Props, maxSize: number): string {\n  const { field, value, orientation, theme } = props;\n  const cssDirection = isVertical(orientation) ? '0deg' : '90deg';\n  const minValue = field.min!;\n  const maxValue = field.max!;\n\n  let gradient = '';\n  let lastpos = 0;\n  let mode = getFieldColorMode(field.color?.mode);\n\n  if (mode.id === FieldColorModeId.Thresholds) {\n    const thresholds = field.thresholds!;\n\n    for (let i = 0; i < thresholds.steps.length; i++) {\n      const threshold = thresholds.steps[i];\n      const color = props.theme.visualization.getColorByName(threshold.color);\n      const valuePercent =\n        thresholds.mode === ThresholdsMode.Percentage\n          ? threshold.value / 100\n          : getValuePercent(threshold.value, minValue, maxValue);\n      const pos = valuePercent * maxSize;\n      const offset = Math.round(pos - (pos - lastpos) / 2);\n      const thresholdValue =\n        thresholds.mode === ThresholdsMode.Percentage\n          ? minValue + (maxValue - minValue) * valuePercent\n          : threshold.value;\n      if (gradient === '') {\n        gradient = `linear-gradient(${cssDirection}, ${color}, ${color}`;\n      } else if (value.numeric < thresholdValue) {\n        break;\n      } else {\n        lastpos = pos;\n        gradient += ` ${offset}px, ${color}`;\n      }\n    }\n\n    return gradient + ')';\n  }\n\n  if (mode.isContinuous && mode.getColors) {\n    const scheme = mode.getColors(theme);\n\n    for (let i = 0; i < scheme.length; i++) {\n      const color = scheme[i];\n\n      if (gradient === '') {\n        gradient = `linear-gradient(${cssDirection}, ${color} 0px`;\n      } else {\n        const valuePercent = i / (scheme.length - 1);\n        const pos = valuePercent * maxSize;\n        gradient += `, ${color} ${pos}px`;\n      }\n    }\n    return gradient + ')';\n  }\n\n  return value.color ?? FALLBACK_COLOR;\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getTextValueColor(props: Props): string {\n  if (props.valueDisplayMode === 'text') {\n    return props.theme.colors.text.primary;\n  }\n\n  const { value } = props;\n  if (value.color) {\n    return value.color;\n  }\n\n  return FALLBACK_COLOR;\n}\n\nfunction getValueStyles(\n  value: FormattedValue,\n  color: string,\n  width: number,\n  height: number,\n  orientation: VizOrientation,\n  isOverflow: boolean,\n  text?: VizTextDisplayOptions\n): CSSProperties {\n  const styles: CSSProperties = {\n    color,\n    height: `${height}px`,\n    maxWidth: `${width}px`,\n    display: 'flex',\n    alignItems: 'center',\n    textWrap: 'nowrap',\n    lineHeight: VALUE_LINE_HEIGHT,\n  };\n\n  // how many pixels in wide can the text be?\n  let textWidth = width;\n  const formattedValueString = formattedValueToString(value);\n\n  if (isVertical(orientation)) {\n    styles.fontSize = text?.valueSize ?? calculateFontSize(formattedValueString, textWidth, height, VALUE_LINE_HEIGHT);\n    styles.justifyContent = `center`;\n  } else {\n    styles.fontSize =\n      text?.valueSize ??\n      calculateFontSize(formattedValueString, textWidth - VALUE_LEFT_PADDING * 2, height, VALUE_LINE_HEIGHT);\n    styles.justifyContent = `flex-end`;\n    styles.paddingLeft = `${VALUE_LEFT_PADDING}px`;\n    styles.paddingRight = `${VALUE_LEFT_PADDING + (isOverflow ? VALUE_RIGHT_OVERFLOW_PADDING : 0)}px`;\n    // Need to remove the left padding from the text width constraints\n    textWidth -= VALUE_LEFT_PADDING;\n  }\n\n  return styles;\n}\n"],"names":["PureComponent","jsxs","cx","clearButtonStyles","jsx","BarGaugeValueMode","FormattedValueDisplay","selectors","GAUGE_DEFAULT_MINIMUM","GAUGE_DEFAULT_MAXIMUM","BarGaugeDisplayMode","VizOrientation","ThresholdsMode","BarGaugeNamePlacement","maxTitleHeightRatio","titleHeight","measureText","formattedValueToString","FALLBACK_COLOR","tinycolor","getFieldColorMode","FieldColorModeId","calculateFontSize"],"mappings":"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"}