import React, { useCallback, useState } from 'react'; import { pick } from 'lodash'; import { SelectableValue } from '@grafana/data'; import { Button, ConfirmModal, RadioButtonGroup } from '@grafana/ui'; import { EditorHeader, InlineSelect, FlexItem } from '@grafana/experimental'; import { CloudWatchDatasource } from '../datasource'; import { CloudWatchMetricsQuery, CloudWatchQuery, CloudWatchQueryMode, MetricEditorMode, MetricQueryType, } from '../types'; import { useRegions } from '../hooks'; interface QueryHeaderProps { query: CloudWatchMetricsQuery; datasource: CloudWatchDatasource; onChange: (query: CloudWatchQuery) => void; onRunQuery: () => void; sqlCodeEditorIsDirty: boolean; } const apiModes: Array> = [ { label: 'CloudWatch Metrics', value: 'Metrics' }, { label: 'CloudWatch Logs', value: 'Logs' }, ]; const metricEditorModes: Array> = [ { 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 = ({ 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) => { if (value !== queryMode) { const commonProps = pick(query, 'id', 'region', 'namespace', 'refId', 'hide', 'key', 'queryType', 'datasource'); onChange({ ...commonProps, queryMode: value, }); } }; return ( v.value === region)} placeholder="Select region" allowCustomValue onChange={({ value: region }) => region && onChange({ ...query, region: region })} options={regions} isLoading={regionIsLoading} /> m.value === metricQueryType)} options={metricEditorModes} onChange={({ value }) => { onChange({ ...query, metricQueryType: value }); }} /> {query.metricQueryType === MetricQueryType.Query && query.metricEditorMode === MetricEditorMode.Code && ( )} { setShowConfirm(false); onChange({ ...query, metricEditorMode: MetricEditorMode.Builder }); }} onDismiss={() => setShowConfirm(false)} /> ); }; export default QueryHeader;