import { isNumber } from 'lodash'; import React, { PureComponent } from 'react'; import { DisplayValueAlignmentFactors, FieldDisplay, FieldType, getDisplayValueAlignmentFactors, getFieldDisplayValues, NumericRange, PanelProps, } from '@grafana/data'; import { findNumericFieldMinMax } from '@grafana/data/src/field/fieldOverrides'; import { BigValue, BigValueGraphMode, DataLinksContextMenu, VizRepeater, VizRepeaterRenderValueProps, BigValueTextMode, } from '@grafana/ui'; import { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu'; import { config } from 'app/core/config'; import { StatPanelOptions } from './types'; export class StatPanel extends PureComponent> { renderComponent = ( valueProps: VizRepeaterRenderValueProps, menuProps: DataLinksContextMenuApi ): JSX.Element => { const { timeRange, options } = this.props; const { value, alignmentFactors, width, height, count } = valueProps; const { openMenu, targetClassName } = menuProps; let sparkline = value.sparkline; if (sparkline) { sparkline.timeRange = timeRange; } return ( ); }; getTextMode() { const { options, fieldConfig, title } = this.props; // If we have manually set displayName or panel title switch text mode to value and name if (options.textMode === BigValueTextMode.Auto && (fieldConfig.defaults.displayName || !title)) { return BigValueTextMode.ValueAndName; } return options.textMode; } renderValue = (valueProps: VizRepeaterRenderValueProps): JSX.Element => { const { value } = valueProps; const { getLinks, hasLinks } = value; if (hasLinks && getLinks) { return ( {(api) => { return this.renderComponent(valueProps, api); }} ); } return this.renderComponent(valueProps, {}); }; getValues = (): FieldDisplay[] => { const { data, options, replaceVariables, fieldConfig, timeZone } = this.props; let globalRange: NumericRange | undefined = undefined; for (let frame of data.series) { for (let field of frame.fields) { let { config } = field; // mostly copied from fieldOverrides, since they are skipped during streaming // Set the Min/Max value automatically if (field.type === FieldType.number) { if (field.state?.range) { continue; } if (!globalRange && (!isNumber(config.min) || !isNumber(config.max))) { globalRange = findNumericFieldMinMax(data.series); } const min = config.min ?? globalRange!.min; const max = config.max ?? globalRange!.max; field.state = field.state ?? {}; field.state.range = { min, max, delta: max! - min! }; } } } return getFieldDisplayValues({ fieldConfig, reduceOptions: options.reduceOptions, replaceVariables, theme: config.theme2, data: data.series, sparkline: options.graphMode !== BigValueGraphMode.None, timeZone, }); }; render() { const { height, options, width, data, renderCounter } = this.props; return ( ); } }