grafana/public/app/features/dashboard/dashgrid/PanelChrome.tsx

106 lines
2.7 KiB
TypeScript
Raw Normal View History

// Libraries
import React, { ComponentClass, PureComponent } from 'react';
// Services
import { getTimeSrv } from '../time_srv';
// Components
import { PanelHeader } from './PanelHeader/PanelHeader';
import { DataPanel } from './DataPanel';
// Types
2018-06-19 07:51:57 -05:00
import { PanelModel } from '../panel_model';
import { DashboardModel } from '../dashboard_model';
import { TimeRange, PanelProps } from 'app/types';
2018-06-19 07:51:57 -05:00
2018-11-01 06:01:27 -05:00
export interface PanelChromeProps {
2018-06-19 07:51:57 -05:00
panel: PanelModel;
dashboard: DashboardModel;
component: ComponentClass<PanelProps>;
2018-11-01 06:01:27 -05:00
withMenuOptions: any;
2018-06-19 07:51:57 -05:00
}
2018-11-01 06:01:27 -05:00
export interface PanelChromeState {
refreshCounter: number;
2018-11-05 10:46:09 -06:00
renderCounter: number;
timeRange?: TimeRange;
}
2018-11-01 06:01:27 -05:00
export class PanelChrome extends PureComponent<PanelChromeProps, PanelChromeState> {
2018-06-19 07:51:57 -05:00
constructor(props) {
super(props);
this.state = {
refreshCounter: 0,
2018-11-05 10:46:09 -06:00
renderCounter: 0,
};
}
componentDidMount() {
this.props.panel.events.on('refresh', this.onRefresh);
2018-11-05 10:46:09 -06:00
this.props.panel.events.on('render', this.onRender);
2018-10-14 09:31:20 -05:00
this.props.dashboard.panelInitialized(this.props.panel);
}
componentWillUnmount() {
this.props.panel.events.off('refresh', this.onRefresh);
}
onRefresh = () => {
const timeSrv = getTimeSrv();
const timeRange = timeSrv.timeRange();
this.setState({
refreshCounter: this.state.refreshCounter + 1,
timeRange: timeRange,
});
};
2018-11-05 10:46:09 -06:00
onRender = () => {
console.log('onRender');
this.setState({
renderCounter: this.state.renderCounter + 1,
});
};
get isVisible() {
2018-10-14 09:31:20 -05:00
return !this.props.dashboard.otherPanelInFullscreen(this.props.panel);
}
render() {
2018-11-01 06:01:27 -05:00
const { panel, dashboard, withMenuOptions } = this.props;
const { datasource, targets } = panel;
2018-11-05 10:46:09 -06:00
const { timeRange, renderCounter, refreshCounter } = this.state;
const PanelComponent = this.props.component;
2018-11-05 10:46:09 -06:00
console.log('Panel chrome render');
2018-06-19 07:51:57 -05:00
return (
2018-07-09 11:17:51 -05:00
<div className="panel-container">
2018-11-01 06:01:27 -05:00
<PanelHeader panel={panel} dashboard={dashboard} withMenuOptions={withMenuOptions} />
<div className="panel-content">
<DataPanel
datasource={datasource}
queries={targets}
2018-10-14 09:31:20 -05:00
timeRange={timeRange}
isVisible={this.isVisible}
refreshCounter={refreshCounter}
>
2018-10-14 11:19:49 -05:00
{({ loading, timeSeries }) => {
2018-11-05 10:46:09 -06:00
console.log('panelcrome inner render');
return (
<PanelComponent
loading={loading}
timeSeries={timeSeries}
timeRange={timeRange}
options={panel.getOptions()}
renderCounter={renderCounter}
/>
);
}}
</DataPanel>
</div>
2018-06-19 07:51:57 -05:00
</div>
);
}
}