Commit 82326fed by ryan

return the same panelData unless it changes

parent bc2a7981
......@@ -44,6 +44,7 @@ export interface State {
isFirstLoad: boolean;
loading: LoadingState;
response: DataQueryResponse;
panelData: PanelData;
}
export class DataPanel extends Component<Props, State> {
......@@ -63,6 +64,7 @@ export class DataPanel extends Component<Props, State> {
response: {
data: [],
},
panelData: {},
isFirstLoad: true,
};
}
......@@ -147,6 +149,7 @@ export class DataPanel extends Component<Props, State> {
this.setState({
loading: LoadingState.Done,
response: resp,
panelData: this.getPanelData(resp),
isFirstLoad: false,
});
} catch (err) {
......@@ -169,9 +172,7 @@ export class DataPanel extends Component<Props, State> {
}
};
getPanelData = () => {
const { response } = this.state;
getPanelData(response: DataQueryResponse) {
if (response.data.length > 0 && (response.data[0] as TableData).type === 'table') {
return {
tableData: response.data[0] as TableData,
......@@ -183,12 +184,11 @@ export class DataPanel extends Component<Props, State> {
timeSeries: response.data as TimeSeries[],
tableData: null,
};
};
}
render() {
const { queries } = this.props;
const { loading, isFirstLoad } = this.state;
const panelData = this.getPanelData();
const { loading, isFirstLoad, panelData } = this.state;
// do not render component until we have first data
if (isFirstLoad && (loading === LoadingState.Loading || loading === LoadingState.NotStarted)) {
......
// Libraries
import React, { PureComponent } from 'react';
import React, { Component } from 'react';
// Services & Utils
import { processTimeSeries, ThemeContext } from '@grafana/ui';
......@@ -12,15 +12,27 @@ import { GaugeOptions } from './types';
import { PanelProps, NullValueMode, TimeSeriesValue } from '@grafana/ui/src/types';
interface Props extends PanelProps<GaugeOptions> {}
interface State {
value: TimeSeriesValue;
}
export class GaugePanel extends PureComponent<Props> {
render() {
const { panelData, width, height, replaceVariables, options } = this.props;
const { valueOptions } = options;
export class GaugePanel extends Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
value: this.findValue(props),
};
}
const prefix = replaceVariables(valueOptions.prefix);
const suffix = replaceVariables(valueOptions.suffix);
let value: TimeSeriesValue;
componentDidUpdate(prevProps: Props) {
if (this.props.panelData !== prevProps.panelData) {
this.setState({ value: this.findValue(this.props) });
}
}
findValue(props: Props): number | null {
const { panelData, options } = props;
const { valueOptions } = options;
if (panelData.timeSeries) {
const vmSeries = processTimeSeries({
......@@ -29,14 +41,21 @@ export class GaugePanel extends PureComponent<Props> {
});
if (vmSeries[0]) {
value = vmSeries[0].stats[valueOptions.stat];
} else {
value = null;
return vmSeries[0].stats[valueOptions.stat];
}
} else if (panelData.tableData) {
value = panelData.tableData.rows[0].find(prop => prop > 0);
return panelData.tableData.rows[0].find(prop => prop > 0);
}
return null;
}
render() {
const { width, height, replaceVariables, options } = this.props;
const { valueOptions } = options;
const { value } = this.state;
const prefix = replaceVariables(valueOptions.prefix);
const suffix = replaceVariables(valueOptions.suffix);
return (
<ThemeContext.Consumer>
{theme => (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment