PanelChrome.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. timeRange?: TimeRange;
  20. }
  21. export class PanelChrome extends PureComponent<Props, State> {
  22. constructor(props) {
  23. super(props);
  24. this.state = {
  25. refreshCounter: 0,
  26. };
  27. }
  28. componentDidMount() {
  29. this.props.panel.events.on('refresh', this.onRefresh);
  30. this.props.dashboard.panelInitialized(this.props.panel);
  31. }
  32. componentWillUnmount() {
  33. this.props.panel.events.off('refresh', this.onRefresh);
  34. }
  35. onRefresh = () => {
  36. const timeSrv = getTimeSrv();
  37. const timeRange = timeSrv.timeRange();
  38. this.setState({
  39. refreshCounter: this.state.refreshCounter + 1,
  40. timeRange: timeRange,
  41. });
  42. };
  43. get isVisible() {
  44. return !this.props.dashboard.otherPanelInFullscreen(this.props.panel);
  45. }
  46. render() {
  47. const { panel, dashboard } = this.props;
  48. const { datasource, targets } = panel;
  49. const { refreshCounter, timeRange } = this.state;
  50. const PanelComponent = this.props.component;
  51. return (
  52. <div className="panel-container">
  53. <PanelHeader panel={panel} dashboard={dashboard} />
  54. <div className="panel-content">
  55. <DataPanel
  56. datasource={datasource}
  57. queries={targets}
  58. timeRange={timeRange}
  59. isVisible={this.isVisible}
  60. refreshCounter={refreshCounter}
  61. >
  62. {({ loading, timeSeries }) => {
  63. return <PanelComponent loading={loading} timeSeries={timeSeries} timeRange={timeRange} />;
  64. }}
  65. </DataPanel>
  66. </div>
  67. </div>
  68. );
  69. }
  70. }