UNPKG

@grafana/ui

Version:
1 lines • 38.3 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\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 theme,\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: theme.shape.radius.default,\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.default,\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.default,\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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"}