UNPKG

@grafana/ui

Version:
1 lines • 38.6 kB
{"version":3,"file":"BarGauge.mjs","sources":["../../../../src/components/BarGauge/BarGauge.tsx"],"sourcesContent":["// Library\nimport { cx } from '@emotion/css';\nimport { CSSProperties, PureComponent, ReactNode } 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":["maxTitleHeightRatio","titleHeight"],"mappings":"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"}