123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import { isNumber } from 'lodash';
- import React, { PureComponent } from 'react';
- import {
- DisplayValueAlignmentFactors,
- FieldDisplay,
- getDisplayValueAlignmentFactors,
- getFieldDisplayValues,
- PanelProps,
- FieldConfig,
- DisplayProcessor,
- DisplayValue,
- VizOrientation,
- } from '@grafana/data';
- import { BarGauge, DataLinksContextMenu, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui';
- import { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';
- import { config } from 'app/core/config';
- import { BarGaugeOptions } from './types';
- export class BarGaugePanel extends PureComponent<PanelProps<BarGaugeOptions>> {
- renderComponent = (
- valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>,
- menuProps: DataLinksContextMenuApi
- ): JSX.Element => {
- const { options, fieldConfig } = this.props;
- const { value, alignmentFactors, orientation, width, height, count } = valueProps;
- const { field, display, view, colIndex } = value;
- const { openMenu, targetClassName } = menuProps;
- let processor: DisplayProcessor | undefined = undefined;
- if (view && isNumber(colIndex)) {
- processor = view.getFieldDisplayProcessor(colIndex);
- }
- return (
- <BarGauge
- value={clearNameForSingleSeries(count, fieldConfig.defaults, display)}
- width={width}
- height={height}
- orientation={orientation}
- field={field}
- text={options.text}
- display={processor}
- theme={config.theme2}
- itemSpacing={this.getItemSpacing()}
- displayMode={options.displayMode}
- onClick={openMenu}
- className={targetClassName}
- alignmentFactors={count > 1 ? alignmentFactors : undefined}
- showUnfilled={options.showUnfilled}
- />
- );
- };
- renderValue = (valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>): JSX.Element => {
- const { value, orientation } = valueProps;
- const { hasLinks, getLinks } = value;
- if (hasLinks && getLinks) {
- return (
- <div style={{ width: '100%', display: orientation === VizOrientation.Vertical ? 'flex' : 'initial' }}>
- <DataLinksContextMenu links={getLinks} config={value.field}>
- {(api) => this.renderComponent(valueProps, api)}
- </DataLinksContextMenu>
- </div>
- );
- }
- return this.renderComponent(valueProps, {});
- };
- getValues = (): FieldDisplay[] => {
- const { data, options, replaceVariables, fieldConfig, timeZone } = this.props;
- return getFieldDisplayValues({
- fieldConfig,
- reduceOptions: options.reduceOptions,
- replaceVariables,
- theme: config.theme2,
- data: data.series,
- timeZone,
- });
- };
- getItemSpacing(): number {
- if (this.props.options.displayMode === 'lcd') {
- return 2;
- }
- return 10;
- }
- render() {
- const { height, width, options, data, renderCounter } = this.props;
- return (
- <VizRepeater
- source={data}
- getAlignmentFactors={getDisplayValueAlignmentFactors}
- getValues={this.getValues}
- renderValue={this.renderValue}
- renderCounter={renderCounter}
- width={width}
- height={height}
- minVizWidth={options.minVizWidth}
- minVizHeight={options.minVizHeight}
- itemSpacing={this.getItemSpacing()}
- orientation={options.orientation}
- />
- );
- }
- }
- export function clearNameForSingleSeries(count: number, field: FieldConfig<any>, display: DisplayValue): DisplayValue {
- if (count === 1 && !field.displayName) {
- return {
- ...display,
- title: undefined,
- };
- }
- return display;
- }
|