GraphPanelController.tsx 3.7 KB

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