diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/QueryEditor.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/QueryEditor.tsx index 23d74f9c5e9..dcbe6662d55 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/QueryEditor.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/QueryEditor.tsx @@ -1,6 +1,6 @@ import { Alert } from '@grafana/ui'; import { QueryEditorProps } from '@grafana/data'; -import React from 'react'; +import React, { useCallback, useMemo } from 'react'; import AzureMonitorDatasource from '../../datasource'; import { AzureMonitorQuery, @@ -17,6 +17,8 @@ import ArgQueryEditor from '../ArgQueryEditor'; import ApplicationInsightsEditor from '../ApplicationInsightsEditor'; import InsightsAnalyticsEditor from '../InsightsAnalyticsEditor'; import { Space } from '../Space'; +import { debounce } from 'lodash'; +import useDefaultQuery from './useDefaultQuery'; export type AzureMonitorQueryEditorProps = QueryEditorProps< AzureMonitorDatasource, @@ -24,8 +26,25 @@ export type AzureMonitorQueryEditorProps = QueryEditorProps< AzureDataSourceJsonData >; -const QueryEditor: React.FC = ({ query, datasource, onChange }) => { +const QueryEditor: React.FC = ({ + query: baseQuery, + datasource, + onChange, + onRunQuery: baseOnRunQuery, +}) => { const [errorMessage, setError] = useLastError(); + const onRunQuery = useMemo(() => debounce(baseOnRunQuery, 500), [baseOnRunQuery]); + + const onQueryChange = useCallback( + (newQuery: AzureMonitorQuery) => { + onChange(newQuery); + onRunQuery(); + }, + [onChange, onRunQuery] + ); + + const query = useDefaultQuery(baseQuery, onQueryChange); + const subscriptionId = query.subscription || datasource.azureMonitorDatasource.defaultSubscriptionId; const variableOptionGroup = { label: 'Template Variables', @@ -34,13 +53,13 @@ const QueryEditor: React.FC = ({ query, datasource return (
- + @@ -72,7 +91,6 @@ const EditorForQueryType: React.FC = ({ setError, }) => { switch (query.queryType) { - case undefined: case AzureQueryType.AzureMonitor: return ( = ({ setError={setError} /> ); + + default: + return ; } return null; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/useDefaultQuery.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/useDefaultQuery.ts new file mode 100644 index 00000000000..f1a571c959a --- /dev/null +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/useDefaultQuery.ts @@ -0,0 +1,35 @@ +import { useEffect, useMemo } from 'react'; +import { AzureMonitorQuery, AzureQueryType } from '../../types'; + +const DEFAULT_QUERY_TYPE = AzureQueryType.AzureMonitor; + +const createQueryWithDefaults = (query: AzureMonitorQuery) => { + // A quick and easy way to set just the default query type. If we want to set any other defaults, + // we might want to look into something more robust + if (!query.queryType) { + return { + ...query, + queryType: query.queryType ?? DEFAULT_QUERY_TYPE, + }; + } + + return query; +}; + +/** + * Returns queries with some defaults, and calls onChange function to notify if it changes + */ +const useDefaultQuery = (query: AzureMonitorQuery, onChangeQuery: (newQuery: AzureMonitorQuery) => void) => { + const queryWithDefaults = useMemo(() => createQueryWithDefaults(query), [query]); + + useEffect(() => { + if (queryWithDefaults !== query) { + console.log('changing default query'); + onChangeQuery(queryWithDefaults); + } + }, [queryWithDefaults, query, onChangeQuery]); + + return queryWithDefaults; +}; + +export default useDefaultQuery; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/module.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/module.ts similarity index 82% rename from public/app/plugins/datasource/grafana-azure-monitor-datasource/module.tsx rename to public/app/plugins/datasource/grafana-azure-monitor-datasource/module.ts index 33ca27c6ace..09b5065d360 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/module.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/module.ts @@ -1,11 +1,11 @@ import { DataSourcePlugin } from '@grafana/data'; -import { AzureMonitorQueryCtrl } from './query_ctrl'; import Datasource from './datasource'; import { ConfigEditor } from './components/ConfigEditor'; +import AzureMonitorQueryEditor from './components/QueryEditor'; import { AzureMonitorAnnotationsQueryCtrl } from './annotations_query_ctrl'; import { AzureMonitorQuery, AzureDataSourceJsonData } from './types'; export const plugin = new DataSourcePlugin(Datasource) .setConfigEditor(ConfigEditor) - .setQueryCtrl(AzureMonitorQueryCtrl) + .setQueryEditor(AzureMonitorQueryEditor) .setAnnotationQueryCtrl(AzureMonitorAnnotationsQueryCtrl);