@grafana/scenes 6.19.0 → 6.20.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 +17 -0
- package/dist/esm/querying/SceneQueryRunner.js +4 -6
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/variables/VariableDependencyConfig.js +12 -32
- package/dist/esm/variables/VariableDependencyConfig.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +2 -2
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +43 -51
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +32 -28
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/utils.js +2 -2
- package/dist/esm/variables/utils.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +92 -118
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
@@ -57,17 +57,14 @@ const OPERATORS = [
|
|
57
57
|
];
|
58
58
|
class AdHocFiltersVariable extends SceneObjectBase {
|
59
59
|
constructor(state) {
|
60
|
-
var _a, _b, _c, _d, _e
|
60
|
+
var _a, _b, _c, _d, _e;
|
61
61
|
super({
|
62
62
|
type: "adhoc",
|
63
63
|
name: (_a = state.name) != null ? _a : "Filters",
|
64
64
|
filters: [],
|
65
65
|
datasource: null,
|
66
66
|
applyMode: "auto",
|
67
|
-
filterExpression: (
|
68
|
-
...(_c = (_b = state.baseFilters) == null ? void 0 : _b.filter((filter) => filter.origin)) != null ? _c : [],
|
69
|
-
...(_d = state.filters) != null ? _d : []
|
70
|
-
]),
|
67
|
+
filterExpression: (_d = state.filterExpression) != null ? _d : renderExpression(state.expressionBuilder, [...(_b = state.originFilters) != null ? _b : [], ...(_c = state.filters) != null ? _c : []]),
|
71
68
|
...state
|
72
69
|
});
|
73
70
|
this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
|
@@ -76,6 +73,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
76
73
|
// are set on construct and used to restore a baseFilter with an origin
|
77
74
|
// to its original value if edited at some point
|
78
75
|
this._originalValues = /* @__PURE__ */ new Map();
|
76
|
+
this._prevScopes = [];
|
79
77
|
/** Needed for scopes dependency */
|
80
78
|
this._variableDependency = new VariableDependencyConfig(this, {
|
81
79
|
dependsOnScopes: true,
|
@@ -83,44 +81,33 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
83
81
|
});
|
84
82
|
this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
|
85
83
|
this._activationHandler = () => {
|
86
|
-
this._updateScopesFilters();
|
87
84
|
return () => {
|
88
|
-
var _a
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
}
|
93
|
-
|
94
|
-
if (filter.origin === "dashboard" && filter.restorable) {
|
95
|
-
this.restoreOriginalFilter(filter);
|
96
|
-
}
|
97
|
-
});
|
98
|
-
}
|
85
|
+
var _a;
|
86
|
+
(_a = this.state.originFilters) == null ? void 0 : _a.forEach((filter) => {
|
87
|
+
if (filter.restorable) {
|
88
|
+
this.restoreOriginalFilter(filter);
|
89
|
+
}
|
90
|
+
});
|
99
91
|
};
|
100
92
|
};
|
101
93
|
if (this.state.applyMode === "auto") {
|
102
94
|
patchGetAdhocFilters(this);
|
103
95
|
}
|
104
|
-
(
|
96
|
+
(_e = this.state.originFilters) == null ? void 0 : _e.forEach((filter) => {
|
105
97
|
var _a2;
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
});
|
111
|
-
}
|
98
|
+
this._originalValues.set(filter.key, {
|
99
|
+
operator: filter.operator,
|
100
|
+
value: (_a2 = filter.values) != null ? _a2 : [filter.value]
|
101
|
+
});
|
112
102
|
});
|
113
103
|
this.addActivationHandler(this._activationHandler);
|
114
104
|
}
|
115
105
|
_updateScopesFilters() {
|
116
106
|
var _a, _b;
|
117
107
|
const scopes = sceneGraph.getScopes(this);
|
118
|
-
if (!scopes) {
|
119
|
-
return;
|
120
|
-
}
|
121
|
-
if (!scopes.length) {
|
108
|
+
if (!scopes || !scopes.length) {
|
122
109
|
this.setState({
|
123
|
-
|
110
|
+
originFilters: (_a = this.state.originFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scope")
|
124
111
|
});
|
125
112
|
return;
|
126
113
|
}
|
@@ -138,13 +125,18 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
138
125
|
operator: scopeFilter.operator
|
139
126
|
});
|
140
127
|
});
|
141
|
-
(_b = this.state.
|
128
|
+
(_b = this.state.originFilters) == null ? void 0 : _b.forEach((filter) => {
|
142
129
|
if (filter.origin === "scope") {
|
143
130
|
scopeInjectedFilters.push(filter);
|
144
131
|
} else {
|
145
132
|
remainingFilters.push(filter);
|
146
133
|
}
|
147
134
|
});
|
135
|
+
if (this._prevScopes.length) {
|
136
|
+
this.setState({ originFilters: [...finalFilters, ...remainingFilters] });
|
137
|
+
this._prevScopes = scopes;
|
138
|
+
return;
|
139
|
+
}
|
148
140
|
const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);
|
149
141
|
const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
|
150
142
|
const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
|
@@ -152,18 +144,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
152
144
|
...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
|
153
145
|
...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
|
154
146
|
];
|
155
|
-
this.setState({
|
147
|
+
this.setState({ originFilters: [...finalFilters, ...remainingFilters] });
|
148
|
+
this._prevScopes = scopes;
|
156
149
|
}
|
157
150
|
setState(update) {
|
158
|
-
var _a, _b
|
151
|
+
var _a, _b;
|
159
152
|
let filterExpressionChanged = false;
|
160
|
-
if ((update.filters && update.filters !== this.state.filters || update.
|
153
|
+
if ((update.filters && update.filters !== this.state.filters || update.originFilters && update.originFilters !== this.state.originFilters) && !update.filterExpression) {
|
161
154
|
const filters = (_a = update.filters) != null ? _a : this.state.filters;
|
162
|
-
const
|
163
|
-
update.filterExpression = renderExpression(this.state.expressionBuilder, [
|
164
|
-
...(_c = baseFilters == null ? void 0 : baseFilters.filter((filter) => filter.origin)) != null ? _c : [],
|
165
|
-
...filters != null ? filters : []
|
166
|
-
]);
|
155
|
+
const originFilters = (_b = update.originFilters) != null ? _b : this.state.originFilters;
|
156
|
+
update.filterExpression = renderExpression(this.state.expressionBuilder, [...originFilters != null ? originFilters : [], ...filters]);
|
167
157
|
filterExpressionChanged = update.filterExpression !== this.state.filterExpression;
|
168
158
|
}
|
169
159
|
super.setState(update);
|
@@ -177,12 +167,12 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
177
167
|
* allowing consumers to update the filters without triggering dependent data providers.
|
178
168
|
*/
|
179
169
|
updateFilters(filters, options) {
|
180
|
-
var _a
|
170
|
+
var _a;
|
181
171
|
let filterExpressionChanged = false;
|
182
172
|
let filterExpression = void 0;
|
183
173
|
if (filters && filters !== this.state.filters) {
|
184
174
|
filterExpression = renderExpression(this.state.expressionBuilder, [
|
185
|
-
...(
|
175
|
+
...(_a = this.state.originFilters) != null ? _a : [],
|
186
176
|
...filters
|
187
177
|
]);
|
188
178
|
filterExpressionChanged = filterExpression !== this.state.filterExpression;
|
@@ -202,32 +192,34 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
202
192
|
};
|
203
193
|
if (filter.restorable) {
|
204
194
|
const originalFilter = this._originalValues.get(filter.key);
|
195
|
+
if (!originalFilter) {
|
196
|
+
return;
|
197
|
+
}
|
205
198
|
original.value = originalFilter == null ? void 0 : originalFilter.value[0];
|
206
199
|
original.values = originalFilter == null ? void 0 : originalFilter.value;
|
207
200
|
original.valueLabels = originalFilter == null ? void 0 : originalFilter.value;
|
208
201
|
original.operator = originalFilter == null ? void 0 : originalFilter.operator;
|
202
|
+
this._updateFilter(filter, original);
|
209
203
|
}
|
210
|
-
this._updateFilter(filter, original);
|
211
204
|
}
|
212
205
|
getValue() {
|
213
206
|
return this.state.filterExpression;
|
214
207
|
}
|
215
208
|
_updateFilter(filter, update) {
|
216
209
|
var _a;
|
217
|
-
const {
|
210
|
+
const { originFilters, filters, _wip } = this.state;
|
218
211
|
if (filter.origin) {
|
219
212
|
const originalValues = this._originalValues.get(filter.key);
|
220
213
|
const updateValues = update.values || (update.value ? [update.value] : void 0);
|
221
|
-
|
222
|
-
if (!isRestorableOverride && (updateValues && !isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator))) {
|
214
|
+
if (updateValues && !isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator)) {
|
223
215
|
update.restorable = true;
|
224
216
|
} else if (updateValues && isEqual(updateValues, originalValues == null ? void 0 : originalValues.value)) {
|
225
217
|
update.restorable = false;
|
226
218
|
}
|
227
|
-
const
|
219
|
+
const updatedFilters2 = (_a = originFilters == null ? void 0 : originFilters.map((f) => {
|
228
220
|
return f === filter ? { ...f, ...update } : f;
|
229
221
|
})) != null ? _a : [];
|
230
|
-
this.setState({
|
222
|
+
this.setState({ originFilters: updatedFilters2 });
|
231
223
|
return;
|
232
224
|
}
|
233
225
|
if (filter === _wip) {
|
@@ -290,13 +282,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
290
282
|
return [...acc, f];
|
291
283
|
}, [])
|
292
284
|
});
|
293
|
-
} else if ((_a = this.state.
|
294
|
-
let filterToForceIndex = this.state.
|
285
|
+
} else if ((_a = this.state.originFilters) == null ? void 0 : _a.length) {
|
286
|
+
let filterToForceIndex = this.state.originFilters.length - 1;
|
295
287
|
if (filter !== this.state._wip) {
|
296
288
|
filterToForceIndex = -1;
|
297
289
|
}
|
298
290
|
this.setState({
|
299
|
-
|
291
|
+
originFilters: this.state.originFilters.reduce((acc, f, index) => {
|
300
292
|
if (index === filterToForceIndex && !f.readOnly) {
|
301
293
|
return [
|
302
294
|
...acc,
|
@@ -366,8 +358,8 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
366
358
|
if (!ds || !ds.getTagValues) {
|
367
359
|
return [];
|
368
360
|
}
|
369
|
-
const
|
370
|
-
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(
|
361
|
+
const originFilters = (_d = (_c = this.state.originFilters) == null ? void 0 : _c.filter((f) => f.key !== filter.key)) != null ? _d : [];
|
362
|
+
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(originFilters);
|
371
363
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
372
364
|
const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
|
373
365
|
let scopes = sceneGraph.getScopes(this);
|
@@ -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 { isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\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}\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 /** 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 // 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, { value: string[]; operator: string }> = new Map();\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 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 // set dashboard lvl original values in constructor, since we have them from schema\n this.state.baseFilters?.forEach((baseFilter) => {\n if (baseFilter.origin === 'dashboard') {\n this._originalValues.set(baseFilter.key, {\n operator: baseFilter.operator,\n value: baseFilter.values ?? [baseFilter.value],\n });\n }\n });\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._updateScopesFilters();\n\n return () => {\n // we clear both scopes and dashboard level filters before leaving a dashboard to maintain accuracy for both\n // when/if we return to the same dashboard\n // e.g.: we edit a scope filter and go to another dashboard, it gets carried over, but then on that dashboard\n // we reset the value, and then come back to the initial dashboard, that dashboard still has the edited scope\n // because the URL will not hold any value, since on reset we clear the url, but the initial dashboard still\n // has the changed value in the schema, unless we reset it here\n if (this.state.baseFilters?.length) {\n this.setState({\n baseFilters: [...this.state.baseFilters.filter((filter) => filter.origin !== 'scope')],\n });\n // same for dashboard level filters if we edit one and go to another dashboard, reset to whatever initial value is there\n // and come back to the initial one it will use the last modified value it has, since URL is empty from the reset done\n // before\n this.state.baseFilters?.forEach((filter) => {\n if (filter.origin === 'dashboard' && filter.restorable) {\n this.restoreOriginalFilter(filter);\n }\n });\n }\n };\n };\n\n private _updateScopesFilters() {\n const scopes = sceneGraph.getScopes(this);\n\n if (!scopes) {\n return;\n }\n\n if (!scopes.length) {\n this.setState({\n baseFilters: this.state.baseFilters?.filter((filter) => filter.origin !== 'scope'),\n });\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n // set original values for scope filters as well\n finalFilters.forEach((scopeFilter) => {\n this._originalValues.set(scopeFilter.key, {\n value: scopeFilter.values ?? [scopeFilter.value],\n operator: scopeFilter.operator,\n });\n });\n\n this.state.baseFilters?.forEach((filter) => {\n if (filter.origin === 'scope') {\n scopeInjectedFilters.push(filter);\n } else {\n remainingFilters.push(filter);\n }\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 baseFilters in the array, only update scopes ones\n this.setState({ baseFilters: [...finalFilters, ...remainingFilters] });\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 matchAllFilter: false,\n restorable: false,\n };\n\n if (filter.restorable) {\n const originalFilter = this._originalValues.get(filter.key);\n\n original.value = originalFilter?.value[0];\n original.values = originalFilter?.value;\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 = originalFilter?.value;\n original.operator = originalFilter?.operator;\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 originalValues = this._originalValues.get(filter.key);\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n // if we don't have the restorable prop set but values differ we set it true\n // this happens when editing the value of an injected filter\n // we also make sure to set restorable false if values are the same as original\n // e.g.: if we edit the value of a filter to whatever the original was, manually\n // 'restoring' the filter\n const isRestorableOverride = update.hasOwnProperty('restorable');\n if (\n !isRestorableOverride &&\n ((updateValues && !isEqual(updateValues, originalValues?.value)) ||\n (update.operator && update.operator !== originalValues?.operator))\n ) {\n update.restorable = true;\n } else if (updateValues && isEqual(updateValues, originalValues?.value)) {\n update.restorable = false;\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 updateToMatchAll(filter: AdHocFilterWithLabels) {\n this._updateFilter(filter, {\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n restorable: true,\n });\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 if not readOnly\n if (index === filterToForceIndex && !f.readOnly) {\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 && !f.readOnly) {\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: 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 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 = sceneGraph.getScopes(this);\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 === '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)(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 isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\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":["_a"],"mappings":"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"}
|
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 { isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\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}\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 /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Filters originated from a source */\n originFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\n */\n applyMode: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the 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 // 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, { value: string[]; operator: string }> = 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 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, [...(state.originFilters ?? []), ...(state.filters ?? [])]),\n ...state,\n });\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n this.state.originFilters?.forEach((filter) => {\n this._originalValues.set(filter.key, {\n operator: filter.operator,\n value: filter.values ?? [filter.value],\n });\n });\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n return () => {\n this.state.originFilters?.forEach((filter) => {\n if (filter.restorable) {\n this.restoreOriginalFilter(filter);\n }\n });\n };\n };\n\n private _updateScopesFilters() {\n const scopes = sceneGraph.getScopes(this);\n\n if (!scopes || !scopes.length) {\n this.setState({\n originFilters: this.state.originFilters?.filter((filter) => filter.origin !== 'scope'),\n });\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n // set original values for scope filters as well\n finalFilters.forEach((scopeFilter) => {\n this._originalValues.set(scopeFilter.key, {\n value: scopeFilter.values ?? [scopeFilter.value],\n operator: scopeFilter.operator,\n });\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 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\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = 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 }\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.originFilters ?? []),\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 matchAllFilter: false,\n restorable: false,\n };\n\n if (filter.restorable) {\n const originalFilter = this._originalValues.get(filter.key);\n\n if (!originalFilter) {\n return;\n }\n\n original.value = originalFilter?.value[0];\n original.values = originalFilter?.value;\n original.valueLabels = originalFilter?.value;\n original.operator = originalFilter?.operator;\n\n this._updateFilter(filter, original);\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 { originFilters, filters, _wip } = this.state;\n\n if (filter.origin) {\n const originalValues = this._originalValues.get(filter.key);\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n if (\n (updateValues && !isEqual(updateValues, originalValues?.value)) ||\n (update.operator && update.operator !== originalValues?.operator)\n ) {\n update.restorable = true;\n } else if (updateValues && isEqual(updateValues, originalValues?.value)) {\n update.restorable = false;\n }\n\n const updatedFilters =\n originFilters?.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n }) ?? [];\n this.setState({ originFilters: updatedFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n this.setState({ 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 updateToMatchAll(filter: AdHocFilterWithLabels) {\n this._updateFilter(filter, {\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n restorable: true,\n });\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 if not readOnly\n if (index === filterToForceIndex && !f.readOnly) {\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.originFilters?.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.originFilters.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 originFilters: this.state.originFilters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex && !f.readOnly) {\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: 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 = this.state.originFilters?.filter((f) => 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(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)(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 isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\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":["_a","updatedFilters"],"mappings":"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"}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { isFilterComplete,
|
2
|
-
import {
|
1
|
+
import { isFilterComplete, isMultiValueOperator, isMatchAllFilter } from './AdHocFiltersVariable.js';
|
2
|
+
import { escapeOriginFilterUrlDelimiters, toUrlCommaDelimitedString, unescapeUrlDelimiters } from '../utils.js';
|
3
3
|
|
4
4
|
class AdHocFiltersVariableUrlSyncHandler {
|
5
5
|
constructor(_variable) {
|
@@ -13,20 +13,20 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
13
13
|
}
|
14
14
|
getUrlState() {
|
15
15
|
const filters = this._variable.state.filters;
|
16
|
-
const
|
16
|
+
const originFilters = this._variable.state.originFilters;
|
17
17
|
let value = [];
|
18
|
-
if (filters.length === 0 && (
|
18
|
+
if (filters.length === 0 && (originFilters == null ? void 0 : originFilters.length) === 0) {
|
19
19
|
return { [this.getKey()]: [""] };
|
20
20
|
}
|
21
21
|
if (filters.length) {
|
22
22
|
value.push(
|
23
|
-
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(
|
23
|
+
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeOriginFilterUrlDelimiters).join("|"))
|
24
24
|
);
|
25
25
|
}
|
26
|
-
if (
|
26
|
+
if (originFilters == null ? void 0 : originFilters.length) {
|
27
27
|
value.push(
|
28
|
-
...
|
29
|
-
(filter) => toArray(filter).map(
|
28
|
+
...originFilters == null ? void 0 : originFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.restorable).map(
|
29
|
+
(filter) => toArray(filter).map(escapeOriginFilterUrlDelimiters).join("|").concat(`#${filter.origin}#restorable`)
|
30
30
|
)
|
31
31
|
);
|
32
32
|
}
|
@@ -40,31 +40,35 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
40
40
|
return;
|
41
41
|
}
|
42
42
|
const filters = deserializeUrlToFilters(urlValue);
|
43
|
-
const
|
44
|
-
for (let i = 0; i < filters.length; i++) {
|
45
|
-
const foundBaseFilterIndex = baseFilters.findIndex((f) => f.key === filters[i].key);
|
46
|
-
if (foundBaseFilterIndex > -1) {
|
47
|
-
if (!filters[i].origin && baseFilters[foundBaseFilterIndex].origin === "dashboard") {
|
48
|
-
filters[i].origin = "dashboard";
|
49
|
-
filters[i].restorable = true;
|
50
|
-
}
|
51
|
-
if (isMatchAllFilter(filters[i])) {
|
52
|
-
filters[i].matchAllFilter = true;
|
53
|
-
}
|
54
|
-
baseFilters[foundBaseFilterIndex] = filters[i];
|
55
|
-
} else if (filters[i].origin === "dashboard") {
|
56
|
-
delete filters[i].origin;
|
57
|
-
delete filters[i].restorable;
|
58
|
-
} else if (foundBaseFilterIndex === -1 && filters[i].origin === "scope" && filters[i].restorable) {
|
59
|
-
baseFilters.push(filters[i]);
|
60
|
-
}
|
61
|
-
}
|
43
|
+
const originFilters = updateOriginFilters([...this._variable.state.originFilters || []], filters);
|
62
44
|
this._variable.setState({
|
63
45
|
filters: filters.filter((f) => !f.origin),
|
64
|
-
|
46
|
+
originFilters
|
65
47
|
});
|
66
48
|
}
|
67
49
|
}
|
50
|
+
function updateOriginFilters(prevOriginFilters, filters) {
|
51
|
+
const updatedOriginFilters = [...prevOriginFilters];
|
52
|
+
for (let i = 0; i < filters.length; i++) {
|
53
|
+
const foundOriginFilterIndex = prevOriginFilters.findIndex((f) => f.key === filters[i].key);
|
54
|
+
if (foundOriginFilterIndex > -1) {
|
55
|
+
if (!filters[i].origin && prevOriginFilters[foundOriginFilterIndex].origin === "dashboard") {
|
56
|
+
filters[i].origin = "dashboard";
|
57
|
+
filters[i].restorable = true;
|
58
|
+
}
|
59
|
+
if (isMatchAllFilter(filters[i])) {
|
60
|
+
filters[i].matchAllFilter = true;
|
61
|
+
}
|
62
|
+
updatedOriginFilters[foundOriginFilterIndex] = filters[i];
|
63
|
+
} else if (filters[i].origin === "dashboard") {
|
64
|
+
delete filters[i].origin;
|
65
|
+
delete filters[i].restorable;
|
66
|
+
} else if (foundOriginFilterIndex === -1 && filters[i].origin === "scope" && filters[i].restorable) {
|
67
|
+
updatedOriginFilters.push(filters[i]);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
return updatedOriginFilters;
|
71
|
+
}
|
68
72
|
function deserializeUrlToFilters(value) {
|
69
73
|
if (Array.isArray(value)) {
|
70
74
|
const values = value;
|
@@ -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 FilterOrigin,\n isFilterComplete,\n isMatchAllFilter,\n isMultiValueOperator,\n} from './AdHocFiltersVariable';\nimport { escapeInjectedFilterUrlDelimiters, toUrlCommaDelimitedString, unescapeUrlDelimiters } 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(escapeInjectedFilterUrlDelimiters).join('|'))\n );\n }\n\n if (baseFilters?.length) {\n // injected filters stored in the following format: normal|adhoc|values#filterOrigin#restorable\n value.push(\n ...baseFilters\n ?.filter(isFilterComplete)\n .filter((filter) => !filter.hidden && filter.origin && filter.restorable)\n .map((filter) =>\n toArray(filter).map(escapeInjectedFilterUrlDelimiters).join('|').concat(`#${filter.origin}#restorable`)\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 const filters = deserializeUrlToFilters(urlValue);\n const baseFilters = [...(this._variable.state.baseFilters || [])];\n\n for (let i = 0; i < filters.length; i++) {\n const foundBaseFilterIndex = baseFilters.findIndex((f) => f.key === filters[i].key);\n\n // if we find a match we update baseFilter with what's in the URL.\n // If there is a normal filter without an origin that matches keys with\n // some dashboard lvl filter we maintain it as dashboard lvl filter in the\n // new dashboard\n if (foundBaseFilterIndex > -1) {\n if (!filters[i].origin && baseFilters[foundBaseFilterIndex].origin === 'dashboard') {\n filters[i].origin = 'dashboard';\n filters[i].restorable = true;\n }\n\n if (isMatchAllFilter(filters[i])) {\n filters[i].matchAllFilter = true;\n }\n\n baseFilters[foundBaseFilterIndex] = filters[i];\n } else if (filters[i].origin === 'dashboard') {\n // if it was originating from a dashoard but has no match in the new dashboard\n // remove it's origin, turn it into a normal filter to be set below\n delete filters[i].origin;\n delete filters[i].restorable;\n } else if (foundBaseFilterIndex === -1 && filters[i].origin === 'scope' && filters[i].restorable) {\n // scopes are being set sometimes (when the observable emits actual filters) after urlSync\n // so we maintain all modified scopes in the adhoc\n // and leave the scopes update to reconciliate on what filters will actually show up\n baseFilters.push(filters[i]);\n }\n }\n\n this._variable.setState({\n filters: filters.filter((f) => !f.origin),\n baseFilters,\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, origin, restorable] = 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 ...(isFilterOrigin(origin) && { origin }),\n ...(!!restorable && { restorable: true }),\n };\n}\n\nfunction isFilterOrigin(value: string): value is FilterOrigin {\n return value === 'scope' || value === 'dashboard';\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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"}
|
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 isMatchAllFilter,\n isMultiValueOperator,\n} from './AdHocFiltersVariable';\nimport { escapeOriginFilterUrlDelimiters, toUrlCommaDelimitedString, unescapeUrlDelimiters } 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 originFilters = this._variable.state.originFilters;\n\n let value = [];\n\n if (filters.length === 0 && originFilters?.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(escapeOriginFilterUrlDelimiters).join('|'))\n );\n }\n\n if (originFilters?.length) {\n // injected filters stored in the following format: normal|adhoc|values#filterOrigin#restorable\n value.push(\n ...originFilters\n ?.filter(isFilterComplete)\n .filter((filter) => !filter.hidden && filter.origin && filter.restorable)\n .map((filter) =>\n toArray(filter).map(escapeOriginFilterUrlDelimiters).join('|').concat(`#${filter.origin}#restorable`)\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 const filters = deserializeUrlToFilters(urlValue);\n const originFilters = updateOriginFilters([...(this._variable.state.originFilters || [])], filters);\n\n this._variable.setState({\n filters: filters.filter((f) => !f.origin),\n originFilters,\n });\n }\n}\n\nfunction updateOriginFilters(prevOriginFilters: AdHocFilterWithLabels[], filters: AdHocFilterWithLabels[]) {\n const updatedOriginFilters: AdHocFilterWithLabels[] = [...prevOriginFilters];\n\n for (let i = 0; i < filters.length; i++) {\n const foundOriginFilterIndex = prevOriginFilters.findIndex((f) => f.key === filters[i].key);\n\n // if we find a match we update originFilters with what's in the URL.\n // If there is a normal filter without an origin that matches keys with\n // some dashboard lvl filter we maintain it as dashboard lvl filter in the\n // new dashboard\n if (foundOriginFilterIndex > -1) {\n if (!filters[i].origin && prevOriginFilters[foundOriginFilterIndex].origin === 'dashboard') {\n filters[i].origin = 'dashboard';\n filters[i].restorable = true;\n }\n\n if (isMatchAllFilter(filters[i])) {\n filters[i].matchAllFilter = true;\n }\n\n updatedOriginFilters[foundOriginFilterIndex] = filters[i];\n } else if (filters[i].origin === 'dashboard') {\n // if it was originating from a dashoard but has no match in the new dashboard\n // remove it's origin, turn it into a normal filter to be set below\n delete filters[i].origin;\n delete filters[i].restorable;\n } else if (foundOriginFilterIndex === -1 && filters[i].origin === 'scope' && filters[i].restorable) {\n // scopes are being set urlSync so we maintain all modified scopes in the adhoc\n // and leave the scopes update to reconciliate on what filters will actually show up\n updatedOriginFilters.push(filters[i]);\n }\n }\n\n return updatedOriginFilters;\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, origin, restorable] = 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 ...(isFilterOrigin(origin) && { origin }),\n ...(!!restorable && { restorable: true }),\n };\n}\n\nfunction isFilterOrigin(value: string): value is FilterOrigin {\n return value === 'scope' || value === 'dashboard';\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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"}
|
@@ -123,7 +123,7 @@ function escapeUrlHashDelimiters(value) {
|
|
123
123
|
}
|
124
124
|
return /#/g[Symbol.replace](value, "__gfh__");
|
125
125
|
}
|
126
|
-
function
|
126
|
+
function escapeOriginFilterUrlDelimiters(value) {
|
127
127
|
return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));
|
128
128
|
}
|
129
129
|
function escapeURLDelimiters(value) {
|
@@ -170,5 +170,5 @@ function handleOptionGroups(values) {
|
|
170
170
|
return result;
|
171
171
|
}
|
172
172
|
|
173
|
-
export { dataFromResponse,
|
173
|
+
export { dataFromResponse, escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector, escapeOriginFilterUrlDelimiters, escapeURLDelimiters, escapeUrlCommaDelimiters, escapeUrlHashDelimiters, escapeUrlPipeDelimiters, getQueriesForVariables, handleOptionGroups, isVariableValueEqual, renderPrometheusLabelFilters, responseHasError, safeStringifyValue, toUrlCommaDelimitedString, unescapeUrlDelimiters };
|
174
174
|
//# sourceMappingURL=utils.js.map
|