UNPKG

@grafana/ui

Version:
1 lines • 33.7 kB
{"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,\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 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 let valueHeight = this.maxTextHeight;\n if (props.value.percentChange != null) {\n // percent change uses 40% of value height, so we want to scale the value font size accordingly\n valueHeight = valueHeight * 0.75;\n }\n // initial value size\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth * valueWidthPercent,\n valueHeight,\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 let valueHeight = this.maxTextHeight - titleHeight;\n if (props.value.percentChange != null) {\n // percent change uses 40% of value height, so we want to scale the value font size accordingly\n valueHeight = valueHeight * 0.75;\n }\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth,\n valueHeight,\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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"}