EVOLUTION-MANAGER
Edit File: GraphPanelController.tsx
import React from 'react'; import { GraphSeriesToggler } from '@grafana/ui'; import { PanelData, GraphSeriesXY, AbsoluteTimeRange, TimeZone } 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; 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.options.fieldOptions ), }; } 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.options.fieldOptions ), }; } 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> ); } }