import { CoreApp, LoadingState, QueryEditorProps, SelectableValue } from '@grafana/data'; import { EditorHeader, InlineSelect, FlexItem } from '@grafana/experimental'; import { config } from '@grafana/runtime'; import { Badge, Button } from '@grafana/ui'; import { CloudWatchDatasource } from '../../datasource'; import { isCloudWatchLogsQuery, isCloudWatchMetricsQuery } from '../../guards'; import { useIsMonitoringAccount, useRegions } from '../../hooks'; import { CloudWatchJsonData, CloudWatchQuery, CloudWatchQueryMode } from '../../types'; export interface Props extends QueryEditorProps { extraHeaderElementLeft?: JSX.Element; extraHeaderElementRight?: JSX.Element; dataIsStale: boolean; } const apiModes: Array> = [ { label: 'CloudWatch Metrics', value: 'Metrics' }, { label: 'CloudWatch Logs', value: 'Logs' }, ]; const QueryHeader = ({ query, onChange, datasource, extraHeaderElementLeft, extraHeaderElementRight, dataIsStale, data, onRunQuery, }: Props) => { const { queryMode, region } = query; const isMonitoringAccount = useIsMonitoringAccount(datasource.resources, query.region); const [regions, regionIsLoading] = useRegions(datasource); const emptyLogsExpression = isCloudWatchLogsQuery(query) ? !query.expression : false; const onQueryModeChange = ({ value }: SelectableValue) => { if (value && value !== queryMode) { onChange({ ...datasource.getDefaultQuery(CoreApp.Unknown), ...query, queryMode: value, expression: '', }); } }; const onRegionChange = async (region: string) => { if (config.featureToggles.cloudWatchCrossAccountQuerying && isCloudWatchMetricsQuery(query)) { const isMonitoringAccount = await datasource.resources.isMonitoringAccount(region); onChange({ ...query, region, accountId: isMonitoringAccount ? query.accountId : undefined }); } else { onChange({ ...query, region }); } }; const shouldDisplayMonitoringBadge = config.featureToggles.cloudWatchCrossAccountQuerying && isMonitoringAccount; return ( <> region && onRegionChange(region)} options={regions} isLoading={regionIsLoading} /> {extraHeaderElementLeft} {shouldDisplayMonitoringBadge && ( <> )} {extraHeaderElementRight} ); }; export default QueryHeader;