@grafana/scenes 8.4.0 → 8.5.0
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.
|
@@ -110,8 +110,11 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
110
110
|
/** Needed for scopes dependency */
|
|
111
111
|
this._variableDependency = new VariableDependencyConfig(this, {
|
|
112
112
|
dependsOnScopes: true,
|
|
113
|
-
onReferencedVariableValueChanged: () => this._updateScopesFilters()
|
|
113
|
+
onReferencedVariableValueChanged: () => this._updateScopesFilters(),
|
|
114
|
+
onAnyVariableChanged: () => this._drainPendingVariableWaits()
|
|
114
115
|
});
|
|
116
|
+
/** Resolvers waiting for in-scope variables to finish loading before a data source call. */
|
|
117
|
+
this._pendingVariableWaits = [];
|
|
115
118
|
this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
|
|
116
119
|
this._debouncedVerifyApplicability = debounce(this._verifyApplicability, 100);
|
|
117
120
|
this._activationHandler = () => {
|
|
@@ -672,6 +675,31 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
672
675
|
});
|
|
673
676
|
this.setState(update);
|
|
674
677
|
}
|
|
678
|
+
/**
|
|
679
|
+
* Wait until template variables in scope have finished loading.
|
|
680
|
+
* Prevents data source calls like getTagKeys
|
|
681
|
+
* from running with unresolved `$var` references in the panel queries we forward.
|
|
682
|
+
*/
|
|
683
|
+
_waitForVariables() {
|
|
684
|
+
if (!this._isAnyInScopeVariableLoading()) {
|
|
685
|
+
return Promise.resolve();
|
|
686
|
+
}
|
|
687
|
+
return new Promise((resolve) => {
|
|
688
|
+
this._pendingVariableWaits.push(resolve);
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
_isAnyInScopeVariableLoading() {
|
|
692
|
+
const variableSet = sceneGraph.getVariables(this);
|
|
693
|
+
return variableSet.state.variables.some((v) => variableSet.isVariableLoadingOrWaitingToUpdate(v));
|
|
694
|
+
}
|
|
695
|
+
_drainPendingVariableWaits() {
|
|
696
|
+
if (this._pendingVariableWaits.length === 0 || this._isAnyInScopeVariableLoading()) {
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
const waiters = this._pendingVariableWaits;
|
|
700
|
+
this._pendingVariableWaits = [];
|
|
701
|
+
waiters.forEach((resolve) => resolve());
|
|
702
|
+
}
|
|
675
703
|
/**
|
|
676
704
|
* Get possible keys given current filters. Do not call from plugins directly
|
|
677
705
|
*/
|
|
@@ -688,6 +716,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
688
716
|
if (!ds || !ds.getTagKeys) {
|
|
689
717
|
return [];
|
|
690
718
|
}
|
|
719
|
+
await this._waitForVariables();
|
|
691
720
|
const applicableOriginFilters = (_d = (_c = this.state.originFilters) == null ? void 0 : _c.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))) != null ? _d : [];
|
|
692
721
|
const otherFilters = this.state.filters.filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)).concat((_e = this.state.baseFilters) != null ? _e : []).concat(applicableOriginFilters);
|
|
693
722
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
|
@@ -731,6 +760,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
731
760
|
if (!ds || !ds.getGroupByKeys) {
|
|
732
761
|
return override ? dataFromResponse(override.values).map(toSelectableValue$1) : [];
|
|
733
762
|
}
|
|
763
|
+
await this._waitForVariables();
|
|
734
764
|
const applicableOriginFilters = (_d = (_c = this.state.originFilters) == null ? void 0 : _c.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))) != null ? _d : [];
|
|
735
765
|
const otherFilters = this.state.filters.filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)).concat((_e = this.state.baseFilters) != null ? _e : []).concat(applicableOriginFilters);
|
|
736
766
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
|
@@ -768,6 +798,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
768
798
|
if (!ds || !ds.getTagValues) {
|
|
769
799
|
return [];
|
|
770
800
|
}
|
|
801
|
+
await this._waitForVariables();
|
|
771
802
|
const originFilters = (_d = (_c = this.state.originFilters) == null ? void 0 : _c.filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f))) != null ? _d : [];
|
|
772
803
|
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f)).concat(originFilters);
|
|
773
804
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
|
@@ -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 });\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.map((filter) =>\n toArray(filter).map(escapeOriginFilterUrlDelimiters).join('|').concat(`#${filter.origin}`)\n ),\n ];\n }\n\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { originFilters, filters, _wip } = this.state;\n\n if ('value' in update && !('values' in update)) {\n update = { ...update, values: undefined };\n }\n\n if (filter.origin) {\n if (isGroupByFilter(filter) && 'key' in update && update.key !== filter.key) {\n const updatedOrigins = (originFilters ?? []).map((f) => {\n if (f === filter) {\n return { ...f, dismissedGroupBy: true, restorable: true };\n }\n if (isGroupByFilter(f) && f.origin && !f.dismissedGroupBy) {\n return { ...f, restorable: true };\n }\n return f;\n });\n\n // The original default is dismissed (preserved for restore); the user's\n // new key becomes a separate user filter so it doesn't overwrite the default.\n const newFilter: AdHocFilterWithLabels = {\n key: update.key as string,\n keyLabel: (update.keyLabel as string) ?? (update.key as string),\n operator: 'groupBy',\n value: '',\n condition: '',\n };\n\n this.setState({\n originFilters: updatedOrigins,\n filters: [...filters, newFilter],\n });\n return;\n }\n\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n if (updateValues) {\n const effectiveOperator = update.operator ?? filter.operator;\n const effectiveValue = update.value ?? filter.value;\n const flags = this._resolveOriginFlags(\n filter.key,\n filter.origin,\n updateValues,\n effectiveOperator,\n effectiveValue\n );\n Object.assign(update, flags);\n }\n\n const updatedFilters =\n originFilters?.map((f) => {\n if (f === filter) {\n return { ...f, ...update };\n }\n if (isGroupByFilter(filter) && update.restorable && isGroupByFilter(f) && f.origin && !f.restorable) {\n return { ...f, restorable: true };\n }\n return f;\n }) ?? [];\n this.setState({ originFilters: updatedFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n const newFilter = { ..._wip, ...update };\n this.setState({\n filters: [...filters, newFilter],\n _wip: undefined,\n });\n this.verifyApplicabilityAndStoreRecentFilter(newFilter);\n 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 * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n if (this.state.defaultKeys) {\n return this.state.defaultKeys.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const applicableOriginFilters =\n this.state.originFilters?.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)) ?? [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(this.state.baseFilters ?? [])\n .concat(applicableOriginFilters);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible group-by keys.\n * @param currentKey - The current key being edited (excluded from filters)\n * @param queries - Optional queries to scope the key lookup. When provided, these are used\n * instead of discovering all queries in the scene via getQueriesForVariables.\n */\n public async _getGroupByKeys(\n currentKey: string | null,\n queries?: SceneDataQuery[]\n ): Promise<Array<SelectableValue<string>>> {\n if (!this.state.enableGroupBy) {\n return [];\n }\n\n const override = await this.state.getGroupByKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n // @ts-expect-error (TODO: remove after upgrading with https://github.com/grafana/grafana/pull/118270)\n if (!ds || !ds.getGroupByKeys) {\n return override ? dataFromResponse(override.values).map(toSelectableValue) : [];\n }\n\n const applicableOriginFilters =\n this.state.originFilters?.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)) ?? [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(this.state.baseFilters ?? [])\n .concat(applicableOriginFilters);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queriesForKeys =\n queries ?? (this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined);\n\n // @ts-expect-error (TODO: remove after upgrading with https://github.com/grafana/grafana/pull/118270)\n const response = await ds.getGroupByKeys({\n filters: otherFilters,\n queries: queriesForKeys,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocFilterWithLabels): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n const originFilters =\n this.state.originFilters?.filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f)) ??\n [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f))\n .concat(originFilters);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n let scopes = sceneGraph.getScopes(this);\n\n // if current filter is a scope originated one we need to filter out\n // filters with same key in scopes prop, similar to how we do in adhocFilters prop\n if (filter.origin === 'scope') {\n scopes = scopes?.map((scope) => {\n return {\n ...scope,\n spec: {\n ...scope.spec,\n filters: scope.spec.filters?.filter((f) => f.key !== filter.key),\n },\n };\n });\n }\n\n const response = await ds.getTagValues({\n key: filter.key,\n filters: otherFilters,\n timeRange,\n queries,\n scopes,\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let values = dataFromResponse(response);\n if (override) {\n values = values.concat(dataFromResponse(override.values));\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({\n _wip: { key: '', value: '', operator: '=', condition: '' },\n });\n }\n\n public _getOperators() {\n const { supportsMultiValueOperators, allowCustomValue = true } = this.state;\n\n return OPERATORS.filter(({ isMulti, isRegex }) => {\n if (!supportsMultiValueOperators && isMulti) {\n return false;\n }\n if (!allowCustomValue && isRegex) {\n return false;\n }\n return true;\n }).map<SelectableValue<string>>(({ value, description }) => ({\n label: value,\n value,\n description,\n }));\n }\n}\n\nfunction renderExpression(\n builder: AdHocVariableExpressionBuilderFn | undefined,\n filters: AdHocFilterWithLabels[] | undefined\n) {\n return (builder ?? renderPrometheusLabelFilters)(\n filters?.filter((f) => isFilterApplicable(f) && !isGroupByFilter(f)) ?? []\n );\n}\n\nfunction getGroupByKeys(filters: AdHocFilterWithLabels[]): string[] {\n return filters\n .filter((f) => isGroupByFilter(f) && isFilterComplete(f) && !f.dismissedGroupBy)\n .map((f) => f.key)\n .sort();\n}\n\nfunction haveGroupByKeysChanged(prev: AdHocFilterWithLabels[], next: AdHocFilterWithLabels[]): boolean {\n const prevKeys = getGroupByKeys(prev);\n const nextKeys = getGroupByKeys(next);\n\n if (prevKeys.length !== nextKeys.length) {\n return true;\n }\n\n return prevKeys.some((key, i) => key !== nextKeys[i]);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n // Create controller adapter for combobox mode\n const controller = useMemo(\n () => (model.state.layout === 'combobox' ? new AdHocFiltersVariableController(model) : undefined),\n [model]\n );\n\n if (controller) {\n return <AdHocFiltersComboboxRenderer controller={controller} />;\n }\n\n return (\n <div className={styles.wrapper}>\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" addFilterButtonText={addFilterButtonText} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-end',\n columnGap: theme.spacing(2),\n rowGap: theme.spacing(1),\n }),\n});\n\nexport function toSelectableValue(input: MetricFindValue): SelectableValue<string> {\n const { text, value } = input;\n const result: SelectableValue<string> = {\n // converting text to string due to some edge cases where it can be a number\n // TODO: remove once https://github.com/grafana/grafana/issues/99021 is closed\n label: String(text),\n value: String(value ?? text),\n };\n\n if ('group' in input) {\n result.group = input.group;\n }\n\n if ('meta' in input) {\n result.meta = input.meta;\n }\n\n return result;\n}\n\nexport function isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\n}\n\nexport const GROUP_BY_OPERATOR = 'groupBy';\nexport const VALUE_KEY_DELIMITER = '::';\n\nexport function isGroupByFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === GROUP_BY_OPERATOR;\n}\n\nexport function isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return (\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 } 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.map((filter) =>\n toArray(filter).map(escapeOriginFilterUrlDelimiters).join('|').concat(`#${filter.origin}`)\n ),\n ];\n }\n\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { originFilters, filters, _wip } = this.state;\n\n if ('value' in update && !('values' in update)) {\n update = { ...update, values: undefined };\n }\n\n if (filter.origin) {\n if (isGroupByFilter(filter) && 'key' in update && update.key !== filter.key) {\n const updatedOrigins = (originFilters ?? []).map((f) => {\n if (f === filter) {\n return { ...f, dismissedGroupBy: true, restorable: true };\n }\n if (isGroupByFilter(f) && f.origin && !f.dismissedGroupBy) {\n return { ...f, restorable: true };\n }\n return f;\n });\n\n // The original default is dismissed (preserved for restore); the user's\n // new key becomes a separate user filter so it doesn't overwrite the default.\n const newFilter: AdHocFilterWithLabels = {\n key: update.key as string,\n keyLabel: (update.keyLabel as string) ?? (update.key as string),\n operator: 'groupBy',\n value: '',\n condition: '',\n };\n\n this.setState({\n originFilters: updatedOrigins,\n filters: [...filters, newFilter],\n });\n return;\n }\n\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n if (updateValues) {\n const effectiveOperator = update.operator ?? filter.operator;\n const effectiveValue = update.value ?? filter.value;\n const flags = this._resolveOriginFlags(\n filter.key,\n filter.origin,\n updateValues,\n effectiveOperator,\n effectiveValue\n );\n Object.assign(update, flags);\n }\n\n const updatedFilters =\n originFilters?.map((f) => {\n if (f === filter) {\n return { ...f, ...update };\n }\n if (isGroupByFilter(filter) && update.restorable && isGroupByFilter(f) && f.origin && !f.restorable) {\n return { ...f, restorable: true };\n }\n return f;\n }) ?? [];\n this.setState({ originFilters: updatedFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n const newFilter = { ..._wip, ...update };\n this.setState({\n filters: [...filters, newFilter],\n _wip: undefined,\n });\n this.verifyApplicabilityAndStoreRecentFilter(newFilter);\n 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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1221,6 +1221,8 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
|
|
|
1221
1221
|
private _prevScopes;
|
|
1222
1222
|
/** Needed for scopes dependency */
|
|
1223
1223
|
protected _variableDependency: VariableDependencyConfig<AdHocFiltersVariableState>;
|
|
1224
|
+
/** Resolvers waiting for in-scope variables to finish loading before a data source call. */
|
|
1225
|
+
private _pendingVariableWaits;
|
|
1224
1226
|
protected _urlSync: AdHocFiltersVariableUrlSyncHandler;
|
|
1225
1227
|
private _debouncedVerifyApplicability;
|
|
1226
1228
|
private _recommendations;
|
|
@@ -1290,6 +1292,14 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
|
|
|
1290
1292
|
_handleComboboxBackspace(filter: AdHocFilterWithLabels): void;
|
|
1291
1293
|
getFiltersApplicabilityForQueries(filters: AdHocFilterWithLabels[], queries: SceneDataQuery[], groupByKeys?: string[]): Promise<DrilldownsApplicability[] | undefined>;
|
|
1292
1294
|
_verifyApplicability(): Promise<void>;
|
|
1295
|
+
/**
|
|
1296
|
+
* Wait until template variables in scope have finished loading.
|
|
1297
|
+
* Prevents data source calls like getTagKeys
|
|
1298
|
+
* from running with unresolved `$var` references in the panel queries we forward.
|
|
1299
|
+
*/
|
|
1300
|
+
private _waitForVariables;
|
|
1301
|
+
private _isAnyInScopeVariableLoading;
|
|
1302
|
+
private _drainPendingVariableWaits;
|
|
1293
1303
|
/**
|
|
1294
1304
|
* Get possible keys given current filters. Do not call from plugins directly
|
|
1295
1305
|
*/
|
package/dist/index.js
CHANGED
|
@@ -9179,8 +9179,11 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
9179
9179
|
/** Needed for scopes dependency */
|
|
9180
9180
|
this._variableDependency = new VariableDependencyConfig(this, {
|
|
9181
9181
|
dependsOnScopes: true,
|
|
9182
|
-
onReferencedVariableValueChanged: () => this._updateScopesFilters()
|
|
9182
|
+
onReferencedVariableValueChanged: () => this._updateScopesFilters(),
|
|
9183
|
+
onAnyVariableChanged: () => this._drainPendingVariableWaits()
|
|
9183
9184
|
});
|
|
9185
|
+
/** Resolvers waiting for in-scope variables to finish loading before a data source call. */
|
|
9186
|
+
this._pendingVariableWaits = [];
|
|
9184
9187
|
this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
|
|
9185
9188
|
this._debouncedVerifyApplicability = lodash.debounce(this._verifyApplicability, 100);
|
|
9186
9189
|
this._activationHandler = () => {
|
|
@@ -9741,6 +9744,31 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
9741
9744
|
});
|
|
9742
9745
|
this.setState(update);
|
|
9743
9746
|
}
|
|
9747
|
+
/**
|
|
9748
|
+
* Wait until template variables in scope have finished loading.
|
|
9749
|
+
* Prevents data source calls like getTagKeys
|
|
9750
|
+
* from running with unresolved `$var` references in the panel queries we forward.
|
|
9751
|
+
*/
|
|
9752
|
+
_waitForVariables() {
|
|
9753
|
+
if (!this._isAnyInScopeVariableLoading()) {
|
|
9754
|
+
return Promise.resolve();
|
|
9755
|
+
}
|
|
9756
|
+
return new Promise((resolve) => {
|
|
9757
|
+
this._pendingVariableWaits.push(resolve);
|
|
9758
|
+
});
|
|
9759
|
+
}
|
|
9760
|
+
_isAnyInScopeVariableLoading() {
|
|
9761
|
+
const variableSet = sceneGraph.getVariables(this);
|
|
9762
|
+
return variableSet.state.variables.some((v) => variableSet.isVariableLoadingOrWaitingToUpdate(v));
|
|
9763
|
+
}
|
|
9764
|
+
_drainPendingVariableWaits() {
|
|
9765
|
+
if (this._pendingVariableWaits.length === 0 || this._isAnyInScopeVariableLoading()) {
|
|
9766
|
+
return;
|
|
9767
|
+
}
|
|
9768
|
+
const waiters = this._pendingVariableWaits;
|
|
9769
|
+
this._pendingVariableWaits = [];
|
|
9770
|
+
waiters.forEach((resolve) => resolve());
|
|
9771
|
+
}
|
|
9744
9772
|
/**
|
|
9745
9773
|
* Get possible keys given current filters. Do not call from plugins directly
|
|
9746
9774
|
*/
|
|
@@ -9757,6 +9785,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
9757
9785
|
if (!ds || !ds.getTagKeys) {
|
|
9758
9786
|
return [];
|
|
9759
9787
|
}
|
|
9788
|
+
await this._waitForVariables();
|
|
9760
9789
|
const applicableOriginFilters = (_d = (_c = this.state.originFilters) == null ? void 0 : _c.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))) != null ? _d : [];
|
|
9761
9790
|
const otherFilters = this.state.filters.filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)).concat((_e = this.state.baseFilters) != null ? _e : []).concat(applicableOriginFilters);
|
|
9762
9791
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
|
@@ -9800,6 +9829,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
9800
9829
|
if (!ds || !ds.getGroupByKeys) {
|
|
9801
9830
|
return override ? dataFromResponse(override.values).map(toSelectableValue$1) : [];
|
|
9802
9831
|
}
|
|
9832
|
+
await this._waitForVariables();
|
|
9803
9833
|
const applicableOriginFilters = (_d = (_c = this.state.originFilters) == null ? void 0 : _c.filter((f) => !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f))) != null ? _d : [];
|
|
9804
9834
|
const otherFilters = this.state.filters.filter((f) => f.key !== currentKey && !f.nonApplicable && !isGroupByFilter(f) && !isMatchAllFilter(f)).concat((_e = this.state.baseFilters) != null ? _e : []).concat(applicableOriginFilters);
|
|
9805
9835
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
|
@@ -9837,6 +9867,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
9837
9867
|
if (!ds || !ds.getTagValues) {
|
|
9838
9868
|
return [];
|
|
9839
9869
|
}
|
|
9870
|
+
await this._waitForVariables();
|
|
9840
9871
|
const originFilters = (_d = (_c = this.state.originFilters) == null ? void 0 : _c.filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f))) != null ? _d : [];
|
|
9841
9872
|
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key && !isGroupByFilter(f) && !isMatchAllFilter(f)).concat(originFilters);
|
|
9842
9873
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|