@grafana/ui
Version:
Grafana Components Library
1 lines • 32.8 kB
Source Map (JSON)
{"version":3,"file":"BigValueLayout.mjs","sources":["../../../../src/components/BigValue/BigValueLayout.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\nimport * as React from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport { formattedValueToString, DisplayValue, FieldConfig, FieldType, ThemeVisualizationColors } from '@grafana/data';\nimport { GraphDrawStyle, GraphFieldConfig, PercentChangeColorMode } from '@grafana/schema';\n\nimport { getTextColorForAlphaBackground } from '../../utils/colors';\nimport { calculateFontSize } from '../../utils/measureText';\nimport { Sparkline } from '../Sparkline/Sparkline';\n\nimport { BigValueColorMode, Props, BigValueJustifyMode, BigValueTextMode } from './BigValue';\nimport { percentChangeString } from './PercentChange';\n\nconst LINE_HEIGHT = 1.2;\nconst MAX_TITLE_SIZE = 30;\nconst VALUE_FONT_WEIGHT = 500;\n\nexport abstract class BigValueLayout {\n titleFontSize: number;\n valueFontSize: number;\n percentFontSize: number;\n chartHeight: number;\n chartWidth: number;\n valueColor: string;\n panelPadding: number;\n justifyCenter: boolean;\n titleToAlignTo?: string;\n valueToAlignTo: string;\n maxTextWidth: number;\n maxTextHeight: number;\n textValues: BigValueTextValues;\n\n constructor(private props: Props) {\n const { width, height, value, text } = props;\n\n this.valueColor = value.color ?? 'gray';\n this.panelPadding = height > 100 ? 12 : 8;\n this.textValues = getTextValues(props);\n this.justifyCenter = shouldJustifyCenter(props.justifyMode, this.textValues.title);\n this.valueToAlignTo = this.textValues.valueToAlignTo;\n this.titleToAlignTo = this.textValues.titleToAlignTo;\n this.titleFontSize = 0;\n this.valueFontSize = 0;\n this.percentFontSize = 0;\n this.chartHeight = 0;\n this.chartWidth = 0;\n this.maxTextWidth = width - this.panelPadding * 2;\n this.maxTextHeight = height - this.panelPadding * 2;\n\n // Explicit font sizing\n if (text) {\n if (text.titleSize) {\n this.titleFontSize = text.titleSize;\n this.titleToAlignTo = undefined;\n }\n if (text.valueSize) {\n this.valueFontSize = text.valueSize;\n this.valueToAlignTo = '';\n }\n if (text.percentSize) {\n this.percentFontSize = text.percentSize;\n }\n }\n }\n\n getTitleStyles(): CSSProperties {\n const styles: CSSProperties = {\n fontSize: `${this.titleFontSize}px`,\n lineHeight: LINE_HEIGHT,\n };\n\n if (\n this.props.colorMode === BigValueColorMode.Background ||\n this.props.colorMode === BigValueColorMode.BackgroundSolid\n ) {\n styles.color = getTextColorForAlphaBackground(this.valueColor, this.props.theme.isDark);\n }\n\n return styles;\n }\n\n getValueStyles(): CSSProperties {\n const styles: CSSProperties = {\n fontSize: this.valueFontSize,\n fontWeight: VALUE_FONT_WEIGHT,\n lineHeight: LINE_HEIGHT,\n position: 'relative',\n zIndex: 1,\n };\n\n if (this.justifyCenter) {\n styles.textAlign = 'center';\n }\n\n switch (this.props.colorMode) {\n case BigValueColorMode.Value:\n styles.color = this.valueColor;\n break;\n case BigValueColorMode.Background:\n case BigValueColorMode.BackgroundSolid:\n styles.color = getTextColorForAlphaBackground(this.valueColor, this.props.theme.isDark);\n break;\n case BigValueColorMode.None:\n styles.color = this.props.theme.colors.text.primary;\n break;\n }\n\n return styles;\n }\n\n getPercentChangeStyles(\n percentChange: number,\n percentChangeColorMode: PercentChangeColorMode | undefined,\n valueStyles: React.CSSProperties\n ): PercentChangeStyles {\n const VALUE_TO_PERCENT_CHANGE_RATIO = 2.5;\n const valueContainerStyles = this.getValueAndTitleContainerStyles();\n const percentFontSize = this.percentFontSize || Math.max(this.valueFontSize / VALUE_TO_PERCENT_CHANGE_RATIO, 12);\n let iconSize = this.percentFontSize ? this.percentFontSize - 3 : Math.max(this.valueFontSize / 3, 10);\n const themeVisualizationColors = this.props.theme.visualization;\n const color = getPercentChangeColor(percentChange, percentChangeColorMode, valueStyles, themeVisualizationColors);\n\n const containerStyles: CSSProperties = {\n fontSize: percentFontSize,\n fontWeight: VALUE_FONT_WEIGHT,\n lineHeight: LINE_HEIGHT,\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n gap: Math.max(percentFontSize / 3, 4),\n zIndex: 1,\n color,\n };\n\n if (this.justifyCenter) {\n containerStyles.textAlign = 'center';\n }\n\n if (valueContainerStyles.flexDirection === 'column' && percentFontSize > 12) {\n containerStyles.marginTop = -(percentFontSize / 4);\n }\n\n if (valueContainerStyles.flexDirection === 'row') {\n containerStyles.alignItems = 'baseline';\n\n // Center the percent change vertically relative to the value\n // This approach seems to work the best for all edge cases\n // Note: the fixed min font size causes this to be off for a few edge cases\n containerStyles.lineHeight = LINE_HEIGHT * VALUE_TO_PERCENT_CHANGE_RATIO;\n }\n\n switch (this.props.colorMode) {\n case BigValueColorMode.Background:\n case BigValueColorMode.BackgroundSolid:\n containerStyles.color = getTextColorForAlphaBackground(this.valueColor, this.props.theme.isDark);\n break;\n }\n\n if (this.props.textMode === BigValueTextMode.None) {\n containerStyles.fontSize = calculateFontSize(\n percentChangeString(percentChange),\n this.maxTextWidth * 0.8,\n this.maxTextHeight * 0.8,\n LINE_HEIGHT,\n undefined,\n VALUE_FONT_WEIGHT\n );\n iconSize = containerStyles.fontSize * 0.8;\n }\n\n return {\n containerStyles,\n iconSize: iconSize,\n };\n }\n\n getValueAndTitleContainerStyles() {\n const styles: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n };\n\n if (this.justifyCenter) {\n styles.alignItems = 'center';\n styles.justifyContent = 'center';\n styles.flexGrow = 1;\n styles.gap = '0.75ch';\n }\n\n return styles;\n }\n\n getPanelStyles(): CSSProperties {\n const { width, height, theme, colorMode, textMode } = this.props;\n\n const panelStyles: CSSProperties = {\n width: `${width}px`,\n height: `${height}px`,\n padding: `${textMode === BigValueTextMode.None ? 2 : this.panelPadding}px`,\n borderRadius: theme.shape.radius.default,\n position: 'relative',\n display: 'flex',\n };\n\n const themeFactor = theme.isDark ? 1 : -0.7;\n\n switch (colorMode) {\n case BigValueColorMode.Background:\n const bgColor2 = tinycolor(this.valueColor)\n .darken(15 * themeFactor)\n .spin(8)\n .toRgbString();\n const bgColor3 = tinycolor(this.valueColor)\n .darken(5 * themeFactor)\n .spin(-8)\n .toRgbString();\n panelStyles.background = `linear-gradient(120deg, ${bgColor2}, ${bgColor3})`;\n break;\n case BigValueColorMode.BackgroundSolid:\n panelStyles.background = tinycolor(this.valueColor).toString();\n break;\n case BigValueColorMode.Value:\n panelStyles.background = `transparent`;\n break;\n }\n\n if (this.justifyCenter) {\n panelStyles.alignItems = 'center';\n panelStyles.flexDirection = 'row';\n }\n\n return panelStyles;\n }\n\n renderChart(): JSX.Element | null {\n const { sparkline, colorMode } = this.props;\n\n if (!sparkline || sparkline.y?.type !== FieldType.number) {\n return null;\n }\n\n let fillColor: string;\n let lineColor: string;\n\n switch (colorMode) {\n case BigValueColorMode.Background:\n case BigValueColorMode.BackgroundSolid:\n fillColor = 'rgba(255,255,255,0.4)';\n lineColor = tinycolor(this.valueColor).brighten(40).toRgbString();\n break;\n case BigValueColorMode.None:\n case BigValueColorMode.Value:\n default:\n lineColor = this.valueColor;\n fillColor = tinycolor(this.valueColor).setAlpha(0.2).toRgbString();\n break;\n }\n\n // The graph field configuration applied to Y values\n const config: FieldConfig<GraphFieldConfig> = {\n custom: {\n drawStyle: GraphDrawStyle.Line,\n lineWidth: 1,\n fillColor,\n lineColor,\n },\n };\n\n return (\n <div style={this.getChartStyles()}>\n <Sparkline\n height={this.chartHeight}\n width={this.chartWidth}\n sparkline={sparkline}\n config={config}\n theme={this.props.theme}\n />\n </div>\n );\n }\n getChartStyles(): CSSProperties {\n return {\n position: 'absolute',\n right: 0,\n bottom: 0,\n };\n }\n}\n\nexport class WideNoChartLayout extends BigValueLayout {\n constructor(props: Props) {\n super(props);\n\n const valueWidthPercent = this.titleToAlignTo?.length ? 0.3 : 1.0;\n\n if (this.valueToAlignTo.length) {\n // initial value size\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth * valueWidthPercent,\n this.maxTextHeight,\n LINE_HEIGHT,\n undefined,\n VALUE_FONT_WEIGHT\n );\n }\n\n if (this.titleToAlignTo?.length) {\n // How big can we make the title and still have it fit\n this.titleFontSize = calculateFontSize(\n this.titleToAlignTo,\n this.maxTextWidth * 0.6,\n this.maxTextHeight,\n LINE_HEIGHT,\n MAX_TITLE_SIZE\n );\n\n // make sure it's a bit smaller than valueFontSize\n this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n }\n }\n\n getValueAndTitleContainerStyles() {\n const styles = super.getValueAndTitleContainerStyles();\n styles.flexDirection = 'row';\n styles.alignItems = 'center';\n styles.flexGrow = 1;\n\n if (!this.justifyCenter) {\n styles.justifyContent = 'space-between';\n }\n\n return styles;\n }\n\n renderChart(): JSX.Element | null {\n return null;\n }\n\n getPanelStyles() {\n const panelStyles = super.getPanelStyles();\n panelStyles.alignItems = 'center';\n return panelStyles;\n }\n}\n\nexport class WideWithChartLayout extends BigValueLayout {\n constructor(props: Props) {\n super(props);\n\n const { width, height } = props;\n\n const chartHeightPercent = 0.5;\n const titleWidthPercent = 0.6;\n const valueWidthPercent = 1 - titleWidthPercent;\n const textHeightPercent = 0.4;\n\n this.chartWidth = width;\n this.chartHeight = height * chartHeightPercent;\n\n if (this.titleToAlignTo?.length) {\n this.titleFontSize = calculateFontSize(\n this.titleToAlignTo,\n this.maxTextWidth * titleWidthPercent,\n this.maxTextHeight * textHeightPercent,\n LINE_HEIGHT,\n MAX_TITLE_SIZE\n );\n }\n\n if (this.valueToAlignTo.length) {\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth * valueWidthPercent,\n this.maxTextHeight * chartHeightPercent,\n LINE_HEIGHT,\n undefined,\n VALUE_FONT_WEIGHT\n );\n }\n }\n\n getValueAndTitleContainerStyles() {\n const styles = super.getValueAndTitleContainerStyles();\n styles.flexDirection = 'row';\n styles.flexGrow = 1;\n\n if (!this.justifyCenter) {\n styles.justifyContent = 'space-between';\n }\n\n return styles;\n }\n\n getPanelStyles() {\n const styles = super.getPanelStyles();\n styles.flexDirection = 'row';\n styles.justifyContent = 'space-between';\n return styles;\n }\n}\n\nexport class StackedWithChartLayout extends BigValueLayout {\n constructor(props: Props) {\n super(props);\n\n const { width, height } = props;\n const titleHeightPercent = 0.15;\n const chartHeightPercent = 0.25;\n let titleHeight = 0;\n\n this.chartHeight = height * chartHeightPercent;\n this.chartWidth = width;\n\n if (this.titleToAlignTo?.length) {\n this.titleFontSize = calculateFontSize(\n this.titleToAlignTo,\n this.maxTextWidth,\n height * titleHeightPercent,\n LINE_HEIGHT,\n MAX_TITLE_SIZE\n );\n\n titleHeight = this.titleFontSize * LINE_HEIGHT;\n }\n\n if (this.valueToAlignTo.length) {\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth,\n this.maxTextHeight - this.chartHeight - titleHeight,\n LINE_HEIGHT,\n undefined,\n VALUE_FONT_WEIGHT\n );\n }\n\n // make title fontsize it's a bit smaller than valueFontSize\n if (this.titleToAlignTo?.length) {\n this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n }\n\n // make chart take up unused space\n this.chartHeight = height - this.titleFontSize * LINE_HEIGHT - this.valueFontSize * LINE_HEIGHT;\n }\n\n getValueAndTitleContainerStyles() {\n const styles = super.getValueAndTitleContainerStyles();\n styles.flexDirection = 'column';\n styles.justifyContent = 'center';\n return styles;\n }\n\n getPanelStyles() {\n const styles = super.getPanelStyles();\n styles.flexDirection = 'column';\n return styles;\n }\n}\n\nexport class StackedWithNoChartLayout extends BigValueLayout {\n constructor(props: Props) {\n super(props);\n\n const { height } = props;\n const titleHeightPercent = 0.15;\n let titleHeight = 0;\n\n if (this.titleToAlignTo?.length) {\n this.titleFontSize = calculateFontSize(\n this.titleToAlignTo,\n this.maxTextWidth,\n height * titleHeightPercent,\n LINE_HEIGHT,\n MAX_TITLE_SIZE\n );\n\n titleHeight = this.titleFontSize * LINE_HEIGHT;\n }\n\n if (this.valueToAlignTo.length) {\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth,\n this.maxTextHeight - titleHeight,\n LINE_HEIGHT,\n undefined,\n VALUE_FONT_WEIGHT\n );\n }\n\n if (this.titleToAlignTo?.length) {\n // make title fontsize it's a bit smaller than valueFontSize\n this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n }\n }\n\n getValueAndTitleContainerStyles() {\n const styles = super.getValueAndTitleContainerStyles();\n styles.flexDirection = 'column';\n styles.flexGrow = 1;\n return styles;\n }\n\n renderChart(): JSX.Element | null {\n return null;\n }\n\n getPanelStyles() {\n const styles = super.getPanelStyles();\n styles.alignItems = 'center';\n return styles;\n }\n}\n\nexport function buildLayout(props: Props): BigValueLayout {\n const { width, height, sparkline } = props;\n const useWideLayout = width / height > 2.5 && !props.disableWideLayout;\n\n if (useWideLayout) {\n if (height > 50 && !!sparkline && sparkline.y.values.length > 1) {\n return new WideWithChartLayout(props);\n } else {\n return new WideNoChartLayout(props);\n }\n }\n\n // stacked layouts\n if (height > 100 && sparkline && sparkline.y.values.length > 1) {\n return new StackedWithChartLayout(props);\n } else {\n return new StackedWithNoChartLayout(props);\n }\n}\n\nexport function shouldJustifyCenter(justifyMode?: BigValueJustifyMode, title?: string) {\n if (justifyMode === BigValueJustifyMode.Center) {\n return true;\n }\n\n return (title ?? '').length === 0;\n}\n\nexport interface BigValueTextValues extends DisplayValue {\n valueToAlignTo: string;\n titleToAlignTo?: string;\n tooltip?: string;\n}\n\nfunction getTextValues(props: Props): BigValueTextValues {\n const { value, alignmentFactors, count } = props;\n let { textMode } = props;\n\n const titleToAlignTo = alignmentFactors ? alignmentFactors.title : value.title;\n const valueToAlignTo = formattedValueToString(alignmentFactors ? alignmentFactors : value);\n\n // In the auto case we only show title if this big value is part of more panes (count > 1)\n if (textMode === BigValueTextMode.Auto && (count ?? 1) === 1) {\n textMode = BigValueTextMode.Value;\n }\n\n switch (textMode) {\n case BigValueTextMode.Name:\n return {\n ...value,\n title: undefined,\n prefix: undefined,\n suffix: undefined,\n text: value.title || '',\n titleToAlignTo: undefined,\n valueToAlignTo: titleToAlignTo ?? '',\n tooltip: formattedValueToString(value),\n };\n case BigValueTextMode.Value:\n return {\n ...value,\n title: undefined,\n titleToAlignTo: undefined,\n valueToAlignTo,\n tooltip: value.title,\n };\n case BigValueTextMode.None:\n return {\n numeric: value.numeric,\n color: value.color,\n title: undefined,\n text: '',\n titleToAlignTo: undefined,\n valueToAlignTo: '1',\n tooltip: `Name: ${value.title}\\nValue: ${formattedValueToString(value)}`,\n };\n case BigValueTextMode.ValueAndName:\n default:\n return {\n ...value,\n titleToAlignTo,\n valueToAlignTo,\n };\n }\n}\n\nexport interface PercentChangeStyles {\n containerStyles: CSSProperties;\n iconSize: number;\n}\n\nexport function getPercentChangeColor(\n percentChange: number,\n percentChangeColorMode: PercentChangeColorMode | undefined,\n valueStyles: CSSProperties,\n themeVisualizationColors: ThemeVisualizationColors\n): string | undefined {\n if (percentChangeColorMode === PercentChangeColorMode.SameAsValue) {\n return valueStyles.color;\n } else {\n return percentChange * (percentChangeColorMode === PercentChangeColorMode.Inverted ? -1 : 1) > 0\n ? themeVisualizationColors.getColorByName('green')\n : themeVisualizationColors.getColorByName('red');\n }\n}\n"],"names":[],"mappings":"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"}