import { useState, useEffect, useCallback } from 'react'; import { ChevronDown, ChevronRight, Loader2, Tags } from 'lucide-react'; import { logCenterApi } from '@/api/log/log-center'; import { extractLokiSelector, mergeLokiSelector } from './query-builder'; import type { TimeRange } from './types-v3'; import i18n from '@/i18n'; interface Props { datasourceId?: number; query: string; timeRange: TimeRange; onQueryChange: (q: string) => void; } // Loki Label 浏览器 — 标签名 → 标签值 → 注入 LogQL 选择器 // Logan.Li export function LokiLabelBrowser({ datasourceId, query, timeRange, onQueryChange }: Props) { const [open, setOpen] = useState(false); const [labels, setLabels] = useState([]); const [activeLabel, setActiveLabel] = useState(''); const [values, setValues] = useState([]); const [loadingLabels, setLoadingLabels] = useState(false); const [loadingValues, setLoadingValues] = useState(false); const [selected, setSelected] = useState>({}); const timeParams = useCallback(() => ({ start: timeRange.start.replace(' ', 'T'), end: timeRange.end.replace(' ', 'T'), }), [timeRange]); useEffect(() => { if (!open || !datasourceId) return; // eslint-disable-next-line react-hooks/set-state-in-effect setLoadingLabels(true); logCenterApi.listLokiLabels(datasourceId, timeParams()) .then((res) => setLabels(Array.isArray(res) ? res : [])) .catch(() => setLabels([])) .finally(() => setLoadingLabels(false)); }, [open, datasourceId, timeParams]); useEffect(() => { if (!activeLabel || !datasourceId) { // eslint-disable-next-line react-hooks/set-state-in-effect setValues([]); return; } setLoadingValues(true); const selector = extractLokiSelector(query); logCenterApi.listLokiLabelValues(datasourceId, activeLabel, { ...timeParams(), ...(selector ? { query: selector } : {}), }) .then((res) => setValues(Array.isArray(res) ? res : [])) .catch(() => setValues([])) .finally(() => setLoadingValues(false)); }, [activeLabel, datasourceId, query, timeParams]); const applySelection = (label: string, value: string) => { const next = { ...selected, [label]: value }; setSelected(next); onQueryChange(mergeLokiSelector(query, next)); }; return (
{open && (
{loadingLabels ? (
) : labels.map((lb) => ( ))}
{!activeLabel &&

{i18n.t('monitor.lokilabelbrowse.s088b9477')}

} {loadingValues &&
} {!loadingValues && activeLabel && values.map((v) => ( ))}
)}
); }