diff --git a/packages/grafana-prometheus/src/components/PromQueryField.tsx b/packages/grafana-prometheus/src/components/PromQueryField.tsx index b92a3c77a98..1e13895b50b 100644 --- a/packages/grafana-prometheus/src/components/PromQueryField.tsx +++ b/packages/grafana-prometheus/src/components/PromQueryField.tsx @@ -12,7 +12,8 @@ import { getInitHints } from '../query_hints'; import { PromOptions, PromQuery } from '../types'; import { CancelablePromise, isCancelablePromiseRejection, makePromiseCancelable } from './cancelable-promise'; -import { PrometheusMetricsBrowser } from './metrics-browser/PrometheusMetricsBrowser'; +import { MetricsBrowser } from './metrics-browser/MetricsBrowser'; +import { MetricsBrowserProvider } from './metrics-browser/MetricsBrowserContext'; import { MonacoQueryFieldWrapper } from './monaco-query-field/MonacoQueryFieldWrapper'; import { useMetricsState } from './useMetricsState'; import { usePromQueryFieldEffects } from './usePromQueryFieldEffects'; @@ -172,11 +173,13 @@ export const PromQueryField = (props: PromQueryFieldProps) => { {labelBrowserVisible && (
- + > + +
)} {ExtraFieldElement} diff --git a/packages/grafana-prometheus/src/components/metrics-browser/LabelSelector.tsx b/packages/grafana-prometheus/src/components/metrics-browser/LabelSelector.tsx index 780150b7cfa..06c511f5f5e 100644 --- a/packages/grafana-prometheus/src/components/metrics-browser/LabelSelector.tsx +++ b/packages/grafana-prometheus/src/components/metrics-browser/LabelSelector.tsx @@ -1,25 +1,23 @@ -import { ChangeEvent, MouseEvent } from 'react'; +import { useMemo, useState } from 'react'; import { selectors } from '@grafana/e2e-selectors'; -import { Input, Label, BrowserLabel as PromLabel } from '@grafana/ui'; +import { BrowserLabel as PromLabel, Input, Label, useStyles2 } from '@grafana/ui'; -import { SelectableLabel } from './types'; +import { useMetricsBrowser } from './MetricsBrowserContext'; +import { getStylesLabelSelector } from './styles'; +import { METRIC_LABEL } from './types'; -interface LabelSelectorProps { - nonMetricLabels: SelectableLabel[]; - labelSearchTerm: string; - onChangeLabelSearch: (event: ChangeEvent) => void; - onClickLabel: (name: string, value: string | undefined, event: MouseEvent) => void; - styles: Record; -} +export function LabelSelector() { + const styles = useStyles2(getStylesLabelSelector); + const [labelSearchTerm, setLabelSearchTerm] = useState(''); + const { labelKeys, selectedLabelKeys, onLabelKeyClick } = useMetricsBrowser(); + + const filteredLabelKeys = useMemo(() => { + return labelKeys.filter( + (lk) => lk !== METRIC_LABEL && (selectedLabelKeys.includes(lk) || lk.includes(labelSearchTerm)) + ); + }, [labelKeys, labelSearchTerm, selectedLabelKeys]); -export function LabelSelector({ - nonMetricLabels, - labelSearchTerm, - onChangeLabelSearch, - onClickLabel, - styles, -}: LabelSelectorProps) { return (
setLabelSearchTerm(e.currentTarget.value)} aria-label="Filter expression for label" value={labelSearchTerm} data-testid={selectors.components.DataSource.Prometheus.queryEditor.code.metricsBrowser.labelNamesFilter} @@ -35,15 +33,19 @@ export function LabelSelector({
{/* Using fixed height here to prevent jumpy layout */}
- {nonMetricLabels.map((label) => ( + {filteredLabelKeys.map((label) => (