import { useEffect, useMemo, useState } from 'react'; import { DataQuery, SelectableValue } from '@grafana/data'; import { InlineField, InlineFieldRow, InputActionMeta, Select } from '@grafana/ui'; import { TempoDatasource } from './datasource'; import { OPTIONS_LIMIT } from './language_provider'; export enum TempoVariableQueryType { LabelNames, LabelValues, } export interface TempoVariableQuery extends DataQuery { type: TempoVariableQueryType; label?: string; stream?: string; } const variableOptions = [ { label: 'Label names', value: TempoVariableQueryType.LabelNames }, { label: 'Label values', value: TempoVariableQueryType.LabelValues }, ]; const refId = 'TempoDatasourceVariableQueryEditor-VariableQuery'; export type TempoVariableQueryEditorProps = { onChange: (value: TempoVariableQuery) => void; query: TempoVariableQuery; datasource: TempoDatasource; }; export const TempoVariableQueryEditor = ({ onChange, query, datasource }: TempoVariableQueryEditorProps) => { const [label, setLabel] = useState(query.label || ''); const [type, setType] = useState(query.type); const [labelOptions, setLabelOptions] = useState>>([]); const [labelQuery, setLabelQuery] = useState(''); useEffect(() => { if (type === TempoVariableQueryType.LabelValues) { datasource.labelNamesQuery().then((labelNames: Array<{ text: string }>) => { setLabelOptions(labelNames.map(({ text }) => ({ label: text, value: text }))); }); } }, [datasource, query, type]); const options = useMemo(() => { if (labelQuery.length === 0) { return labelOptions.slice(0, OPTIONS_LIMIT); } const queryLowerCase = labelQuery.toLowerCase(); return labelOptions .filter((tag) => { if (tag.value && tag.value.length > 0) { return tag.value.toLowerCase().includes(queryLowerCase); } return false; }) .slice(0, OPTIONS_LIMIT); }, [labelQuery, labelOptions]); const onQueryTypeChange = (newType: SelectableValue) => { setType(newType.value); if (newType.value !== undefined) { onChange({ type: newType.value, label, refId, }); } }; const onLabelChange = (newLabel: SelectableValue) => { const newLabelValue = newLabel.value || ''; setLabel(newLabelValue); if (type !== undefined) { onChange({ type, label: newLabelValue, refId, }); } }; const handleBlur = () => { if (type !== undefined) { onChange({ type, label, refId }); } }; return ( <> { if (action === 'input-change') { setLabelQuery(value); } }} onCloseMenu={() => setLabelQuery('')} value={{ label, value: label }} options={options} width={32} allowCustomValue virtualized /> )} ); };