@grafana/scenes 8.9.2 → 8.9.3

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,17 @@
1
+ # v8.9.3 (Thu Jul 02 2026)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - feat(variables): per-key interpolation for ad hoc filter variables [#1553](https://github.com/grafana/scenes/pull/1553) ([@dprokop](https://github.com/dprokop))
6
+ - Deps: Unpin production dependencies in `@grafana/scenes` + `@grafana/scenes-react` [#1561](https://github.com/grafana/scenes/pull/1561) ([@MattIPv4](https://github.com/MattIPv4))
7
+
8
+ #### Authors: 2
9
+
10
+ - Dominik Prokop ([@dprokop](https://github.com/dprokop))
11
+ - Matt Cowley ([@MattIPv4](https://github.com/MattIPv4))
12
+
13
+ ---
14
+
1
15
  # v8.9.2 (Tue Jun 30 2026)
2
16
 
3
17
  #### 🐛 Bug Fix
@@ -14,7 +14,7 @@ import { css } from '@emotion/css';
14
14
  import { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest.js';
15
15
  import { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js';
16
16
  import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
17
- import { debounce, isEqual } from 'lodash';
17
+ import { debounce, isEqual, toPath } from 'lodash';
18
18
  import { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes.js';
19
19
  import { VariableDependencyConfig } from '../VariableDependencyConfig.js';
20
20
  import { getQueryController } from '../../core/sceneGraph/getQueryController.js';
@@ -426,8 +426,53 @@ class AdHocFiltersVariable extends SceneObjectBase {
426
426
  ...originFilters.filter((filter) => !filter.nonApplicable).map((filter) => toArray(filter).map(escapeOriginFilterUrlDelimiters).join("|").concat(`#${filter.origin}`))
427
427
  ];
428
428
  }
429
+ if (fieldPath) {
430
+ const parsed = parseFilterFieldPath(fieldPath);
431
+ if (parsed) {
432
+ return this.getFilterValueByKey(parsed.key, parsed.accessor);
433
+ }
434
+ if (process.env.NODE_ENV !== "production") {
435
+ console.warn(
436
+ `[AdHocFiltersVariable] "${fieldPath}" is not a per-key accessor. Use bracket-quoted key syntax, e.g. \${${this.state.name}["${fieldPath}"]}. Falling back to the whole filter expression.`
437
+ );
438
+ }
439
+ }
429
440
  return this.state.filterExpression;
430
441
  }
442
+ /**
443
+ * Resolves a single filter key (and optional accessor) to its value(s). Candidate filters are
444
+ * the combined origin + user filters, excluding groupBy and WIP filters - the same set used to
445
+ * build `filterExpression`. Returns:
446
+ * - value accessor (default): the flattened value(s) of all filters matching `key` - a scalar
447
+ * string when exactly one value resolves, otherwise a `string[]` for the formatter to render.
448
+ * - `operator` accessor: the operator token of the first matching filter.
449
+ * - any other accessor, or a missing key: an empty string.
450
+ */
451
+ getFilterValueByKey(key, accessor) {
452
+ const { originFilters, filters, _wip } = this.state;
453
+ const matches = [...originFilters != null ? originFilters : [], ...filters].filter(
454
+ (f) => f !== _wip && !isGroupByFilter(f) && f.key === key
455
+ );
456
+ if (matches.length === 0) {
457
+ return "";
458
+ }
459
+ if (accessor === "operator") {
460
+ return matches[0].operator;
461
+ }
462
+ if (accessor !== void 0) {
463
+ return "";
464
+ }
465
+ const values = matches.flatMap(
466
+ (f) => {
467
+ var _a;
468
+ return isMultiValueOperator(f.operator) ? (_a = f.values) != null ? _a : [] : f.value != null ? [f.value] : [];
469
+ }
470
+ );
471
+ if (values.length === 1) {
472
+ return values[0];
473
+ }
474
+ return values;
475
+ }
431
476
  _updateFilter(filter, update) {
432
477
  var _a, _b, _c, _d, _e, _f, _g, _h;
433
478
  const { originFilters, filters, _wip } = this.state;
@@ -933,6 +978,16 @@ function findLastAdhocFilterIndex(filters) {
933
978
  function originalValueKey({ key, origin, operator }) {
934
979
  return operator === GROUP_BY_OPERATOR ? `${key}${VALUE_KEY_DELIMITER}${origin}${VALUE_KEY_DELIMITER}${GROUP_BY_OPERATOR}` : `${key}${VALUE_KEY_DELIMITER}${origin}`;
935
980
  }
981
+ function parseFilterFieldPath(fieldPath) {
982
+ if (fieldPath.charAt(0) !== "[") {
983
+ return null;
984
+ }
985
+ const segments = toPath(fieldPath);
986
+ if (segments.length === 0) {
987
+ return null;
988
+ }
989
+ return { key: segments[0], accessor: segments[1] };
990
+ }
936
991
  function isMultiValueOperator(operatorValue) {
937
992
  const operator = OPERATORS.find((o) => o.value === operatorValue);
938
993
  if (!operator) {
@@ -941,5 +996,5 @@ function isMultiValueOperator(operatorValue) {
941
996
  return Boolean(operator.isMulti);
942
997
  }
943
998
 
944
- export { AdHocFiltersVariable, AdHocFiltersVariableRenderer, GROUP_BY_OPERATOR, OPERATORS, VALUE_KEY_DELIMITER, isFilterApplicable, isFilterComplete, isGroupByFilter, isMatchAllFilter, isMultiValueOperator, toSelectableValue$1 as toSelectableValue };
999
+ export { AdHocFiltersVariable, AdHocFiltersVariableRenderer, GROUP_BY_OPERATOR, OPERATORS, VALUE_KEY_DELIMITER, isFilterApplicable, isFilterComplete, isGroupByFilter, isMatchAllFilter, isMultiValueOperator, parseFilterFieldPath, toSelectableValue$1 as toSelectableValue };
945
1000
  //# sourceMappingURL=AdHocFiltersVariable.js.map
@@ -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 { getAdHocFilterInteractionHandler } from '../../core/sceneGraph/getReportInteractionHandler';\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 * @deprecated The `layout` property is deprecated and scheduled for removal before grafana v14.\n * The `'horizontal'` and `'vertical'` options are no longer supported.\n * Use `'combobox'` instead or remove this property entirely.\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 onAnyVariableChanged: () => this._drainPendingVariableWaits(),\n });\n\n /** Resolvers waiting for in-scope variables to finish loading before a data source call. */\n private _pendingVariableWaits: Array<() => void> = [];\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 {\n collapsible,\n defaultKeys,\n drilldownRecommendationsEnabled,\n originFilters: rawOriginFilters,\n ...restState\n } = state;\n const behaviors = state.$behaviors ?? [];\n const recommendations = state.drilldownRecommendationsEnabled ? new AdHocFiltersRecommendations() : undefined;\n\n if (recommendations) {\n behaviors.push(recommendations);\n }\n\n // validate origin filter completion\n const originFilters = rawOriginFilters?.filter(isFilterComplete);\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, [...(originFilters ?? []), ...(state.filters ?? [])]),\n ...restState,\n originFilters,\n ...(behaviors.length > 0 && { $behaviors: behaviors }),\n ...(collapsible !== undefined && { collapsible }),\n ...(drilldownRecommendationsEnabled !== undefined && { drilldownRecommendationsEnabled }),\n ...(defaultKeys && { defaultKeys }),\n layout: state.layout || 'combobox',\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\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\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 getAdHocFilterInteractionHandler(this)?.onGroupByAdded?.({ 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 getAdHocFilterInteractionHandler(this)?.onFilterRestored?.({ key: filter.key, origin: filter.origin });\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.values.length ? 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 getAdHocFilterInteractionHandler(this)?.onGroupByRestored?.();\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 getAdHocFilterInteractionHandler(this)?.onClearAll?.({\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\n .filter((filter) => !filter.nonApplicable)\n .map((filter) => toArray(filter).map(escapeOriginFilterUrlDelimiters).join('|').concat(`#${filter.origin}`)),\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 getAdHocFilterInteractionHandler(this)?.onFilterAdded?.({ key: newFilter.key, operator: newFilter.operator });\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 getAdHocFilterInteractionHandler(this)?.onGroupByRemoved?.({ key: filter.key, origin: filter.origin });\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 getAdHocFilterInteractionHandler(this)?.onFilterMatchAll?.({ key: filter.key, origin: filter.origin });\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 const handler = getAdHocFilterInteractionHandler(this);\n if (isGroupBy) {\n handler?.onGroupByRemoved?.({ key: filter.key });\n } else {\n handler?.onFilterRemoved?.({ 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 * Wait until template variables in scope have finished loading.\n * Prevents data source calls like getTagKeys\n * from running with unresolved `$var` references in the panel queries we forward.\n */\n private _waitForVariables(): Promise<void> {\n if (!this._isAnyInScopeVariableLoading()) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n this._pendingVariableWaits.push(resolve);\n });\n }\n\n private _isAnyInScopeVariableLoading(): boolean {\n const variableSet = sceneGraph.getVariables(this);\n return variableSet.state.variables.some((v) => variableSet.isVariableLoadingOrWaitingToUpdate(v));\n }\n\n private _drainPendingVariableWaits() {\n if (this._pendingVariableWaits.length === 0 || this._isAnyInScopeVariableLoading()) {\n return;\n }\n const waiters = this._pendingVariableWaits;\n this._pendingVariableWaits = [];\n waiters.forEach((resolve) => resolve());\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 await this._waitForVariables();\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 await this._waitForVariables();\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 await this._waitForVariables();\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 (\n filter.key !== '' &&\n filter.operator !== '' &&\n (isGroupByFilter(filter) || (filter.value != null && filter.value !== ''))\n );\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","toSelectableValue","_a","getStyles"],"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 } from '@grafana/runtime';\nimport { getAdHocFilterInteractionHandler } from '../../core/sceneGraph/getReportInteractionHandler';\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, toPath } 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 * @deprecated The `layout` property is deprecated and scheduled for removal before grafana v14.\n * The `'horizontal'` and `'vertical'` options are no longer supported.\n * Use `'combobox'` instead or remove this property entirely.\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 onAnyVariableChanged: () => this._drainPendingVariableWaits(),\n });\n\n /** Resolvers waiting for in-scope variables to finish loading before a data source call. */\n private _pendingVariableWaits: Array<() => void> = [];\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 {\n collapsible,\n defaultKeys,\n drilldownRecommendationsEnabled,\n originFilters: rawOriginFilters,\n ...restState\n } = state;\n const behaviors = state.$behaviors ?? [];\n const recommendations = state.drilldownRecommendationsEnabled ? new AdHocFiltersRecommendations() : undefined;\n\n if (recommendations) {\n behaviors.push(recommendations);\n }\n\n // validate origin filter completion\n const originFilters = rawOriginFilters?.filter(isFilterComplete);\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, [...(originFilters ?? []), ...(state.filters ?? [])]),\n ...restState,\n originFilters,\n ...(behaviors.length > 0 && { $behaviors: behaviors }),\n ...(collapsible !== undefined && { collapsible }),\n ...(drilldownRecommendationsEnabled !== undefined && { drilldownRecommendationsEnabled }),\n ...(defaultKeys && { defaultKeys }),\n layout: state.layout || 'combobox',\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\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\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 getAdHocFilterInteractionHandler(this)?.onGroupByAdded?.({ 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 getAdHocFilterInteractionHandler(this)?.onFilterRestored?.({ key: filter.key, origin: filter.origin });\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.values.length ? 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 getAdHocFilterInteractionHandler(this)?.onGroupByRestored?.();\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 getAdHocFilterInteractionHandler(this)?.onClearAll?.({\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\n .filter((filter) => !filter.nonApplicable)\n .map((filter) => toArray(filter).map(escapeOriginFilterUrlDelimiters).join('|').concat(`#${filter.origin}`)),\n ];\n }\n\n if (fieldPath) {\n const parsed = parseFilterFieldPath(fieldPath);\n\n if (parsed) {\n return this.getFilterValueByKey(parsed.key, parsed.accessor);\n }\n\n // A dot-only path (`${filters.env}`) is not a per-key accessor; bracket syntax is the\n // documented contract. Warn in dev builds, then fall through to whole-expression behavior.\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[AdHocFiltersVariable] \"${fieldPath}\" is not a per-key accessor. ` +\n `Use bracket-quoted key syntax, e.g. \\${${this.state.name}[\"${fieldPath}\"]}. ` +\n `Falling back to the whole filter expression.`\n );\n }\n }\n\n return this.state.filterExpression;\n }\n\n /**\n * Resolves a single filter key (and optional accessor) to its value(s). Candidate filters are\n * the combined origin + user filters, excluding groupBy and WIP filters - the same set used to\n * build `filterExpression`. Returns:\n * - value accessor (default): the flattened value(s) of all filters matching `key` - a scalar\n * string when exactly one value resolves, otherwise a `string[]` for the formatter to render.\n * - `operator` accessor: the operator token of the first matching filter.\n * - any other accessor, or a missing key: an empty string.\n */\n private getFilterValueByKey(key: string, accessor?: string): VariableValue {\n const { originFilters, filters, _wip } = this.state;\n\n const matches = [...(originFilters ?? []), ...filters].filter(\n (f) => f !== _wip && !isGroupByFilter(f) && f.key === key\n );\n\n if (matches.length === 0) {\n return '';\n }\n\n if (accessor === 'operator') {\n return matches[0].operator;\n }\n\n if (accessor !== undefined) {\n // Unrecognized accessor (e.g. `.foo`).\n return '';\n }\n\n const values = matches.flatMap((f) =>\n isMultiValueOperator(f.operator) ? f.values ?? [] : f.value != null ? [f.value] : []\n );\n\n if (values.length === 1) {\n return values[0];\n }\n\n return values;\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 getAdHocFilterInteractionHandler(this)?.onFilterAdded?.({ key: newFilter.key, operator: newFilter.operator });\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 getAdHocFilterInteractionHandler(this)?.onGroupByRemoved?.({ key: filter.key, origin: filter.origin });\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 getAdHocFilterInteractionHandler(this)?.onFilterMatchAll?.({ key: filter.key, origin: filter.origin });\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 const handler = getAdHocFilterInteractionHandler(this);\n if (isGroupBy) {\n handler?.onGroupByRemoved?.({ key: filter.key });\n } else {\n handler?.onFilterRemoved?.({ 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 * Wait until template variables in scope have finished loading.\n * Prevents data source calls like getTagKeys\n * from running with unresolved `$var` references in the panel queries we forward.\n */\n private _waitForVariables(): Promise<void> {\n if (!this._isAnyInScopeVariableLoading()) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n this._pendingVariableWaits.push(resolve);\n });\n }\n\n private _isAnyInScopeVariableLoading(): boolean {\n const variableSet = sceneGraph.getVariables(this);\n return variableSet.state.variables.some((v) => variableSet.isVariableLoadingOrWaitingToUpdate(v));\n }\n\n private _drainPendingVariableWaits() {\n if (this._pendingVariableWaits.length === 0 || this._isAnyInScopeVariableLoading()) {\n return;\n }\n const waiters = this._pendingVariableWaits;\n this._pendingVariableWaits = [];\n waiters.forEach((resolve) => resolve());\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 await this._waitForVariables();\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 await this._waitForVariables();\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 await this._waitForVariables();\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 (\n filter.key !== '' &&\n filter.operator !== '' &&\n (isGroupByFilter(filter) || (filter.value != null && filter.value !== ''))\n );\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\n/**\n * Parses a bracket-quoted filter field path into a filter key and optional accessor.\n *\n * Only paths whose first segment is bracket-quoted (`[\"env\"]`, `['env']`, `[\"env\"].operator`,\n * `[\"a\"][\"b\"]`) are treated as per-key accessors. A plain dot path (`env`, `a.b`) returns null so\n * the caller falls through to legacy whole-expression behavior. The first lodash path segment is\n * the filter key; an optional second segment is the accessor.\n */\nexport function parseFilterFieldPath(fieldPath: string): { key: string; accessor?: string } | null {\n // Bracket syntax is the documented contract for per-key access. A dot-first path is legacy.\n if (fieldPath.charAt(0) !== '[') {\n return null;\n }\n\n const segments = toPath(fieldPath);\n\n if (segments.length === 0) {\n return null;\n }\n\n return { key: segments[0], accessor: segments[1] };\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","toSelectableValue","_a","getStyles"],"mappings":"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"}
@@ -2,7 +2,7 @@ const ALL_VARIABLE_TEXT = "All";
2
2
  const ALL_VARIABLE_VALUE = "$__all";
3
3
  const AUTO_VARIABLE_TEXT = "Auto";
4
4
  const AUTO_VARIABLE_VALUE = "$__auto";
5
- const VARIABLE_REGEX = /\$(\w+)|\[\[(\w+?)(?::(\w+))?\]\]|\${(\w+)(?:\.([^:^\}]+))?(?::([^\}]+))?}/g;
5
+ const VARIABLE_REGEX = /\$(\w+)|\[\[(\w+?)(?::(\w+))?\]\]|\${(\w+)((?:\.[^:^{}\[\]]+|\["[^"]*"\]|\['[^']*'\]|\[[^\]"']*\])*)(?::([^}]+))?}/g;
6
6
  const SEARCH_FILTER_VARIABLE = "__searchFilter";
7
7
  const SCOPES_VARIABLE_NAME = "__scopes";
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../src/variables/constants.ts"],"sourcesContent":["export const ALL_VARIABLE_TEXT = 'All';\nexport const ALL_VARIABLE_VALUE = '$__all';\nexport const NONE_VARIABLE_TEXT = 'None';\nexport const NONE_VARIABLE_VALUE = '';\nexport const AUTO_VARIABLE_TEXT = 'Auto';\nexport const AUTO_VARIABLE_VALUE = '$__auto';\n\n// Grafana core source: https://github.com/grafana/grafana/blob/main/public/app/features/variables/utils.ts#L23\n/*\n * This regex matches 3 types of variable reference with an optional format specifier\n * \\$(\\w+) $var1\n * \\[\\[(\\w+?)(?::(\\w+))?\\]\\] [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(?::(\\w+))?} ${var3} or ${var3:fmt3}\n */\nexport const VARIABLE_REGEX = /\\$(\\w+)|\\[\\[(\\w+?)(?::(\\w+))?\\]\\]|\\${(\\w+)(?:\\.([^:^\\}]+))?(?::([^\\}]+))?}/g;\nexport const SEARCH_FILTER_VARIABLE = '__searchFilter';\nexport const SCOPES_VARIABLE_NAME = '__scopes';\n"],"names":[],"mappings":"AAAO,MAAM,iBAAA,GAAoB;AAC1B,MAAM,kBAAA,GAAqB;AAG3B,MAAM,kBAAA,GAAqB;AAC3B,MAAM,mBAAA,GAAsB;AAS5B,MAAM,cAAA,GAAiB;AACvB,MAAM,sBAAA,GAAyB;AAC/B,MAAM,oBAAA,GAAuB;;;;"}
1
+ {"version":3,"file":"constants.js","sources":["../../../src/variables/constants.ts"],"sourcesContent":["export const ALL_VARIABLE_TEXT = 'All';\nexport const ALL_VARIABLE_VALUE = '$__all';\nexport const NONE_VARIABLE_TEXT = 'None';\nexport const NONE_VARIABLE_VALUE = '';\nexport const AUTO_VARIABLE_TEXT = 'Auto';\nexport const AUTO_VARIABLE_VALUE = '$__auto';\n\n// Grafana core source: https://github.com/grafana/grafana/blob/main/public/app/features/variables/utils.ts#L23\n/*\n * This regex matches 3 types of variable reference with an optional field path and format specifier\n * \\$(\\w+) $var1\n * \\[\\[(\\w+?)(?::(\\w+))?\\]\\] [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(fieldPath)?(:fmt3)?} ${var3}, ${var3.field}, ${var3[\"key\"]}, ${var3[\"key\"].operator}, ${var3:fmt3}\n *\n * The fieldPath capture (group 5) is a `*`-repeated sequence of four mutually exclusive,\n * first-character-anchored alternatives:\n * \\.[^:^{}\\[\\]]+ a legacy dot segment (.field, .1, .a.b). Excludes { } [ ] so it can never\n * swallow a bracket segment or a brace; it still includes the leading dot.\n * \\[\"[^\"]*\"\\] a double-quoted bracket key. The body allows dots, spaces, =, |, etc.\n * \\['[^']*'\\] the single-quoted variant.\n * \\[[^\\]\"']*\\] an unquoted bracket index/key (`[0]`, `[1]`). Preserves the legacy data-macro\n * forms (`${__data.fields[1]}`, `${__data.fields[0].text}`) that the old regex\n * matched as part of a permissive dot segment.\n * Because the dot alternative keeps its leading `.`, the captured fieldPath for the legacy\n * `${var.field}` form is `.field` (not `field`); sceneInterpolator strips one leading `.` so\n * downstream consumers (getValue / getFieldAccessor) see the same string as before. Bracket\n * keys (`[\"env\"]`, `[\"env\"].operator`) are passed through untouched.\n */\nexport const VARIABLE_REGEX =\n /\\$(\\w+)|\\[\\[(\\w+?)(?::(\\w+))?\\]\\]|\\${(\\w+)((?:\\.[^:^{}\\[\\]]+|\\[\"[^\"]*\"\\]|\\['[^']*'\\]|\\[[^\\]\"']*\\])*)(?::([^}]+))?}/g;\nexport const SEARCH_FILTER_VARIABLE = '__searchFilter';\nexport const SCOPES_VARIABLE_NAME = '__scopes';\n"],"names":[],"mappings":"AAAO,MAAM,iBAAA,GAAoB;AAC1B,MAAM,kBAAA,GAAqB;AAG3B,MAAM,kBAAA,GAAqB;AAC3B,MAAM,mBAAA,GAAsB;AAuB5B,MAAM,cAAA,GACX;AACK,MAAM,sBAAA,GAAyB;AAC/B,MAAM,oBAAA,GAAuB;;;;"}
@@ -11,9 +11,10 @@ function sceneInterpolator(sceneObject, target, scopedVars, format, interpolatio
11
11
  return target != null ? target : "";
12
12
  }
13
13
  VARIABLE_REGEX.lastIndex = 0;
14
- return target.replace(VARIABLE_REGEX, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {
14
+ return target.replace(VARIABLE_REGEX, (match, var1, var2, fmt2, var3, rawFieldPath, fmt3) => {
15
15
  const variableName = var1 || var2 || var3;
16
16
  const fmt = fmt2 || fmt3 || format;
17
+ const fieldPath = rawFieldPath && rawFieldPath.charCodeAt(0) === 46 ? rawFieldPath.slice(1) : rawFieldPath || void 0;
17
18
  const variable = lookupFormatVariable(variableName, match, scopedVars, sceneObject);
18
19
  if (!variable) {
19
20
  if (interpolations) {