import React, { useRef } from 'react'; import { EditorField } from '@grafana/experimental'; import { SelectableValue } from '@grafana/data'; import { Select } from '@grafana/ui'; import { LegendFormatMode, PromQuery } from '../../types'; import { AutoSizeInput } from '../shared/AutoSizeInput'; export interface Props { query: PromQuery; onChange: (update: PromQuery) => void; onRunQuery: () => void; } const legendModeOptions = [ { label: 'Auto', value: LegendFormatMode.Auto, description: 'Only includes unique labels', }, { label: 'Verbose', value: LegendFormatMode.Verbose, description: 'All label names and values' }, { label: 'Custom', value: LegendFormatMode.Custom, description: 'Provide a naming template' }, ]; /** * Tests for this component are on the parent level (PromQueryBuilderOptions). */ export const PromQueryLegendEditor = React.memo(({ query, onChange, onRunQuery }) => { const mode = getLegendMode(query.legendFormat); const inputRef = useRef(null); const onLegendFormatChanged = (evt: React.FormEvent) => { let legendFormat = evt.currentTarget.value; if (legendFormat.length === 0) { legendFormat = LegendFormatMode.Auto; } onChange({ ...query, legendFormat }); onRunQuery(); }; const onLegendModeChanged = (value: SelectableValue) => { switch (value.value!) { case LegendFormatMode.Auto: onChange({ ...query, legendFormat: LegendFormatMode.Auto }); break; case LegendFormatMode.Custom: onChange({ ...query, legendFormat: '{{label_name}}' }); setTimeout(() => { inputRef.current?.focus(); inputRef.current?.setSelectionRange(2, 12, 'forward'); }, 10); break; case LegendFormatMode.Verbose: onChange({ ...query, legendFormat: '' }); break; } onRunQuery(); }; return ( <> {mode === LegendFormatMode.Custom && ( )} {mode !== LegendFormatMode.Custom && (