diff --git a/public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx b/public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx index 317e255dde0..c8923f3e1f6 100644 --- a/public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx +++ b/public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx @@ -3,8 +3,8 @@ import store from '../../store'; export interface Props { storageKey: string; - defaultValue?: T; - children: (value: T, onSaveToStore: (value: T) => void) => React.ReactNode; + defaultValue: T; + children: (value: T, onSaveToStore: (value: T) => void, onDeleteFromStore: () => void) => React.ReactNode; } interface State { @@ -32,10 +32,20 @@ export class LocalStorageValueProvider extends PureComponent, State< this.setState({ value }); }; + onDeleteFromStore = () => { + const { storageKey, defaultValue } = this.props; + try { + store.delete(storageKey); + } catch (error) { + console.log(error); + } + this.setState({ value: defaultValue }); + }; + render() { const { children } = this.props; const { value } = this.state; - return <>{children(value, this.onSaveToStore)}; + return <>{children(value, this.onSaveToStore, this.onDeleteFromStore)}; } } diff --git a/public/app/plugins/datasource/loki/components/LokiLabelBrowser.test.tsx b/public/app/plugins/datasource/loki/components/LokiLabelBrowser.test.tsx index fe9ce1b4e02..035a391a0d4 100644 --- a/public/app/plugins/datasource/loki/components/LokiLabelBrowser.test.tsx +++ b/public/app/plugins/datasource/loki/components/LokiLabelBrowser.test.tsx @@ -109,6 +109,9 @@ describe('LokiLabelBrowser', () => { onChange: () => {}, autoSelect: 0, languageProvider: (mockLanguageProvider as unknown) as LokiLanguageProvider, + lastUsedLabels: [], + storeLastUsedLabels: () => {}, + deleteLastUsedLabels: () => {}, }; return defaults; diff --git a/public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx b/public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx index 95c949b423a..297a7b6266e 100644 --- a/public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx +++ b/public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx @@ -13,7 +13,6 @@ import { import LokiLanguageProvider from '../language_provider'; import PromQlLanguageProvider from '../../prometheus/language_provider'; import { css, cx } from '@emotion/css'; -import store from 'app/core/store'; import { FixedSizeList } from 'react-window'; import { GrafanaTheme2 } from '@grafana/data'; import { sortBy } from 'lodash'; @@ -24,8 +23,6 @@ const MAX_VALUE_COUNT = 10000; const MAX_AUTO_SELECT = 4; const EMPTY_SELECTOR = '{}'; -export const LAST_USED_LABELS_KEY = 'grafana.datasources.loki.browser.labels'; - export interface BrowserProps { // TODO #33976: Is it possible to use a common interface here? For example: LabelsLanguageProvider languageProvider: LokiLanguageProvider | PromQlLanguageProvider; @@ -33,6 +30,9 @@ export interface BrowserProps { theme: GrafanaTheme2; autoSelect?: number; hide?: () => void; + lastUsedLabels: string[]; + storeLastUsedLabels: (labels: string[]) => void; + deleteLastUsedLabels: () => void; } interface BrowserState { @@ -208,7 +208,7 @@ export class UnthemedLokiLabelBrowser extends React.Component) => { @@ -261,9 +261,9 @@ export class UnthemedLokiLabelBrowser extends React.Component { let rawLabels: string[] = languageProvider.getLabelKeys(); if (rawLabels.length > MAX_LABEL_COUNT) { @@ -295,7 +295,7 @@ export class UnthemedLokiLabelBrowser extends React.Component label.selected).map((label) => label.name); - store.setObject(LAST_USED_LABELS_KEY, selectedLabels); + this.props.storeLastUsedLabels(selectedLabels); if (label.selected) { // Refetch values for newly selected label... if (!label.values) { diff --git a/public/app/plugins/datasource/loki/components/LokiQueryField.tsx b/public/app/plugins/datasource/loki/components/LokiQueryField.tsx index 3682204a99e..ecd4cd6378d 100644 --- a/public/app/plugins/datasource/loki/components/LokiQueryField.tsx +++ b/public/app/plugins/datasource/loki/components/LokiQueryField.tsx @@ -17,6 +17,9 @@ import { LanguageMap, languages as prismLanguages } from 'prismjs'; import LokiLanguageProvider from '../language_provider'; import { shouldRefreshLabels } from '../language_utils'; import LokiDatasource from '../datasource'; +import { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider'; + +const LAST_USED_LABELS_KEY = 'grafana.datasources.loki.browser.labels'; function getChooserText(hasSyntax: boolean, hasLogLabels: boolean) { if (!hasSyntax) { @@ -159,42 +162,54 @@ export class LokiQueryField extends React.PureComponent -
- -
- -
-
- {labelBrowserVisible && ( -
- -
- )} + storageKey={LAST_USED_LABELS_KEY} defaultValue={[]}> + {(lastUsedLabels, onLastUsedLabelsSave, onLastUsedLabelsDelete) => { + return ( + <> +
+ +
+ +
+
+ {labelBrowserVisible && ( +
+ +
+ )} - {ExtraFieldElement} - + {ExtraFieldElement} + + ); + }} + ); } } diff --git a/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx b/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx index 3e0c540d0b5..ef92a7fce6b 100644 --- a/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx +++ b/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx @@ -23,8 +23,10 @@ import { QueryEditorProps, QueryHint, isDataFrame, toLegacyResponseData, TimeRan import { PrometheusDatasource } from '../datasource'; import { PrometheusMetricsBrowser } from './PrometheusMetricsBrowser'; import { MonacoQueryFieldLazy } from './monaco-query-field/MonacoQueryFieldLazy'; +import { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider'; export const RECORDING_RULES_GROUP = '__recording_rules__'; +const LAST_USED_LABELS_KEY = 'grafana.datasources.prometheus.browser.labels'; function getChooserText(metricsLookupDisabled: boolean, hasSyntax: boolean, hasMetrics: boolean) { if (metricsLookupDisabled) { @@ -277,66 +279,78 @@ class PromQueryField extends React.PureComponent -
- + storageKey={LAST_USED_LABELS_KEY} defaultValue={[]}> + {(lastUsedLabels, onLastUsedLabelsSave, onLastUsedLabelsDelete) => { + return ( + <> +
+ -
- {isMonacoEditorEnabled ? ( - - ) : ( - - )} -
-
- {labelBrowserVisible && ( -
- -
- )} +
+ {isMonacoEditorEnabled ? ( + + ) : ( + + )} +
+
+ {labelBrowserVisible && ( +
+ +
+ )} - {ExtraFieldElement} - {hint ? ( -
-
- {hint.label}{' '} - {hint.fix ? ( - - {hint.fix.label} - + {ExtraFieldElement} + {hint ? ( +
+
+ {hint.label}{' '} + {hint.fix ? ( + + {hint.fix.label} + + ) : null} +
+
) : null} -
-
- ) : null} - + + ); + }} + ); } } diff --git a/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.test.tsx b/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.test.tsx index 23ae7888785..367d86d2500 100644 --- a/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.test.tsx +++ b/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.test.tsx @@ -133,6 +133,9 @@ describe('PrometheusMetricsBrowser', () => { onChange: () => {}, autoSelect: 0, languageProvider: (mockLanguageProvider as unknown) as PromQlLanguageProvider, + lastUsedLabels: [], + storeLastUsedLabels: () => {}, + deleteLastUsedLabels: () => {}, }; return defaults; diff --git a/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.tsx b/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.tsx index 4ebf4fc9fc7..c91b0fb3436 100644 --- a/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.tsx +++ b/public/app/plugins/datasource/prometheus/components/PrometheusMetricsBrowser.tsx @@ -12,7 +12,6 @@ import { import PromQlLanguageProvider from '../language_provider'; import { escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector } from '../language_utils'; import { css, cx } from '@emotion/css'; -import store from 'app/core/store'; import { FixedSizeList } from 'react-window'; import { GrafanaTheme } from '@grafana/data'; @@ -24,14 +23,15 @@ const EMPTY_SELECTOR = '{}'; const METRIC_LABEL = '__name__'; const LIST_ITEM_SIZE = 25; -export const LAST_USED_LABELS_KEY = 'grafana.datasources.prometheus.browser.labels'; - export interface BrowserProps { languageProvider: PromQlLanguageProvider; onChange: (selector: string) => void; theme: GrafanaTheme; autoSelect?: number; hide?: () => void; + lastUsedLabels: string[]; + storeLastUsedLabels: (labels: string[]) => void; + deleteLastUsedLabels: () => void; } interface BrowserState { @@ -243,7 +243,7 @@ export class UnthemedPrometheusMetricsBrowser extends React.Component { let rawLabels: string[] = languageProvider.getLabelKeys(); // TODO too-many-metrics @@ -353,7 +353,7 @@ export class UnthemedPrometheusMetricsBrowser extends React.Component label.selected).map((label) => label.name); - store.setObject(LAST_USED_LABELS_KEY, selectedLabels); + this.props.storeLastUsedLabels(selectedLabels); if (label.selected) { // Refetch values for newly selected label... if (!label.values) {