import { css, cx } from '@emotion/css'; import { isEqual } from 'lodash'; import React, { memo, useCallback } from 'react'; import { usePrevious } from 'react-use'; import { InlineFormLabel, RadioButtonGroup } from '@grafana/ui'; import { PrometheusDatasource } from '../datasource'; import { PromQuery } from '../types'; import { PromExemplarField } from './PromExemplarField'; export interface PromExploreExtraFieldProps { query: PromQuery; onChange: (value: PromQuery) => void; onRunQuery: () => void; datasource: PrometheusDatasource; } export const PromExploreExtraField: React.FC = memo( ({ query, datasource, onChange, onRunQuery }) => { const rangeOptions = getQueryTypeOptions(true); const prevQuery = usePrevious(query); const onExemplarChange = useCallback( (exemplar: boolean) => { if (!isEqual(query, prevQuery) || exemplar !== query.exemplar) { onChange({ ...query, exemplar }); } }, [prevQuery, query, onChange] ); function onChangeQueryStep(interval: string) { onChange({ ...query, interval }); } function onStepChange(e: React.SyntheticEvent) { if (e.currentTarget.value !== query.interval) { onChangeQueryStep(e.currentTarget.value); } } function onReturnKeyDown(e: React.KeyboardEvent) { if (e.key === 'Enter' && e.shiftKey) { onRunQuery(); } } const onQueryTypeChange = getQueryTypeChangeHandler(query, onChange); return (
{/*Query type field*/}
Query type
{/*Step field*/}
Min step
); } ); PromExploreExtraField.displayName = 'PromExploreExtraField'; export function getQueryTypeOptions(includeBoth: boolean) { const rangeOptions = [ { value: 'range', label: 'Range', description: 'Run query over a range of time' }, { value: 'instant', label: 'Instant', description: 'Run query against a single point in time. For this query, the "To" time is used', }, ]; if (includeBoth) { rangeOptions.push({ value: 'both', label: 'Both', description: 'Run an Instant query and a Range query' }); } return rangeOptions; } export function getQueryTypeChangeHandler(query: PromQuery, onChange: (update: PromQuery) => void) { return (queryType: string) => { if (queryType === 'instant') { onChange({ ...query, instant: true, range: false, exemplar: false }); } else if (queryType === 'range') { onChange({ ...query, instant: false, range: true }); } else { onChange({ ...query, instant: true, range: true }); } }; } export const testIds = { extraFieldEditor: 'prom-editor-extra-field', stepField: 'prom-editor-extra-field-step', queryTypeField: 'prom-editor-extra-field-query-type', };