mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* add support for code editor and builder * refactor cloudwatch migration * Add tooltip to editor field (#56) * add tooltip * add old tooltips * Bug bash feedback fixes (#58) * make ASC the default option * update sql preview whenever sql changes * don't allow queries without aggregation * set default value for aggregation * use new input field * cleanup * pr feedback * prevent unnecessary rerenders * use frame error instead of main error * remove not used snapshot * Use dimension filter in schema picker (#63) * use dimension key filter in group by and schema labels * add dimension filter also to code editor * add tests * fix build error * fix strict error * remove debug code * fix annotation editor (#64) * fix annotation editor * fix broken test * revert annotation backend change * PR feedback (#67) * pr feedback * removed dimension filter from group by * add spacing between common fields and rest * do not generate deep link for metric queries (#70) * update docs (#69) Co-authored-by: Erik Sundell <erik.sundell87@gmail.com> * fix lint problem caused by merge conflict Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com>
125 lines
3.9 KiB
TypeScript
125 lines
3.9 KiB
TypeScript
import React, { useCallback, useState } from 'react';
|
|
import { pick } from 'lodash';
|
|
|
|
import { SelectableValue } from '@grafana/data';
|
|
import { Button, ConfirmModal, RadioButtonGroup } from '@grafana/ui';
|
|
|
|
import { CloudWatchDatasource } from '../datasource';
|
|
import {
|
|
CloudWatchMetricsQuery,
|
|
CloudWatchQuery,
|
|
CloudWatchQueryMode,
|
|
MetricEditorMode,
|
|
MetricQueryType,
|
|
} from '../types';
|
|
import EditorHeader from './ui/EditorHeader';
|
|
import InlineSelect from './ui/InlineSelect';
|
|
import FlexItem from './ui/FlexItem';
|
|
import { useRegions } from '../hooks';
|
|
|
|
interface QueryHeaderProps {
|
|
query: CloudWatchMetricsQuery;
|
|
datasource: CloudWatchDatasource;
|
|
onChange: (query: CloudWatchQuery) => void;
|
|
onRunQuery: () => void;
|
|
sqlCodeEditorIsDirty: boolean;
|
|
}
|
|
|
|
const apiModes: Array<SelectableValue<CloudWatchQueryMode>> = [
|
|
{ label: 'CloudWatch Metrics', value: 'Metrics' },
|
|
{ label: 'CloudWatch Logs', value: 'Logs' },
|
|
];
|
|
|
|
const metricEditorModes: Array<SelectableValue<MetricQueryType>> = [
|
|
{ label: 'Metric Search', value: MetricQueryType.Search },
|
|
{ label: 'Metric Query', value: MetricQueryType.Query },
|
|
];
|
|
|
|
const editorModes = [
|
|
{ label: 'Builder', value: MetricEditorMode.Builder },
|
|
{ label: 'Code', value: MetricEditorMode.Code },
|
|
];
|
|
|
|
const QueryHeader: React.FC<QueryHeaderProps> = ({ query, sqlCodeEditorIsDirty, datasource, onChange, onRunQuery }) => {
|
|
const { metricEditorMode, metricQueryType, queryMode, region } = query;
|
|
const [showConfirm, setShowConfirm] = useState(false);
|
|
|
|
const [regions, regionIsLoading] = useRegions(datasource);
|
|
|
|
const onEditorModeChange = useCallback(
|
|
(newMetricEditorMode: MetricEditorMode) => {
|
|
if (
|
|
sqlCodeEditorIsDirty &&
|
|
metricQueryType === MetricQueryType.Query &&
|
|
metricEditorMode === MetricEditorMode.Code
|
|
) {
|
|
setShowConfirm(true);
|
|
return;
|
|
}
|
|
onChange({ ...query, metricEditorMode: newMetricEditorMode });
|
|
},
|
|
[setShowConfirm, onChange, sqlCodeEditorIsDirty, query, metricEditorMode, metricQueryType]
|
|
);
|
|
|
|
const onQueryModeChange = ({ value }: SelectableValue<CloudWatchQueryMode>) => {
|
|
if (value !== queryMode) {
|
|
const commonProps = pick(query, 'id', 'region', 'namespace', 'refId', 'hide', 'key', 'queryType', 'datasource');
|
|
|
|
onChange({
|
|
...commonProps,
|
|
queryMode: value,
|
|
});
|
|
}
|
|
};
|
|
|
|
return (
|
|
<EditorHeader>
|
|
<InlineSelect
|
|
label="Region"
|
|
value={regions.find((v) => v.value === region)}
|
|
placeholder="Select region"
|
|
allowCustomValue
|
|
onChange={({ value: region }) => region && onChange({ ...query, region: region })}
|
|
options={regions}
|
|
isLoading={regionIsLoading}
|
|
/>
|
|
|
|
<InlineSelect value={queryMode} options={apiModes} onChange={onQueryModeChange} />
|
|
|
|
<InlineSelect
|
|
value={metricEditorModes.find((m) => m.value === metricQueryType)}
|
|
options={metricEditorModes}
|
|
onChange={({ value }) => {
|
|
onChange({ ...query, metricQueryType: value });
|
|
}}
|
|
/>
|
|
|
|
<FlexItem grow={1} />
|
|
|
|
<RadioButtonGroup options={editorModes} size="sm" value={metricEditorMode} onChange={onEditorModeChange} />
|
|
|
|
{query.metricQueryType === MetricQueryType.Query && query.metricEditorMode === MetricEditorMode.Code && (
|
|
<Button variant="secondary" size="sm" onClick={() => onRunQuery()}>
|
|
Run query
|
|
</Button>
|
|
)}
|
|
|
|
<ConfirmModal
|
|
isOpen={showConfirm}
|
|
title="Are you sure?"
|
|
body="You will lose manual changes done to the query if you go back to the visual builder."
|
|
confirmText="Yes, I am sure."
|
|
dismissText="No, continue editing the query manually."
|
|
icon="exclamation-triangle"
|
|
onConfirm={() => {
|
|
setShowConfirm(false);
|
|
onChange({ ...query, metricEditorMode: MetricEditorMode.Builder });
|
|
}}
|
|
onDismiss={() => setShowConfirm(false)}
|
|
/>
|
|
</EditorHeader>
|
|
);
|
|
};
|
|
|
|
export default QueryHeader;
|