PanelChrome.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Libraries
  2. import React, { ComponentClass, PureComponent } from 'react';
  3. // Services
  4. import { getTimeSrv } from '../time_srv';
  5. // Components
  6. import { PanelHeader } from './PanelHeader/PanelHeader';
  7. import { DataPanel } from './DataPanel';
  8. // Types
  9. import { PanelModel } from '../panel_model';
  10. import { DashboardModel } from '../dashboard_model';
  11. import { TimeRange, PanelProps } from 'app/types';
  12. export interface Props {
  13. panel: PanelModel;
  14. dashboard: DashboardModel;
  15. component: ComponentClass<PanelProps>;
  16. }
  17. export interface State {
  18. refreshCounter: number;
  19. renderCounter: number;
  20. timeRange?: TimeRange;
  21. }
  22. export class PanelChrome extends PureComponent<Props, State> {
  23. constructor(props) {
  24. super(props);
  25. this.state = {
  26. refreshCounter: 0,
  27. renderCounter: 0,
  28. };
  29. }
  30. componentDidMount() {
  31. this.props.panel.events.on('refresh', this.onRefresh);
  32. this.props.panel.events.on('render', this.onRender);
  33. this.props.dashboard.panelInitialized(this.props.panel);
  34. }
  35. componentWillUnmount() {
  36. this.props.panel.events.off('refresh', this.onRefresh);
  37. }
  38. onRefresh = () => {
  39. const timeSrv = getTimeSrv();
  40. const timeRange = timeSrv.timeRange();
  41. this.setState(prevState => ({
  42. ...prevState,
  43. refreshCounter: this.state.refreshCounter + 1,
  44. timeRange: timeRange,
  45. }));
  46. };
  47. onRender = () => {
  48. console.log('onRender');
  49. this.setState(prevState => ({
  50. ...prevState,
  51. renderCounter: this.state.renderCounter + 1,
  52. }));
  53. };
  54. get isVisible() {
  55. return !this.props.dashboard.otherPanelInFullscreen(this.props.panel);
  56. }
  57. render() {
  58. const { panel, dashboard } = this.props;
  59. const { refreshCounter, timeRange, renderCounter } = this.state;
  60. const { datasource, targets } = panel;
  61. const PanelComponent = this.props.component;
  62. console.log('panelChrome render');
  63. return (
  64. <div className="panel-container">
  65. <PanelHeader panel={panel} dashboard={dashboard} />
  66. <div className="panel-content">
  67. <DataPanel
  68. datasource={datasource}
  69. queries={targets}
  70. timeRange={timeRange}
  71. isVisible={this.isVisible}
  72. refreshCounter={refreshCounter}
  73. >
  74. {({ loading, timeSeries }) => {
  75. console.log('panelcrome inner render');
  76. return (
  77. <PanelComponent
  78. loading={loading}
  79. timeSeries={timeSeries}
  80. timeRange={timeRange}
  81. options={panel.getOptions()}
  82. renderCounter={renderCounter}
  83. />
  84. );
  85. }}
  86. </DataPanel>
  87. </div>
  88. </div>
  89. );
  90. }
  91. }