@ -7,7 +7,6 @@ import { DatasourceSrv, getDatasourceSrv } from 'app/features/plugins/datasource
import kbn from 'app/core/utils/kbn' ;
import kbn from 'app/core/utils/kbn' ;
// Types
// Types
import {
import {
DataQueryOptions ,
DataQueryError ,
DataQueryError ,
LoadingState ,
LoadingState ,
SeriesData ,
SeriesData ,
@ -16,11 +15,12 @@ import {
toSeriesData ,
toSeriesData ,
guessFieldTypes ,
guessFieldTypes ,
DataQuery ,
DataQuery ,
PanelData ,
DataRequestInfo ,
} from '@grafana/ui' ;
} from '@grafana/ui' ;
interface RenderProps {
interface RenderProps {
loading : LoadingState ;
data : PanelData ;
data : SeriesData [ ] ;
}
}
export interface Props {
export interface Props {
@ -42,8 +42,7 @@ export interface Props {
export interface State {
export interface State {
isFirstLoad : boolean ;
isFirstLoad : boolean ;
loading : LoadingState ;
data : PanelData ;
data? : SeriesData [ ] ;
}
}
/ * *
/ * *
@ -78,8 +77,11 @@ export class DataPanel extends Component<Props, State> {
super ( props ) ;
super ( props ) ;
this . state = {
this . state = {
loading : LoadingState.NotStarted ,
isFirstLoad : true ,
isFirstLoad : true ,
data : {
state : LoadingState.NotStarted ,
series : [ ] ,
} ,
} ;
} ;
}
}
@ -123,11 +125,21 @@ export class DataPanel extends Component<Props, State> {
}
}
if ( ! queries . length ) {
if ( ! queries . length ) {
this . setState ( { loading : LoadingState.Done } ) ;
this . setState ( {
data : {
state : LoadingState.Done ,
series : [ ] ,
} ,
} ) ;
return ;
return ;
}
}
this . setState ( { loading : LoadingState.Loading } ) ;
this . setState ( {
data : {
. . . this . state . data ,
loading : LoadingState.Loading ,
} ,
} ) ;
try {
try {
const ds = await this . dataSourceSrv . get ( datasource , scopedVars ) ;
const ds = await this . dataSourceSrv . get ( datasource , scopedVars ) ;
@ -142,7 +154,7 @@ export class DataPanel extends Component<Props, State> {
__interval_ms : { text : intervalRes.intervalMs.toString ( ) , value : intervalRes.intervalMs } ,
__interval_ms : { text : intervalRes.intervalMs.toString ( ) , value : intervalRes.intervalMs } ,
} ) ;
} ) ;
const queryOptions : DataQueryOptions = {
const request : DataRequestInfo = {
timezone : 'browser' ,
timezone : 'browser' ,
panelId : panelId ,
panelId : panelId ,
dashboardId : dashboardId ,
dashboardId : dashboardId ,
@ -154,24 +166,29 @@ export class DataPanel extends Component<Props, State> {
maxDataPoints : maxDataPoints || widthPixels ,
maxDataPoints : maxDataPoints || widthPixels ,
scopedVars : scopedVarsWithInterval ,
scopedVars : scopedVarsWithInterval ,
cacheTimeout : null ,
cacheTimeout : null ,
startTime : Date.now ( ) ,
} ;
} ;
const resp = await ds . query ( queryOptions ) ;
const resp = await ds . query ( request ) ;
request . endTime = Date . now ( ) ;
if ( this . isUnmounted ) {
if ( this . isUnmounted ) {
return ;
return ;
}
}
// Make sure the data is SeriesData[]
// Make sure the data is SeriesData[]
const data = getProcessedSeriesData ( resp . data ) ;
const series = getProcessedSeriesData ( resp . data ) ;
if ( onDataResponse ) {
if ( onDataResponse ) {
onDataResponse ( data ) ;
onDataResponse ( series ) ;
}
}
this . setState ( {
this . setState ( {
data ,
loading : LoadingState.Done ,
isFirstLoad : false ,
isFirstLoad : false ,
data : {
state : LoadingState.Done ,
series ,
request ,
} ,
} ) ;
} ) ;
} catch ( err ) {
} catch ( err ) {
console . log ( 'DataPanel error' , err ) ;
console . log ( 'DataPanel error' , err ) ;
@ -189,16 +206,24 @@ export class DataPanel extends Component<Props, State> {
}
}
onError ( message , err ) ;
onError ( message , err ) ;
this . setState ( { isFirstLoad : false , loading : LoadingState.Error } ) ;
this . setState ( {
isFirstLoad : false ,
data : {
. . . this . state . data ,
loading : LoadingState.Error ,
} ,
} ) ;
}
}
} ;
} ;
render() {
render() {
const { queries } = this . props ;
const { queries } = this . props ;
const { loading , isFirstLoad , data } = this . state ;
const { isFirstLoad , data } = this . state ;
const { state } = data ;
// do not render component until we have first data
// do not render component until we have first data
if ( isFirstLoad && ( loading === LoadingState . Loading || loading === LoadingState . NotStarted ) ) {
if ( isFirstLoad && ( state === LoadingState . Loading || state === LoadingState . NotStarted ) ) {
return this . renderLoadingState ( ) ;
return this . renderLoadingState ( ) ;
}
}
@ -212,8 +237,8 @@ export class DataPanel extends Component<Props, State> {
return (
return (
< >
< >
{ loading === LoadingState . Loading && this . renderLoadingState ( ) }
{ state === LoadingState . Loading && this . renderLoadingState ( ) }
{ this . props . children ( { loading , data } ) }
{ this . props . children ( { data } ) }
< / >
< / >
) ;
) ;
}
}