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();