@grafana/scenes 8.1.1 → 8.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# v8.1.2 (Thu Apr 30 2026)
|
|
2
|
+
|
|
3
|
+
#### 🐛 Bug Fix
|
|
4
|
+
|
|
5
|
+
- AdHocFilters: Don't store incomplete filters in recents [#1437](https://github.com/grafana/scenes/pull/1437) ([@kristinademeshchik](https://github.com/kristinademeshchik))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Kristina Demeshchik ([@kristinademeshchik](https://github.com/kristinademeshchik))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
1
13
|
# v8.1.1 (Thu Apr 30 2026)
|
|
2
14
|
|
|
3
15
|
#### 🐛 Bug Fix
|
|
@@ -7,8 +7,8 @@ import { getDataSource } from '../../utils/getDataSource.js';
|
|
|
7
7
|
import { DrilldownRecommendations } from '../components/DrilldownRecommendations.js';
|
|
8
8
|
import { ScopesVariable } from '../variants/ScopesVariable.js';
|
|
9
9
|
import { SCOPES_VARIABLE_NAME } from '../constants.js';
|
|
10
|
-
import { AdHocFiltersVariable, isGroupByFilter } from './AdHocFiltersVariable.js';
|
|
11
10
|
import { getAdHocFilterInteractionHandler } from '../../core/sceneGraph/getReportInteractionHandler.js';
|
|
11
|
+
import { AdHocFiltersVariable, isGroupByFilter, isFilterComplete } from './AdHocFiltersVariable.js';
|
|
12
12
|
import { SceneObjectBase } from '../../core/SceneObjectBase.js';
|
|
13
13
|
import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
|
|
14
14
|
|
|
@@ -210,8 +210,12 @@ class AdHocFiltersRecommendations extends SceneObjectBase {
|
|
|
210
210
|
}
|
|
211
211
|
/**
|
|
212
212
|
* Stores a recent filter in localStorage and updates state.
|
|
213
|
+
* No-op for filters that are not yet complete (key/operator/value all set)
|
|
213
214
|
*/
|
|
214
215
|
storeRecentFilter(filter) {
|
|
216
|
+
if (!isFilterComplete(filter)) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
215
219
|
const key = this._getFiltersStorageKey();
|
|
216
220
|
const storedFilters = store.get(key);
|
|
217
221
|
const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];
|
|
@@ -225,10 +229,10 @@ class AdHocFiltersRecommendations extends SceneObjectBase {
|
|
|
225
229
|
}
|
|
226
230
|
/**
|
|
227
231
|
* Stores a recent grouping key in localStorage and updates state.
|
|
228
|
-
* No-op when enableGroupBy is false.
|
|
232
|
+
* No-op when enableGroupBy is false or when the key is empty.
|
|
229
233
|
*/
|
|
230
234
|
storeRecentGrouping(groupByKey) {
|
|
231
|
-
if (!this._isGroupByEnabled) {
|
|
235
|
+
if (!this._isGroupByEnabled || !groupByKey) {
|
|
232
236
|
return;
|
|
233
237
|
}
|
|
234
238
|
const storageKey = this._getGroupingStorageKey();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersRecommendations.js","sources":["../../../../src/variables/adhoc/AdHocFiltersRecommendations.tsx"],"sourcesContent":["import React from 'react';\nimport {\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n SelectableValue,\n store,\n} from '@grafana/data';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest';\nimport { getQueriesForVariables } from '../utils';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { DrilldownRecommendations, DrilldownPill } from '../components/DrilldownRecommendations';\nimport { ScopesVariable } from '../variants/ScopesVariable';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isGroupByFilter } from './AdHocFiltersVariable';\nimport { getAdHocFilterInteractionHandler } from '../../core/sceneGraph/getReportInteractionHandler';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState } from '../../core/types';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { VariableValueSingle } from '../types';\nimport { Unsubscribable } from 'rxjs';\n\nexport const MAX_RECENT_DRILLDOWNS = 3;\nexport const MAX_STORED_RECENT_DRILLDOWNS = 10;\n\nexport const getRecentFiltersKey = (datasourceUid: string | undefined) =>\n `grafana.filters.recent.${datasourceUid ?? 'default'}`;\n\nexport const getRecentGroupingKey = (datasourceUid: string | undefined) =>\n `grafana.grouping.recent.${datasourceUid ?? 'default'}`;\n\nexport interface AdHocFiltersRecommendationsState extends SceneObjectState {\n recentFilters?: AdHocFilterWithLabels[];\n recommendedFilters?: AdHocFilterWithLabels[];\n recentGrouping?: Array<SelectableValue<VariableValueSingle>>;\n recommendedGrouping?: Array<SelectableValue<VariableValueSingle>>;\n datasourceSupportsRecommendations?: boolean;\n}\n\n/**\n * Keeps only the last occurrence of each unique (key, operator, value) triple,\n * preserving the most-recent-wins ordering.\n */\nfunction getFilterIdentity(filter: AdHocFilterWithLabels): string {\n return `${filter.key}|${filter.operator}|${filter.value}`;\n}\n\nfunction deduplicateFilters(filters: AdHocFilterWithLabels[]): AdHocFilterWithLabels[] {\n const filterMap = new Map<string, AdHocFilterWithLabels>();\n\n for (const filter of filters) {\n const identity = getFilterIdentity(filter);\n if (filterMap.has(identity)) {\n filterMap.delete(identity);\n }\n filterMap.set(identity, filter);\n }\n\n return Array.from(filterMap.values());\n}\n\nfunction deduplicateGroupings(\n groupings: Array<SelectableValue<VariableValueSingle>>\n): Array<SelectableValue<VariableValueSingle>> {\n const seen = new Map<string, SelectableValue<VariableValueSingle>>();\n\n for (const g of groupings) {\n const key = String(g.value);\n if (seen.has(key)) {\n seen.delete(key);\n }\n seen.set(key, g);\n }\n\n return Array.from(seen.values());\n}\n\nexport class AdHocFiltersRecommendations extends SceneObjectBase<AdHocFiltersRecommendationsState> {\n static Component = AdHocFiltersRecommendationsRenderer;\n\n public constructor(state: Partial<AdHocFiltersRecommendationsState> = {}) {\n super(state);\n\n this.addActivationHandler(this._activationHandler);\n }\n\n public get _adHocFilter(): AdHocFiltersVariable {\n if (!(this.parent instanceof AdHocFiltersVariable)) {\n throw new Error('AdHocFiltersRecommendations must be a child of AdHocFiltersVariable');\n }\n\n return this.parent;\n }\n\n private get _scopedVars() {\n return { __sceneObject: wrapInSafeSerializableSceneObject(this._adHocFilter) };\n }\n\n private get _isGroupByEnabled(): boolean {\n return this._adHocFilter.state.enableGroupBy === true;\n }\n\n private _activationHandler = () => {\n const filterJson = store.get(this._getFiltersStorageKey());\n const storedFilters = filterJson ? JSON.parse(filterJson) : [];\n\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n } else {\n this.setState({ recentFilters: [] });\n }\n\n if (this._isGroupByEnabled) {\n const groupingJson = store.get(this._getGroupingStorageKey());\n const storedGroupings = groupingJson ? JSON.parse(groupingJson) : [];\n\n if (storedGroupings.length > 0) {\n this._verifyRecentGroupingsApplicability(storedGroupings);\n } else {\n this.setState({ recentGrouping: [] });\n }\n }\n\n this._fetchRecommendedDrilldowns();\n\n const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this._adHocFilter);\n let scopesSubscription: Unsubscribable | undefined;\n let adHocSubscription: Unsubscribable | undefined;\n\n if (scopesVariable instanceof ScopesVariable) {\n this._subs.add(\n (scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {\n if (newState.scopes !== prevState.scopes) {\n this._reloadStoredFilters();\n if (this._isGroupByEnabled) {\n this._reloadStoredGroupings();\n }\n this._fetchRecommendedDrilldowns();\n }\n }))\n );\n }\n\n this._subs.add(\n (adHocSubscription = this._adHocFilter.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._reloadStoredFilters();\n if (this._isGroupByEnabled) {\n this._reloadStoredGroupings();\n }\n this._fetchRecommendedDrilldowns();\n }\n }))\n );\n\n return () => {\n scopesSubscription?.unsubscribe();\n adHocSubscription?.unsubscribe();\n };\n };\n\n private _reloadStoredFilters() {\n const json = store.get(this._getFiltersStorageKey());\n const storedFilters = json ? JSON.parse(json) : [];\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n }\n }\n\n private _reloadStoredGroupings() {\n const json = store.get(this._getGroupingStorageKey());\n const storedGroupings = json ? JSON.parse(json) : [];\n if (storedGroupings.length > 0) {\n this._verifyRecentGroupingsApplicability(storedGroupings);\n }\n }\n\n private _getFiltersStorageKey(): string {\n return getRecentFiltersKey(this._adHocFilter.state.datasource?.uid);\n }\n\n private _getGroupingStorageKey(): string {\n return getRecentGroupingKey(this._adHocFilter.state.datasource?.uid);\n }\n\n private async _fetchRecommendedDrilldowns() {\n const adhoc = this._adHocFilter;\n const ds = await getDataSource(adhoc.state.datasource, this._scopedVars);\n\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getRecommendedDrilldowns) {\n this.setState({ datasourceSupportsRecommendations: false });\n return;\n }\n\n this.setState({ datasourceSupportsRecommendations: true });\n\n const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : undefined;\n const timeRange = sceneGraph.getTimeRange(adhoc).state.value;\n const scopes = sceneGraph.getScopes(adhoc);\n\n const allFilters = [...(adhoc.state.originFilters ?? []), ...adhoc.state.filters];\n const filters = allFilters.filter((f) => !isGroupByFilter(f));\n const groupByKeys = this._isGroupByEnabled\n ? allFilters.filter((f) => isGroupByFilter(f)).map((f) => f.key)\n : undefined;\n\n const enrichedRequest = getEnrichedDataRequest(adhoc);\n const dashboardUid = enrichedRequest?.dashboardUID;\n\n try {\n // @ts-expect-error (temporary till we update grafana/data)\n const recommendedDrilldowns = await ds.getRecommendedDrilldowns({\n timeRange,\n dashboardUid,\n queries: queries ?? [],\n filters,\n ...(groupByKeys ? { groupByKeys } : {}),\n scopes,\n });\n\n const stateUpdate: Partial<AdHocFiltersRecommendationsState> = {};\n\n if (recommendedDrilldowns?.filters) {\n stateUpdate.recommendedFilters = recommendedDrilldowns.filters;\n }\n\n if (this._isGroupByEnabled && recommendedDrilldowns?.groupByKeys) {\n stateUpdate.recommendedGrouping = recommendedDrilldowns.groupByKeys.map((key: string) => ({\n value: key,\n text: key,\n }));\n }\n\n this.setState(stateUpdate);\n } catch (error) {\n console.error('Failed to fetch recommended drilldowns:', error);\n }\n }\n\n private async _verifyRecentFiltersApplicability(storedFilters: AdHocFilterWithLabels[]) {\n const adhoc = this._adHocFilter;\n const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : undefined;\n const response = await adhoc.getFiltersApplicabilityForQueries(storedFilters, queries ?? []);\n\n if (!response) {\n const deduped = deduplicateFilters(storedFilters);\n this.setState({ recentFilters: deduped.slice(-MAX_RECENT_DRILLDOWNS) });\n return;\n }\n\n const applicabilityMap = new Map<string, boolean>();\n response.forEach((item: DrilldownsApplicability) => {\n applicabilityMap.set(item.key, item.applicable !== false);\n });\n\n const applicableFilters = storedFilters.filter((f) => {\n const isApplicable = applicabilityMap.get(f.key);\n return isApplicable === undefined || isApplicable === true;\n });\n\n const recentFilters = deduplicateFilters(applicableFilters).slice(-MAX_RECENT_DRILLDOWNS);\n\n this.setState({ recentFilters });\n }\n\n private async _verifyRecentGroupingsApplicability(storedGroupings: Array<SelectableValue<VariableValueSingle>>) {\n const adhoc = this._adHocFilter;\n const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : undefined;\n const groupByKeys = storedGroupings.map((g) => String(g.value));\n\n const response = await adhoc.getFiltersApplicabilityForQueries([], queries ?? [], groupByKeys);\n\n if (!response) {\n this.setState({ recentGrouping: deduplicateGroupings(storedGroupings).slice(-MAX_RECENT_DRILLDOWNS) });\n return;\n }\n\n const applicabilityMap = new Map<string, boolean>();\n response.forEach((item: DrilldownsApplicability) => {\n applicabilityMap.set(item.key, item.applicable !== false);\n });\n\n const applicableGroupings = deduplicateGroupings(storedGroupings)\n .filter((g) => {\n const isApplicable = applicabilityMap.get(String(g.value));\n return isApplicable === undefined || isApplicable === true;\n })\n .slice(-MAX_RECENT_DRILLDOWNS);\n\n this.setState({ recentGrouping: applicableGroupings });\n }\n\n /**\n * Stores a recent filter in localStorage and updates state.\n */\n public storeRecentFilter(filter: AdHocFilterWithLabels) {\n const key = this._getFiltersStorageKey();\n const storedFilters = store.get(key);\n const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];\n\n const updatedStoredFilters = deduplicateFilters([...allRecentFilters, filter]).slice(-MAX_STORED_RECENT_DRILLDOWNS);\n store.set(key, JSON.stringify(updatedStoredFilters));\n\n const adhoc = this._adHocFilter;\n const existingFilter = adhoc.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));\n if (existingFilter && !Boolean(existingFilter.nonApplicable)) {\n this.setState({ recentFilters: updatedStoredFilters.slice(-MAX_RECENT_DRILLDOWNS) });\n }\n }\n\n /**\n * Stores a recent grouping key in localStorage and updates state.\n * No-op when enableGroupBy is false.\n */\n public storeRecentGrouping(groupByKey: string) {\n if (!this._isGroupByEnabled) {\n return;\n }\n\n const storageKey = this._getGroupingStorageKey();\n const storedGroupings = store.get(storageKey);\n const allRecentGroupings: Array<SelectableValue<VariableValueSingle>> = storedGroupings\n ? JSON.parse(storedGroupings)\n : [];\n\n const withoutDuplicate = allRecentGroupings.filter((g) => String(g.value) !== groupByKey);\n const updated = [...withoutDuplicate, { value: groupByKey, text: groupByKey }];\n const limited = updated.slice(-MAX_STORED_RECENT_DRILLDOWNS);\n\n store.set(storageKey, JSON.stringify(limited));\n\n this.setState({ recentGrouping: limited.slice(-MAX_RECENT_DRILLDOWNS) });\n }\n\n public addFilterToParent(filter: AdHocFilterWithLabels) {\n this._adHocFilter.updateFilters([...this._adHocFilter.state.filters, filter]);\n }\n\n public addGroupByToParent(key: string) {\n if (!this._isGroupByEnabled) {\n return;\n }\n\n const adhoc = this._adHocFilter;\n const exists = adhoc.state.filters.some((f) => isGroupByFilter(f) && f.key === key);\n if (exists) {\n return;\n }\n\n adhoc._addGroupByFilter({ value: key, label: key });\n }\n}\n\nfunction AdHocFiltersRecommendationsRenderer({ model }: SceneComponentProps<AdHocFiltersRecommendations>) {\n const { recentFilters, recommendedFilters, datasourceSupportsRecommendations } = model.useState();\n const { filters } = model._adHocFilter.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = recentFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);\n if (!exists) {\n model.addFilterToParent(filter);\n getAdHocFilterInteractionHandler(model)?.onRecentFilterApplied?.({\n key: filter.key,\n operator: filter.operator,\n });\n }\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);\n if (!exists) {\n model.addFilterToParent(filter);\n getAdHocFilterInteractionHandler(model)?.onRecommendedFilterApplied?.({\n key: filter.key,\n operator: filter.operator,\n });\n }\n },\n }));\n\n return (\n <DrilldownRecommendations\n recentDrilldowns={recentDrilldowns}\n recommendedDrilldowns={recommendedDrilldowns}\n showRecommended={datasourceSupportsRecommendations}\n />\n );\n}\n\nexport function AdHocGroupByRecommendationsRenderer({ model }: SceneComponentProps<AdHocFiltersRecommendations>) {\n const { recentGrouping, recommendedGrouping, datasourceSupportsRecommendations } = model.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = recentGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n model.addGroupByToParent(String(groupBy.value));\n getAdHocFilterInteractionHandler(model)?.onRecentGroupByApplied?.({ key: String(groupBy.value) });\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n model.addGroupByToParent(String(groupBy.value));\n getAdHocFilterInteractionHandler(model)?.onRecommendedGroupByApplied?.({ key: String(groupBy.value) });\n },\n }));\n\n return (\n <DrilldownRecommendations\n recentDrilldowns={recentDrilldowns}\n recommendedDrilldowns={recommendedDrilldowns}\n showRecommended={datasourceSupportsRecommendations}\n />\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdHocFiltersRecommendations.js","sources":["../../../../src/variables/adhoc/AdHocFiltersRecommendations.tsx"],"sourcesContent":["import React from 'react';\nimport {\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n SelectableValue,\n store,\n} from '@grafana/data';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { getEnrichedDataRequest } from '../../querying/getEnrichedDataRequest';\nimport { getQueriesForVariables } from '../utils';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { DrilldownRecommendations, DrilldownPill } from '../components/DrilldownRecommendations';\nimport { ScopesVariable } from '../variants/ScopesVariable';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport { getAdHocFilterInteractionHandler } from '../../core/sceneGraph/getReportInteractionHandler';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isFilterComplete, isGroupByFilter } from './AdHocFiltersVariable';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState } from '../../core/types';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { VariableValueSingle } from '../types';\nimport { Unsubscribable } from 'rxjs';\n\nexport const MAX_RECENT_DRILLDOWNS = 3;\nexport const MAX_STORED_RECENT_DRILLDOWNS = 10;\n\nexport const getRecentFiltersKey = (datasourceUid: string | undefined) =>\n `grafana.filters.recent.${datasourceUid ?? 'default'}`;\n\nexport const getRecentGroupingKey = (datasourceUid: string | undefined) =>\n `grafana.grouping.recent.${datasourceUid ?? 'default'}`;\n\nexport interface AdHocFiltersRecommendationsState extends SceneObjectState {\n recentFilters?: AdHocFilterWithLabels[];\n recommendedFilters?: AdHocFilterWithLabels[];\n recentGrouping?: Array<SelectableValue<VariableValueSingle>>;\n recommendedGrouping?: Array<SelectableValue<VariableValueSingle>>;\n datasourceSupportsRecommendations?: boolean;\n}\n\n/**\n * Keeps only the last occurrence of each unique (key, operator, value) triple,\n * preserving the most-recent-wins ordering.\n */\nfunction getFilterIdentity(filter: AdHocFilterWithLabels): string {\n return `${filter.key}|${filter.operator}|${filter.value}`;\n}\n\nfunction deduplicateFilters(filters: AdHocFilterWithLabels[]): AdHocFilterWithLabels[] {\n const filterMap = new Map<string, AdHocFilterWithLabels>();\n\n for (const filter of filters) {\n const identity = getFilterIdentity(filter);\n if (filterMap.has(identity)) {\n filterMap.delete(identity);\n }\n filterMap.set(identity, filter);\n }\n\n return Array.from(filterMap.values());\n}\n\nfunction deduplicateGroupings(\n groupings: Array<SelectableValue<VariableValueSingle>>\n): Array<SelectableValue<VariableValueSingle>> {\n const seen = new Map<string, SelectableValue<VariableValueSingle>>();\n\n for (const g of groupings) {\n const key = String(g.value);\n if (seen.has(key)) {\n seen.delete(key);\n }\n seen.set(key, g);\n }\n\n return Array.from(seen.values());\n}\n\nexport class AdHocFiltersRecommendations extends SceneObjectBase<AdHocFiltersRecommendationsState> {\n static Component = AdHocFiltersRecommendationsRenderer;\n\n public constructor(state: Partial<AdHocFiltersRecommendationsState> = {}) {\n super(state);\n\n this.addActivationHandler(this._activationHandler);\n }\n\n public get _adHocFilter(): AdHocFiltersVariable {\n if (!(this.parent instanceof AdHocFiltersVariable)) {\n throw new Error('AdHocFiltersRecommendations must be a child of AdHocFiltersVariable');\n }\n\n return this.parent;\n }\n\n private get _scopedVars() {\n return { __sceneObject: wrapInSafeSerializableSceneObject(this._adHocFilter) };\n }\n\n private get _isGroupByEnabled(): boolean {\n return this._adHocFilter.state.enableGroupBy === true;\n }\n\n private _activationHandler = () => {\n const filterJson = store.get(this._getFiltersStorageKey());\n const storedFilters = filterJson ? JSON.parse(filterJson) : [];\n\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n } else {\n this.setState({ recentFilters: [] });\n }\n\n if (this._isGroupByEnabled) {\n const groupingJson = store.get(this._getGroupingStorageKey());\n const storedGroupings = groupingJson ? JSON.parse(groupingJson) : [];\n\n if (storedGroupings.length > 0) {\n this._verifyRecentGroupingsApplicability(storedGroupings);\n } else {\n this.setState({ recentGrouping: [] });\n }\n }\n\n this._fetchRecommendedDrilldowns();\n\n const scopesVariable = sceneGraph.lookupVariable(SCOPES_VARIABLE_NAME, this._adHocFilter);\n let scopesSubscription: Unsubscribable | undefined;\n let adHocSubscription: Unsubscribable | undefined;\n\n if (scopesVariable instanceof ScopesVariable) {\n this._subs.add(\n (scopesSubscription = scopesVariable.subscribeToState((newState, prevState) => {\n if (newState.scopes !== prevState.scopes) {\n this._reloadStoredFilters();\n if (this._isGroupByEnabled) {\n this._reloadStoredGroupings();\n }\n this._fetchRecommendedDrilldowns();\n }\n }))\n );\n }\n\n this._subs.add(\n (adHocSubscription = this._adHocFilter.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._reloadStoredFilters();\n if (this._isGroupByEnabled) {\n this._reloadStoredGroupings();\n }\n this._fetchRecommendedDrilldowns();\n }\n }))\n );\n\n return () => {\n scopesSubscription?.unsubscribe();\n adHocSubscription?.unsubscribe();\n };\n };\n\n private _reloadStoredFilters() {\n const json = store.get(this._getFiltersStorageKey());\n const storedFilters = json ? JSON.parse(json) : [];\n if (storedFilters.length > 0) {\n this._verifyRecentFiltersApplicability(storedFilters);\n }\n }\n\n private _reloadStoredGroupings() {\n const json = store.get(this._getGroupingStorageKey());\n const storedGroupings = json ? JSON.parse(json) : [];\n if (storedGroupings.length > 0) {\n this._verifyRecentGroupingsApplicability(storedGroupings);\n }\n }\n\n private _getFiltersStorageKey(): string {\n return getRecentFiltersKey(this._adHocFilter.state.datasource?.uid);\n }\n\n private _getGroupingStorageKey(): string {\n return getRecentGroupingKey(this._adHocFilter.state.datasource?.uid);\n }\n\n private async _fetchRecommendedDrilldowns() {\n const adhoc = this._adHocFilter;\n const ds = await getDataSource(adhoc.state.datasource, this._scopedVars);\n\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getRecommendedDrilldowns) {\n this.setState({ datasourceSupportsRecommendations: false });\n return;\n }\n\n this.setState({ datasourceSupportsRecommendations: true });\n\n const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : undefined;\n const timeRange = sceneGraph.getTimeRange(adhoc).state.value;\n const scopes = sceneGraph.getScopes(adhoc);\n\n const allFilters = [...(adhoc.state.originFilters ?? []), ...adhoc.state.filters];\n const filters = allFilters.filter((f) => !isGroupByFilter(f));\n const groupByKeys = this._isGroupByEnabled\n ? allFilters.filter((f) => isGroupByFilter(f)).map((f) => f.key)\n : undefined;\n\n const enrichedRequest = getEnrichedDataRequest(adhoc);\n const dashboardUid = enrichedRequest?.dashboardUID;\n\n try {\n // @ts-expect-error (temporary till we update grafana/data)\n const recommendedDrilldowns = await ds.getRecommendedDrilldowns({\n timeRange,\n dashboardUid,\n queries: queries ?? [],\n filters,\n ...(groupByKeys ? { groupByKeys } : {}),\n scopes,\n });\n\n const stateUpdate: Partial<AdHocFiltersRecommendationsState> = {};\n\n if (recommendedDrilldowns?.filters) {\n stateUpdate.recommendedFilters = recommendedDrilldowns.filters;\n }\n\n if (this._isGroupByEnabled && recommendedDrilldowns?.groupByKeys) {\n stateUpdate.recommendedGrouping = recommendedDrilldowns.groupByKeys.map((key: string) => ({\n value: key,\n text: key,\n }));\n }\n\n this.setState(stateUpdate);\n } catch (error) {\n console.error('Failed to fetch recommended drilldowns:', error);\n }\n }\n\n private async _verifyRecentFiltersApplicability(storedFilters: AdHocFilterWithLabels[]) {\n const adhoc = this._adHocFilter;\n const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : undefined;\n const response = await adhoc.getFiltersApplicabilityForQueries(storedFilters, queries ?? []);\n\n if (!response) {\n const deduped = deduplicateFilters(storedFilters);\n this.setState({ recentFilters: deduped.slice(-MAX_RECENT_DRILLDOWNS) });\n return;\n }\n\n const applicabilityMap = new Map<string, boolean>();\n response.forEach((item: DrilldownsApplicability) => {\n applicabilityMap.set(item.key, item.applicable !== false);\n });\n\n const applicableFilters = storedFilters.filter((f) => {\n const isApplicable = applicabilityMap.get(f.key);\n return isApplicable === undefined || isApplicable === true;\n });\n\n const recentFilters = deduplicateFilters(applicableFilters).slice(-MAX_RECENT_DRILLDOWNS);\n\n this.setState({ recentFilters });\n }\n\n private async _verifyRecentGroupingsApplicability(storedGroupings: Array<SelectableValue<VariableValueSingle>>) {\n const adhoc = this._adHocFilter;\n const queries = adhoc.state.useQueriesAsFilterForOptions ? getQueriesForVariables(adhoc) : undefined;\n const groupByKeys = storedGroupings.map((g) => String(g.value));\n\n const response = await adhoc.getFiltersApplicabilityForQueries([], queries ?? [], groupByKeys);\n\n if (!response) {\n this.setState({ recentGrouping: deduplicateGroupings(storedGroupings).slice(-MAX_RECENT_DRILLDOWNS) });\n return;\n }\n\n const applicabilityMap = new Map<string, boolean>();\n response.forEach((item: DrilldownsApplicability) => {\n applicabilityMap.set(item.key, item.applicable !== false);\n });\n\n const applicableGroupings = deduplicateGroupings(storedGroupings)\n .filter((g) => {\n const isApplicable = applicabilityMap.get(String(g.value));\n return isApplicable === undefined || isApplicable === true;\n })\n .slice(-MAX_RECENT_DRILLDOWNS);\n\n this.setState({ recentGrouping: applicableGroupings });\n }\n\n /**\n * Stores a recent filter in localStorage and updates state.\n * No-op for filters that are not yet complete (key/operator/value all set)\n */\n public storeRecentFilter(filter: AdHocFilterWithLabels) {\n if (!isFilterComplete(filter)) {\n return;\n }\n\n const key = this._getFiltersStorageKey();\n const storedFilters = store.get(key);\n const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];\n\n const updatedStoredFilters = deduplicateFilters([...allRecentFilters, filter]).slice(-MAX_STORED_RECENT_DRILLDOWNS);\n store.set(key, JSON.stringify(updatedStoredFilters));\n\n const adhoc = this._adHocFilter;\n const existingFilter = adhoc.state.filters.find((f) => f.key === filter.key && !Boolean(f.nonApplicable));\n if (existingFilter && !Boolean(existingFilter.nonApplicable)) {\n this.setState({ recentFilters: updatedStoredFilters.slice(-MAX_RECENT_DRILLDOWNS) });\n }\n }\n\n /**\n * Stores a recent grouping key in localStorage and updates state.\n * No-op when enableGroupBy is false or when the key is empty.\n */\n public storeRecentGrouping(groupByKey: string) {\n if (!this._isGroupByEnabled || !groupByKey) {\n return;\n }\n\n const storageKey = this._getGroupingStorageKey();\n const storedGroupings = store.get(storageKey);\n const allRecentGroupings: Array<SelectableValue<VariableValueSingle>> = storedGroupings\n ? JSON.parse(storedGroupings)\n : [];\n\n const withoutDuplicate = allRecentGroupings.filter((g) => String(g.value) !== groupByKey);\n const updated = [...withoutDuplicate, { value: groupByKey, text: groupByKey }];\n const limited = updated.slice(-MAX_STORED_RECENT_DRILLDOWNS);\n\n store.set(storageKey, JSON.stringify(limited));\n\n this.setState({ recentGrouping: limited.slice(-MAX_RECENT_DRILLDOWNS) });\n }\n\n public addFilterToParent(filter: AdHocFilterWithLabels) {\n this._adHocFilter.updateFilters([...this._adHocFilter.state.filters, filter]);\n }\n\n public addGroupByToParent(key: string) {\n if (!this._isGroupByEnabled) {\n return;\n }\n\n const adhoc = this._adHocFilter;\n const exists = adhoc.state.filters.some((f) => isGroupByFilter(f) && f.key === key);\n if (exists) {\n return;\n }\n\n adhoc._addGroupByFilter({ value: key, label: key });\n }\n}\n\nfunction AdHocFiltersRecommendationsRenderer({ model }: SceneComponentProps<AdHocFiltersRecommendations>) {\n const { recentFilters, recommendedFilters, datasourceSupportsRecommendations } = model.useState();\n const { filters } = model._adHocFilter.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = recentFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);\n if (!exists) {\n model.addFilterToParent(filter);\n getAdHocFilterInteractionHandler(model)?.onRecentFilterApplied?.({\n key: filter.key,\n operator: filter.operator,\n });\n }\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedFilters?.map((filter) => ({\n label: `${filter.key} ${filter.operator} ${filter.value}`,\n onClick: () => {\n const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);\n if (!exists) {\n model.addFilterToParent(filter);\n getAdHocFilterInteractionHandler(model)?.onRecommendedFilterApplied?.({\n key: filter.key,\n operator: filter.operator,\n });\n }\n },\n }));\n\n return (\n <DrilldownRecommendations\n recentDrilldowns={recentDrilldowns}\n recommendedDrilldowns={recommendedDrilldowns}\n showRecommended={datasourceSupportsRecommendations}\n />\n );\n}\n\nexport function AdHocGroupByRecommendationsRenderer({ model }: SceneComponentProps<AdHocFiltersRecommendations>) {\n const { recentGrouping, recommendedGrouping, datasourceSupportsRecommendations } = model.useState();\n\n const recentDrilldowns: DrilldownPill[] | undefined = recentGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n model.addGroupByToParent(String(groupBy.value));\n getAdHocFilterInteractionHandler(model)?.onRecentGroupByApplied?.({ key: String(groupBy.value) });\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n model.addGroupByToParent(String(groupBy.value));\n getAdHocFilterInteractionHandler(model)?.onRecommendedGroupByApplied?.({ key: String(groupBy.value) });\n },\n }));\n\n return (\n <DrilldownRecommendations\n recentDrilldowns={recentDrilldowns}\n recommendedDrilldowns={recommendedDrilldowns}\n showRecommended={datasourceSupportsRecommendations}\n />\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1051,11 +1051,12 @@ declare class AdHocFiltersRecommendations extends SceneObjectBase<AdHocFiltersRe
|
|
|
1051
1051
|
private _verifyRecentGroupingsApplicability;
|
|
1052
1052
|
/**
|
|
1053
1053
|
* Stores a recent filter in localStorage and updates state.
|
|
1054
|
+
* No-op for filters that are not yet complete (key/operator/value all set)
|
|
1054
1055
|
*/
|
|
1055
1056
|
storeRecentFilter(filter: AdHocFilterWithLabels): void;
|
|
1056
1057
|
/**
|
|
1057
1058
|
* Stores a recent grouping key in localStorage and updates state.
|
|
1058
|
-
* No-op when enableGroupBy is false.
|
|
1059
|
+
* No-op when enableGroupBy is false or when the key is empty.
|
|
1059
1060
|
*/
|
|
1060
1061
|
storeRecentGrouping(groupByKey: string): void;
|
|
1061
1062
|
addFilterToParent(filter: AdHocFilterWithLabels): void;
|
package/dist/index.js
CHANGED
|
@@ -8430,8 +8430,12 @@ class AdHocFiltersRecommendations extends SceneObjectBase {
|
|
|
8430
8430
|
}
|
|
8431
8431
|
/**
|
|
8432
8432
|
* Stores a recent filter in localStorage and updates state.
|
|
8433
|
+
* No-op for filters that are not yet complete (key/operator/value all set)
|
|
8433
8434
|
*/
|
|
8434
8435
|
storeRecentFilter(filter) {
|
|
8436
|
+
if (!isFilterComplete(filter)) {
|
|
8437
|
+
return;
|
|
8438
|
+
}
|
|
8435
8439
|
const key = this._getFiltersStorageKey();
|
|
8436
8440
|
const storedFilters = data.store.get(key);
|
|
8437
8441
|
const allRecentFilters = storedFilters ? JSON.parse(storedFilters) : [];
|
|
@@ -8445,10 +8449,10 @@ class AdHocFiltersRecommendations extends SceneObjectBase {
|
|
|
8445
8449
|
}
|
|
8446
8450
|
/**
|
|
8447
8451
|
* Stores a recent grouping key in localStorage and updates state.
|
|
8448
|
-
* No-op when enableGroupBy is false.
|
|
8452
|
+
* No-op when enableGroupBy is false or when the key is empty.
|
|
8449
8453
|
*/
|
|
8450
8454
|
storeRecentGrouping(groupByKey) {
|
|
8451
|
-
if (!this._isGroupByEnabled) {
|
|
8455
|
+
if (!this._isGroupByEnabled || !groupByKey) {
|
|
8452
8456
|
return;
|
|
8453
8457
|
}
|
|
8454
8458
|
const storageKey = this._getGroupingStorageKey();
|