GraphPanelController.tsx 3.7 KB

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