2018-10-14 15:39:34 +02:00
|
|
|
// Libraries
|
|
|
|
|
import React, { ComponentClass, PureComponent } from 'react';
|
|
|
|
|
|
|
|
|
|
// Services
|
2018-11-08 14:44:12 +01:00
|
|
|
import { getTimeSrv, TimeSrv } from '../time_srv';
|
2018-10-14 15:39:34 +02:00
|
|
|
|
|
|
|
|
// Components
|
2018-10-25 12:47:09 +02:00
|
|
|
import { PanelHeader } from './PanelHeader/PanelHeader';
|
2018-10-14 15:39:34 +02:00
|
|
|
import { DataPanel } from './DataPanel';
|
|
|
|
|
|
2018-11-08 14:44:12 +01:00
|
|
|
// Utils
|
2018-11-12 09:32:55 +01:00
|
|
|
import { applyPanelTimeOverrides, getResolution, calculateInterval } from 'app/features/dashboard/utils/panel';
|
2018-11-08 14:44:12 +01:00
|
|
|
|
2018-10-14 15:39:34 +02:00
|
|
|
// Types
|
2018-06-19 14:51:57 +02:00
|
|
|
import { PanelModel } from '../panel_model';
|
|
|
|
|
import { DashboardModel } from '../dashboard_model';
|
2018-11-12 11:23:41 +01:00
|
|
|
import { TimeRange, PanelProps } from 'app/types';
|
2018-06-19 14:51:57 +02:00
|
|
|
|
2018-11-06 16:37:51 +01:00
|
|
|
export interface Props {
|
2018-06-19 14:51:57 +02:00
|
|
|
panel: PanelModel;
|
|
|
|
|
dashboard: DashboardModel;
|
2018-07-05 13:10:39 -07:00
|
|
|
component: ComponentClass<PanelProps>;
|
2018-06-19 14:51:57 +02:00
|
|
|
}
|
|
|
|
|
|
2018-11-06 16:37:51 +01:00
|
|
|
export interface State {
|
2018-10-14 15:39:34 +02:00
|
|
|
refreshCounter: number;
|
2018-11-05 17:46:09 +01:00
|
|
|
renderCounter: number;
|
2018-11-12 11:23:41 +01:00
|
|
|
timeInfo: string;
|
|
|
|
|
timeRange: TimeRange;
|
2018-11-12 09:32:55 +01:00
|
|
|
interval: {
|
|
|
|
|
interval: string;
|
|
|
|
|
intervalMs: number;
|
|
|
|
|
};
|
2018-10-14 15:39:34 +02:00
|
|
|
}
|
2018-07-05 13:10:39 -07:00
|
|
|
|
2018-11-06 16:37:51 +01:00
|
|
|
export class PanelChrome extends PureComponent<Props, State> {
|
2018-11-08 14:44:12 +01:00
|
|
|
timeSrv: TimeSrv = getTimeSrv();
|
|
|
|
|
|
2018-06-19 14:51:57 +02:00
|
|
|
constructor(props) {
|
|
|
|
|
super(props);
|
2018-11-06 16:37:51 +01:00
|
|
|
|
2018-10-14 15:39:34 +02:00
|
|
|
this.state = {
|
|
|
|
|
refreshCounter: 0,
|
2018-11-05 17:46:09 +01:00
|
|
|
renderCounter: 0,
|
2018-11-12 11:23:41 +01:00
|
|
|
timeInfo: '',
|
|
|
|
|
timeRange: this.timeSrv.timeRange(),
|
2018-11-12 09:32:55 +01:00
|
|
|
interval: {
|
|
|
|
|
interval: undefined,
|
|
|
|
|
intervalMs: undefined,
|
|
|
|
|
},
|
2018-10-14 15:39:34 +02:00
|
|
|
};
|
2018-07-05 13:10:39 -07:00
|
|
|
}
|
|
|
|
|
|
2018-11-06 16:37:51 +01:00
|
|
|
componentDidMount() {
|
2018-10-14 15:39:34 +02:00
|
|
|
this.props.panel.events.on('refresh', this.onRefresh);
|
2018-11-05 17:46:09 +01:00
|
|
|
this.props.panel.events.on('render', this.onRender);
|
2018-10-14 16:31:20 +02:00
|
|
|
this.props.dashboard.panelInitialized(this.props.panel);
|
2018-10-14 15:39:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
componentWillUnmount() {
|
|
|
|
|
this.props.panel.events.off('refresh', this.onRefresh);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onRefresh = () => {
|
2018-11-08 14:44:12 +01:00
|
|
|
console.log('onRefresh');
|
|
|
|
|
if (!this.isVisible) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2018-11-12 11:23:41 +01:00
|
|
|
|
2018-11-08 14:44:12 +01:00
|
|
|
const { panel } = this.props;
|
2018-11-12 11:38:41 +01:00
|
|
|
const timeRange = this.timeSrv.timeRange();
|
2018-11-12 11:23:41 +01:00
|
|
|
const timeData = applyPanelTimeOverrides(panel, timeRange);
|
2018-11-12 09:32:55 +01:00
|
|
|
const resolution = getResolution(panel);
|
|
|
|
|
const interval = calculateInterval(panel, panel.datasource, timeData.timeRange, resolution);
|
|
|
|
|
|
2018-11-03 23:36:40 +01:00
|
|
|
this.setState(prevState => ({
|
|
|
|
|
...prevState,
|
2018-10-14 15:39:34 +02:00
|
|
|
refreshCounter: this.state.refreshCounter + 1,
|
2018-11-12 09:32:55 +01:00
|
|
|
interval,
|
2018-11-12 11:23:41 +01:00
|
|
|
...timeData,
|
2018-11-03 23:36:40 +01:00
|
|
|
}));
|
2018-10-14 15:39:34 +02:00
|
|
|
};
|
2018-07-09 13:24:15 -07:00
|
|
|
|
2018-11-05 17:46:09 +01:00
|
|
|
onRender = () => {
|
|
|
|
|
console.log('onRender');
|
2018-11-03 23:36:40 +01:00
|
|
|
this.setState(prevState => ({
|
|
|
|
|
...prevState,
|
2018-11-06 16:37:51 +01:00
|
|
|
renderCounter: this.state.renderCounter + 1,
|
2018-11-03 23:36:40 +01:00
|
|
|
}));
|
|
|
|
|
};
|
|
|
|
|
|
2018-10-14 15:39:34 +02:00
|
|
|
get isVisible() {
|
2018-10-14 16:31:20 +02:00
|
|
|
return !this.props.dashboard.otherPanelInFullscreen(this.props.panel);
|
2018-10-14 15:39:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
render() {
|
2018-11-06 16:44:13 +01:00
|
|
|
const { panel, dashboard } = this.props;
|
2018-11-12 11:23:41 +01:00
|
|
|
const { refreshCounter, timeRange, timeInfo, renderCounter } = this.state;
|
2018-11-06 15:03:56 +01:00
|
|
|
|
2018-11-06 16:37:51 +01:00
|
|
|
const { datasource, targets } = panel;
|
2018-10-14 15:39:34 +02:00
|
|
|
const PanelComponent = this.props.component;
|
2018-11-05 17:46:09 +01:00
|
|
|
|
2018-11-03 23:36:40 +01:00
|
|
|
console.log('panelChrome render');
|
2018-06-19 14:51:57 +02:00
|
|
|
return (
|
2018-07-09 18:17:51 +02:00
|
|
|
<div className="panel-container">
|
2018-11-12 11:23:41 +01:00
|
|
|
<PanelHeader panel={panel} dashboard={dashboard} timeInfo={timeInfo} />
|
2018-10-14 12:41:09 +02:00
|
|
|
<div className="panel-content">
|
2018-10-14 15:39:34 +02:00
|
|
|
<DataPanel
|
2018-11-06 16:37:51 +01:00
|
|
|
datasource={datasource}
|
2018-10-14 15:39:34 +02:00
|
|
|
queries={targets}
|
2018-11-12 11:23:41 +01:00
|
|
|
timeRange={timeRange}
|
2018-10-14 15:39:34 +02:00
|
|
|
isVisible={this.isVisible}
|
|
|
|
|
refreshCounter={refreshCounter}
|
|
|
|
|
>
|
2018-10-14 18:19:49 +02:00
|
|
|
{({ loading, timeSeries }) => {
|
2018-11-05 17:46:09 +01:00
|
|
|
console.log('panelcrome inner render');
|
|
|
|
|
return (
|
|
|
|
|
<PanelComponent
|
|
|
|
|
loading={loading}
|
|
|
|
|
timeSeries={timeSeries}
|
2018-11-12 11:23:41 +01:00
|
|
|
timeRange={timeRange}
|
2018-11-05 17:46:09 +01:00
|
|
|
options={panel.getOptions()}
|
|
|
|
|
renderCounter={renderCounter}
|
|
|
|
|
/>
|
|
|
|
|
);
|
2018-10-14 12:41:09 +02:00
|
|
|
}}
|
|
|
|
|
</DataPanel>
|
|
|
|
|
</div>
|
2018-06-19 14:51:57 +02:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|