diff --git a/docusaurus/docs/tutorials/build-a-streaming-data-source-plugin.md b/docusaurus/docs/tutorials/build-a-streaming-data-source-plugin.md index 04460929c..031537d9d 100644 --- a/docusaurus/docs/tutorials/build-a-streaming-data-source-plugin.md +++ b/docusaurus/docs/tutorials/build-a-streaming-data-source-plugin.md @@ -79,7 +79,7 @@ export function QueryEditor({ query, onChange, onRunQuery }: Props) { const { upperLimit, lowerLimit, tickInterval } = query; return ( -
+ <> @@ -89,7 +89,7 @@ export function QueryEditor({ query, onChange, onRunQuery }: Props) { -
+ <> ); } ``` diff --git a/packages/create-plugin/templates/backend/src/datasource.ts b/packages/create-plugin/templates/backend/src/datasource.ts index b542b8c33..1b62a7826 100644 --- a/packages/create-plugin/templates/backend/src/datasource.ts +++ b/packages/create-plugin/templates/backend/src/datasource.ts @@ -1,5 +1,5 @@ -import { DataSourceInstanceSettings, CoreApp } from '@grafana/data'; -import { DataSourceWithBackend } from '@grafana/runtime'; +import { DataSourceInstanceSettings, CoreApp, ScopedVars } from '@grafana/data'; +import { DataSourceWithBackend, getTemplateSrv } from '@grafana/runtime'; import { MyQuery, MyDataSourceOptions, DEFAULT_QUERY } from './types'; @@ -9,6 +9,18 @@ export class DataSource extends DataSourceWithBackend { - return DEFAULT_QUERY + return DEFAULT_QUERY; + } + + applyTemplateVariables(query: MyQuery, scopedVars: ScopedVars): Record { + return { + ...query, + queryText: getTemplateSrv().replace(query.queryText, scopedVars), + }; + } + + filterQuery(query: MyQuery): boolean { + // if no query has been provided, prevent the query from being executed + return !!query.queryText; } } diff --git a/packages/create-plugin/templates/datasource/src/components/ConfigEditor.tsx b/packages/create-plugin/templates/datasource/src/components/ConfigEditor.tsx index b37208e55..0e69a9134 100644 --- a/packages/create-plugin/templates/datasource/src/components/ConfigEditor.tsx +++ b/packages/create-plugin/templates/datasource/src/components/ConfigEditor.tsx @@ -3,16 +3,20 @@ import { InlineField, Input, SecretInput } from '@grafana/ui'; import { DataSourcePluginOptionsEditorProps } from '@grafana/data'; import { MyDataSourceOptions, MySecureJsonData } from '../types'; -interface Props extends DataSourcePluginOptionsEditorProps {} +interface Props extends DataSourcePluginOptionsEditorProps {} export function ConfigEditor(props: Props) { const { onOptionsChange, options } = props; + const { jsonData, secureJsonFields, secureJsonData } = options; + const onPathChange = (event: ChangeEvent) => { - const jsonData = { - ...options.jsonData, - path: event.target.value, - }; - onOptionsChange({ ...options, jsonData }); + onOptionsChange({ + ...options, + jsonData: { + ...jsonData, + path: event.target.value, + }, + }); }; // Secure field (only sent to the backend) @@ -39,29 +43,29 @@ export function ConfigEditor(props: Props) { }); }; - const { jsonData, secureJsonFields } = options; - const secureJsonData = (options.secureJsonData || {}) as MySecureJsonData; - return ( -
- + <> + - + -
+ ); } diff --git a/packages/create-plugin/templates/datasource/src/components/QueryEditor.tsx b/packages/create-plugin/templates/datasource/src/components/QueryEditor.tsx index f9b0647ee..ec0787e3a 100644 --- a/packages/create-plugin/templates/datasource/src/components/QueryEditor.tsx +++ b/packages/create-plugin/templates/datasource/src/components/QueryEditor.tsx @@ -1,5 +1,5 @@ import React, { ChangeEvent } from 'react'; -import { InlineField, Input } from '@grafana/ui'; +import { InlineField, Input, Stack } from '@grafana/ui'; import { QueryEditorProps } from '@grafana/data'; import { DataSource } from '../datasource'; import { MyDataSourceOptions, MyQuery } from '../types'; @@ -20,13 +20,26 @@ export function QueryEditor({ query, onChange, onRunQuery }: Props) { const { queryText, constant } = query; return ( -
+ - + - + -
+ ); } diff --git a/packages/create-plugin/templates/datasource/src/datasource.ts b/packages/create-plugin/templates/datasource/src/datasource.ts index 92ee42eee..dbed18d10 100644 --- a/packages/create-plugin/templates/datasource/src/datasource.ts +++ b/packages/create-plugin/templates/datasource/src/datasource.ts @@ -1,4 +1,5 @@ import { + CoreApp, DataQueryRequest, DataQueryResponse, DataSourceApi, @@ -7,13 +8,22 @@ import { FieldType, } from '@grafana/data'; -import { MyQuery, MyDataSourceOptions } from './types'; +import { MyQuery, MyDataSourceOptions, DEFAULT_QUERY } from './types'; export class DataSource extends DataSourceApi { constructor(instanceSettings: DataSourceInstanceSettings) { super(instanceSettings); } + getDefaultQuery(_: CoreApp): Partial { + return DEFAULT_QUERY; + } + + filterQuery(query: MyQuery): boolean { + // if no query has been provided, prevent the query from being executed + return !!query.queryText; + } + async query(options: DataQueryRequest): Promise { const { range } = options; const from = range!.from.valueOf();