mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			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>
 | |
|     );
 | |
|   }
 | |
| }
 |