| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- import React from 'react';
- import { PanelData, GraphSeriesToggler } from '@grafana/ui';
- import { GraphSeriesXY, AbsoluteTimeRange } 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;
- 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.options.series,
- props.options.graph,
- props.options.legend
- ),
- };
- }
- static getDerivedStateFromProps(props: GraphPanelControllerProps, state: GraphPanelControllerState) {
- return {
- ...state,
- graphSeriesModel: getGraphSeriesModel(
- props.data.series,
- props.options.series,
- props.options.graph,
- props.options.legend
- ),
- };
- }
- 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>
- );
- }
- }
|