PanelChrome.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Libraries
  2. import React, { ComponentClass, PureComponent } from 'react';
  3. // Services
  4. import { getTimeSrv } from '../time_srv';
  5. // Components
  6. import { PanelHeader } from './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({
  42. refreshCounter: this.state.refreshCounter + 1,
  43. timeRange: timeRange,
  44. });
  45. };
  46. onRender = () => {
  47. console.log('onRender');
  48. this.setState({
  49. renderCounter: this.state.renderCounter + 1,
  50. });
  51. };
  52. get isVisible() {
  53. return !this.props.dashboard.otherPanelInFullscreen(this.props.panel);
  54. }
  55. render() {
  56. const { panel, dashboard } = this.props;
  57. const { datasource, targets } = panel;
  58. const { timeRange, renderCounter, refreshCounter } = this.state;
  59. const PanelComponent = this.props.component;
  60. console.log('Panel chrome render');
  61. return (
  62. <div className="panel-container">
  63. <PanelHeader panel={panel} dashboard={dashboard} />
  64. <div className="panel-content">
  65. <DataPanel
  66. datasource={datasource}
  67. queries={targets}
  68. timeRange={timeRange}
  69. isVisible={this.isVisible}
  70. refreshCounter={refreshCounter}
  71. >
  72. {({ loading, timeSeries }) => {
  73. console.log('panelcrome inner render');
  74. return (
  75. <PanelComponent
  76. loading={loading}
  77. timeSeries={timeSeries}
  78. timeRange={timeRange}
  79. options={panel.getOptions()}
  80. renderCounter={renderCounter}
  81. />
  82. );
  83. }}
  84. </DataPanel>
  85. </div>
  86. </div>
  87. );
  88. }
  89. }