diff --git a/packages/grafana-ui/src/types/datasource.ts b/packages/grafana-ui/src/types/datasource.ts index 3e64ed8a18d..f47e2473a85 100644 --- a/packages/grafana-ui/src/types/datasource.ts +++ b/packages/grafana-ui/src/types/datasource.ts @@ -1,6 +1,6 @@ import { TimeRange, RawTimeRange } from './time'; import { TimeSeries } from './series'; -import { PluginExports, PluginMeta } from './plugin'; +import { PluginMeta } from './plugin'; export interface DataQueryResponse { data: TimeSeries[]; @@ -43,42 +43,6 @@ export interface QueryHint { fix?: QueryFix; } -export interface DataSourceApi { - name: string; - meta: PluginMeta; - pluginExports: PluginExports; - - /** - * min interval range - */ - interval?: string; - - /** - * Imports queries from a different datasource - */ - importQueries?(queries: DataQuery[], originMeta: PluginMeta): Promise; - - /** - * Initializes a datasource after instantiation - */ - init?: () => void; - - /** - * Main metrics / data query action - */ - query(options: DataQueryOptions): Promise; - - /** - * Test & verify datasource settings & connection details - */ - testDatasource(): Promise; - - /** - * Get hints for query improvements - */ - getQueryHints(query: DataQuery, results: any[], ...rest: any): QueryHint[]; -} - export interface DataSourceSettings { id: number; orgId: number; diff --git a/packages/grafana-ui/src/types/plugin.ts b/packages/grafana-ui/src/types/plugin.ts index a2ee426dd9f..30a958420de 100644 --- a/packages/grafana-ui/src/types/plugin.ts +++ b/packages/grafana-ui/src/types/plugin.ts @@ -1,10 +1,54 @@ import { ComponentClass } from 'react'; import { PanelProps, PanelOptionsProps } from './panel'; +import { DataQueryOptions, DataQuery, DataQueryResponse, QueryHint } from './datasource'; + +export interface DataSourceApi { + name: string; + meta: PluginMeta; + pluginExports: PluginExports; + + /** + * min interval range + */ + interval?: string; + + /** + * Imports queries from a different datasource + */ + importQueries?(queries: DataQuery[], originMeta: PluginMeta): Promise; + + /** + * Initializes a datasource after instantiation + */ + init?: () => void; + + /** + * Main metrics / data query action + */ + query(options: DataQueryOptions): Promise; + + /** + * Test & verify datasource settings & connection details + */ + testDatasource(): Promise; + + /** + * Get hints for query improvements + */ + getQueryHints(query: DataQuery, results: any[], ...rest: any): QueryHint[]; +} + +export interface QueryEditorProps { + datasource: DataSourceApi; + query: DataQuery; + onExecuteQuery?: () => void; + onQueryChange?: (value: DataQuery) => void; +} export interface PluginExports { Datasource?: any; QueryCtrl?: any; - QueryEditor?: any; + QueryEditor?: ComponentClass; ConfigCtrl?: any; AnnotationsQueryCtrl?: any; VariableQueryEditor?: any; diff --git a/public/app/features/dashboard/panel_editor/QueryEditorRow.tsx b/public/app/features/dashboard/panel_editor/QueryEditorRow.tsx index 392890ab9f1..1289ad3bac7 100644 --- a/public/app/features/dashboard/panel_editor/QueryEditorRow.tsx +++ b/public/app/features/dashboard/panel_editor/QueryEditorRow.tsx @@ -103,7 +103,17 @@ export class QueryEditorRow extends PureComponent { this.setState({ isCollapsed: !this.state.isCollapsed }); }; + onQueryChange = (query: DataQuery) => { + Object.assign(this.props.query, query); + this.onExecuteQuery(); + }; + + onExecuteQuery = () => { + this.props.panel.refresh(); + }; + renderPluginEditor() { + const { query } = this.props; const { datasource } = this.state; if (datasource.pluginExports.QueryCtrl) { @@ -112,7 +122,14 @@ export class QueryEditorRow extends PureComponent { if (datasource.pluginExports.QueryEditor) { const QueryEditor = datasource.pluginExports.QueryEditor; - return ; + return ( + + ); } return
Data source plugin does not export any Query Editor component
; diff --git a/public/app/plugins/datasource/testdata/QueryEditor.tsx b/public/app/plugins/datasource/testdata/QueryEditor.tsx index 675d1a74ea8..25a811da42d 100644 --- a/public/app/plugins/datasource/testdata/QueryEditor.tsx +++ b/public/app/plugins/datasource/testdata/QueryEditor.tsx @@ -1,12 +1,66 @@ +// Libraries import React, { PureComponent } from 'react'; +import _ from 'lodash'; -interface Props { +// Services & Utils +import { getBackendSrv, BackendSrv } from 'app/core/services/backend_srv'; + +// Components +import { FormLabel, Select, SelectOptionItem } from '@grafana/ui'; + +// Types +import { QueryEditorProps } from '@grafana/ui/src/types'; + +interface Scenario { + id: string; + name: string; } -export class QueryEditor extends PureComponent { +interface State { + scenarioList: Scenario[]; + current: Scenario | null; +} + +export class QueryEditor extends PureComponent { + backendSrv: BackendSrv = getBackendSrv(); + + state: State = { + scenarioList: [], + current: null, + }; + + async componentDidMount() { + const { query } = this.props; + + query.scenarioId = query.scenarioId || 'random_walk'; + + const scenarioList = await this.backendSrv.get('/api/tsdb/testdata/scenarios'); + const current = _.find(scenarioList, { id: query.scenarioId }); + + this.setState({ scenarioList: scenarioList, current: current }); + } + + onScenarioChange = (item: SelectOptionItem) => { + this.props.onQueryChange({ + scenarioId: item.value, + ...this.props.query + }); + } + render() { + const { query } = this.props; + const options = this.state.scenarioList.map(item => ({ label: item.name, value: item.id })); + const current = options.find(item => item.value === query.scenarioId); + return ( -

Test data

+
+
+ + Scenario + +