GraphPanelController.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import React from 'react';
  2. import { PanelData, GraphSeriesToggler } from '@grafana/ui';
  3. import { GraphSeriesXY, AbsoluteTimeRange } from '@grafana/data';
  4. import { getGraphSeriesModel } from './getGraphSeriesModel';
  5. import { Options, SeriesOptions } from './types';
  6. import { SeriesColorChangeHandler, SeriesAxisToggleHandler } from '@grafana/ui/src/components/Graph/GraphWithLegend';
  7. interface GraphPanelControllerAPI {
  8. series: GraphSeriesXY[];
  9. onSeriesAxisToggle: SeriesAxisToggleHandler;
  10. onSeriesColorChange: SeriesColorChangeHandler;
  11. onSeriesToggle: (label: string, event: React.MouseEvent<HTMLElement>) => void;
  12. onToggleSort: (sortBy: string) => void;
  13. onHorizontalRegionSelected: (from: number, to: number) => void;
  14. }
  15. interface GraphPanelControllerProps {
  16. children: (api: GraphPanelControllerAPI) => JSX.Element;
  17. options: Options;
  18. data: PanelData;
  19. onOptionsChange: (options: Options) => void;
  20. onChangeTimeRange: (timeRange: AbsoluteTimeRange) => void;
  21. }
  22. interface GraphPanelControllerState {
  23. graphSeriesModel: GraphSeriesXY[];
  24. }
  25. export class GraphPanelController extends React.Component<GraphPanelControllerProps, GraphPanelControllerState> {
  26. constructor(props: GraphPanelControllerProps) {
  27. super(props);
  28. this.onSeriesColorChange = this.onSeriesColorChange.bind(this);
  29. this.onSeriesAxisToggle = this.onSeriesAxisToggle.bind(this);
  30. this.onToggleSort = this.onToggleSort.bind(this);
  31. this.onHorizontalRegionSelected = this.onHorizontalRegionSelected.bind(this);
  32. this.state = {
  33. graphSeriesModel: getGraphSeriesModel(
  34. props.data.series,
  35. props.options.series,
  36. props.options.graph,
  37. props.options.legend
  38. ),
  39. };
  40. }
  41. static getDerivedStateFromProps(props: GraphPanelControllerProps, state: GraphPanelControllerState) {
  42. return {
  43. ...state,
  44. graphSeriesModel: getGraphSeriesModel(
  45. props.data.series,
  46. props.options.series,
  47. props.options.graph,
  48. props.options.legend
  49. ),
  50. };
  51. }
  52. onSeriesOptionsUpdate(label: string, optionsUpdate: SeriesOptions) {
  53. const { onOptionsChange, options } = this.props;
  54. const updatedSeriesOptions: { [label: string]: SeriesOptions } = { ...options.series };
  55. updatedSeriesOptions[label] = optionsUpdate;
  56. onOptionsChange({
  57. ...options,
  58. series: updatedSeriesOptions,
  59. });
  60. }
  61. onSeriesAxisToggle(label: string, yAxis: number) {
  62. const {
  63. options: { series },
  64. } = this.props;
  65. const seriesOptionsUpdate: SeriesOptions = series[label]
  66. ? {
  67. ...series[label],
  68. yAxis: {
  69. ...series[label].yAxis,
  70. index: yAxis,
  71. },
  72. }
  73. : {
  74. yAxis: {
  75. index: yAxis,
  76. },
  77. };
  78. this.onSeriesOptionsUpdate(label, seriesOptionsUpdate);
  79. }
  80. onSeriesColorChange(label: string, color: string) {
  81. const {
  82. options: { series },
  83. } = this.props;
  84. const seriesOptionsUpdate: SeriesOptions = series[label]
  85. ? {
  86. ...series[label],
  87. color,
  88. }
  89. : {
  90. color,
  91. };
  92. this.onSeriesOptionsUpdate(label, seriesOptionsUpdate);
  93. }
  94. onToggleSort(sortBy: string) {
  95. const { onOptionsChange, options } = this.props;
  96. onOptionsChange({
  97. ...options,
  98. legend: {
  99. ...options.legend,
  100. sortBy,
  101. sortDesc: sortBy === options.legend.sortBy ? !options.legend.sortDesc : false,
  102. },
  103. });
  104. }
  105. onHorizontalRegionSelected(from: number, to: number) {
  106. const { onChangeTimeRange } = this.props;
  107. onChangeTimeRange({ from, to });
  108. }
  109. render() {
  110. const { children } = this.props;
  111. const { graphSeriesModel } = this.state;
  112. return (
  113. <GraphSeriesToggler series={graphSeriesModel}>
  114. {({ onSeriesToggle, toggledSeries }) => {
  115. return children({
  116. series: toggledSeries,
  117. onSeriesColorChange: this.onSeriesColorChange,
  118. onSeriesAxisToggle: this.onSeriesAxisToggle,
  119. onToggleSort: this.onToggleSort,
  120. onSeriesToggle: onSeriesToggle,
  121. onHorizontalRegionSelected: this.onHorizontalRegionSelected,
  122. });
  123. }}
  124. </GraphSeriesToggler>
  125. );
  126. }
  127. }