diff --git a/packages/grafana-data/src/types/app.ts b/packages/grafana-data/src/types/app.ts index 4f0c9ff4cec..2324eb3c741 100644 --- a/packages/grafana-data/src/types/app.ts +++ b/packages/grafana-data/src/types/app.ts @@ -7,6 +7,7 @@ export enum CoreApp { Dashboard = 'dashboard', Explore = 'explore', Unknown = 'unknown', + CloudAlerting = 'cloud-alerting', } export interface AppRootProps { diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index b0474f75acc..e314518bf54 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -367,6 +367,7 @@ export interface QueryEditorProps< exploreId?: any; history?: HistoryItem[]; queries?: DataQuery[]; + app?: CoreApp; } // TODO: not really needed but used as type in some data sources and in DataQueryRequest diff --git a/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx b/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx index bd9e04dc907..7d7906a1c7b 100644 --- a/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx @@ -1,5 +1,10 @@ -import { TextArea } from '@grafana/ui'; -import React, { FC } from 'react'; +import React, { FC, useCallback, useMemo, useState } from 'react'; +import { noop } from 'lodash'; +import { CoreApp, DataQuery } from '@grafana/data'; +import { getDataSourceSrv } from '@grafana/runtime'; +import { useAsync } from 'react-use'; +import { PromQuery } from 'app/plugins/datasource/prometheus/types'; +import { LokiQuery } from 'app/plugins/datasource/loki/types'; interface Props { value?: string; @@ -7,13 +12,62 @@ interface Props { dataSourceName: string; // will be a prometheus or loki datasource } -// @TODO implement proper prom/loki query editor here export const ExpressionEditor: FC = ({ value, onChange, dataSourceName }) => { + const { mapToValue, mapToQuery } = useQueryMappers(dataSourceName); + const [query, setQuery] = useState(mapToQuery({ refId: 'A', hide: false }, value)); + const { error, loading, value: dataSource } = useAsync(() => { + return getDataSourceSrv().get(dataSourceName); + }, [dataSourceName]); + + const onChangeQuery = useCallback( + (query: DataQuery) => { + setQuery(query); + onChange(mapToValue(query)); + }, + [onChange, mapToValue] + ); + + if (loading || dataSource?.name !== dataSourceName) { + return null; + } + + if (error || !dataSource || !dataSource?.components?.QueryEditor) { + const errorMessage = error?.message || 'Data source plugin does not export any Query Editor component'; + return
Could not load query editor due to: {errorMessage}
; + } + + const QueryEditor = dataSource?.components?.QueryEditor; + return ( -