mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* Remove deprecated setDefault usages * Add simple support for conditinal field config properties * Use new API in NewsPanel * Update tests * Fix check
150 lines
4.3 KiB
TypeScript
150 lines
4.3 KiB
TypeScript
import React from 'react';
|
|
import { GraphSeriesToggler } from '@grafana/ui';
|
|
import { PanelData, GraphSeriesXY, AbsoluteTimeRange, TimeZone, FieldConfigSource } from '@grafana/data';
|
|
|
|
import { getGraphSeriesModel } from './getGraphSeriesModel';
|
|
import { Options, SeriesOptions } from './types';
|
|
import { SeriesColorChangeHandler, SeriesAxisToggleHandler } from '@grafana/ui/src/components/Graph/GraphWithLegend';
|
|
|
|
interface GraphPanelControllerAPI {
|
|
series: GraphSeriesXY[];
|
|
onSeriesAxisToggle: SeriesAxisToggleHandler;
|
|
onSeriesColorChange: SeriesColorChangeHandler;
|
|
onSeriesToggle: (label: string, event: React.MouseEvent<HTMLElement>) => void;
|
|
onToggleSort: (sortBy: string) => void;
|
|
onHorizontalRegionSelected: (from: number, to: number) => void;
|
|
}
|
|
|
|
interface GraphPanelControllerProps {
|
|
children: (api: GraphPanelControllerAPI) => JSX.Element;
|
|
options: Options;
|
|
fieldConfig: FieldConfigSource;
|
|
data: PanelData;
|
|
timeZone: TimeZone;
|
|
onOptionsChange: (options: Options) => void;
|
|
onChangeTimeRange: (timeRange: AbsoluteTimeRange) => void;
|
|
}
|
|
|
|
interface GraphPanelControllerState {
|
|
graphSeriesModel: GraphSeriesXY[];
|
|
}
|
|
|
|
export class GraphPanelController extends React.Component<GraphPanelControllerProps, GraphPanelControllerState> {
|
|
constructor(props: GraphPanelControllerProps) {
|
|
super(props);
|
|
|
|
this.onSeriesColorChange = this.onSeriesColorChange.bind(this);
|
|
this.onSeriesAxisToggle = this.onSeriesAxisToggle.bind(this);
|
|
this.onToggleSort = this.onToggleSort.bind(this);
|
|
this.onHorizontalRegionSelected = this.onHorizontalRegionSelected.bind(this);
|
|
|
|
this.state = {
|
|
graphSeriesModel: getGraphSeriesModel(
|
|
props.data.series,
|
|
props.timeZone,
|
|
props.options.series || {},
|
|
props.options.graph,
|
|
props.options.legend,
|
|
props.fieldConfig
|
|
),
|
|
};
|
|
}
|
|
|
|
static getDerivedStateFromProps(props: GraphPanelControllerProps, state: GraphPanelControllerState) {
|
|
return {
|
|
...state,
|
|
graphSeriesModel: getGraphSeriesModel(
|
|
props.data.series,
|
|
props.timeZone,
|
|
props.options.series || {},
|
|
props.options.graph,
|
|
props.options.legend,
|
|
props.fieldConfig
|
|
),
|
|
};
|
|
}
|
|
|
|
onSeriesOptionsUpdate(label: string, optionsUpdate: SeriesOptions) {
|
|
const { onOptionsChange, options } = this.props;
|
|
const updatedSeriesOptions: { [label: string]: SeriesOptions } = { ...options.series };
|
|
updatedSeriesOptions[label] = optionsUpdate;
|
|
onOptionsChange({
|
|
...options,
|
|
series: updatedSeriesOptions,
|
|
});
|
|
}
|
|
|
|
onSeriesAxisToggle(label: string, yAxis: number) {
|
|
const {
|
|
options: { series },
|
|
} = this.props;
|
|
const seriesOptionsUpdate: SeriesOptions = series[label]
|
|
? {
|
|
...series[label],
|
|
yAxis: {
|
|
...series[label].yAxis,
|
|
index: yAxis,
|
|
},
|
|
}
|
|
: {
|
|
yAxis: {
|
|
index: yAxis,
|
|
},
|
|
};
|
|
this.onSeriesOptionsUpdate(label, seriesOptionsUpdate);
|
|
}
|
|
|
|
onSeriesColorChange(label: string, color: string) {
|
|
const {
|
|
options: { series },
|
|
} = this.props;
|
|
const seriesOptionsUpdate: SeriesOptions = series[label]
|
|
? {
|
|
...series[label],
|
|
color,
|
|
}
|
|
: {
|
|
color,
|
|
};
|
|
|
|
this.onSeriesOptionsUpdate(label, seriesOptionsUpdate);
|
|
}
|
|
|
|
onToggleSort(sortBy: string) {
|
|
const { onOptionsChange, options } = this.props;
|
|
onOptionsChange({
|
|
...options,
|
|
legend: {
|
|
...options.legend,
|
|
sortBy,
|
|
sortDesc: sortBy === options.legend.sortBy ? !options.legend.sortDesc : false,
|
|
},
|
|
});
|
|
}
|
|
|
|
onHorizontalRegionSelected(from: number, to: number) {
|
|
const { onChangeTimeRange } = this.props;
|
|
onChangeTimeRange({ from, to });
|
|
}
|
|
|
|
render() {
|
|
const { children } = this.props;
|
|
const { graphSeriesModel } = this.state;
|
|
|
|
return (
|
|
<GraphSeriesToggler series={graphSeriesModel}>
|
|
{({ onSeriesToggle, toggledSeries }) => {
|
|
return children({
|
|
series: toggledSeries,
|
|
onSeriesColorChange: this.onSeriesColorChange,
|
|
onSeriesAxisToggle: this.onSeriesAxisToggle,
|
|
onToggleSort: this.onToggleSort,
|
|
onSeriesToggle: onSeriesToggle,
|
|
onHorizontalRegionSelected: this.onHorizontalRegionSelected,
|
|
});
|
|
}}
|
|
</GraphSeriesToggler>
|
|
);
|
|
}
|
|
}
|