@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.
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport {\n AdHocVariableFilter,\n GetTagResponse,\n GrafanaTheme2,\n MetricFindValue,\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n Scope,\n SelectableValue,\n} from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { ControlsLayout, SceneComponentProps, SceneDataQuery } from '../../core/types';\nimport { DataSourceRef } from '@grafana/schema';\nimport {\n dataFromResponse,\n escapeOriginFilterUrlDelimiters,\n getQueriesForVariables,\n renderPrometheusLabelFilters,\n responseHasError,\n} from '../utils';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { useStyles2 } from '@grafana/ui';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { AdHocFiltersVariableUrlSyncHandler, toArray } from './AdHocFiltersVariableUrlSyncHandler';\nimport { css } from '@emotion/css';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { debounce, isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\nimport { getQueryController } from '../../core/sceneGraph/getQueryController';\nimport { FILTER_REMOVED_INTERACTION, FILTER_RESTORED_INTERACTION } from '../../performance/interactionConstants';\nimport { AdHocFiltersVariableController } from './controller/AdHocFiltersVariableController';\nimport { AdHocFiltersRecommendations } from './AdHocFiltersRecommendations';\n\nexport interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHocVariableFilter {\n keyLabel?: string;\n valueLabels?: string[];\n // this is used to externally trigger edit mode in combobox filter UI\n forceEdit?: boolean;\n // hide the filter from AdHocFiltersVariableRenderer and the URL\n hidden?: boolean;\n meta?: M;\n // filter origin, it can be either scopes, dashboards or undefined,\n // which means it won't appear in the UI\n origin?: FilterOrigin;\n // whether this is basically a cancelled filter through filter-key =~ .*\n matchAllFilter?: boolean;\n // whether this specific filter is read-only and cannot be edited\n readOnly?: boolean;\n // whether this specific filter is restorable to some value from _originalValues\n restorable?: boolean;\n // whether this groupBy origin filter was dismissed by the user (hidden from UI but kept for restore tracking)\n dismissedGroupBy?: boolean;\n // sets this filter as non-applicable\n nonApplicable?: boolean;\n // reason with reason for nonApplicable filters\n nonApplicableReason?: string;\n}\n\nconst ORIGIN_FILTERS_KEY: keyof AdHocFiltersVariableState = 'originFilters';\n\nexport type AdHocControlsLayout = ControlsLayout | 'combobox';\n\nexport type FilterOrigin = 'dashboard' | 'scope' | string;\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /** Optional text to display on the 'add filter' button */\n addFilterButtonText?: string;\n /** Optional placeholder text for the filter input field */\n inputPlaceholder?: string;\n /** Optional placeholder for the group-by key input */\n groupByInputPlaceholder?: string;\n /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Filters originated from a source */\n originFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\n */\n applyMode: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the group-by key lookup.\n * Return replace: true to override the default lookup (ds.getGroupByKeys or ds.getTagKeys).\n * Return replace: false to combine the results with the default lookup.\n */\n getGroupByKeysProvider?: getGroupByKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * Optionally provide an array of static keys that override getTagKeys\n */\n defaultKeys?: MetricFindValue[];\n\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label filter expression\n */\n filterExpression?: string;\n\n /**\n * The default builder creates a Prometheus/Loki compatible filter expression,\n * this can be overridden to create a different expression based on the current filters.\n */\n expressionBuilder?: AdHocVariableExpressionBuilderFn;\n\n /**\n * Whether the filter supports new multi-value operators like =| and !=|\n */\n supportsMultiValueOperators?: boolean;\n\n /**\n * When querying the datasource for label names and values to determine keys and values\n * for this ad hoc filter, consider the queries in the scene and use them as a filter.\n * This queries filter can be used to ensure that only ad hoc filter options that would\n * impact the current queries are presented to the user.\n */\n useQueriesAsFilterForOptions?: boolean;\n\n /**\n * Flag that decides whether custom values can be added to the filter\n */\n allowCustomValue?: boolean;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocFilterWithLabels;\n\n /**\n * Allows custom formatting of a value before saving to filter state\n */\n onAddCustomValue?: OnAddCustomValueFn;\n /**\n * state for checking whether drilldown applicability is enabled\n */\n applicabilityEnabled?: boolean;\n /**\n * When true, enables a collapse button that appears when filters wrap to multiple lines.\n * Allows users to collapse the filter UI to save vertical space.\n */\n collapsible?: boolean;\n\n /**\n * enables drilldown recommendations\n */\n drilldownRecommendationsEnabled?: boolean;\n\n /**\n * When true, the \"groupBy\" operator is available and filters can be used as group-by dimensions.\n */\n enableGroupBy?: boolean;\n}\n\nexport type AdHocVariableExpressionBuilderFn = (filters: AdHocFilterWithLabels[]) => string;\nexport type OnAddCustomValueFn = (\n item: SelectableValue<string> & { isCustom?: boolean },\n filter: AdHocFilterWithLabels\n) => { value: string | undefined; valueLabels: string[] };\n\nexport type getTagKeysProvider = (\n variable: AdHocFiltersVariable,\n currentKey: string | null,\n operators?: OperatorDefinition[]\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n variable: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type getGroupByKeysProvider = (\n variable: AdHocFiltersVariable,\n currentKey?: string | null\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type AdHocFiltersVariableCreateHelperArgs = AdHocFiltersVariableState;\n\nexport type OperatorDefinition = {\n value: string;\n description?: string;\n isMulti?: Boolean;\n isRegex?: Boolean;\n};\n\nexport const OPERATORS: OperatorDefinition[] = [\n {\n value: '=',\n description: 'Equals',\n },\n {\n value: '!=',\n description: 'Not equal',\n },\n {\n value: '=|',\n description: 'One of. Use to filter on multiple values.',\n isMulti: true,\n },\n {\n value: '!=|',\n description: 'Not one of. Use to exclude multiple values.',\n isMulti: true,\n },\n {\n value: '=~',\n description: 'Matches regex',\n isRegex: true,\n },\n {\n value: '!~',\n description: 'Does not match regex',\n isRegex: true,\n },\n {\n value: '<',\n description: 'Less than',\n },\n {\n value: '<=',\n description: 'Less than or equal to',\n },\n {\n value: '>',\n description: 'Greater than',\n },\n {\n value: '>=',\n description: 'Greater than or equal to',\n },\n];\n\ninterface OriginalValue {\n value: string[];\n operator: string;\n valueLabels?: string[];\n keyLabel?: string;\n nonApplicable?: boolean;\n nonApplicableReason?: string;\n}\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n static Component = AdHocFiltersVariableRenderer;\n\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _dataSourceSrv = getDataSourceSrv();\n // holds the originalValues of all baseFilters in a map. The values\n // are set on construct and used to restore a baseFilter with an origin\n // to its original value if edited at some point\n private _originalValues: Map<string, OriginalValue> = new Map();\n private _prevScopes: Scope[] = [];\n\n /** Needed for scopes dependency */\n protected _variableDependency = new VariableDependencyConfig(this, {\n dependsOnScopes: true,\n onReferencedVariableValueChanged: () => this._updateScopesFilters(),\n });\n\n protected _urlSync = new AdHocFiltersVariableUrlSyncHandler(this);\n\n private _debouncedVerifyApplicability = debounce(this._verifyApplicability, 100);\n\n private _recommendations: AdHocFiltersRecommendations | undefined;\n\n public constructor(state: Partial<AdHocFiltersVariableState>) {\n const behaviors = state.$behaviors ?? [];\n const recommendations = state.drilldownRecommendationsEnabled ? new AdHocFiltersRecommendations() : undefined;\n\n if (recommendations) {\n behaviors.push(recommendations);\n }\n\n super({\n type: 'adhoc',\n name: state.name ?? 'Filters',\n filters: [],\n datasource: null,\n applyMode: 'auto',\n filterExpression:\n state.filterExpression ??\n renderExpression(state.expressionBuilder, [...(state.originFilters ?? []), ...(state.filters ?? [])]),\n ...state,\n $behaviors: behaviors.length > 0 ? behaviors : undefined,\n });\n\n this._recommendations = recommendations;\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n this.state.originFilters?.forEach((filter) => {\n this._setOriginalValue(filter);\n });\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._debouncedVerifyApplicability();\n\n return () => {\n // When the variable's component is temporarily unmounted (e.g. during panel edit)\n // but the variable set is still active, skip restoring defaults — the variable\n // is still logically part of the scene and its state should be preserved.\n if (this.parent?.isActive) {\n return;\n }\n\n this.state.originFilters?.forEach((filter) => {\n if (filter.restorable && !isGroupByFilter(filter)) {\n this.restoreOriginalFilter(filter);\n }\n });\n\n this.restoreOriginalGroupBy();\n };\n };\n\n public getRecommendations(): AdHocFiltersRecommendations | undefined {\n return this._recommendations;\n }\n\n private _updateScopesFilters() {\n const scopes = sceneGraph.getScopes(this);\n\n if (!scopes || !scopes.length) {\n this.setState({\n originFilters: this.state.originFilters?.filter((filter) => filter.origin !== 'scope'),\n });\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n // set original values for scope filters as well\n finalFilters.forEach((scopeFilter) => {\n this._setOriginalValue(scopeFilter);\n });\n\n this.state.originFilters?.forEach((filter) => {\n if (filter.origin === 'scope') {\n scopeInjectedFilters.push(filter);\n } else {\n remainingFilters.push(filter);\n }\n });\n\n if (this._prevScopes.length) {\n this.setState({ originFilters: [...finalFilters, ...remainingFilters] });\n this._prevScopes = scopes;\n\n this._debouncedVerifyApplicability();\n return;\n }\n\n const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);\n const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);\n const scopeFilterKeys = scopeFilters.map((filter) => filter.key);\n\n // if the scope filters contain the key of an edited scope filter, we replace\n // with the edited filter. We also add the remaining unedited scope filters\n // when not overwriting\n finalFilters = [\n ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),\n ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key)),\n ];\n\n // maintain other originFilters in the array, only update scopes ones\n this.setState({ originFilters: [...finalFilters, ...remainingFilters] });\n this._prevScopes = scopes;\n\n this._debouncedVerifyApplicability();\n }\n\n private async verifyApplicabilityAndStoreRecentFilter(update: AdHocFilterWithLabels) {\n await this._verifyApplicability();\n this._recommendations?.storeRecentFilter(update);\n }\n\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = false;\n let groupByChanged = false;\n\n if (\n ((update.filters && update.filters !== this.state.filters) ||\n (update.originFilters && update.originFilters !== this.state.originFilters)) &&\n !update.filterExpression\n ) {\n const filters = update.filters ?? this.state.filters;\n const originFilters = update.originFilters ?? this.state.originFilters;\n\n update.filterExpression = renderExpression(this.state.expressionBuilder, [...(originFilters ?? []), ...filters]);\n filterExpressionChanged = update.filterExpression !== this.state.filterExpression;\n groupByChanged = haveGroupByKeysChanged(\n [...(this.state.originFilters ?? []), ...this.state.filters],\n [...(originFilters ?? []), ...filters]\n );\n }\n\n super.setState(update);\n\n if (filterExpressionChanged || groupByChanged) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n private _resolveOriginFlags(\n key: string,\n origin: string,\n values: string[],\n operator: string,\n singleValue: string\n ): { restorable: boolean; matchAllFilter: boolean } {\n const original = this._originalValues.get(originalValueKey({ key, origin, operator }));\n const isMatchAll = operator === '=~' && singleValue === '.*';\n const isRestorable = !isEqual(values, original?.value) || operator !== original?.operator;\n\n return {\n matchAllFilter: isMatchAll,\n restorable: isRestorable,\n };\n }\n\n public validateOriginFilters(filters: AdHocFilterWithLabels[]): AdHocFilterWithLabels[] {\n return filters.map((filter) => {\n if (!filter.origin) {\n return filter;\n }\n\n if (!this._originalValues.has(originalValueKey(filter))) {\n return filter;\n }\n\n const updateValues = filter.values || (filter.value ? [filter.value] : undefined);\n if (!updateValues) {\n return {\n ...filter,\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n nonApplicable: false,\n restorable: true,\n };\n }\n\n const flags = this._resolveOriginFlags(filter.key, filter.origin, updateValues, filter.operator, filter.value);\n return { ...filter, ...flags };\n });\n }\n\n /**\n * Updates the variable's `filters` and `filterExpression` state.\n * If `skipPublish` option is true, this will not emit the `SceneVariableValueChangedEvent`,\n * allowing consumers to update the filters without triggering dependent data providers.\n */\n public updateFilters(\n filters: AdHocFilterWithLabels[],\n options?: {\n skipPublish?: boolean;\n forcePublish?: boolean;\n }\n ): void {\n let filterExpressionChanged = false;\n let groupByChanged = false;\n let filterExpression: string | undefined = undefined;\n\n if (filters && filters !== this.state.filters) {\n filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(this.state.originFilters ?? []),\n ...filters,\n ]);\n filterExpressionChanged = filterExpression !== this.state.filterExpression;\n groupByChanged = haveGroupByKeysChanged(this.state.filters, filters);\n }\n\n super.setState({\n filters,\n filterExpression,\n });\n\n if (((filterExpressionChanged || groupByChanged) && options?.skipPublish !== true) || options?.forcePublish) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n /**\n * Add a group-by filter (key only, operator 'groupBy', no value).\n * No-op when enableGroupBy is false.\n */\n public _addGroupByFilter(item: SelectableValue<string>): void {\n if (!this.state.enableGroupBy) {\n return;\n }\n\n const key = item.value ?? '';\n const keyLabel = item.label ?? key;\n const newFilter: AdHocFilterWithLabels = {\n key,\n keyLabel,\n operator: 'groupBy',\n value: '',\n condition: '',\n };\n this._recommendations?.storeRecentGrouping(key);\n this.updateFilters([...this.state.filters, newFilter]);\n }\n\n public restoreOriginalFilter(filter: AdHocFilterWithLabels) {\n if (!filter.restorable) {\n return;\n }\n\n const originalFilter = this._originalValues.get(originalValueKey(filter));\n if (!originalFilter) {\n return;\n }\n\n const queryController = getQueryController(this);\n queryController?.startProfile(FILTER_RESTORED_INTERACTION);\n this._updateFilter(filter, {\n value: originalFilter.value[0],\n values: isMultiValueOperator(originalFilter.operator) ? originalFilter.value : undefined,\n valueLabels: originalFilter.valueLabels ?? originalFilter.value,\n operator: originalFilter.operator,\n nonApplicable: originalFilter.nonApplicable,\n });\n }\n\n /**\n * Get the original value for an origin filter before any user modifications.\n * Returns undefined if no original is tracked for this filter.\n */\n public getOriginalValue(\n filter: AdHocFilterWithLabels\n ): { value: string[]; operator: string; valueLabels?: string[]; keyLabel?: string } | undefined {\n return this._originalValues.get(originalValueKey(filter));\n }\n\n /**\n * Store a snapshot of the filter's current value and operator so it can be restored later.\n */\n private _setOriginalValue(filter: AdHocFilterWithLabels): void {\n this._originalValues.set(originalValueKey(filter), {\n value: filter.values ?? [filter.value],\n operator: filter.operator,\n ...(filter.valueLabels && { valueLabels: filter.valueLabels }),\n ...(filter.keyLabel && { keyLabel: filter.keyLabel }),\n });\n }\n\n /**\n * Get original filters from original values.\n * Returns filters from _originalValues map.\n */\n public getOriginalFilters(): AdHocFilterWithLabels[] {\n return [...this._originalValues.entries()].map(([mapKey, original]) => {\n const suffix = `${VALUE_KEY_DELIMITER}${GROUP_BY_OPERATOR}`;\n const isGroupBy = mapKey.endsWith(suffix);\n const baseKey = isGroupBy ? mapKey.slice(0, -suffix.length) : mapKey;\n\n const delimiter = baseKey.lastIndexOf(VALUE_KEY_DELIMITER);\n const key = baseKey.substring(0, delimiter);\n const origin = baseKey.substring(delimiter + VALUE_KEY_DELIMITER.length);\n\n return {\n key,\n origin,\n value: original.value[0],\n values: isMultiValueOperator(original.operator) ? original.value : undefined,\n valueLabels: original.valueLabels ?? original.value,\n keyLabel: original.keyLabel ?? key,\n operator: original.operator,\n nonApplicable: original.nonApplicable,\n } as AdHocFilterWithLabels;\n });\n }\n\n /**\n * Replace all stored original values from the given filters array.\n */\n public setOriginalFilters(filters: AdHocFilterWithLabels[]): void {\n this._originalValues.clear();\n filters.forEach((filter) => {\n this._setOriginalValue(filter);\n });\n }\n\n /**\n * Whether the groupBy state has diverged from defaults (any dismissed or user-added groupBys).\n */\n public isGroupByRestorable(): boolean {\n const originFilters = this.state.originFilters ?? [];\n const hasOriginGroupBy = originFilters.some((f) => isGroupByFilter(f) && f.origin);\n\n if (!hasOriginGroupBy) {\n return false;\n }\n\n const hasDismissedOrRestorable = originFilters.some((f) => isGroupByFilter(f) && f.origin && f.restorable);\n const hasUserGroupBy = this.state.filters.some(isGroupByFilter);\n\n return hasDismissedOrRestorable || hasUserGroupBy;\n }\n\n /**\n * Restore all original group by filters.\n */\n public restoreOriginalGroupBy(): void {\n const restoredOrigins = (this.state.originFilters ?? []).map((f) => {\n if (!isGroupByFilter(f) || !f.origin) {\n return f;\n }\n return { ...f, dismissedGroupBy: false, restorable: false };\n });\n\n const nonGroupByFilters = this.state.filters.filter((f) => !isGroupByFilter(f));\n\n this.setState({\n originFilters: restoredOrigins,\n filters: nonGroupByFilters,\n });\n }\n\n /**\n * Clear all user-added filters and restore origin filters to their original values.\n */\n public clearAll(): void {\n // Restore all restorable origin filters to their original values\n this.state.originFilters?.forEach((filter) => {\n if (filter.restorable && !isGroupByFilter(filter)) {\n this.restoreOriginalFilter(filter);\n }\n });\n\n // Restore groupBy defaults\n this.restoreOriginalGroupBy();\n\n // Clear all user-added filters\n this.setState({ filters: [] });\n }\n\n public getValue(fieldPath?: string): VariableValue | undefined {\n if (fieldPath === ORIGIN_FILTERS_KEY) {\n const originFilters = this.state.originFilters;\n\n if (!originFilters || originFilters?.length === 0) {\n return [];\n }\n\n return [\n ...originFilters.map((filter) =>\n toArray(filter).map(escapeOriginFilterUrlDelimiters).join('|').concat(`#${filter.origin}`)\n ),\n ];\n }\n\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { originFilters, filters, _wip } = this.state;\n\n if ('value' in update && !('values' in update)) {\n update = { ...update, values: undefined };\n }\n\n if (filter.origin) {\n if (isGroupByFilter(filter) && 'key' in update && update.key !== filter.key) {\n const updatedOrigins = (originFilters ?? []).map((f) => {\n if (f === filter) {\n return { ...f, dismissedGroupBy: true, restorable: true };\n }\n if (isGroupByFilter(f) && f.origin && !f.dismissedGroupBy) {\n return { ...f, restorable: true };\n }\n return f;\n });\n\n // The original default is dismissed (preserved for restore); the user's\n // new key becomes a separate user filter so it doesn't overwrite the default.\n const newFilter: AdHocFilterWithLabels = {\n key: update.key as string,\n keyLabel: (update.keyLabel as string) ?? (update.key as string),\n operator: 'groupBy',\n value: '',\n condition: '',\n };\n\n this.setState({\n originFilters: updatedOrigins,\n filters: [...filters, newFilter],\n });\n return;\n }\n\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n if (updateValues) {\n const effectiveOperator = update.operator ?? filter.operator;\n const effectiveValue = update.value ?? filter.value;\n const flags = this._resolveOriginFlags(\n filter.key,\n filter.origin,\n updateValues,\n effectiveOperator,\n effectiveValue\n );\n Object.assign(update, flags);\n }\n\n const updatedFilters =\n originFilters?.map((f) => {\n if (f === filter) {\n return { ...f, ...update };\n }\n if (isGroupByFilter(filter) && update.restorable && isGroupByFilter(f) && f.origin && !f.restorable) {\n return { ...f, restorable: true };\n }\n return f;\n }) ?? [];\n this.setState({ originFilters: updatedFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n this.setState({\n filters: [...filters, { ..._wip, ...update }],\n _wip: undefined,\n });\n this.verifyApplicabilityAndStoreRecentFilter({ ..._wip, ...update });\n } else {\n this.setState({ _wip: { ...filter, ...update } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n });\n\n this.setState({ filters: updatedFilters });\n\n const merged = { ...filter, ...update };\n if (isGroupByFilter(merged)) {\n this._recommendations?.storeRecentGrouping(merged.key);\n } else {\n this._recommendations?.storeRecentFilter(merged);\n }\n }\n\n public updateToMatchAll(filter: AdHocFilterWithLabels) {\n if (isGroupByFilter(filter) && filter.origin) {\n const updatedOrigins = (this.state.originFilters ?? []).map((f) => {\n if (f === filter) {\n return { ...f, dismissedGroupBy: true, restorable: true };\n }\n if (isGroupByFilter(f) && f.origin && !f.dismissedGroupBy) {\n return { ...f, restorable: true };\n }\n return f;\n });\n\n this.setState({ originFilters: updatedOrigins });\n } else {\n this._updateFilter(filter, {\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n nonApplicable: false,\n restorable: true,\n });\n }\n }\n\n public _removeFilter(filter: AdHocFilterWithLabels) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n const queryController = getQueryController(this);\n queryController?.startProfile(FILTER_REMOVED_INTERACTION);\n\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\n this._debouncedVerifyApplicability();\n }\n\n public _removeLastFilter() {\n const filterToRemove = this.state.filters.at(-1);\n\n if (filterToRemove) {\n this._removeFilter(filterToRemove);\n }\n }\n\n public _handleComboboxBackspace(filter: AdHocFilterWithLabels) {\n if (isGroupByFilter(filter)) {\n if (this.state.filters.includes(filter)) {\n this._removeFilter(filter);\n } else {\n for (let i = this.state.filters.length - 1; i >= 0; i--) {\n if (isGroupByFilter(this.state.filters[i]) && !this.state.filters[i].readOnly) {\n this._removeFilter(this.state.filters[i]);\n return;\n }\n }\n const origins = this.state.originFilters ?? [];\n for (let i = origins.length - 1; i >= 0; i--) {\n if (isGroupByFilter(origins[i]) && origins[i].origin && !origins[i].dismissedGroupBy) {\n this.updateToMatchAll(origins[i]);\n return;\n }\n }\n }\n return;\n }\n\n if (isFilterComplete(filter)) {\n const queryController = getQueryController(this);\n queryController?.startProfile(FILTER_REMOVED_INTERACTION);\n }\n\n const isWip = filter === this.state._wip;\n\n if (this.state.filters.length) {\n const filterToForceIndex = isWip ? findLastAdhocFilterIndex(this.state.filters) : -1;\n\n this.setState({\n filters: this.state.filters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter if not readOnly\n if (index === filterToForceIndex && !f.readOnly) {\n return [...acc, { ...f, forceEdit: true }];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n return [...acc, f];\n }, []),\n });\n } else if (this.state.originFilters?.length) {\n // default forceEdit last filter (when triggering from wip filter)\n const filterToForceIndex = isWip ? findLastAdhocFilterIndex(this.state.originFilters) : -1;\n\n this.setState({\n originFilters: this.state.originFilters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex && !f.readOnly) {\n return [...acc, { ...f, forceEdit: true }];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n }\n }\n\n public async getFiltersApplicabilityForQueries(\n filters: AdHocFilterWithLabels[],\n queries: SceneDataQuery[],\n groupByKeys?: string[]\n ): Promise<DrilldownsApplicability[] | undefined> {\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getDrilldownsApplicability) {\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n\n // @ts-expect-error (temporary till we update grafana/data)\n return await ds.getDrilldownsApplicability({\n filters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...(groupByKeys && groupByKeys.length > 0 ? { groupByKeys } : {}),\n ...getEnrichedFiltersRequest(this),\n });\n }\n\n public async _verifyApplicability() {\n if (!this.state.applicabilityEnabled) {\n return;\n }\n\n const allFilters = [...this.state.filters, ...(this.state.originFilters ?? [])];\n const filters = allFilters.filter((f) => !isGroupByFilter(f));\n const groupByKeys = this.state.enableGroupBy\n ? allFilters.filter((f) => isGroupByFilter(f)).map((f) => f.key)\n : undefined;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n const response = await this.getFiltersApplicabilityForQueries(filters, queries ?? [], groupByKeys);\n\n if (!response) {\n return;\n }\n\n const responseMap = new Map<string, DrilldownsApplicability>();\n response.forEach((filter: DrilldownsApplicability) => {\n responseMap.set(`${filter.key}${filter.origin ? `-${filter.origin}` : ''}`, filter);\n });\n\n const update = {\n filters: [...this.state.filters],\n originFilters: [...(this.state.originFilters ?? [])],\n };\n\n update.filters.forEach((f) => {\n const filter = responseMap.get(f.key);\n\n if (filter) {\n f.nonApplicable = !filter.applicable;\n f.nonApplicableReason = filter.reason;\n }\n });\n\n update.originFilters?.forEach((f) => {\n const filter = responseMap.get(`${f.key}-${f.origin}`);\n\n if (filter) {\n if (!f.matchAllFilter) {\n f.nonApplicable = !filter.applicable;\n f.nonApplicableReason = filter.reason;\n }\n\n const originalValue = this._originalValues.get(originalValueKey(f));\n if (originalValue) {\n originalValue.nonApplicable = !filter.applicable;\n originalValue.nonApplicableReason = filter?.reason;\n }\n }\n });\n\n this.setState(update);\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n if (this.state.defaultKeys) {\n return this.state.defaultKeys.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const applicableOriginFilters =\n this.state.originFilters?.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)) ?? [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(this.state.baseFilters ?? [])\n .concat(applicableOriginFilters);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible group-by keys.\n * @param currentKey - The current key being edited (excluded from filters)\n * @param queries - Optional queries to scope the key lookup. When provided, these are used\n * instead of discovering all queries in the scene via getQueriesForVariables.\n */\n public async _getGroupByKeys(\n currentKey: string | null,\n queries?: SceneDataQuery[]\n ): Promise<Array<SelectableValue<string>>> {\n if (!this.state.enableGroupBy) {\n return [];\n }\n\n const override = await this.state.getGroupByKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n // @ts-expect-error (TODO: remove after upgrading with https://github.com/grafana/grafana/pull/118270)\n if (!ds || !ds.getGroupByKeys) {\n return override ? dataFromResponse(override.values).map(toSelectableValue) : [];\n }\n\n const applicableOriginFilters =\n this.state.originFilters?.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)) ?? [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(this.state.baseFilters ?? [])\n .concat(applicableOriginFilters);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queriesForKeys =\n queries ?? (this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined);\n\n // @ts-expect-error (TODO: remove after upgrading with https://github.com/grafana/grafana/pull/118270)\n const response = await ds.getGroupByKeys({\n filters: otherFilters,\n queries: queriesForKeys,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocFilterWithLabels): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n const originFilters =\n this.state.originFilters?.filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f)) ??\n [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(originFilters);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n let scopes = sceneGraph.getScopes(this);\n\n // if current filter is a scope originated one we need to filter out\n // filters with same key in scopes prop, similar to how we do in adhocFilters prop\n if (filter.origin === 'scope') {\n scopes = scopes?.map((scope) => {\n return {\n ...scope,\n spec: {\n ...scope.spec,\n filters: scope.spec.filters?.filter((f) => f.key !== filter.key),\n },\n };\n });\n }\n\n const response = await ds.getTagValues({\n key: filter.key,\n filters: otherFilters,\n timeRange,\n queries,\n scopes,\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let values = dataFromResponse(response);\n if (override) {\n values = values.concat(dataFromResponse(override.values));\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({\n _wip: { key: '', value: '', operator: '=', condition: '' },\n });\n }\n\n public _getOperators() {\n const { supportsMultiValueOperators, allowCustomValue = true } = this.state;\n\n return OPERATORS.filter(({ isMulti, isRegex }) => {\n if (!supportsMultiValueOperators && isMulti) {\n return false;\n }\n if (!allowCustomValue && isRegex) {\n return false;\n }\n return true;\n }).map<SelectableValue<string>>(({ value, description }) => ({\n label: value,\n value,\n description,\n }));\n }\n}\n\nfunction renderExpression(\n builder: AdHocVariableExpressionBuilderFn | undefined,\n filters: AdHocFilterWithLabels[] | undefined\n) {\n return (builder ?? renderPrometheusLabelFilters)(\n filters?.filter((f) => isFilterApplicable(f) && !isGroupByFilter(f)) ?? []\n );\n}\n\nfunction getGroupByKeys(filters: AdHocFilterWithLabels[]): string[] {\n return filters\n .filter((f) => isGroupByFilter(f) && isFilterComplete(f) && !f.dismissedGroupBy)\n .map((f) => f.key)\n .sort();\n}\n\nfunction haveGroupByKeysChanged(prev: AdHocFilterWithLabels[], next: AdHocFilterWithLabels[]): boolean {\n const prevKeys = getGroupByKeys(prev);\n const nextKeys = getGroupByKeys(next);\n\n if (prevKeys.length !== nextKeys.length) {\n return true;\n }\n\n return prevKeys.some((key, i) => key !== nextKeys[i]);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n // Create controller adapter for combobox mode\n const controller = useMemo(\n () => (model.state.layout === 'combobox' ? new AdHocFiltersVariableController(model) : undefined),\n [model]\n );\n\n if (controller) {\n return <AdHocFiltersComboboxRenderer controller={controller} />;\n }\n\n return (\n <div className={styles.wrapper}>\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" addFilterButtonText={addFilterButtonText} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-end',\n columnGap: theme.spacing(2),\n rowGap: theme.spacing(1),\n }),\n});\n\nexport function toSelectableValue(input: MetricFindValue): SelectableValue<string> {\n const { text, value } = input;\n const result: SelectableValue<string> = {\n // converting text to string due to some edge cases where it can be a number\n // TODO: remove once https://github.com/grafana/grafana/issues/99021 is closed\n label: String(text),\n value: String(value ?? text),\n };\n\n if ('group' in input) {\n result.group = input.group;\n }\n\n if ('meta' in input) {\n result.meta = input.meta;\n }\n\n return result;\n}\n\nexport function isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\n}\n\nexport const GROUP_BY_OPERATOR = 'groupBy';\nexport const VALUE_KEY_DELIMITER = '::';\n\nexport function isGroupByFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === GROUP_BY_OPERATOR;\n}\n\nexport function isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return filter.key !== '' && filter.operator !== '' && (isGroupByFilter(filter) || filter.value !== '');\n}\n\nexport function isFilterApplicable(filter: AdHocFilterWithLabels): boolean {\n return !filter.nonApplicable;\n}\n\nfunction findLastAdhocFilterIndex(filters: AdHocFilterWithLabels[]): number {\n for (let i = filters.length - 1; i >= 0; i--) {\n if (!isGroupByFilter(filters[i])) {\n return i;\n }\n }\n return -1;\n}\n\nfunction originalValueKey({ key, origin, operator }: { key: string; origin?: string; operator: string }): string {\n return operator === GROUP_BY_OPERATOR\n ? `${key}${VALUE_KEY_DELIMITER}${origin}${VALUE_KEY_DELIMITER}${GROUP_BY_OPERATOR}`\n : `${key}${VALUE_KEY_DELIMITER}${origin}`;\n}\n\nexport function isMultiValueOperator(operatorValue: string): boolean {\n const operator = OPERATORS.find((o) => o.value === operatorValue);\n if (!operator) {\n // default to false if operator is not found\n return false;\n }\n return Boolean(operator.isMulti);\n}\n"],"names":["updatedFilters","_a"],"mappings":"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"}
1
+ {"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport {\n AdHocVariableFilter,\n GetTagResponse,\n GrafanaTheme2,\n MetricFindValue,\n // @ts-expect-error (temporary till we update grafana/data)\n DrilldownsApplicability,\n Scope,\n SelectableValue,\n} from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { ControlsLayout, SceneComponentProps, SceneDataQuery } from '../../core/types';\nimport { DataSourceRef } from '@grafana/schema';\nimport {\n dataFromResponse,\n escapeOriginFilterUrlDelimiters,\n getQueriesForVariables,\n renderPrometheusLabelFilters,\n responseHasError,\n} from '../utils';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { useStyles2 } from '@grafana/ui';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { getDataSourceSrv, reportInteraction } from '@grafana/runtime';\nimport { AdHocFiltersVariableUrlSyncHandler, toArray } from './AdHocFiltersVariableUrlSyncHandler';\nimport { css } from '@emotion/css';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { debounce, isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\nimport { getQueryController } from '../../core/sceneGraph/getQueryController';\nimport { FILTER_REMOVED_INTERACTION, FILTER_RESTORED_INTERACTION } from '../../performance/interactionConstants';\nimport { AdHocFiltersVariableController } from './controller/AdHocFiltersVariableController';\nimport { AdHocFiltersRecommendations } from './AdHocFiltersRecommendations';\n\nexport interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHocVariableFilter {\n keyLabel?: string;\n valueLabels?: string[];\n // this is used to externally trigger edit mode in combobox filter UI\n forceEdit?: boolean;\n // hide the filter from AdHocFiltersVariableRenderer and the URL\n hidden?: boolean;\n meta?: M;\n // filter origin, it can be either scopes, dashboards or undefined,\n // which means it won't appear in the UI\n origin?: FilterOrigin;\n // whether this is basically a cancelled filter through filter-key =~ .*\n matchAllFilter?: boolean;\n // whether this specific filter is read-only and cannot be edited\n readOnly?: boolean;\n // whether this specific filter is restorable to some value from _originalValues\n restorable?: boolean;\n // whether this groupBy origin filter was dismissed by the user (hidden from UI but kept for restore tracking)\n dismissedGroupBy?: boolean;\n // sets this filter as non-applicable\n nonApplicable?: boolean;\n // reason with reason for nonApplicable filters\n nonApplicableReason?: string;\n}\n\nconst ORIGIN_FILTERS_KEY: keyof AdHocFiltersVariableState = 'originFilters';\n\nexport type AdHocControlsLayout = ControlsLayout | 'combobox';\n\nexport type FilterOrigin = 'dashboard' | 'scope' | string;\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /** Optional text to display on the 'add filter' button */\n addFilterButtonText?: string;\n /** Optional placeholder text for the filter input field */\n inputPlaceholder?: string;\n /** Optional placeholder for the group-by key input */\n groupByInputPlaceholder?: string;\n /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Filters originated from a source */\n originFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\n */\n applyMode: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the group-by key lookup.\n * Return replace: true to override the default lookup (ds.getGroupByKeys or ds.getTagKeys).\n * Return replace: false to combine the results with the default lookup.\n */\n getGroupByKeysProvider?: getGroupByKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * Optionally provide an array of static keys that override getTagKeys\n */\n defaultKeys?: MetricFindValue[];\n\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label filter expression\n */\n filterExpression?: string;\n\n /**\n * The default builder creates a Prometheus/Loki compatible filter expression,\n * this can be overridden to create a different expression based on the current filters.\n */\n expressionBuilder?: AdHocVariableExpressionBuilderFn;\n\n /**\n * Whether the filter supports new multi-value operators like =| and !=|\n */\n supportsMultiValueOperators?: boolean;\n\n /**\n * When querying the datasource for label names and values to determine keys and values\n * for this ad hoc filter, consider the queries in the scene and use them as a filter.\n * This queries filter can be used to ensure that only ad hoc filter options that would\n * impact the current queries are presented to the user.\n */\n useQueriesAsFilterForOptions?: boolean;\n\n /**\n * Flag that decides whether custom values can be added to the filter\n */\n allowCustomValue?: boolean;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocFilterWithLabels;\n\n /**\n * Allows custom formatting of a value before saving to filter state\n */\n onAddCustomValue?: OnAddCustomValueFn;\n /**\n * state for checking whether drilldown applicability is enabled\n */\n applicabilityEnabled?: boolean;\n /**\n * When true, enables a collapse button that appears when filters wrap to multiple lines.\n * Allows users to collapse the filter UI to save vertical space.\n */\n collapsible?: boolean;\n\n /**\n * enables drilldown recommendations\n */\n drilldownRecommendationsEnabled?: boolean;\n\n /**\n * When true, the \"groupBy\" operator is available and filters can be used as group-by dimensions.\n */\n enableGroupBy?: boolean;\n}\n\nexport type AdHocVariableExpressionBuilderFn = (filters: AdHocFilterWithLabels[]) => string;\nexport type OnAddCustomValueFn = (\n item: SelectableValue<string> & { isCustom?: boolean },\n filter: AdHocFilterWithLabels\n) => { value: string | undefined; valueLabels: string[] };\n\nexport type getTagKeysProvider = (\n variable: AdHocFiltersVariable,\n currentKey: string | null,\n operators?: OperatorDefinition[]\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n variable: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type getGroupByKeysProvider = (\n variable: AdHocFiltersVariable,\n currentKey?: string | null\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type AdHocFiltersVariableCreateHelperArgs = AdHocFiltersVariableState;\n\nexport type OperatorDefinition = {\n value: string;\n description?: string;\n isMulti?: Boolean;\n isRegex?: Boolean;\n};\n\nexport const OPERATORS: OperatorDefinition[] = [\n {\n value: '=',\n description: 'Equals',\n },\n {\n value: '!=',\n description: 'Not equal',\n },\n {\n value: '=|',\n description: 'One of. Use to filter on multiple values.',\n isMulti: true,\n },\n {\n value: '!=|',\n description: 'Not one of. Use to exclude multiple values.',\n isMulti: true,\n },\n {\n value: '=~',\n description: 'Matches regex',\n isRegex: true,\n },\n {\n value: '!~',\n description: 'Does not match regex',\n isRegex: true,\n },\n {\n value: '<',\n description: 'Less than',\n },\n {\n value: '<=',\n description: 'Less than or equal to',\n },\n {\n value: '>',\n description: 'Greater than',\n },\n {\n value: '>=',\n description: 'Greater than or equal to',\n },\n];\n\ninterface OriginalValue {\n value: string[];\n operator: string;\n valueLabels?: string[];\n keyLabel?: string;\n nonApplicable?: boolean;\n nonApplicableReason?: string;\n}\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n static Component = AdHocFiltersVariableRenderer;\n\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _dataSourceSrv = getDataSourceSrv();\n // holds the originalValues of all baseFilters in a map. The values\n // are set on construct and used to restore a baseFilter with an origin\n // to its original value if edited at some point\n private _originalValues: Map<string, OriginalValue> = new Map();\n private _prevScopes: Scope[] = [];\n\n /** Needed for scopes dependency */\n protected _variableDependency = new VariableDependencyConfig(this, {\n dependsOnScopes: true,\n onReferencedVariableValueChanged: () => this._updateScopesFilters(),\n });\n\n protected _urlSync = new AdHocFiltersVariableUrlSyncHandler(this);\n\n private _debouncedVerifyApplicability = debounce(this._verifyApplicability, 100);\n\n private _recommendations: AdHocFiltersRecommendations | undefined;\n\n public constructor(state: Partial<AdHocFiltersVariableState>) {\n const behaviors = state.$behaviors ?? [];\n const recommendations = state.drilldownRecommendationsEnabled ? new AdHocFiltersRecommendations() : undefined;\n\n if (recommendations) {\n behaviors.push(recommendations);\n }\n\n super({\n type: 'adhoc',\n name: state.name ?? 'Filters',\n filters: [],\n datasource: null,\n applyMode: 'auto',\n filterExpression:\n state.filterExpression ??\n renderExpression(state.expressionBuilder, [...(state.originFilters ?? []), ...(state.filters ?? [])]),\n ...state,\n $behaviors: behaviors.length > 0 ? behaviors : undefined,\n });\n\n this._recommendations = recommendations;\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n this.state.originFilters?.forEach((filter) => {\n this._setOriginalValue(filter);\n });\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._debouncedVerifyApplicability();\n\n return () => {\n // When the variable's component is temporarily unmounted (e.g. during panel edit)\n // but the variable set is still active, skip restoring defaults — the variable\n // is still logically part of the scene and its state should be preserved.\n if (this.parent?.isActive) {\n return;\n }\n\n this.state.originFilters?.forEach((filter) => {\n if (filter.restorable && !isGroupByFilter(filter)) {\n this.restoreOriginalFilter(filter);\n }\n });\n\n this.restoreOriginalGroupBy();\n };\n };\n\n public getRecommendations(): AdHocFiltersRecommendations | undefined {\n return this._recommendations;\n }\n\n private _updateScopesFilters() {\n const scopes = sceneGraph.getScopes(this);\n\n if (!scopes || !scopes.length) {\n this.setState({\n originFilters: this.state.originFilters?.filter((filter) => filter.origin !== 'scope'),\n });\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n // set original values for scope filters as well\n finalFilters.forEach((scopeFilter) => {\n this._setOriginalValue(scopeFilter);\n });\n\n this.state.originFilters?.forEach((filter) => {\n if (filter.origin === 'scope') {\n scopeInjectedFilters.push(filter);\n } else {\n remainingFilters.push(filter);\n }\n });\n\n if (this._prevScopes.length) {\n this.setState({ originFilters: [...finalFilters, ...remainingFilters] });\n this._prevScopes = scopes;\n\n this._debouncedVerifyApplicability();\n return;\n }\n\n const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);\n const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);\n const scopeFilterKeys = scopeFilters.map((filter) => filter.key);\n\n // if the scope filters contain the key of an edited scope filter, we replace\n // with the edited filter. We also add the remaining unedited scope filters\n // when not overwriting\n finalFilters = [\n ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),\n ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key)),\n ];\n\n // maintain other originFilters in the array, only update scopes ones\n this.setState({ originFilters: [...finalFilters, ...remainingFilters] });\n this._prevScopes = scopes;\n\n this._debouncedVerifyApplicability();\n }\n\n private async verifyApplicabilityAndStoreRecentFilter(update: AdHocFilterWithLabels) {\n await this._verifyApplicability();\n this._recommendations?.storeRecentFilter(update);\n }\n\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = false;\n let groupByChanged = false;\n\n if (\n ((update.filters && update.filters !== this.state.filters) ||\n (update.originFilters && update.originFilters !== this.state.originFilters)) &&\n !update.filterExpression\n ) {\n const filters = update.filters ?? this.state.filters;\n const originFilters = update.originFilters ?? this.state.originFilters;\n\n update.filterExpression = renderExpression(this.state.expressionBuilder, [...(originFilters ?? []), ...filters]);\n filterExpressionChanged = update.filterExpression !== this.state.filterExpression;\n groupByChanged = haveGroupByKeysChanged(\n [...(this.state.originFilters ?? []), ...this.state.filters],\n [...(originFilters ?? []), ...filters]\n );\n }\n\n super.setState(update);\n\n if (filterExpressionChanged || groupByChanged) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n private _resolveOriginFlags(\n key: string,\n origin: string,\n values: string[],\n operator: string,\n singleValue: string\n ): { restorable: boolean; matchAllFilter: boolean } {\n const original = this._originalValues.get(originalValueKey({ key, origin, operator }));\n const isMatchAll = operator === '=~' && singleValue === '.*';\n const isRestorable = !isEqual(values, original?.value) || operator !== original?.operator;\n\n return {\n matchAllFilter: isMatchAll,\n restorable: isRestorable,\n };\n }\n\n public validateOriginFilters(filters: AdHocFilterWithLabels[]): AdHocFilterWithLabels[] {\n return filters.map((filter) => {\n if (!filter.origin) {\n return filter;\n }\n\n if (!this._originalValues.has(originalValueKey(filter))) {\n return filter;\n }\n\n const updateValues = filter.values || (filter.value ? [filter.value] : undefined);\n if (!updateValues) {\n return {\n ...filter,\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n nonApplicable: false,\n restorable: true,\n };\n }\n\n const flags = this._resolveOriginFlags(filter.key, filter.origin, updateValues, filter.operator, filter.value);\n return { ...filter, ...flags };\n });\n }\n\n /**\n * Updates the variable's `filters` and `filterExpression` state.\n * If `skipPublish` option is true, this will not emit the `SceneVariableValueChangedEvent`,\n * allowing consumers to update the filters without triggering dependent data providers.\n */\n public updateFilters(\n filters: AdHocFilterWithLabels[],\n options?: {\n skipPublish?: boolean;\n forcePublish?: boolean;\n }\n ): void {\n let filterExpressionChanged = false;\n let groupByChanged = false;\n let filterExpression: string | undefined = undefined;\n\n if (filters && filters !== this.state.filters) {\n filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(this.state.originFilters ?? []),\n ...filters,\n ]);\n filterExpressionChanged = filterExpression !== this.state.filterExpression;\n groupByChanged = haveGroupByKeysChanged(this.state.filters, filters);\n }\n\n super.setState({\n filters,\n filterExpression,\n });\n\n if (((filterExpressionChanged || groupByChanged) && options?.skipPublish !== true) || options?.forcePublish) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n /**\n * Add a group-by filter (key only, operator 'groupBy', no value).\n * No-op when enableGroupBy is false.\n */\n public _addGroupByFilter(item: SelectableValue<string>): void {\n if (!this.state.enableGroupBy) {\n return;\n }\n\n const key = item.value ?? '';\n const keyLabel = item.label ?? key;\n const newFilter: AdHocFilterWithLabels = {\n key,\n keyLabel,\n operator: 'groupBy',\n value: '',\n condition: '',\n };\n this._recommendations?.storeRecentGrouping(key);\n this.updateFilters([...this.state.filters, newFilter]);\n reportInteraction('grafana_unified_drilldown_groupby_added', { key });\n }\n\n public restoreOriginalFilter(filter: AdHocFilterWithLabels) {\n if (!filter.restorable) {\n return;\n }\n\n const originalFilter = this._originalValues.get(originalValueKey(filter));\n if (!originalFilter) {\n return;\n }\n\n const queryController = getQueryController(this);\n queryController?.startProfile(FILTER_RESTORED_INTERACTION);\n this._updateFilter(filter, {\n value: originalFilter.value[0],\n values: isMultiValueOperator(originalFilter.operator) ? originalFilter.value : undefined,\n valueLabels: originalFilter.valueLabels ?? originalFilter.value,\n operator: originalFilter.operator,\n nonApplicable: originalFilter.nonApplicable,\n });\n reportInteraction('grafana_unified_drilldown_filter_restored', {\n key: filter.key,\n origin: filter.origin,\n });\n }\n\n /**\n * Get the original value for an origin filter before any user modifications.\n * Returns undefined if no original is tracked for this filter.\n */\n public getOriginalValue(\n filter: AdHocFilterWithLabels\n ): { value: string[]; operator: string; valueLabels?: string[]; keyLabel?: string } | undefined {\n return this._originalValues.get(originalValueKey(filter));\n }\n\n /**\n * Store a snapshot of the filter's current value and operator so it can be restored later.\n */\n private _setOriginalValue(filter: AdHocFilterWithLabels): void {\n this._originalValues.set(originalValueKey(filter), {\n value: filter.values ?? [filter.value],\n operator: filter.operator,\n ...(filter.valueLabels && { valueLabels: filter.valueLabels }),\n ...(filter.keyLabel && { keyLabel: filter.keyLabel }),\n });\n }\n\n /**\n * Get original filters from original values.\n * Returns filters from _originalValues map.\n */\n public getOriginalFilters(): AdHocFilterWithLabels[] {\n return [...this._originalValues.entries()].map(([mapKey, original]) => {\n const suffix = `${VALUE_KEY_DELIMITER}${GROUP_BY_OPERATOR}`;\n const isGroupBy = mapKey.endsWith(suffix);\n const baseKey = isGroupBy ? mapKey.slice(0, -suffix.length) : mapKey;\n\n const delimiter = baseKey.lastIndexOf(VALUE_KEY_DELIMITER);\n const key = baseKey.substring(0, delimiter);\n const origin = baseKey.substring(delimiter + VALUE_KEY_DELIMITER.length);\n\n return {\n key,\n origin,\n value: original.value[0],\n values: isMultiValueOperator(original.operator) ? original.value : undefined,\n valueLabels: original.valueLabels ?? original.value,\n keyLabel: original.keyLabel ?? key,\n operator: original.operator,\n nonApplicable: original.nonApplicable,\n } as AdHocFilterWithLabels;\n });\n }\n\n /**\n * Replace all stored original values from the given filters array.\n */\n public setOriginalFilters(filters: AdHocFilterWithLabels[]): void {\n this._originalValues.clear();\n filters.forEach((filter) => {\n this._setOriginalValue(filter);\n });\n }\n\n /**\n * Whether the groupBy state has diverged from defaults (any dismissed or user-added groupBys).\n */\n public isGroupByRestorable(): boolean {\n const originFilters = this.state.originFilters ?? [];\n const hasOriginGroupBy = originFilters.some((f) => isGroupByFilter(f) && f.origin);\n\n if (!hasOriginGroupBy) {\n return false;\n }\n\n const hasDismissedOrRestorable = originFilters.some((f) => isGroupByFilter(f) && f.origin && f.restorable);\n const hasUserGroupBy = this.state.filters.some(isGroupByFilter);\n\n return hasDismissedOrRestorable || hasUserGroupBy;\n }\n\n /**\n * Restore all original group by filters.\n */\n public restoreOriginalGroupBy(): void {\n const restoredOrigins = (this.state.originFilters ?? []).map((f) => {\n if (!isGroupByFilter(f) || !f.origin) {\n return f;\n }\n return { ...f, dismissedGroupBy: false, restorable: false };\n });\n\n const nonGroupByFilters = this.state.filters.filter((f) => !isGroupByFilter(f));\n\n this.setState({\n originFilters: restoredOrigins,\n filters: nonGroupByFilters,\n });\n reportInteraction('grafana_unified_drilldown_groupby_restored');\n }\n\n /**\n * Clear all user-added filters and restore origin filters to their original values.\n */\n public clearAll(): void {\n const filtersCount = this.state.filters.length;\n const restorableCount = this.state.originFilters?.filter((f) => f.restorable && !isGroupByFilter(f)).length ?? 0;\n\n // Restore all restorable origin filters to their original values\n this.state.originFilters?.forEach((filter) => {\n if (filter.restorable && !isGroupByFilter(filter)) {\n this.restoreOriginalFilter(filter);\n }\n });\n\n // Restore groupBy defaults\n this.restoreOriginalGroupBy();\n\n // Clear all user-added filters\n this.setState({ filters: [] });\n\n reportInteraction('grafana_unified_drilldown_clear_all', {\n filtersCleared: filtersCount,\n originsRestored: restorableCount,\n });\n }\n\n public getValue(fieldPath?: string): VariableValue | undefined {\n if (fieldPath === ORIGIN_FILTERS_KEY) {\n const originFilters = this.state.originFilters;\n\n if (!originFilters || originFilters?.length === 0) {\n return [];\n }\n\n return [\n ...originFilters.map((filter) =>\n toArray(filter).map(escapeOriginFilterUrlDelimiters).join('|').concat(`#${filter.origin}`)\n ),\n ];\n }\n\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { originFilters, filters, _wip } = this.state;\n\n if ('value' in update && !('values' in update)) {\n update = { ...update, values: undefined };\n }\n\n if (filter.origin) {\n if (isGroupByFilter(filter) && 'key' in update && update.key !== filter.key) {\n const updatedOrigins = (originFilters ?? []).map((f) => {\n if (f === filter) {\n return { ...f, dismissedGroupBy: true, restorable: true };\n }\n if (isGroupByFilter(f) && f.origin && !f.dismissedGroupBy) {\n return { ...f, restorable: true };\n }\n return f;\n });\n\n // The original default is dismissed (preserved for restore); the user's\n // new key becomes a separate user filter so it doesn't overwrite the default.\n const newFilter: AdHocFilterWithLabels = {\n key: update.key as string,\n keyLabel: (update.keyLabel as string) ?? (update.key as string),\n operator: 'groupBy',\n value: '',\n condition: '',\n };\n\n this.setState({\n originFilters: updatedOrigins,\n filters: [...filters, newFilter],\n });\n return;\n }\n\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n if (updateValues) {\n const effectiveOperator = update.operator ?? filter.operator;\n const effectiveValue = update.value ?? filter.value;\n const flags = this._resolveOriginFlags(\n filter.key,\n filter.origin,\n updateValues,\n effectiveOperator,\n effectiveValue\n );\n Object.assign(update, flags);\n }\n\n const updatedFilters =\n originFilters?.map((f) => {\n if (f === filter) {\n return { ...f, ...update };\n }\n if (isGroupByFilter(filter) && update.restorable && isGroupByFilter(f) && f.origin && !f.restorable) {\n return { ...f, restorable: true };\n }\n return f;\n }) ?? [];\n this.setState({ originFilters: updatedFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n const newFilter = { ..._wip, ...update };\n this.setState({\n filters: [...filters, newFilter],\n _wip: undefined,\n });\n this.verifyApplicabilityAndStoreRecentFilter(newFilter);\n reportInteraction('grafana_unified_drilldown_filter_added', {\n key: newFilter.key,\n operator: newFilter.operator,\n });\n } else {\n this.setState({ _wip: { ...filter, ...update } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n });\n\n this.setState({ filters: updatedFilters });\n\n const merged = { ...filter, ...update };\n if (isGroupByFilter(merged)) {\n this._recommendations?.storeRecentGrouping(merged.key);\n } else {\n this._recommendations?.storeRecentFilter(merged);\n }\n }\n\n public updateToMatchAll(filter: AdHocFilterWithLabels) {\n if (isGroupByFilter(filter) && filter.origin) {\n const updatedOrigins = (this.state.originFilters ?? []).map((f) => {\n if (f === filter) {\n return { ...f, dismissedGroupBy: true, restorable: true };\n }\n if (isGroupByFilter(f) && f.origin && !f.dismissedGroupBy) {\n return { ...f, restorable: true };\n }\n return f;\n });\n\n this.setState({ originFilters: updatedOrigins });\n reportInteraction('grafana_unified_drilldown_groupby_removed', {\n key: filter.key,\n origin: filter.origin,\n });\n } else {\n this._updateFilter(filter, {\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n nonApplicable: false,\n restorable: true,\n });\n reportInteraction('grafana_unified_drilldown_filter_match_all', {\n key: filter.key,\n origin: filter.origin,\n });\n }\n }\n\n public _removeFilter(filter: AdHocFilterWithLabels) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n const queryController = getQueryController(this);\n queryController?.startProfile(FILTER_REMOVED_INTERACTION);\n\n const isGroupBy = isGroupByFilter(filter);\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\n this._debouncedVerifyApplicability();\n\n reportInteraction(\n isGroupBy ? 'grafana_unified_drilldown_groupby_removed' : 'grafana_unified_drilldown_filter_removed',\n { key: filter.key }\n );\n }\n\n public _removeLastFilter() {\n const filterToRemove = this.state.filters.at(-1);\n\n if (filterToRemove) {\n this._removeFilter(filterToRemove);\n }\n }\n\n public _handleComboboxBackspace(filter: AdHocFilterWithLabels) {\n if (isGroupByFilter(filter)) {\n if (this.state.filters.includes(filter)) {\n this._removeFilter(filter);\n } else {\n for (let i = this.state.filters.length - 1; i >= 0; i--) {\n if (isGroupByFilter(this.state.filters[i]) && !this.state.filters[i].readOnly) {\n this._removeFilter(this.state.filters[i]);\n return;\n }\n }\n const origins = this.state.originFilters ?? [];\n for (let i = origins.length - 1; i >= 0; i--) {\n if (isGroupByFilter(origins[i]) && origins[i].origin && !origins[i].dismissedGroupBy) {\n this.updateToMatchAll(origins[i]);\n return;\n }\n }\n }\n return;\n }\n\n if (isFilterComplete(filter)) {\n const queryController = getQueryController(this);\n queryController?.startProfile(FILTER_REMOVED_INTERACTION);\n }\n\n const isWip = filter === this.state._wip;\n\n if (this.state.filters.length) {\n const filterToForceIndex = isWip ? findLastAdhocFilterIndex(this.state.filters) : -1;\n\n this.setState({\n filters: this.state.filters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter if not readOnly\n if (index === filterToForceIndex && !f.readOnly) {\n return [...acc, { ...f, forceEdit: true }];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n return [...acc, f];\n }, []),\n });\n } else if (this.state.originFilters?.length) {\n // default forceEdit last filter (when triggering from wip filter)\n const filterToForceIndex = isWip ? findLastAdhocFilterIndex(this.state.originFilters) : -1;\n\n this.setState({\n originFilters: this.state.originFilters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex && !f.readOnly) {\n return [...acc, { ...f, forceEdit: true }];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n }\n }\n\n public async getFiltersApplicabilityForQueries(\n filters: AdHocFilterWithLabels[],\n queries: SceneDataQuery[],\n groupByKeys?: string[]\n ): Promise<DrilldownsApplicability[] | undefined> {\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getDrilldownsApplicability) {\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n\n // @ts-expect-error (temporary till we update grafana/data)\n return await ds.getDrilldownsApplicability({\n filters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...(groupByKeys && groupByKeys.length > 0 ? { groupByKeys } : {}),\n ...getEnrichedFiltersRequest(this),\n });\n }\n\n public async _verifyApplicability() {\n if (!this.state.applicabilityEnabled) {\n return;\n }\n\n const allFilters = [...this.state.filters, ...(this.state.originFilters ?? [])];\n const filters = allFilters.filter((f) => !isGroupByFilter(f));\n const groupByKeys = this.state.enableGroupBy\n ? allFilters.filter((f) => isGroupByFilter(f)).map((f) => f.key)\n : undefined;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n const response = await this.getFiltersApplicabilityForQueries(filters, queries ?? [], groupByKeys);\n\n if (!response) {\n return;\n }\n\n const responseMap = new Map<string, DrilldownsApplicability>();\n response.forEach((filter: DrilldownsApplicability) => {\n responseMap.set(`${filter.key}${filter.origin ? `-${filter.origin}` : ''}`, filter);\n });\n\n const update = {\n filters: [...this.state.filters],\n originFilters: [...(this.state.originFilters ?? [])],\n };\n\n update.filters.forEach((f) => {\n const filter = responseMap.get(f.key);\n\n if (filter) {\n f.nonApplicable = !filter.applicable;\n f.nonApplicableReason = filter.reason;\n }\n });\n\n update.originFilters?.forEach((f) => {\n const filter = responseMap.get(`${f.key}-${f.origin}`);\n\n if (filter) {\n if (!f.matchAllFilter) {\n f.nonApplicable = !filter.applicable;\n f.nonApplicableReason = filter.reason;\n }\n\n const originalValue = this._originalValues.get(originalValueKey(f));\n if (originalValue) {\n originalValue.nonApplicable = !filter.applicable;\n originalValue.nonApplicableReason = filter?.reason;\n }\n }\n });\n\n this.setState(update);\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n if (this.state.defaultKeys) {\n return this.state.defaultKeys.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const applicableOriginFilters =\n this.state.originFilters?.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)) ?? [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(this.state.baseFilters ?? [])\n .concat(applicableOriginFilters);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible group-by keys.\n * @param currentKey - The current key being edited (excluded from filters)\n * @param queries - Optional queries to scope the key lookup. When provided, these are used\n * instead of discovering all queries in the scene via getQueriesForVariables.\n */\n public async _getGroupByKeys(\n currentKey: string | null,\n queries?: SceneDataQuery[]\n ): Promise<Array<SelectableValue<string>>> {\n if (!this.state.enableGroupBy) {\n return [];\n }\n\n const override = await this.state.getGroupByKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n // @ts-expect-error (TODO: remove after upgrading with https://github.com/grafana/grafana/pull/118270)\n if (!ds || !ds.getGroupByKeys) {\n return override ? dataFromResponse(override.values).map(toSelectableValue) : [];\n }\n\n const applicableOriginFilters =\n this.state.originFilters?.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)) ?? [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(this.state.baseFilters ?? [])\n .concat(applicableOriginFilters);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queriesForKeys =\n queries ?? (this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined);\n\n // @ts-expect-error (TODO: remove after upgrading with https://github.com/grafana/grafana/pull/118270)\n const response = await ds.getGroupByKeys({\n filters: otherFilters,\n queries: queriesForKeys,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocFilterWithLabels): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n const originFilters =\n this.state.originFilters?.filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f)) ??\n [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(originFilters);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n let scopes = sceneGraph.getScopes(this);\n\n // if current filter is a scope originated one we need to filter out\n // filters with same key in scopes prop, similar to how we do in adhocFilters prop\n if (filter.origin === 'scope') {\n scopes = scopes?.map((scope) => {\n return {\n ...scope,\n spec: {\n ...scope.spec,\n filters: scope.spec.filters?.filter((f) => f.key !== filter.key),\n },\n };\n });\n }\n\n const response = await ds.getTagValues({\n key: filter.key,\n filters: otherFilters,\n timeRange,\n queries,\n scopes,\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let values = dataFromResponse(response);\n if (override) {\n values = values.concat(dataFromResponse(override.values));\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({\n _wip: { key: '', value: '', operator: '=', condition: '' },\n });\n }\n\n public _getOperators() {\n const { supportsMultiValueOperators, allowCustomValue = true } = this.state;\n\n return OPERATORS.filter(({ isMulti, isRegex }) => {\n if (!supportsMultiValueOperators && isMulti) {\n return false;\n }\n if (!allowCustomValue && isRegex) {\n return false;\n }\n return true;\n }).map<SelectableValue<string>>(({ value, description }) => ({\n label: value,\n value,\n description,\n }));\n }\n}\n\nfunction renderExpression(\n builder: AdHocVariableExpressionBuilderFn | undefined,\n filters: AdHocFilterWithLabels[] | undefined\n) {\n return (builder ?? renderPrometheusLabelFilters)(\n filters?.filter((f) => isFilterApplicable(f) && !isGroupByFilter(f)) ?? []\n );\n}\n\nfunction getGroupByKeys(filters: AdHocFilterWithLabels[]): string[] {\n return filters\n .filter((f) => isGroupByFilter(f) && isFilterComplete(f) && !f.dismissedGroupBy)\n .map((f) => f.key)\n .sort();\n}\n\nfunction haveGroupByKeysChanged(prev: AdHocFilterWithLabels[], next: AdHocFilterWithLabels[]): boolean {\n const prevKeys = getGroupByKeys(prev);\n const nextKeys = getGroupByKeys(next);\n\n if (prevKeys.length !== nextKeys.length) {\n return true;\n }\n\n return prevKeys.some((key, i) => key !== nextKeys[i]);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n // Create controller adapter for combobox mode\n const controller = useMemo(\n () => (model.state.layout === 'combobox' ? new AdHocFiltersVariableController(model) : undefined),\n [model]\n );\n\n if (controller) {\n return <AdHocFiltersComboboxRenderer controller={controller} />;\n }\n\n return (\n <div className={styles.wrapper}>\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" addFilterButtonText={addFilterButtonText} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-end',\n columnGap: theme.spacing(2),\n rowGap: theme.spacing(1),\n }),\n});\n\nexport function toSelectableValue(input: MetricFindValue): SelectableValue<string> {\n const { text, value } = input;\n const result: SelectableValue<string> = {\n // converting text to string due to some edge cases where it can be a number\n // TODO: remove once https://github.com/grafana/grafana/issues/99021 is closed\n label: String(text),\n value: String(value ?? text),\n };\n\n if ('group' in input) {\n result.group = input.group;\n }\n\n if ('meta' in input) {\n result.meta = input.meta;\n }\n\n return result;\n}\n\nexport function isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\n}\n\nexport const GROUP_BY_OPERATOR = 'groupBy';\nexport const VALUE_KEY_DELIMITER = '::';\n\nexport function isGroupByFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === GROUP_BY_OPERATOR;\n}\n\nexport function isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return filter.key !== '' && filter.operator !== '' && (isGroupByFilter(filter) || filter.value !== '');\n}\n\nexport function isFilterApplicable(filter: AdHocFilterWithLabels): boolean {\n return !filter.nonApplicable;\n}\n\nfunction findLastAdhocFilterIndex(filters: AdHocFilterWithLabels[]): number {\n for (let i = filters.length - 1; i >= 0; i--) {\n if (!isGroupByFilter(filters[i])) {\n return i;\n }\n }\n return -1;\n}\n\nfunction originalValueKey({ key, origin, operator }: { key: string; origin?: string; operator: string }): string {\n return operator === GROUP_BY_OPERATOR\n ? `${key}${VALUE_KEY_DELIMITER}${origin}${VALUE_KEY_DELIMITER}${GROUP_BY_OPERATOR}`\n : `${key}${VALUE_KEY_DELIMITER}${origin}`;\n}\n\nexport function isMultiValueOperator(operatorValue: string): boolean {\n const operator = OPERATORS.find((o) => o.value === operatorValue);\n if (!operator) {\n // default to false if operator is not found\n return false;\n }\n return Boolean(operator.isMulti);\n}\n"],"names":["updatedFilters","_a"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8260,6 +8260,10 @@ function AdHocFiltersRecommendationsRenderer({ model }) {
8260
8260
  const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
8261
8261
  if (!exists) {
8262
8262
  model.addFilterToParent(filter);
8263
+ runtime.reportInteraction("grafana_unified_drilldown_recent_filter_applied", {
8264
+ key: filter.key,
8265
+ operator: filter.operator
8266
+ });
8263
8267
  }
8264
8268
  }
8265
8269
  }));
@@ -8269,6 +8273,10 @@ function AdHocFiltersRecommendationsRenderer({ model }) {
8269
8273
  const exists = filters.some((f) => f.key === filter.key && f.value === filter.value);
8270
8274
  if (!exists) {
8271
8275
  model.addFilterToParent(filter);
8276
+ runtime.reportInteraction("grafana_unified_drilldown_recommended_filter_applied", {
8277
+ key: filter.key,
8278
+ operator: filter.operator
8279
+ });
8272
8280
  }
8273
8281
  }
8274
8282
  }));
@@ -8287,12 +8295,18 @@ function AdHocGroupByRecommendationsRenderer({ model }) {
8287
8295
  label: `${groupBy.value}`,
8288
8296
  onClick: () => {
8289
8297
  model.addGroupByToParent(String(groupBy.value));
8298
+ runtime.reportInteraction("grafana_unified_drilldown_recent_groupby_applied", {
8299
+ key: String(groupBy.value)
8300
+ });
8290
8301
  }
8291
8302
  }));
8292
8303
  const recommendedDrilldowns = recommendedGrouping == null ? void 0 : recommendedGrouping.map((groupBy) => ({
8293
8304
  label: `${groupBy.value}`,
8294
8305
  onClick: () => {
8295
8306
  model.addGroupByToParent(String(groupBy.value));
8307
+ runtime.reportInteraction("grafana_unified_drilldown_recommended_groupby_applied", {
8308
+ key: String(groupBy.value)
8309
+ });
8296
8310
  }
8297
8311
  }));
8298
8312
  return /* @__PURE__ */ React__default.default.createElement(
@@ -9062,6 +9076,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
9062
9076
  };
9063
9077
  (_c = this._recommendations) == null ? void 0 : _c.storeRecentGrouping(key);
9064
9078
  this.updateFilters([...this.state.filters, newFilter]);
9079
+ runtime.reportInteraction("grafana_unified_drilldown_groupby_added", { key });
9065
9080
  }
9066
9081
  restoreOriginalFilter(filter) {
9067
9082
  var _a;
@@ -9081,6 +9096,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
9081
9096
  operator: originalFilter.operator,
9082
9097
  nonApplicable: originalFilter.nonApplicable
9083
9098
  });
9099
+ runtime.reportInteraction("grafana_unified_drilldown_filter_restored", {
9100
+ key: filter.key,
9101
+ origin: filter.origin
9102
+ });
9084
9103
  }
9085
9104
  /**
9086
9105
  * Get the original value for an origin filter before any user modifications.
@@ -9165,19 +9184,26 @@ class AdHocFiltersVariable extends SceneObjectBase {
9165
9184
  originFilters: restoredOrigins,
9166
9185
  filters: nonGroupByFilters
9167
9186
  });
9187
+ runtime.reportInteraction("grafana_unified_drilldown_groupby_restored");
9168
9188
  }
9169
9189
  /**
9170
9190
  * Clear all user-added filters and restore origin filters to their original values.
9171
9191
  */
9172
9192
  clearAll() {
9173
- var _a;
9174
- (_a = this.state.originFilters) == null ? void 0 : _a.forEach((filter) => {
9193
+ var _a, _b, _c;
9194
+ const filtersCount = this.state.filters.length;
9195
+ const restorableCount = (_b = (_a = this.state.originFilters) == null ? void 0 : _a.filter((f) => f.restorable && !isGroupByFilter(f)).length) != null ? _b : 0;
9196
+ (_c = this.state.originFilters) == null ? void 0 : _c.forEach((filter) => {
9175
9197
  if (filter.restorable && !isGroupByFilter(filter)) {
9176
9198
  this.restoreOriginalFilter(filter);
9177
9199
  }
9178
9200
  });
9179
9201
  this.restoreOriginalGroupBy();
9180
9202
  this.setState({ filters: [] });
9203
+ runtime.reportInteraction("grafana_unified_drilldown_clear_all", {
9204
+ filtersCleared: filtersCount,
9205
+ originsRestored: restorableCount
9206
+ });
9181
9207
  }
9182
9208
  getValue(fieldPath) {
9183
9209
  if (fieldPath === ORIGIN_FILTERS_KEY) {
@@ -9250,11 +9276,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
9250
9276
  }
9251
9277
  if (filter === _wip) {
9252
9278
  if ("value" in update && update["value"] !== "") {
9279
+ const newFilter = { ..._wip, ...update };
9253
9280
  this.setState({
9254
- filters: [...filters, { ..._wip, ...update }],
9281
+ filters: [...filters, newFilter],
9255
9282
  _wip: void 0
9256
9283
  });
9257
- this.verifyApplicabilityAndStoreRecentFilter({ ..._wip, ...update });
9284
+ this.verifyApplicabilityAndStoreRecentFilter(newFilter);
9285
+ runtime.reportInteraction("grafana_unified_drilldown_filter_added", {
9286
+ key: newFilter.key,
9287
+ operator: newFilter.operator
9288
+ });
9258
9289
  } else {
9259
9290
  this.setState({ _wip: { ...filter, ...update } });
9260
9291
  }
@@ -9284,6 +9315,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
9284
9315
  return f;
9285
9316
  });
9286
9317
  this.setState({ originFilters: updatedOrigins });
9318
+ runtime.reportInteraction("grafana_unified_drilldown_groupby_removed", {
9319
+ key: filter.key,
9320
+ origin: filter.origin
9321
+ });
9287
9322
  } else {
9288
9323
  this._updateFilter(filter, {
9289
9324
  operator: "=~",
@@ -9294,6 +9329,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
9294
9329
  nonApplicable: false,
9295
9330
  restorable: true
9296
9331
  });
9332
+ runtime.reportInteraction("grafana_unified_drilldown_filter_match_all", {
9333
+ key: filter.key,
9334
+ origin: filter.origin
9335
+ });
9297
9336
  }
9298
9337
  }
9299
9338
  _removeFilter(filter) {
@@ -9303,8 +9342,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
9303
9342
  }
9304
9343
  const queryController = getQueryController(this);
9305
9344
  queryController == null ? void 0 : queryController.startProfile(FILTER_REMOVED_INTERACTION);
9345
+ const isGroupBy = isGroupByFilter(filter);
9306
9346
  this.setState({ filters: this.state.filters.filter((f) => f !== filter) });
9307
9347
  this._debouncedVerifyApplicability();
9348
+ runtime.reportInteraction(
9349
+ isGroupBy ? "grafana_unified_drilldown_groupby_removed" : "grafana_unified_drilldown_filter_removed",
9350
+ { key: filter.key }
9351
+ );
9308
9352
  }
9309
9353
  _removeLastFilter() {
9310
9354
  const filterToRemove = this.state.filters.at(-1);