@grafana/scenes 6.4.0 → 6.5.0--canary.1062.13949528214.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.
- package/CHANGELOG.md +0 -12
- package/dist/esm/components/VizPanel/VizPanelExploreButton.js +4 -6
- package/dist/esm/components/VizPanel/VizPanelExploreButton.js.map +1 -1
- package/dist/esm/utils/explore.js +1 -5
- package/dist/esm/utils/explore.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js +12 -3
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +19 -5
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +131 -9
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +41 -9
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/adhoc/getAdHocFiltersFromScopes.js +72 -0
- package/dist/esm/variables/adhoc/getAdHocFiltersFromScopes.js.map +1 -0
- package/dist/esm/variables/utils.js +11 -1
- package/dist/esm/variables/utils.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +281 -35
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -13,6 +13,8 @@ import { css } from '@emotion/css';
|
|
|
13
13
|
import { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest.js';
|
|
14
14
|
import { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js';
|
|
15
15
|
import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
|
|
16
|
+
import { isEqual } from 'lodash';
|
|
17
|
+
import { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes.js';
|
|
16
18
|
|
|
17
19
|
var __defProp = Object.defineProperty;
|
|
18
20
|
var __defProps = Object.defineProperties;
|
|
@@ -78,20 +80,68 @@ const OPERATORS = [
|
|
|
78
80
|
];
|
|
79
81
|
class AdHocFiltersVariable extends SceneObjectBase {
|
|
80
82
|
constructor(state) {
|
|
81
|
-
var _a, _b;
|
|
83
|
+
var _a, _b, _c, _d, _e;
|
|
82
84
|
super(__spreadValues({
|
|
83
85
|
type: "adhoc",
|
|
84
86
|
name: (_a = state.name) != null ? _a : "Filters",
|
|
85
87
|
filters: [],
|
|
86
88
|
datasource: null,
|
|
87
89
|
applyMode: "auto",
|
|
88
|
-
filterExpression: (
|
|
90
|
+
filterExpression: (_e = state.filterExpression) != null ? _e : renderExpression(state.expressionBuilder, [
|
|
91
|
+
...(_c = (_b = state.baseFilters) == null ? void 0 : _b.filter((filter) => filter.origin)) != null ? _c : [],
|
|
92
|
+
...(_d = state.filters) != null ? _d : []
|
|
93
|
+
])
|
|
89
94
|
}, state));
|
|
90
95
|
this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
|
|
91
96
|
this._dataSourceSrv = getDataSourceSrv();
|
|
92
97
|
this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
|
|
93
98
|
this._activationHandler = () => {
|
|
99
|
+
var _a, _b;
|
|
94
100
|
this._scopesBridge = sceneGraph.getScopesBridge(this);
|
|
101
|
+
const scopes = (_a = this._scopesBridge) == null ? void 0 : _a.getValue();
|
|
102
|
+
if (scopes) {
|
|
103
|
+
this._updateScopesFilters(scopes);
|
|
104
|
+
}
|
|
105
|
+
const sub = (_b = this._scopesBridge) == null ? void 0 : _b.subscribeToValue((n, _) => {
|
|
106
|
+
var _a2;
|
|
107
|
+
this._updateScopesFilters(n, (_a2 = this._scopesBridge) == null ? void 0 : _a2.isLoading());
|
|
108
|
+
});
|
|
109
|
+
return () => {
|
|
110
|
+
sub == null ? void 0 : sub.unsubscribe();
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
this._updateScopesFilters = (scopes, areScopesLoading) => {
|
|
114
|
+
var _a;
|
|
115
|
+
const scopeFilters = getAdHocFiltersFromScopes(scopes);
|
|
116
|
+
if (!scopeFilters.length) {
|
|
117
|
+
this._overwriteScopes = areScopesLoading;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
let finalFilters = scopeFilters;
|
|
121
|
+
const scopeInjectedFilters = [];
|
|
122
|
+
const remainingFilters = [];
|
|
123
|
+
(_a = this.state.baseFilters) == null ? void 0 : _a.forEach((filter) => {
|
|
124
|
+
if (filter.origin === "scopes" /* Scopes */) {
|
|
125
|
+
scopeInjectedFilters.push(filter);
|
|
126
|
+
} else {
|
|
127
|
+
remainingFilters.push(filter);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
if (!this._overwriteScopes) {
|
|
131
|
+
const editedScopeFilters = scopeInjectedFilters.filter((filter) => {
|
|
132
|
+
var _a2;
|
|
133
|
+
return (_a2 = filter.originalValue) == null ? void 0 : _a2.length;
|
|
134
|
+
});
|
|
135
|
+
const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
|
|
136
|
+
const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
|
|
137
|
+
finalFilters = [
|
|
138
|
+
...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
|
|
139
|
+
...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
|
|
140
|
+
];
|
|
141
|
+
this._overwriteScopes = false;
|
|
142
|
+
}
|
|
143
|
+
const newFilters = [...remainingFilters, ...finalFilters];
|
|
144
|
+
this.setState({ baseFilters: newFilters });
|
|
95
145
|
};
|
|
96
146
|
if (this.state.applyMode === "auto") {
|
|
97
147
|
patchGetAdhocFilters(this);
|
|
@@ -99,9 +149,15 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
99
149
|
this.addActivationHandler(this._activationHandler);
|
|
100
150
|
}
|
|
101
151
|
setState(update) {
|
|
152
|
+
var _a, _b, _c;
|
|
102
153
|
let filterExpressionChanged = false;
|
|
103
|
-
if (update.filters && update.filters !== this.state.filters && !update.filterExpression) {
|
|
104
|
-
update.
|
|
154
|
+
if ((update.filters && update.filters !== this.state.filters || update.baseFilters && update.baseFilters !== this.state.baseFilters) && !update.filterExpression) {
|
|
155
|
+
const filters = (_a = update.filters) != null ? _a : this.state.filters;
|
|
156
|
+
const baseFilters = (_b = update.baseFilters) != null ? _b : this.state.baseFilters;
|
|
157
|
+
update.filterExpression = renderExpression(this.state.expressionBuilder, [
|
|
158
|
+
...(_c = baseFilters == null ? void 0 : baseFilters.filter((filter) => filter.origin)) != null ? _c : [],
|
|
159
|
+
...filters != null ? filters : []
|
|
160
|
+
]);
|
|
105
161
|
filterExpressionChanged = update.filterExpression !== this.state.filterExpression;
|
|
106
162
|
}
|
|
107
163
|
super.setState(update);
|
|
@@ -110,10 +166,14 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
110
166
|
}
|
|
111
167
|
}
|
|
112
168
|
updateFilters(filters, options) {
|
|
169
|
+
var _a, _b;
|
|
113
170
|
let filterExpressionChanged = false;
|
|
114
171
|
let filterExpression = void 0;
|
|
115
172
|
if (filters && filters !== this.state.filters) {
|
|
116
|
-
filterExpression = renderExpression(this.state.expressionBuilder,
|
|
173
|
+
filterExpression = renderExpression(this.state.expressionBuilder, [
|
|
174
|
+
...(_b = (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin)) != null ? _b : [],
|
|
175
|
+
...filters
|
|
176
|
+
]);
|
|
117
177
|
filterExpressionChanged = filterExpression !== this.state.filterExpression;
|
|
118
178
|
}
|
|
119
179
|
super.setState({
|
|
@@ -124,11 +184,40 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
124
184
|
this.publishEvent(new SceneVariableValueChangedEvent(this), true);
|
|
125
185
|
}
|
|
126
186
|
}
|
|
187
|
+
restoreOriginalFilter(filter) {
|
|
188
|
+
var _a;
|
|
189
|
+
const original = {
|
|
190
|
+
originalValue: void 0
|
|
191
|
+
};
|
|
192
|
+
if ((_a = filter.originalValue) == null ? void 0 : _a.length) {
|
|
193
|
+
original.value = filter.originalValue[0];
|
|
194
|
+
original.values = filter.originalValue;
|
|
195
|
+
original.valueLabels = filter.originalValue;
|
|
196
|
+
}
|
|
197
|
+
this._updateFilter(filter, original);
|
|
198
|
+
}
|
|
127
199
|
getValue() {
|
|
128
200
|
return this.state.filterExpression;
|
|
129
201
|
}
|
|
130
202
|
_updateFilter(filter, update) {
|
|
131
|
-
|
|
203
|
+
var _a;
|
|
204
|
+
const { baseFilters, filters, _wip } = this.state;
|
|
205
|
+
if (filter.origin) {
|
|
206
|
+
const currentValues = filter.values ? filter.values : [filter.value];
|
|
207
|
+
const updateValues = update.values || (update.value ? [update.value] : void 0);
|
|
208
|
+
const originalValueOverride = update.hasOwnProperty("originalValue");
|
|
209
|
+
if (!originalValueOverride && updateValues && !filter.originalValue && !isEqual(currentValues, updateValues)) {
|
|
210
|
+
update.originalValue = currentValues;
|
|
211
|
+
}
|
|
212
|
+
if (!originalValueOverride && isEqual(updateValues, filter.originalValue)) {
|
|
213
|
+
update.originalValue = void 0;
|
|
214
|
+
}
|
|
215
|
+
const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
|
|
216
|
+
return f === filter ? __spreadValues(__spreadValues({}, f), update) : f;
|
|
217
|
+
})) != null ? _a : [];
|
|
218
|
+
this.setState({ baseFilters: updatedBaseFilters });
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
132
221
|
if (filter === _wip) {
|
|
133
222
|
if ("value" in update && update["value"] !== "") {
|
|
134
223
|
this.setState({ filters: [...filters, __spreadValues(__spreadValues({}, _wip), update)], _wip: void 0 });
|
|
@@ -156,6 +245,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
156
245
|
}
|
|
157
246
|
}
|
|
158
247
|
_handleComboboxBackspace(filter) {
|
|
248
|
+
var _a;
|
|
159
249
|
if (this.state.filters.length) {
|
|
160
250
|
let filterToForceIndex = this.state.filters.length - 1;
|
|
161
251
|
if (filter !== this.state._wip) {
|
|
@@ -177,6 +267,27 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
177
267
|
return [...acc, f];
|
|
178
268
|
}, [])
|
|
179
269
|
});
|
|
270
|
+
} else if ((_a = this.state.baseFilters) == null ? void 0 : _a.length) {
|
|
271
|
+
let filterToForceIndex = this.state.baseFilters.length - 1;
|
|
272
|
+
if (filter !== this.state._wip) {
|
|
273
|
+
filterToForceIndex = -1;
|
|
274
|
+
}
|
|
275
|
+
this.setState({
|
|
276
|
+
baseFilters: this.state.baseFilters.reduce((acc, f, index) => {
|
|
277
|
+
if (index === filterToForceIndex) {
|
|
278
|
+
return [
|
|
279
|
+
...acc,
|
|
280
|
+
__spreadProps(__spreadValues({}, f), {
|
|
281
|
+
forceEdit: true
|
|
282
|
+
})
|
|
283
|
+
];
|
|
284
|
+
}
|
|
285
|
+
if (f === filter) {
|
|
286
|
+
return acc;
|
|
287
|
+
}
|
|
288
|
+
return [...acc, f];
|
|
289
|
+
}, [])
|
|
290
|
+
});
|
|
180
291
|
}
|
|
181
292
|
}
|
|
182
293
|
async _getKeys(currentKey) {
|
|
@@ -215,7 +326,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
215
326
|
return keys.map(toSelectableValue);
|
|
216
327
|
}
|
|
217
328
|
async _getValuesFor(filter) {
|
|
218
|
-
var _a, _b, _c, _d;
|
|
329
|
+
var _a, _b, _c, _d, _e;
|
|
219
330
|
const override = await ((_b = (_a = this.state).getTagValuesProvider) == null ? void 0 : _b.call(_a, this, filter));
|
|
220
331
|
if (override && override.replace) {
|
|
221
332
|
return dataFromResponse(override.values).map(toSelectableValue);
|
|
@@ -224,15 +335,26 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
|
224
335
|
if (!ds || !ds.getTagValues) {
|
|
225
336
|
return [];
|
|
226
337
|
}
|
|
227
|
-
const
|
|
338
|
+
const filteredBaseFilters = (_d = (_c = this.state.baseFilters) == null ? void 0 : _c.filter((f) => f.origin && f.key !== filter.key)) != null ? _d : [];
|
|
339
|
+
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);
|
|
228
340
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
|
229
341
|
const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
|
|
342
|
+
let scopes = (_e = this._scopesBridge) == null ? void 0 : _e.getValue();
|
|
343
|
+
if (filter.origin === "scopes" /* Scopes */) {
|
|
344
|
+
scopes = scopes == null ? void 0 : scopes.map((scope) => {
|
|
345
|
+
return __spreadProps(__spreadValues({}, scope), {
|
|
346
|
+
spec: __spreadProps(__spreadValues({}, scope.spec), {
|
|
347
|
+
filters: scope.spec.filters.filter((f) => f.key !== filter.key)
|
|
348
|
+
})
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
}
|
|
230
352
|
const response = await ds.getTagValues(__spreadValues({
|
|
231
353
|
key: filter.key,
|
|
232
354
|
filters: otherFilters,
|
|
233
355
|
timeRange,
|
|
234
356
|
queries,
|
|
235
|
-
scopes
|
|
357
|
+
scopes
|
|
236
358
|
}, getEnrichedFiltersRequest(this)));
|
|
237
359
|
if (responseHasError(response)) {
|
|
238
360
|
this.setState({ error: response.error.message });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { AdHocVariableFilter, GetTagResponse, GrafanaTheme2, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { ControlsLayout, SceneComponentProps } from '../../core/types';\nimport { DataSourceRef } from '@grafana/schema';\nimport { dataFromResponse, getQueriesForVariables, renderPrometheusLabelFilters, responseHasError } from '../utils';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { useStyles2 } from '@grafana/ui';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { css } from '@emotion/css';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { SceneScopesBridge } from '../../core/SceneScopesBridge';\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}\n\nexport type AdHocControlsLayout = ControlsLayout | 'combobox';\n\nexport enum FilterOrigin {\n Scopes = 'scopes',\n Dashboards = 'dashboards',\n}\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /** Optional text to display on the 'add filter' button */\n addFilterButtonText?: string;\n /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\n */\n applyMode: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the 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\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 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: 'Greater than',\n },\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 private _scopesBridge: SceneScopesBridge | undefined;\n\n protected _urlSync = new AdHocFiltersVariableUrlSyncHandler(this);\n\n public constructor(state: Partial<AdHocFiltersVariableState>) {\n super({\n type: 'adhoc',\n name: state.name ?? 'Filters',\n filters: [],\n datasource: null,\n applyMode: 'auto',\n filterExpression: state.filterExpression ?? renderExpression(state.expressionBuilder, state.filters),\n ...state,\n });\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._scopesBridge = sceneGraph.getScopesBridge(this);\n };\n\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = false;\n\n if (update.filters && update.filters !== this.state.filters && !update.filterExpression) {\n update.filterExpression = renderExpression(this.state.expressionBuilder, update.filters);\n filterExpressionChanged = update.filterExpression !== this.state.filterExpression;\n }\n\n super.setState(update);\n\n if (filterExpressionChanged) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\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 filterExpression: string | undefined = undefined;\n\n if (filters && filters !== this.state.filters) {\n filterExpression = renderExpression(this.state.expressionBuilder, filters);\n filterExpressionChanged = filterExpression !== this.state.filterExpression;\n }\n\n super.setState({\n filters,\n filterExpression,\n });\n\n if ((filterExpressionChanged && options?.skipPublish !== true) || options?.forcePublish) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n public getValue(): VariableValue | undefined {\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { filters, _wip } = this.state;\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n this.setState({ filters: [...filters, { ..._wip, ...update }], _wip: undefined });\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\n public _removeFilter(filter: AdHocFilterWithLabels) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\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 (this.state.filters.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.filters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n filters: this.state.filters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n }\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 otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters ?? []);\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: this._scopesBridge?.getValue(),\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 // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(this.state.baseFilters ?? []);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n const response = await ds.getTagValues({\n key: filter.key,\n filters: otherFilters,\n timeRange,\n queries,\n scopes: this._scopesBridge?.getValue(),\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)(filters ?? []);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n if (model.state.layout === 'combobox') {\n return <AdHocFiltersComboboxRenderer model={model} />;\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 isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return filter.key !== '' && filter.operator !== '' && filter.value !== '';\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":["FilterOrigin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCY,IAAA,YAAA,qBAAAA,aAAL,KAAA;AACL,EAAAA,cAAA,QAAS,CAAA,GAAA,QAAA,CAAA;AACT,EAAAA,cAAA,YAAa,CAAA,GAAA,YAAA,CAAA;AAFH,EAAAA,OAAAA,aAAAA,CAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA,EAAA;AAmHL,MAAM,SAAkC,GAAA;AAAA,EAC7C;AAAA,IACE,KAAO,EAAA,GAAA;AAAA,IACP,WAAa,EAAA,QAAA;AAAA,GACf;AAAA,EACA;AAAA,IACE,KAAO,EAAA,IAAA;AAAA,IACP,WAAa,EAAA,WAAA;AAAA,GACf;AAAA,EACA;AAAA,IACE,KAAO,EAAA,IAAA;AAAA,IACP,WAAa,EAAA,2CAAA;AAAA,IACb,OAAS,EAAA,IAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,KAAO,EAAA,KAAA;AAAA,IACP,WAAa,EAAA,6CAAA;AAAA,IACb,OAAS,EAAA,IAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,KAAO,EAAA,IAAA;AAAA,IACP,WAAa,EAAA,eAAA;AAAA,IACb,OAAS,EAAA,IAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,KAAO,EAAA,IAAA;AAAA,IACP,WAAa,EAAA,sBAAA;AAAA,IACb,OAAS,EAAA,IAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,KAAO,EAAA,GAAA;AAAA,IACP,WAAa,EAAA,WAAA;AAAA,GACf;AAAA,EACA;AAAA,IACE,KAAO,EAAA,GAAA;AAAA,IACP,WAAa,EAAA,cAAA;AAAA,GACf;AACF,EAAA;AAEO,MAAM,6BACH,eAEV,CAAA;AAAA,EASS,YAAY,KAA2C,EAAA;AAzMhE,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA0MI,IAAM,KAAA,CAAA,cAAA,CAAA;AAAA,MACJ,IAAM,EAAA,OAAA;AAAA,MACN,IAAA,EAAA,CAAM,EAAM,GAAA,KAAA,CAAA,IAAA,KAAN,IAAc,GAAA,EAAA,GAAA,SAAA;AAAA,MACpB,SAAS,EAAC;AAAA,MACV,UAAY,EAAA,IAAA;AAAA,MACZ,SAAW,EAAA,MAAA;AAAA,MACX,gBAAA,EAAA,CAAkB,WAAM,gBAAN,KAAA,IAAA,GAAA,EAAA,GAA0B,iBAAiB,KAAM,CAAA,iBAAA,EAAmB,MAAM,OAAO,CAAA;AAAA,KAAA,EAChG,KACJ,CAAA,CAAA,CAAA;AAfH,IAAA,IAAA,CAAQ,WAAc,GAAA,EAAE,aAAe,EAAA,iCAAA,CAAkC,IAAI,CAAE,EAAA,CAAA;AAC/E,IAAA,IAAA,CAAQ,iBAAiB,gBAAiB,EAAA,CAAA;AAG1C,IAAU,IAAA,CAAA,QAAA,GAAW,IAAI,kCAAA,CAAmC,IAAI,CAAA,CAAA;AAoBhE,IAAA,IAAA,CAAQ,qBAAqB,MAAM;AACjC,MAAK,IAAA,CAAA,aAAA,GAAgB,UAAW,CAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AAAA,KACtD,CAAA;AATE,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,SAAA,KAAc,MAAQ,EAAA;AACnC,MAAA,oBAAA,CAAqB,IAAI,CAAA,CAAA;AAAA,KAC3B;AAEA,IAAK,IAAA,CAAA,oBAAA,CAAqB,KAAK,kBAAkB,CAAA,CAAA;AAAA,GACnD;AAAA,EAMO,SAAS,MAAkD,EAAA;AAChE,IAAA,IAAI,uBAA0B,GAAA,KAAA,CAAA;AAE9B,IAAI,IAAA,MAAA,CAAO,WAAW,MAAO,CAAA,OAAA,KAAY,KAAK,KAAM,CAAA,OAAA,IAAW,CAAC,MAAA,CAAO,gBAAkB,EAAA;AACvF,MAAA,MAAA,CAAO,mBAAmB,gBAAiB,CAAA,IAAA,CAAK,KAAM,CAAA,iBAAA,EAAmB,OAAO,OAAO,CAAA,CAAA;AACvF,MAA0B,uBAAA,GAAA,MAAA,CAAO,gBAAqB,KAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,CAAA;AAAA,KACnE;AAEA,IAAA,KAAA,CAAM,SAAS,MAAM,CAAA,CAAA;AAErB,IAAA,IAAI,uBAAyB,EAAA;AAC3B,MAAA,IAAA,CAAK,YAAa,CAAA,IAAI,8BAA+B,CAAA,IAAI,GAAG,IAAI,CAAA,CAAA;AAAA,KAClE;AAAA,GACF;AAAA,EAOO,aAAA,CACL,SACA,OAIM,EAAA;AACN,IAAA,IAAI,uBAA0B,GAAA,KAAA,CAAA;AAC9B,IAAA,IAAI,gBAAuC,GAAA,KAAA,CAAA,CAAA;AAE3C,IAAA,IAAI,OAAW,IAAA,OAAA,KAAY,IAAK,CAAA,KAAA,CAAM,OAAS,EAAA;AAC7C,MAAA,gBAAA,GAAmB,gBAAiB,CAAA,IAAA,CAAK,KAAM,CAAA,iBAAA,EAAmB,OAAO,CAAA,CAAA;AACzE,MAA0B,uBAAA,GAAA,gBAAA,KAAqB,KAAK,KAAM,CAAA,gBAAA,CAAA;AAAA,KAC5D;AAEA,IAAA,KAAA,CAAM,QAAS,CAAA;AAAA,MACb,OAAA;AAAA,MACA,gBAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,IAAK,uBAA2B,IAAA,CAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAS,WAAgB,MAAA,IAAA,KAAS,mCAAS,YAAc,CAAA,EAAA;AACvF,MAAA,IAAA,CAAK,YAAa,CAAA,IAAI,8BAA+B,CAAA,IAAI,GAAG,IAAI,CAAA,CAAA;AAAA,KAClE;AAAA,GACF;AAAA,EAEO,QAAsC,GAAA;AAC3C,IAAA,OAAO,KAAK,KAAM,CAAA,gBAAA,CAAA;AAAA,GACpB;AAAA,EAEO,aAAA,CAAc,QAA+B,MAAwC,EAAA;AAC1F,IAAA,MAAM,EAAE,OAAA,EAAS,IAAK,EAAA,GAAI,IAAK,CAAA,KAAA,CAAA;AAE/B,IAAA,IAAI,WAAW,IAAM,EAAA;AAEnB,MAAA,IAAI,OAAW,IAAA,MAAA,IAAU,MAAO,CAAA,OAAA,CAAA,KAAa,EAAI,EAAA;AAC/C,QAAA,IAAA,CAAK,QAAS,CAAA,EAAE,OAAS,EAAA,CAAC,GAAG,OAAA,EAAS,cAAK,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAA,EAAS,MAAQ,CAAA,CAAA,EAAG,IAAM,EAAA,KAAA,CAAA,EAAW,CAAA,CAAA;AAAA,OAC3E,MAAA;AACL,QAAA,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,cAAK,CAAA,cAAA,CAAA,EAAA,EAAA,MAAA,CAAA,EAAW,SAAU,CAAA,CAAA;AAAA,OAClD;AACA,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,iBAAiB,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AACnD,MAAA,OAAO,CAAM,KAAA,MAAA,GAAS,cAAK,CAAA,cAAA,CAAA,EAAA,EAAA,CAAA,CAAA,EAAM,MAAW,CAAA,GAAA,CAAA,CAAA;AAAA,KAC7C,CAAA,CAAA;AAED,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,OAAS,EAAA,cAAA,EAAgB,CAAA,CAAA;AAAA,GAC3C;AAAA,EAEO,cAAc,MAA+B,EAAA;AAClD,IAAI,IAAA,MAAA,KAAW,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA;AAC9B,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,IAAM,EAAA,KAAA,CAAA,EAAW,CAAA,CAAA;AACjC,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,OAAS,EAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA,CAAC,CAAM,KAAA,CAAA,KAAM,MAAM,CAAA,EAAG,CAAA,CAAA;AAAA,GAC3E;AAAA,EAEO,iBAAoB,GAAA;AACzB,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAE,CAAA,CAAA,CAAA;AAE/C,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,IAAA,CAAK,cAAc,cAAc,CAAA,CAAA;AAAA,KACnC;AAAA,GACF;AAAA,EAEO,yBAAyB,MAA+B,EAAA;AAC7D,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,MAAQ,EAAA;AAE7B,MAAA,IAAI,kBAAqB,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,MAAS,GAAA,CAAA,CAAA;AAIrD,MAAI,IAAA,MAAA,KAAW,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA;AAC9B,QAAqB,kBAAA,GAAA,CAAA,CAAA,CAAA;AAAA,OACvB;AAEA,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,OAAA,EAAS,KAAK,KAAM,CAAA,OAAA,CAAQ,OAAgC,CAAC,GAAA,EAAK,GAAG,KAAU,KAAA;AAE7E,UAAA,IAAI,UAAU,kBAAoB,EAAA;AAChC,YAAO,OAAA;AAAA,cACL,GAAG,GAAA;AAAA,cACH,iCACK,CADL,CAAA,EAAA;AAAA,gBAEE,SAAW,EAAA,IAAA;AAAA,eACb,CAAA;AAAA,aACF,CAAA;AAAA,WACF;AAEA,UAAA,IAAI,MAAM,MAAQ,EAAA;AAChB,YAAO,OAAA,GAAA,CAAA;AAAA,WACT;AAEA,UAAO,OAAA,CAAC,GAAG,GAAA,EAAK,CAAC,CAAA,CAAA;AAAA,SACnB,EAAG,EAAE,CAAA;AAAA,OACN,CAAA,CAAA;AAAA,KACH;AAAA,GACF;AAAA,EAKA,MAAa,SAAS,UAAoE,EAAA;AA1V5F,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA2VI,IAAA,MAAM,WAAW,OAAM,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,EAAA,kBAAA,KAAX,4BAAgC,IAAM,EAAA,UAAA,CAAA,CAAA,CAAA;AAE7D,IAAI,IAAA,QAAA,IAAY,SAAS,OAAS,EAAA;AAChC,MAAA,OAAO,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAA,CAAE,IAAI,iBAAiB,CAAA,CAAA;AAAA,KAChE;AAEA,IAAI,IAAA,IAAA,CAAK,MAAM,WAAa,EAAA;AAC1B,MAAA,OAAO,IAAK,CAAA,KAAA,CAAM,WAAY,CAAA,GAAA,CAAI,iBAAiB,CAAA,CAAA;AAAA,KACrD;AAEA,IAAM,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,cAAA,CAAe,IAAI,IAAK,CAAA,KAAA,CAAM,UAAY,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAChF,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,UAAY,EAAA;AACzB,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAEA,IAAA,MAAM,eAAe,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,GAAQ,KAAA,UAAU,EAAE,MAAO,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAM,WAAX,KAAA,IAAA,GAAA,EAAA,GAA0B,EAAE,CAAA,CAAA;AAC/G,IAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,IAAI,EAAE,KAAM,CAAA,KAAA,CAAA;AACtD,IAAA,MAAM,UAAU,IAAK,CAAA,KAAA,CAAM,4BAA+B,GAAA,sBAAA,CAAuB,IAAI,CAAI,GAAA,KAAA,CAAA,CAAA;AACzF,IAAM,MAAA,QAAA,GAAW,MAAM,EAAA,CAAG,UAAW,CAAA,cAAA,CAAA;AAAA,MACnC,OAAS,EAAA,YAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,EAAA,CAAQ,EAAK,GAAA,IAAA,CAAA,aAAA,KAAL,IAAoB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,EAAA;AAAA,KACzB,EAAA,yBAAA,CAA0B,IAAI,CAClC,CAAA,CAAA,CAAA;AAED,IAAI,IAAA,gBAAA,CAAiB,QAAQ,CAAG,EAAA;AAC9B,MAAA,IAAA,CAAK,SAAS,EAAE,KAAA,EAAO,QAAS,CAAA,KAAA,CAAM,SAAS,CAAA,CAAA;AAAA,KACjD;AAEA,IAAI,IAAA,IAAA,GAAO,iBAAiB,QAAQ,CAAA,CAAA;AACpC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAA,GAAO,IAAK,CAAA,MAAA,CAAO,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA;AAAA,KACtD;AAEA,IAAM,MAAA,iBAAA,GAAoB,KAAK,KAAM,CAAA,iBAAA,CAAA;AACrC,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAO,IAAA,GAAA,IAAA,CAAK,OAAO,CAAC,CAAA,KAAM,EAAE,IAAK,CAAA,KAAA,CAAM,iBAAiB,CAAC,CAAA,CAAA;AAAA,KAC3D;AAEA,IAAO,OAAA,IAAA,CAAK,IAAI,iBAAiB,CAAA,CAAA;AAAA,GACnC;AAAA,EAKA,MAAa,cAAc,MAAwE,EAAA;AAzYrG,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA0YI,IAAA,MAAM,WAAW,OAAM,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,EAAA,oBAAA,KAAX,4BAAkC,IAAM,EAAA,MAAA,CAAA,CAAA,CAAA;AAE/D,IAAI,IAAA,QAAA,IAAY,SAAS,OAAS,EAAA;AAChC,MAAA,OAAO,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAA,CAAE,IAAI,iBAAiB,CAAA,CAAA;AAAA,KAChE;AAEA,IAAM,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,cAAA,CAAe,IAAI,IAAK,CAAA,KAAA,CAAM,UAAY,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAEhF,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,YAAc,EAAA;AAC3B,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAGA,IAAA,MAAM,eAAe,IAAK,CAAA,KAAA,CAAM,QAAQ,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,GAAA,KAAQ,MAAO,CAAA,GAAG,EAAE,MAAO,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAM,WAAX,KAAA,IAAA,GAAA,EAAA,GAA0B,EAAE,CAAA,CAAA;AAE/G,IAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,IAAI,EAAE,KAAM,CAAA,KAAA,CAAA;AACtD,IAAA,MAAM,UAAU,IAAK,CAAA,KAAA,CAAM,4BAA+B,GAAA,sBAAA,CAAuB,IAAI,CAAI,GAAA,KAAA,CAAA,CAAA;AAEzF,IAAM,MAAA,QAAA,GAAW,MAAM,EAAA,CAAG,YAAa,CAAA,cAAA,CAAA;AAAA,MACrC,KAAK,MAAO,CAAA,GAAA;AAAA,MACZ,OAAS,EAAA,YAAA;AAAA,MACT,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EAAA,CAAQ,EAAK,GAAA,IAAA,CAAA,aAAA,KAAL,IAAoB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,EAAA;AAAA,KACzB,EAAA,yBAAA,CAA0B,IAAI,CAClC,CAAA,CAAA,CAAA;AAED,IAAI,IAAA,gBAAA,CAAiB,QAAQ,CAAG,EAAA;AAC9B,MAAA,IAAA,CAAK,SAAS,EAAE,KAAA,EAAO,QAAS,CAAA,KAAA,CAAM,SAAS,CAAA,CAAA;AAAA,KACjD;AAEA,IAAI,IAAA,MAAA,GAAS,iBAAiB,QAAQ,CAAA,CAAA;AACtC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,MAAA,GAAS,MAAO,CAAA,MAAA,CAAO,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA;AAAA,KAC1D;AAEA,IAAO,OAAA,MAAA,CAAO,IAAI,iBAAiB,CAAA,CAAA;AAAA,GACrC;AAAA,EAEO,OAAU,GAAA;AACf,IAAA,IAAA,CAAK,QAAS,CAAA;AAAA,MACZ,IAAA,EAAM,EAAE,GAAK,EAAA,EAAA,EAAI,OAAO,EAAI,EAAA,QAAA,EAAU,GAAK,EAAA,SAAA,EAAW,EAAG,EAAA;AAAA,KAC1D,CAAA,CAAA;AAAA,GACH;AAAA,EAEO,aAAgB,GAAA;AACrB,IAAA,MAAM,EAAE,2BAAA,EAA6B,gBAAmB,GAAA,IAAA,KAAS,IAAK,CAAA,KAAA,CAAA;AAEtE,IAAA,OAAO,UAAU,MAAO,CAAA,CAAC,EAAE,OAAA,EAAS,SAAc,KAAA;AAChD,MAAI,IAAA,CAAC,+BAA+B,OAAS,EAAA;AAC3C,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AACA,MAAI,IAAA,CAAC,oBAAoB,OAAS,EAAA;AAChC,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AACA,MAAO,OAAA,IAAA,CAAA;AAAA,KACR,CAAE,CAAA,GAAA,CAA6B,CAAC,EAAE,KAAA,EAAO,aAAmB,MAAA;AAAA,MAC3D,KAAO,EAAA,KAAA;AAAA,MACP,KAAA;AAAA,MACA,WAAA;AAAA,KACA,CAAA,CAAA,CAAA;AAAA,GACJ;AACF,CAAA;AA3Qa,oBAAA,CAIJ,SAAY,GAAA,4BAAA,CAAA;AAyQrB,SAAS,gBAAA,CACP,SACA,OACA,EAAA;AACA,EAAA,OAAA,CAAQ,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,4BAAA,EAA8B,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,EAAE,CAAA,CAAA;AAChE,CAAA;AAEgB,SAAA,4BAAA,CAA6B,EAAE,KAAA,EAAoD,EAAA;AACjG,EAAA,MAAM,EAAE,OAAS,EAAA,QAAA,EAAU,mBAAoB,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAClE,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA,CAAA;AAEnC,EAAI,IAAA,KAAA,CAAM,KAAM,CAAA,MAAA,KAAW,UAAY,EAAA;AACrC,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,4BAAA,EAAA;AAAA,MAA6B,KAAA;AAAA,KAAc,CAAA,CAAA;AAAA,GACrD;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,WAAW,MAAO,CAAA,OAAA;AAAA,GAAA,EACpB,OACE,CAAA,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,MAAO,CAAA,MAAM,CACjC,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,KACZ,qBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,QAAN,EAAA;AAAA,IAAe,GAAK,EAAA,KAAA;AAAA,GAAA,kBAClB,KAAA,CAAA,aAAA,CAAA,mBAAA,EAAA;AAAA,IAAoB,MAAA;AAAA,IAAgB,KAAA;AAAA,GAAc,CACrD,CACD,CAEF,EAAA,CAAC,4BAAa,KAAA,CAAA,aAAA,CAAA,kBAAA,EAAA;AAAA,IAAmB,KAAA;AAAA,IAAc,GAAI,EAAA,UAAA;AAAA,IAAW,mBAAA;AAAA,GAA0C,CAC3G,CAAA,CAAA;AAEJ,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,SAAS,GAAI,CAAA;AAAA,IACX,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA,UAAA;AAAA,IACZ,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,GACxB,CAAA;AACH,CAAA,CAAA,CAAA;AAEO,SAAS,kBAAkB,KAAiD,EAAA;AACjF,EAAM,MAAA,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,KAAA,CAAA;AACxB,EAAA,MAAM,MAAkC,GAAA;AAAA,IAGtC,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,IAClB,KAAA,EAAO,MAAO,CAAA,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,IAAI,CAAA;AAAA,GAC7B,CAAA;AAEA,EAAA,IAAI,WAAW,KAAO,EAAA;AACpB,IAAA,MAAA,CAAO,QAAQ,KAAM,CAAA,KAAA,CAAA;AAAA,GACvB;AAEA,EAAA,IAAI,UAAU,KAAO,EAAA;AACnB,IAAA,MAAA,CAAO,OAAO,KAAM,CAAA,IAAA,CAAA;AAAA,GACtB;AAEA,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEO,SAAS,iBAAiB,MAAwC,EAAA;AACvE,EAAA,OAAO,OAAO,GAAQ,KAAA,EAAA,IAAM,OAAO,QAAa,KAAA,EAAA,IAAM,OAAO,KAAU,KAAA,EAAA,CAAA;AACzE,CAAA;AAEO,SAAS,qBAAqB,aAAgC,EAAA;AACnE,EAAA,MAAM,WAAW,SAAU,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,UAAU,aAAa,CAAA,CAAA;AAChE,EAAA,IAAI,CAAC,QAAU,EAAA;AAEb,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,OAAA,CAAQ,SAAS,OAAO,CAAA,CAAA;AACjC;;;;"}
|
|
1
|
+
{"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport {\n AdHocVariableFilter,\n GetTagResponse,\n GrafanaTheme2,\n MetricFindValue,\n Scope,\n SelectableValue,\n} from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { ControlsLayout, SceneComponentProps } from '../../core/types';\nimport { DataSourceRef } from '@grafana/schema';\nimport { dataFromResponse, getQueriesForVariables, renderPrometheusLabelFilters, responseHasError } from '../utils';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { useStyles2 } from '@grafana/ui';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { css } from '@emotion/css';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { SceneScopesBridge } from '../../core/SceneScopesBridge';\nimport { isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\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 // this holds the original/initial value of a injected filter that\n // was edited.\n originalValue?: string[];\n}\n\nexport type AdHocControlsLayout = ControlsLayout | 'combobox';\n\nexport enum FilterOrigin {\n Scopes = 'scopes',\n Dashboards = 'dashboards',\n}\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /** Optional text to display on the 'add filter' button */\n addFilterButtonText?: string;\n /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\n */\n applyMode: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the 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\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 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: 'Greater than',\n },\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 private _scopesBridge: SceneScopesBridge | undefined;\n private _overwriteScopes: boolean | undefined;\n\n protected _urlSync = new AdHocFiltersVariableUrlSyncHandler(this);\n\n public constructor(state: Partial<AdHocFiltersVariableState>) {\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, [\n ...(state.baseFilters?.filter((filter) => filter.origin) ?? []),\n ...(state.filters ?? []),\n ]),\n ...state,\n });\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._scopesBridge = sceneGraph.getScopesBridge(this);\n\n const scopes = this._scopesBridge?.getValue();\n\n if (scopes) {\n this._updateScopesFilters(scopes);\n }\n\n const sub = this._scopesBridge?.subscribeToValue((n, _) => {\n this._updateScopesFilters(n, this._scopesBridge?.isLoading());\n });\n\n return () => {\n sub?.unsubscribe();\n };\n };\n\n private _updateScopesFilters = (scopes: Scope[], areScopesLoading?: boolean) => {\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n this._overwriteScopes = areScopesLoading;\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n this.state.baseFilters?.forEach((filter) => {\n if (filter.origin === FilterOrigin.Scopes) {\n scopeInjectedFilters.push(filter);\n } else {\n remainingFilters.push(filter);\n }\n });\n\n if (!this._overwriteScopes) {\n const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.originalValue?.length);\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 this._overwriteScopes = false;\n }\n\n // maintain other baseFilters in the array, only update scopes ones\n const newFilters = [...remainingFilters, ...finalFilters];\n this.setState({ baseFilters: newFilters });\n };\n\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = false;\n\n if (\n ((update.filters && update.filters !== this.state.filters) ||\n (update.baseFilters && update.baseFilters !== this.state.baseFilters)) &&\n !update.filterExpression\n ) {\n const filters = update.filters ?? this.state.filters;\n const baseFilters = update.baseFilters ?? this.state.baseFilters;\n\n update.filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(baseFilters?.filter((filter) => filter.origin) ?? []),\n ...(filters ?? []),\n ]);\n filterExpressionChanged = update.filterExpression !== this.state.filterExpression;\n }\n\n super.setState(update);\n\n if (filterExpressionChanged) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\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 filterExpression: string | undefined = undefined;\n\n if (filters && filters !== this.state.filters) {\n filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(this.state.baseFilters?.filter((filter) => filter.origin) ?? []),\n ...filters,\n ]);\n filterExpressionChanged = filterExpression !== this.state.filterExpression;\n }\n\n super.setState({\n filters,\n filterExpression,\n });\n\n if ((filterExpressionChanged && options?.skipPublish !== true) || options?.forcePublish) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n public restoreOriginalFilter(filter: AdHocFilterWithLabels) {\n const original: Partial<AdHocFilterWithLabels> = {\n originalValue: undefined,\n };\n\n if (filter.originalValue?.length) {\n original.value = filter.originalValue[0];\n original.values = filter.originalValue;\n // we don't care much about the labels in this injected filters scenario\n // but this is needed to rerender the filter with the proper values\n // in the UI. E.g.: in a multi-value on hover, it shows the correct values\n original.valueLabels = filter.originalValue;\n }\n\n this._updateFilter(filter, original);\n }\n\n public getValue(): VariableValue | undefined {\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { baseFilters, filters, _wip } = this.state;\n\n if (filter.origin) {\n const currentValues = filter.values ? filter.values : [filter.value];\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n const originalValueOverride = update.hasOwnProperty('originalValue');\n\n // if we do not override this logic by adding originalValue in update\n // and there is no originalValue set and the updateValues are set and\n // not equal to the currentValues we update the originalValue\n if (!originalValueOverride && updateValues && !filter.originalValue && !isEqual(currentValues, updateValues)) {\n update.originalValue = currentValues;\n }\n\n // we are updating to the same values, no reason to hold original value\n if (!originalValueOverride && isEqual(updateValues, filter.originalValue)) {\n update.originalValue = undefined;\n }\n\n const updatedBaseFilters =\n baseFilters?.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n }) ?? [];\n this.setState({ baseFilters: updatedBaseFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n this.setState({ filters: [...filters, { ..._wip, ...update }], _wip: undefined });\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\n public _removeFilter(filter: AdHocFilterWithLabels) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\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 (this.state.filters.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.filters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n filters: this.state.filters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n } else if (this.state.baseFilters?.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.baseFilters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n baseFilters: this.state.baseFilters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n }\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 otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters ?? []);\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: this._scopesBridge?.getValue(),\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 filteredBaseFilters = this.state.baseFilters?.filter((f) => f.origin && f.key !== filter.key) ?? [];\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n let scopes = this._scopesBridge?.getValue();\n\n // if current filter is a scope injected 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 === FilterOrigin.Scopes) {\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)(filters ?? []);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n if (model.state.layout === 'combobox') {\n return <AdHocFiltersComboboxRenderer model={model} />;\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 isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return filter.key !== '' && filter.operator !== '' && filter.value !== '';\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":["FilterOrigin","_a"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { isFilterComplete, isMultiValueOperator } from './AdHocFiltersVariable.js';
|
|
2
|
-
import { escapeUrlPipeDelimiters, toUrlCommaDelimitedString, unescapeUrlDelimiters } from '../utils.js';
|
|
1
|
+
import { isFilterComplete, isMultiValueOperator, FilterOrigin } from './AdHocFiltersVariable.js';
|
|
2
|
+
import { escapeUrlPipeDelimiters, escapeInjectedFilterUrlDelimiters, toUrlCommaDelimitedString, unescapeUrlDelimiters } from '../utils.js';
|
|
3
3
|
|
|
4
4
|
class AdHocFiltersVariableUrlSyncHandler {
|
|
5
5
|
constructor(_variable) {
|
|
@@ -13,19 +13,44 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
|
13
13
|
}
|
|
14
14
|
getUrlState() {
|
|
15
15
|
const filters = this._variable.state.filters;
|
|
16
|
-
|
|
16
|
+
const baseFilters = this._variable.state.baseFilters;
|
|
17
|
+
let value = [];
|
|
18
|
+
if (filters.length === 0 && (baseFilters == null ? void 0 : baseFilters.length) === 0) {
|
|
17
19
|
return { [this.getKey()]: [""] };
|
|
18
20
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
if (filters.length) {
|
|
22
|
+
value.push(
|
|
23
|
+
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join("|"))
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
if (baseFilters == null ? void 0 : baseFilters.length) {
|
|
27
|
+
value.push(
|
|
28
|
+
...baseFilters == null ? void 0 : baseFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.originalValue).map(
|
|
29
|
+
(filter) => {
|
|
30
|
+
var _a, _b;
|
|
31
|
+
return toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|").concat(
|
|
32
|
+
`#${(_b = (_a = filter.originalValue) == null ? void 0 : _a.map(escapeInjectedFilterUrlDelimiters).join("|")) != null ? _b : ""}#${filter.origin}`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
[this.getKey()]: value.length ? value : [""]
|
|
40
|
+
};
|
|
21
41
|
}
|
|
22
42
|
updateFromUrl(values) {
|
|
23
43
|
const urlValue = values[this.getKey()];
|
|
24
44
|
if (urlValue == null) {
|
|
25
45
|
return;
|
|
26
46
|
}
|
|
27
|
-
|
|
28
|
-
|
|
47
|
+
if (urlValue) {
|
|
48
|
+
const filters = deserializeUrlToFilters(urlValue);
|
|
49
|
+
this._variable.setState({
|
|
50
|
+
filters: filters.filter((f) => !f.origin),
|
|
51
|
+
baseFilters: filters.filter((f) => f.origin)
|
|
52
|
+
});
|
|
53
|
+
}
|
|
29
54
|
}
|
|
30
55
|
}
|
|
31
56
|
function deserializeUrlToFilters(value) {
|
|
@@ -50,10 +75,12 @@ function toArray(filter) {
|
|
|
50
75
|
return result;
|
|
51
76
|
}
|
|
52
77
|
function toFilter(urlValue) {
|
|
78
|
+
var _a;
|
|
53
79
|
if (typeof urlValue !== "string" || urlValue.length === 0) {
|
|
54
80
|
return null;
|
|
55
81
|
}
|
|
56
|
-
const [
|
|
82
|
+
const [filter, originalValues, origin] = urlValue.split("#");
|
|
83
|
+
const [key, keyLabel, operator, _operatorLabel, ...values] = filter.split("|").reduce((acc, v) => {
|
|
57
84
|
const [key2, label] = v.split(",");
|
|
58
85
|
acc.push(key2, label != null ? label : key2);
|
|
59
86
|
return acc;
|
|
@@ -65,9 +92,14 @@ function toFilter(urlValue) {
|
|
|
65
92
|
value: values[0],
|
|
66
93
|
values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : void 0,
|
|
67
94
|
valueLabels: values.filter((_, index) => index % 2 === 1),
|
|
68
|
-
condition: ""
|
|
95
|
+
condition: "",
|
|
96
|
+
origin: isFilterOrigin(origin) ? origin : void 0,
|
|
97
|
+
originalValue: originalValues && originalValues.length ? (_a = originalValues.split("|")) != null ? _a : [originalValues] : void 0
|
|
69
98
|
};
|
|
70
99
|
}
|
|
100
|
+
function isFilterOrigin(value) {
|
|
101
|
+
return value === FilterOrigin.Scopes || value === FilterOrigin.Dashboards;
|
|
102
|
+
}
|
|
71
103
|
function isFilter(filter) {
|
|
72
104
|
return filter !== null && typeof filter.key === "string" && typeof filter.value === "string";
|
|
73
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersVariableUrlSyncHandler.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.ts"],"sourcesContent":["import { SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues } from '../../core/types';\nimport {\n AdHocFiltersVariable,\n AdHocFilterWithLabels,\n isFilterComplete,\n isMultiValueOperator,\n} from './AdHocFiltersVariable';\nimport {
|
|
1
|
+
{"version":3,"file":"AdHocFiltersVariableUrlSyncHandler.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.ts"],"sourcesContent":["import { SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues } from '../../core/types';\nimport {\n AdHocFiltersVariable,\n AdHocFilterWithLabels,\n FilterOrigin,\n isFilterComplete,\n isMultiValueOperator,\n} from './AdHocFiltersVariable';\nimport {\n escapeInjectedFilterUrlDelimiters,\n escapeUrlPipeDelimiters,\n toUrlCommaDelimitedString,\n unescapeUrlDelimiters,\n} from '../utils';\n\nexport class AdHocFiltersVariableUrlSyncHandler implements SceneObjectUrlSyncHandler {\n public constructor(private _variable: AdHocFiltersVariable) {}\n\n private getKey(): string {\n return `var-${this._variable.state.name}`;\n }\n\n public getKeys(): string[] {\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n const filters = this._variable.state.filters;\n const baseFilters = this._variable.state.baseFilters;\n\n let value = [];\n\n if (filters.length === 0 && baseFilters?.length === 0) {\n return { [this.getKey()]: [''] };\n }\n\n if (filters.length) {\n value.push(\n ...filters\n .filter(isFilterComplete)\n .filter((filter) => !filter.hidden)\n .map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join('|'))\n );\n }\n\n if (baseFilters?.length) {\n // injected filters stored in the following format: normal|adhoc|values#original|values#filterOrigin\n value.push(\n ...baseFilters\n ?.filter(isFilterComplete)\n .filter((filter) => !filter.hidden && filter.origin && filter.originalValue)\n .map((filter) =>\n toArray(filter)\n .map(escapeInjectedFilterUrlDelimiters)\n .join('|')\n .concat(\n `#${filter.originalValue?.map(escapeInjectedFilterUrlDelimiters).join('|') ?? ''}#${filter.origin}`\n )\n )\n );\n }\n\n return {\n [this.getKey()]: value.length ? value : [''],\n };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n const urlValue = values[this.getKey()];\n\n if (urlValue == null) {\n return;\n }\n\n if (urlValue) {\n const filters = deserializeUrlToFilters(urlValue);\n this._variable.setState({\n filters: filters.filter((f) => !f.origin),\n baseFilters: filters.filter((f) => f.origin),\n });\n }\n }\n}\n\nfunction deserializeUrlToFilters(value: SceneObjectUrlValue): AdHocFilterWithLabels[] {\n if (Array.isArray(value)) {\n const values = value;\n return values.map(toFilter).filter(isFilter);\n }\n\n const filter = toFilter(value);\n return filter === null ? [] : [filter];\n}\n\nfunction toArray(filter: AdHocFilterWithLabels): string[] {\n const result = [toUrlCommaDelimitedString(filter.key, filter.keyLabel), filter.operator];\n if (isMultiValueOperator(filter.operator)) {\n // TODO remove expect-error when we're on the latest version of @grafana/data\n // @ts-expect-error\n filter.values.forEach((value, index) => {\n result.push(toUrlCommaDelimitedString(value, filter.valueLabels?.[index]));\n });\n } else {\n result.push(toUrlCommaDelimitedString(filter.value, filter.valueLabels?.[0]));\n }\n return result;\n}\n\nfunction toFilter(urlValue: string | number | boolean | undefined | null): AdHocFilterWithLabels | null {\n if (typeof urlValue !== 'string' || urlValue.length === 0) {\n return null;\n }\n\n const [filter, originalValues, origin] = urlValue.split('#');\n const [key, keyLabel, operator, _operatorLabel, ...values] = filter\n .split('|')\n .reduce<string[]>((acc, v) => {\n const [key, label] = v.split(',');\n\n acc.push(key, label ?? key);\n\n return acc;\n }, [])\n .map(unescapeUrlDelimiters);\n\n return {\n key,\n keyLabel,\n operator,\n value: values[0],\n values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : undefined,\n valueLabels: values.filter((_, index) => index % 2 === 1),\n condition: '',\n origin: isFilterOrigin(origin) ? origin : undefined,\n originalValue: originalValues && originalValues.length ? originalValues.split('|') ?? [originalValues] : undefined,\n };\n}\n\nfunction isFilterOrigin(value: string): value is FilterOrigin {\n return value === FilterOrigin.Scopes || value === FilterOrigin.Dashboards;\n}\n\nfunction isFilter(filter: AdHocFilterWithLabels | null): filter is AdHocFilterWithLabels {\n return filter !== null && typeof filter.key === 'string' && typeof filter.value === 'string';\n}\n"],"names":["_a","key"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { scopeFilterOperatorMap } from '@grafana/data';
|
|
2
|
+
import { FilterOrigin } from './AdHocFiltersVariable.js';
|
|
3
|
+
|
|
4
|
+
const reverseScopeFilterOperatorMap = Object.fromEntries(
|
|
5
|
+
Object.entries(scopeFilterOperatorMap).map(([symbol, operator]) => [operator, symbol])
|
|
6
|
+
);
|
|
7
|
+
function isEqualityOrMultiOperator(value) {
|
|
8
|
+
const operators = /* @__PURE__ */ new Set(["equals", "not-equals", "one-of", "not-one-of"]);
|
|
9
|
+
return operators.has(value);
|
|
10
|
+
}
|
|
11
|
+
function getAdHocFiltersFromScopes(scopes) {
|
|
12
|
+
const formattedFilters = /* @__PURE__ */ new Map();
|
|
13
|
+
const duplicatedFilters = [];
|
|
14
|
+
const allFilters = scopes.flatMap((scope) => scope.spec.filters);
|
|
15
|
+
for (const filter of allFilters) {
|
|
16
|
+
processFilter(formattedFilters, duplicatedFilters, filter);
|
|
17
|
+
}
|
|
18
|
+
return [...formattedFilters.values(), ...duplicatedFilters];
|
|
19
|
+
}
|
|
20
|
+
function processFilter(formattedFilters, duplicatedFilters, filter) {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
const existingFilter = formattedFilters.get(filter.key);
|
|
23
|
+
if (existingFilter && canValueBeMerged(existingFilter.operator, filter.operator)) {
|
|
24
|
+
mergeFilterValues(existingFilter, filter);
|
|
25
|
+
} else if (!existingFilter) {
|
|
26
|
+
formattedFilters.set(filter.key, {
|
|
27
|
+
key: filter.key,
|
|
28
|
+
operator: reverseScopeFilterOperatorMap[filter.operator],
|
|
29
|
+
value: filter.value,
|
|
30
|
+
values: (_a = filter.values) != null ? _a : [filter.value],
|
|
31
|
+
origin: FilterOrigin.Scopes
|
|
32
|
+
});
|
|
33
|
+
} else {
|
|
34
|
+
duplicatedFilters.push({
|
|
35
|
+
key: filter.key,
|
|
36
|
+
operator: reverseScopeFilterOperatorMap[filter.operator],
|
|
37
|
+
value: filter.value,
|
|
38
|
+
values: (_b = filter.values) != null ? _b : [filter.value],
|
|
39
|
+
origin: FilterOrigin.Scopes
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function mergeFilterValues(adHocFilter, filter) {
|
|
44
|
+
var _a, _b, _c, _d;
|
|
45
|
+
const values = (_a = filter.values) != null ? _a : [filter.value];
|
|
46
|
+
for (const value of values) {
|
|
47
|
+
if (!((_b = adHocFilter.values) == null ? void 0 : _b.includes(value))) {
|
|
48
|
+
(_c = adHocFilter.values) == null ? void 0 : _c.push(value);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (((_d = adHocFilter.values) == null ? void 0 : _d.length) === 1) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (filter.operator === "equals" && adHocFilter.operator === reverseScopeFilterOperatorMap["equals"]) {
|
|
55
|
+
adHocFilter.operator = reverseScopeFilterOperatorMap["one-of"];
|
|
56
|
+
} else if (filter.operator === "not-equals" && adHocFilter.operator === reverseScopeFilterOperatorMap["not-equals"]) {
|
|
57
|
+
adHocFilter.operator = reverseScopeFilterOperatorMap["not-one-of"];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function canValueBeMerged(adHocFilterOperator, filterOperator) {
|
|
61
|
+
const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];
|
|
62
|
+
if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
if (scopeConvertedOperator.includes("not") && !filterOperator.includes("not") || !scopeConvertedOperator.includes("not") && filterOperator.includes("not")) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { getAdHocFiltersFromScopes, isEqualityOrMultiOperator, reverseScopeFilterOperatorMap };
|
|
72
|
+
//# sourceMappingURL=getAdHocFiltersFromScopes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAdHocFiltersFromScopes.js","sources":["../../../../src/variables/adhoc/getAdHocFiltersFromScopes.ts"],"sourcesContent":["import { Scope, ScopeFilterOperator, ScopeSpecFilter, scopeFilterOperatorMap } from '@grafana/data';\nimport { AdHocFilterWithLabels, FilterOrigin } from './AdHocFiltersVariable';\n\nexport type EqualityOrMultiOperator = Extract<ScopeFilterOperator, 'equals' | 'not-equals' | 'one-of' | 'not-one-of'>;\n\nexport const reverseScopeFilterOperatorMap: Record<ScopeFilterOperator, string> = Object.fromEntries(\n Object.entries(scopeFilterOperatorMap).map(([symbol, operator]) => [operator, symbol])\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n) as Record<ScopeFilterOperator, string>;\n\nexport function isEqualityOrMultiOperator(value: string): value is EqualityOrMultiOperator {\n const operators = new Set(['equals', 'not-equals', 'one-of', 'not-one-of']);\n return operators.has(value);\n}\n\n// this function returns processed adhoc filters after parsing and processing\n// all scope filters from a scope list. The reason we need to process these filters is\n// because scopes can have multiple filter values with the same key. For example:\n// we have selected ScopeA which has a filter with a key1, operator one-of, a value1,\n// and a ScopeB which has a filter with key1, operator one-of, and value2. After processing,\n// the result will be just one adhoc filter with both values. This is held in formattedFilters.\n// DuplicatedFilters will containg unprocessable filters: if scopeA has instead of the one-of op\n// an equal op, then the result will be 2 adhoc filters with the same key, but diferent operator\n// and value. We return them this way and let the adhoc interface deal with this.\nexport function getAdHocFiltersFromScopes(scopes: Scope[]): AdHocFilterWithLabels[] {\n const formattedFilters: Map<string, AdHocFilterWithLabels> = new Map();\n // duplicated filters that could not be processed in any way are just appended to the list\n const duplicatedFilters: AdHocFilterWithLabels[] = [];\n const allFilters = scopes.flatMap((scope) => scope.spec.filters);\n\n for (const filter of allFilters) {\n processFilter(formattedFilters, duplicatedFilters, filter);\n }\n\n return [...formattedFilters.values(), ...duplicatedFilters];\n}\n\nfunction processFilter(\n formattedFilters: Map<string, AdHocFilterWithLabels>,\n duplicatedFilters: AdHocFilterWithLabels[],\n filter: ScopeSpecFilter\n) {\n const existingFilter = formattedFilters.get(filter.key);\n\n if (existingFilter && canValueBeMerged(existingFilter.operator, filter.operator)) {\n mergeFilterValues(existingFilter, filter);\n } else if (!existingFilter) {\n // Add filter to map either only if it is new.\n // Otherwise it is an existing filter that cannot be converted to multi-value\n // and thus will be moved to the duplicatedFilters list\n formattedFilters.set(filter.key, {\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: FilterOrigin.Scopes,\n });\n } else {\n duplicatedFilters.push({\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: FilterOrigin.Scopes,\n });\n }\n}\n\nfunction mergeFilterValues(adHocFilter: AdHocFilterWithLabels, filter: ScopeSpecFilter) {\n const values = filter.values ?? [filter.value];\n\n for (const value of values) {\n if (!adHocFilter.values?.includes(value)) {\n adHocFilter.values?.push(value);\n }\n }\n\n // If there's only one value, there's no need to update the\n // operator to its multi-value equivalent\n if (adHocFilter.values?.length === 1) {\n return;\n }\n\n // Otherwise update it to the equivalent multi-value operator\n if (filter.operator === 'equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['one-of'];\n } else if (filter.operator === 'not-equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['not-equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['not-one-of'];\n }\n}\n\nfunction canValueBeMerged(adHocFilterOperator: string, filterOperator: string) {\n const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];\n\n if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {\n return false;\n }\n\n if (\n (scopeConvertedOperator.includes('not') && !filterOperator.includes('not')) ||\n (!scopeConvertedOperator.includes('not') && filterOperator.includes('not'))\n ) {\n return false;\n }\n\n return true;\n}\n"],"names":[],"mappings":"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"}
|