diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.tsx index bc5e93b3c38..32390a99fa3 100644 --- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.tsx +++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.tsx @@ -60,7 +60,7 @@ export function LokiQueryBuilderContainer(props: Props) { onChange={onVisQueryChange} onRunQuery={onRunQuery} /> - + {query.rawQuery && } ); } diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryEditorSelector.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryEditorSelector.test.tsx index c655ffcac96..23c9dae50fb 100644 --- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryEditorSelector.test.tsx +++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryEditorSelector.test.tsx @@ -82,29 +82,29 @@ describe('LokiQueryEditorSelector', () => { }); }); - // it('Can enable preview', async () => { - // const { onChange } = renderWithMode(QueryEditorMode.Builder); - // expect(screen.queryByLabelText('selector')).not.toBeInTheDocument(); + it('Can enable raw query', async () => { + const { onChange } = renderWithMode(QueryEditorMode.Builder); + expect(screen.queryByLabelText('selector')).not.toBeInTheDocument(); - // screen.getByLabelText('Preview').click(); + screen.getByLabelText('Raw query').click(); - // expect(onChange).toBeCalledWith({ - // refId: 'A', - // expr: defaultQuery.expr, - // range: true, - // editorMode: QueryEditorMode.Builder, - // editorPreview: true, - // }); - // }); + expect(onChange).toBeCalledWith({ + refId: 'A', + expr: defaultQuery.expr, + queryType: 'range', + editorMode: QueryEditorMode.Builder, + rawQuery: true, + }); + }); - // it('Should show preview', async () => { - // renderWithProps({ - // editorPreview: true, - // editorMode: QueryEditorMode.Builder, - // expr: 'my_metric', - // }); - // expect(screen.getByLabelText('selector').textContent).toBe('my_metric'); - // }); + it('Should show raw query', async () => { + renderWithProps({ + rawQuery: true, + editorMode: QueryEditorMode.Builder, + expr: '{job="grafana"}', + }); + expect(screen.getByLabelText('selector').textContent).toBe('{job="grafana"}'); + }); it('changes to code mode', async () => { const { onChange } = renderWithMode(QueryEditorMode.Builder); diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryEditorSelector.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryEditorSelector.tsx index 58f0de41fe9..a405ef7b602 100644 --- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryEditorSelector.tsx +++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryEditorSelector.tsx @@ -1,10 +1,9 @@ -import { css } from '@emotion/css'; -import { GrafanaTheme2, LoadingState } from '@grafana/data'; +import { LoadingState } from '@grafana/data'; import { EditorHeader, EditorRows, FlexItem, InlineSelect, Space } from '@grafana/experimental'; -import { Button, useStyles2, ConfirmModal } from '@grafana/ui'; +import { Button, ConfirmModal } from '@grafana/ui'; import { QueryEditorModeToggle } from 'app/plugins/datasource/prometheus/querybuilder/shared/QueryEditorModeToggle'; import { QueryEditorMode } from 'app/plugins/datasource/prometheus/querybuilder/shared/types'; -import React, { useCallback, useState } from 'react'; +import React, { SyntheticEvent, useCallback, useEffect, useState } from 'react'; import { LokiQueryEditorProps } from '../../components/types'; import { lokiQueryModeller } from '../LokiQueryModeller'; import { getQueryWithDefaults } from '../state'; @@ -13,12 +12,15 @@ import { LokiQueryBuilderExplained } from './LokiQueryBuilderExplained'; import { LokiQueryBuilderOptions } from './LokiQueryBuilderOptions'; import { LokiQueryCodeEditor } from './LokiQueryCodeEditor'; import { buildVisualQueryFromString } from '../parsing'; +import { QueryHeaderSwitch } from 'app/plugins/datasource/prometheus/querybuilder/shared/QueryHeaderSwitch'; +import { LokiQuery } from '../../types'; export const LokiQueryEditorSelector = React.memo((props) => { const { onChange, onRunQuery, data } = props; - const styles = useStyles2(getStyles); - const query = getQueryWithDefaults(props.query); const [parseModalOpen, setParseModalOpen] = useState(false); + const [dataIsStale, setDataIsStale] = useState(false); + + const query = getQueryWithDefaults(props.query); const onEditorModeChange = useCallback( (newMetricEditorMode: QueryEditorMode) => { @@ -36,6 +38,20 @@ export const LokiQueryEditorSelector = React.memo((props) [onChange, query] ); + useEffect(() => { + setDataIsStale(false); + }, [data]); + + const onChangeInternal = (query: LokiQuery) => { + setDataIsStale(true); + onChange(query); + }; + + const onQueryPreviewChange = (event: SyntheticEvent) => { + const isEnabled = event.currentTarget.checked; + onChange({ ...query, rawQuery: isEnabled }); + }; + // If no expr (ie new query) then default to builder const editorMode = query.editorMode ?? (query.expr ? QueryEditorMode.Code : QueryEditorMode.Builder); return ( @@ -52,18 +68,6 @@ export const LokiQueryEditorSelector = React.memo((props) onDismiss={() => setParseModalOpen(false)} /> - - ((props) }} options={lokiQueryModeller.getQueryPatterns().map((x) => ({ label: x.name, value: x }))} /> + + + @@ -87,7 +102,7 @@ export const LokiQueryEditorSelector = React.memo((props) )} @@ -101,15 +116,3 @@ export const LokiQueryEditorSelector = React.memo((props) }); LokiQueryEditorSelector.displayName = 'LokiQueryEditorSelector'; - -const getStyles = (theme: GrafanaTheme2) => { - return { - runQuery: css({ - color: theme.colors.text.secondary, - }), - switchLabel: css({ - color: theme.colors.text.secondary, - fontSize: theme.typography.bodySmall.fontSize, - }), - }; -}; diff --git a/public/app/plugins/datasource/loki/types.ts b/public/app/plugins/datasource/loki/types.ts index f1e91c3b279..1563669632c 100644 --- a/public/app/plugins/datasource/loki/types.ts +++ b/public/app/plugins/datasource/loki/types.ts @@ -42,6 +42,8 @@ export interface LokiQuery extends DataQuery { /* @deprecated now use queryType */ instant?: boolean; editorMode?: QueryEditorMode; + /** Controls if the raw query text is shown */ + rawQuery?: boolean; } export interface LokiOptions extends DataSourceJsonData {