@grafana/scenes 7.3.11 → 7.3.12

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
+ # v7.3.12 (Thu Apr 09 2026)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - Filters: Add interaction reporting [#1422](https://github.com/grafana/scenes/pull/1422) ([@mdvictor](https://github.com/mdvictor))
6
+
7
+ #### Authors: 1
8
+
9
+ - Victor Marin ([@mdvictor](https://github.com/mdvictor))
10
+
11
+ ---
12
+
1
13
  # v7.3.11 (Wed Apr 08 2026)
2
14
 
3
15
  #### 🐛 Bug Fix
@@ -7,6 +7,7 @@ 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 { reportInteraction } from '@grafana/runtime';
10
11
  import { AdHocFiltersVariable, isGroupByFilter } from './AdHocFiltersVariable.js';
11
12
  import { SceneObjectBase } from '../../core/SceneObjectBase.js';
12
13
  import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
@@ -264,6 +265,10 @@ function AdHocFiltersRecommendationsRenderer({ model }) {
264
265
  const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
265
266
  if (!exists) {
266
267
  model.addFilterToParent(filter);
268
+ reportInteraction("grafana_unified_drilldown_recent_filter_applied", {
269
+ key: filter.key,
270
+ operator: filter.operator
271
+ });
267
272
  }
268
273
  }
269
274
  }));
@@ -273,6 +278,10 @@ function AdHocFiltersRecommendationsRenderer({ model }) {
273
278
  const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
274
279
  if (!exists) {
275
280
  model.addFilterToParent(filter);
281
+ reportInteraction("grafana_unified_drilldown_recommended_filter_applied", {
282
+ key: filter.key,
283
+ operator: filter.operator
284
+ });
276
285
  }
277
286
  }
278
287
  }));
@@ -291,12 +300,18 @@ function AdHocGroupByRecommendationsRenderer({ model }) {
291
300
  label: `${groupBy.value}`,
292
301
  onClick: () => {
293
302
  model.addGroupByToParent(String(groupBy.value));
303
+ reportInteraction("grafana_unified_drilldown_recent_groupby_applied", {
304
+ key: String(groupBy.value)
305
+ });
294
306
  }
295
307
  }));
296
308
  const recommendedDrilldowns = recommendedGrouping == null ? void 0 : recommendedGrouping.map((groupBy) => ({
297
309
  label: `${groupBy.value}`,
298
310
  onClick: () => {
299
311
  model.addGroupByToParent(String(groupBy.value));
312
+ reportInteraction("grafana_unified_drilldown_recommended_groupby_applied", {
313
+ key: String(groupBy.value)
314
+ });
300
315
  }
301
316
  }));
302
317
  return /* @__PURE__ */ React.createElement(
@@ -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 { 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 }\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 }\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 },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n model.addGroupByToParent(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 { reportInteraction } from '@grafana/runtime';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, 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 */\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 reportInteraction('grafana_unified_drilldown_recent_filter_applied', {\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 reportInteraction('grafana_unified_drilldown_recommended_filter_applied', {\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 reportInteraction('grafana_unified_drilldown_recent_groupby_applied', {\n key: String(groupBy.value),\n });\n },\n }));\n\n const recommendedDrilldowns: DrilldownPill[] | undefined = recommendedGrouping?.map((groupBy) => ({\n label: `${groupBy.value}`,\n onClick: () => {\n model.addGroupByToParent(String(groupBy.value));\n reportInteraction('grafana_unified_drilldown_recommended_groupby_applied', {\n key: String(groupBy.value),\n });\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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"}
@@ -7,7 +7,7 @@ import { useStyles2 } from '@grafana/ui';
7
7
  import { sceneGraph } from '../../core/sceneGraph/index.js';
8
8
  import { AdHocFilterBuilder } from './AdHocFilterBuilder.js';
9
9
  import { AdHocFilterRenderer } from './AdHocFilterRenderer.js';
10
- import { getDataSourceSrv } from '@grafana/runtime';
10
+ import { getDataSourceSrv, reportInteraction } from '@grafana/runtime';
11
11
  import { AdHocFiltersVariableUrlSyncHandler, toArray } from './AdHocFiltersVariableUrlSyncHandler.js';
12
12
  import { css } from '@emotion/css';
13
13
  import { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest.js';
@@ -274,6 +274,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
274
274
  };
275
275
  (_c = this._recommendations) == null ? void 0 : _c.storeRecentGrouping(key);
276
276
  this.updateFilters([...this.state.filters, newFilter]);
277
+ reportInteraction("grafana_unified_drilldown_groupby_added", { key });
277
278
  }
278
279
  restoreOriginalFilter(filter) {
279
280
  var _a;
@@ -293,6 +294,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
293
294
  operator: originalFilter.operator,
294
295
  nonApplicable: originalFilter.nonApplicable
295
296
  });
297
+ reportInteraction("grafana_unified_drilldown_filter_restored", {
298
+ key: filter.key,
299
+ origin: filter.origin
300
+ });
296
301
  }
297
302
  /**
298
303
  * Get the original value for an origin filter before any user modifications.
@@ -377,19 +382,26 @@ class AdHocFiltersVariable extends SceneObjectBase {
377
382
  originFilters: restoredOrigins,
378
383
  filters: nonGroupByFilters
379
384
  });
385
+ reportInteraction("grafana_unified_drilldown_groupby_restored");
380
386
  }
381
387
  /**
382
388
  * Clear all user-added filters and restore origin filters to their original values.
383
389
  */
384
390
  clearAll() {
385
- var _a;
386
- (_a = this.state.originFilters) == null ? void 0 : _a.forEach((filter) => {
391
+ var _a, _b, _c;
392
+ const filtersCount = this.state.filters.length;
393
+ const restorableCount = (_b = (_a = this.state.originFilters) == null ? void 0 : _a.filter((f) => f.restorable && !isGroupByFilter(f)).length) != null ? _b : 0;
394
+ (_c = this.state.originFilters) == null ? void 0 : _c.forEach((filter) => {
387
395
  if (filter.restorable && !isGroupByFilter(filter)) {
388
396
  this.restoreOriginalFilter(filter);
389
397
  }
390
398
  });
391
399
  this.restoreOriginalGroupBy();
392
400
  this.setState({ filters: [] });
401
+ reportInteraction("grafana_unified_drilldown_clear_all", {
402
+ filtersCleared: filtersCount,
403
+ originsRestored: restorableCount
404
+ });
393
405
  }
394
406
  getValue(fieldPath) {
395
407
  if (fieldPath === ORIGIN_FILTERS_KEY) {
@@ -462,11 +474,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
462
474
  }
463
475
  if (filter === _wip) {
464
476
  if ("value" in update && update["value"] !== "") {
477
+ const newFilter = { ..._wip, ...update };
465
478
  this.setState({
466
- filters: [...filters, { ..._wip, ...update }],
479
+ filters: [...filters, newFilter],
467
480
  _wip: void 0
468
481
  });
469
- this.verifyApplicabilityAndStoreRecentFilter({ ..._wip, ...update });
482
+ this.verifyApplicabilityAndStoreRecentFilter(newFilter);
483
+ reportInteraction("grafana_unified_drilldown_filter_added", {
484
+ key: newFilter.key,
485
+ operator: newFilter.operator
486
+ });
470
487
  } else {
471
488
  this.setState({ _wip: { ...filter, ...update } });
472
489
  }
@@ -496,6 +513,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
496
513
  return f;
497
514
  });
498
515
  this.setState({ originFilters: updatedOrigins });
516
+ reportInteraction("grafana_unified_drilldown_groupby_removed", {
517
+ key: filter.key,
518
+ origin: filter.origin
519
+ });
499
520
  } else {
500
521
  this._updateFilter(filter, {
501
522
  operator: "=~",
@@ -506,6 +527,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
506
527
  nonApplicable: false,
507
528
  restorable: true
508
529
  });
530
+ reportInteraction("grafana_unified_drilldown_filter_match_all", {
531
+ key: filter.key,
532
+ origin: filter.origin
533
+ });
509
534
  }
510
535
  }
511
536
  _removeFilter(filter) {
@@ -515,8 +540,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
515
540
  }
516
541
  const queryController = getQueryController(this);
517
542
  queryController == null ? void 0 : queryController.startProfile(FILTER_REMOVED_INTERACTION);
543
+ const isGroupBy = isGroupByFilter(filter);
518
544
  this.setState({ filters: this.state.filters.filter((f) => f !== filter) });
519
545
  this._debouncedVerifyApplicability();
546
+ reportInteraction(
547
+ isGroupBy ? "grafana_unified_drilldown_groupby_removed" : "grafana_unified_drilldown_filter_removed",
548
+ { key: filter.key }
549
+ );
520
550
  }
521
551
  _removeLastFilter() {
522
552
  const filterToRemove = this.state.filters.at(-1);