import React, { FC, FormEvent, useState, useEffect } from 'react'; import { QueryEditorProps, SelectableValue } from '@grafana/data'; import { InlineField, InlineFieldRow, Input, Select } from '@grafana/ui'; import { LokiDatasource } from '../datasource'; import { migrateVariableQuery } from '../migrations/variableQueryMigrations'; import { LokiOptions, LokiQuery, LokiVariableQuery, LokiVariableQueryType as QueryType } from '../types'; const variableOptions = [ { label: 'Label names', value: QueryType.LabelNames }, { label: 'Label values', value: QueryType.LabelValues }, ]; export type Props = QueryEditorProps; const refId = 'LokiVariableQueryEditor-VariableQuery'; export const LokiVariableQueryEditor: FC = ({ onChange, query, datasource }) => { const [type, setType] = useState(undefined); const [label, setLabel] = useState(''); const [labelOptions, setLabelOptions] = useState>>([]); const [stream, setStream] = useState(''); useEffect(() => { if (!query) { return; } const variableQuery = typeof query === 'string' ? migrateVariableQuery(query) : query; setType(variableQuery.type); setLabel(variableQuery.label || ''); setStream(variableQuery.stream || ''); if (variableQuery.label) { setLabelOptions([{ label: variableQuery.label, value: variableQuery.label }]); } }, [query]); useEffect(() => { if (type !== QueryType.LabelValues) { return; } datasource.labelNamesQuery().then((labelNames: Array<{ text: string }>) => { setLabelOptions(labelNames.map(({ text }) => ({ label: text, value: text }))); }); }, [datasource, type]); const onQueryTypeChange = (newType: SelectableValue) => { setType(newType.value); if (newType.value !== undefined) { onChange({ type: newType.value, label, stream, refId, }); } }; const onLabelChange = (newLabel: SelectableValue) => { setLabel(newLabel.value || ''); }; const onStreamChange = (e: FormEvent) => { setStream(e.currentTarget.value); }; const handleBlur = () => { if (type !== undefined) { onChange({ type, label, stream, refId: 'LokiVariableQueryEditor-VariableQuery' }); } }; return ( Optional. If defined, a list of values for the label in the specified log stream selector is returned. } > )} ); };