PanelChrome.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Libraries
  2. import React, { PureComponent } from 'react';
  3. import { AutoSizer } from 'react-virtualized';
  4. // Services
  5. import { getTimeSrv, TimeSrv } from '../time_srv';
  6. // Components
  7. import { PanelHeader } from './PanelHeader/PanelHeader';
  8. import { DataPanel } from './DataPanel';
  9. // Utils
  10. import { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';
  11. import { PANEL_HEADER_HEIGHT } from 'app/core/constants';
  12. // Types
  13. import { PanelModel } from '../panel_model';
  14. import { DashboardModel } from '../dashboard_model';
  15. import { PanelPlugin } from 'app/types';
  16. import { TimeRange } from '@grafana/ui';
  17. import variables from 'sass/_variables.scss';
  18. import templateSrv from 'app/features/templating/template_srv';
  19. export interface Props {
  20. panel: PanelModel;
  21. dashboard: DashboardModel;
  22. plugin: PanelPlugin;
  23. }
  24. export interface State {
  25. refreshCounter: number;
  26. renderCounter: number;
  27. timeInfo?: string;
  28. timeRange?: TimeRange;
  29. }
  30. export class PanelChrome extends PureComponent<Props, State> {
  31. timeSrv: TimeSrv = getTimeSrv();
  32. constructor(props) {
  33. super(props);
  34. this.state = {
  35. refreshCounter: 0,
  36. renderCounter: 0,
  37. };
  38. }
  39. componentDidMount() {
  40. this.props.panel.events.on('refresh', this.onRefresh);
  41. this.props.panel.events.on('render', this.onRender);
  42. this.props.dashboard.panelInitialized(this.props.panel);
  43. }
  44. componentWillUnmount() {
  45. this.props.panel.events.off('refresh', this.onRefresh);
  46. }
  47. onRefresh = () => {
  48. console.log('onRefresh');
  49. if (!this.isVisible) {
  50. return;
  51. }
  52. const { panel } = this.props;
  53. const timeData = applyPanelTimeOverrides(panel, this.timeSrv.timeRange());
  54. this.setState({
  55. refreshCounter: this.state.refreshCounter + 1,
  56. timeRange: timeData.timeRange,
  57. timeInfo: timeData.timeInfo,
  58. });
  59. };
  60. onRender = () => {
  61. this.setState({
  62. renderCounter: this.state.renderCounter + 1,
  63. });
  64. };
  65. onInterpolate = (value: string, format?: string) => {
  66. return templateSrv.replace(value, this.props.panel.scopedVars, format);
  67. };
  68. get isVisible() {
  69. return !this.props.dashboard.otherPanelInFullscreen(this.props.panel);
  70. }
  71. render() {
  72. const { panel, dashboard, plugin } = this.props;
  73. const { refreshCounter, timeRange, timeInfo, renderCounter } = this.state;
  74. const { datasource, targets, transparent } = panel;
  75. const PanelComponent = plugin.exports.Panel;
  76. const containerClassNames = `panel-container panel-container--absolute ${transparent ? 'panel-transparent' : ''}`;
  77. return (
  78. <AutoSizer>
  79. {({ width, height }) => {
  80. if (width === 0) {
  81. return null;
  82. }
  83. return (
  84. <div className={containerClassNames}>
  85. <PanelHeader
  86. panel={panel}
  87. dashboard={dashboard}
  88. timeInfo={timeInfo}
  89. title={panel.title}
  90. description={panel.description}
  91. scopedVars={panel.scopedVars}
  92. links={panel.links}
  93. />
  94. <DataPanel
  95. datasource={datasource}
  96. queries={targets}
  97. timeRange={timeRange}
  98. isVisible={this.isVisible}
  99. widthPixels={width}
  100. refreshCounter={refreshCounter}
  101. >
  102. {({ loading, timeSeries }) => {
  103. return (
  104. <div className="panel-content">
  105. <PanelComponent
  106. loading={loading}
  107. timeSeries={timeSeries}
  108. timeRange={timeRange}
  109. options={panel.getOptions(plugin.exports.PanelDefaults)}
  110. width={width - 2 * variables.panelHorizontalPadding}
  111. height={height - PANEL_HEADER_HEIGHT - variables.panelVerticalPadding}
  112. renderCounter={renderCounter}
  113. onInterpolate={this.onInterpolate}
  114. />
  115. </div>
  116. );
  117. }}
  118. </DataPanel>
  119. </div>
  120. );
  121. }}
  122. </AutoSizer>
  123. );
  124. }
  125. }