From 3b523c13a7cd0110823e970d6dca97072b0553aa Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Wed, 8 Mar 2023 01:02:26 +0200 Subject: [PATCH] [v9.4.x] OpenTSDB: Allow metric autocomplete to use suggest api on every input (#64361) OpenTSDB: Allow metric autocomplete to use suggest api on every input (#62045) * allow metric autocomplete by suggest api * debounce sugggest metrics * debounce sugggest metrics with debounce-promise * commit for tests (cherry picked from commit 70c18508887f50185fbdbb5032aaede070a355c1) Co-authored-by: Brendan O'Handley --- .../opentsdb/components/MetricSection.tsx | 37 +++++-------------- .../components/OpenTsdbQueryEditor.tsx | 6 +-- 2 files changed, 11 insertions(+), 32 deletions(-) diff --git a/public/app/plugins/datasource/opentsdb/components/MetricSection.tsx b/public/app/plugins/datasource/opentsdb/components/MetricSection.tsx index e90b7c8e96d..edb3adad010 100644 --- a/public/app/plugins/datasource/opentsdb/components/MetricSection.tsx +++ b/public/app/plugins/datasource/opentsdb/components/MetricSection.tsx @@ -1,7 +1,8 @@ -import React, { useCallback, useState } from 'react'; +import debounce from 'debounce-promise'; +import React from 'react'; import { SelectableValue, toOption } from '@grafana/data'; -import { Select, Input, InlineFormLabel } from '@grafana/ui'; +import { Select, Input, InlineFormLabel, AsyncSelect } from '@grafana/ui'; import { OpenTsdbQuery } from '../types'; @@ -9,26 +10,13 @@ export interface MetricSectionProps { query: OpenTsdbQuery; onChange: (query: OpenTsdbQuery) => void; onRunQuery: () => void; - suggestMetrics: () => Promise; + suggestMetrics: (value: string) => Promise; aggregators: string[]; } export function MetricSection({ query, onChange, onRunQuery, suggestMetrics, aggregators }: MetricSectionProps) { - const [state, setState] = useState<{ - metrics?: Array>; - isLoading?: boolean; - }>({}); - - // We are matching words split with space - const splitSeparator = ' '; - const customFilterOption = useCallback((option: SelectableValue, searchQuery: string) => { - const label = option.value ?? ''; - - const searchWords = searchQuery.split(splitSeparator); - return searchWords.reduce((acc, cur) => acc && label.toLowerCase().includes(cur.toLowerCase()), true); - }, []); - const aggregatorOptions = aggregators.map((value: string) => toOption(value)); + const metricSearch = debounce((query: string) => suggestMetrics(query), 350); return (
@@ -36,23 +24,16 @@ export function MetricSection({ query, onChange, onRunQuery, suggestMetrics, agg Metric -