@grafana/scenes 6.18.2--canary.1144.15561582453.0 → 6.18.2--canary.1146.15588416655.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/dist/esm/querying/SceneQueryRunner.js +4 -6
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/querying/layers/annotations/standardAnnotationQuery.js +0 -2
- package/dist/esm/querying/layers/annotations/standardAnnotationQuery.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/groupby/GroupByVariable.js +5 -11
- package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.js +3 -17
- package/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.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 +88 -115
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/variables/utils.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport { VariableValue } from './types';\nimport { AdHocVariableFilter, DataQueryError, GetTagResponse, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneDataQuery, SceneObject, SceneObjectState } from '../core/types';\nimport { SceneQueryRunner } from '../querying/SceneQueryRunner';\nimport { DataSourceRef } from '@grafana/schema';\n\nexport function isVariableValueEqual(a: VariableValue | null | undefined, b: VariableValue | null | undefined) {\n if (a === b) {\n return true;\n }\n\n return isEqual(a, b);\n}\n\nexport function safeStringifyValue(value: unknown) {\n // Avoid circular references ignoring those references\n const getCircularReplacer = () => {\n const seen = new WeakSet();\n return (_: string, value: object | null) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n }\n return value;\n };\n };\n\n try {\n return JSON.stringify(value, getCircularReplacer());\n } catch (error) {\n console.error(error);\n }\n\n return '';\n}\n\nexport function renderPrometheusLabelFilters(filters: AdHocVariableFilter[]) {\n return filters.map((filter) => renderFilter(filter)).join(',');\n}\n\nfunction renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n let operator = filter.operator;\n\n // map \"one of\" operator to regex\n if (operator === '=|') {\n operator = '=~';\n // TODO remove when we're on the latest version of @grafana/data\n // @ts-expect-error\n value = filter.values?.map(escapeLabelValueInRegexSelector).join('|');\n } else if (operator === '!=|') {\n operator = '!~';\n // TODO remove when we're on the latest version of @grafana/data\n // @ts-expect-error\n value = filter.values?.map(escapeLabelValueInRegexSelector).join('|');\n } else if (operator === '=~' || operator === '!~') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${operator}\"${value}\"`;\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n\n/**\n * Get all queries in the scene that have the same datasource as provided source object\n */\nexport function getQueriesForVariables(\n sourceObject: SceneObject<SceneObjectState & { datasource: DataSourceRef | null }>\n) {\n const runners = sceneGraph.findAllObjects(\n sourceObject.getRoot(),\n (o) => o instanceof SceneQueryRunner\n ) as SceneQueryRunner[];\n\n const interpolatedDsUuid = sceneGraph.interpolate(sourceObject, sourceObject.state.datasource?.uid);\n\n const applicableRunners = filterOutInactiveRunnerDuplicates(runners).filter((r) => {\n const interpolatedQueryDsUuid = sceneGraph.interpolate(sourceObject, r.state.datasource?.uid);\n\n return interpolatedQueryDsUuid === interpolatedDsUuid;\n });\n\n if (applicableRunners.length === 0) {\n return [];\n }\n\n const result: SceneDataQuery[] = [];\n applicableRunners.forEach((r) => {\n result.push(\n ...r.state.queries.filter((q) => {\n if (!q.datasource || !q.datasource.uid) {\n return true;\n }\n\n const interpolatedQueryDsUuid = sceneGraph.interpolate(sourceObject, q.datasource.uid);\n return interpolatedQueryDsUuid === interpolatedDsUuid;\n })\n );\n });\n\n return result;\n}\n\n// Filters out inactive runner duplicates, keeping only the ones that are currently active.\n// This is needed for scnearios whan a query runner is cloned and the original is not removed but de-activated.\n// Can happen i.e. when editing a panel in Grafana Core dashboards.\nfunction filterOutInactiveRunnerDuplicates(runners: SceneQueryRunner[]) {\n // Group items by key\n const groupedItems: { [key: string]: SceneQueryRunner[] } = {};\n\n for (const item of runners) {\n if (item.state.key) {\n if (!(item.state.key in groupedItems)) {\n groupedItems[item.state.key] = [];\n }\n groupedItems[item.state.key].push(item);\n }\n }\n\n // Filter out inactive items and concatenate active items\n return Object.values(groupedItems).flatMap((group) => {\n const activeItems = group.filter((item) => item.isActive);\n // Keep inactive items if there's only one item with the key\n if (activeItems.length === 0 && group.length === 1) {\n return group;\n }\n return activeItems;\n });\n}\n\nexport function escapeUrlPipeDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Replace the pipe due to using it as a filter separator\n return (value = /\\|/g[Symbol.replace](value, '__gfp__'));\n}\n\nexport function escapeUrlCommaDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Replace the comma due to using it as a value/label separator\n return /,/g[Symbol.replace](value, '__gfc__');\n}\n\nexport function escapeUrlHashDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Replace the hash due to using it as a value/label separator\n return /#/g[Symbol.replace](value, '__gfh__');\n}\n\nexport function escapeInjectedFilterUrlDelimiters(value: string | undefined): string {\n return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));\n}\n\nexport function escapeURLDelimiters(value: string | undefined): string {\n return escapeUrlCommaDelimiters(escapeUrlPipeDelimiters(value));\n}\n\nexport function unescapeUrlDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n value = /__gfp__/g[Symbol.replace](value, '|');\n value = /__gfc__/g[Symbol.replace](value, ',');\n value = /__gfh__/g[Symbol.replace](value, '#');\n\n return value;\n}\n\nexport function toUrlCommaDelimitedString(key: string, label?: string): string {\n // Omit for identical key/label or when label is not set at all\n if (!label || key === label) {\n return escapeUrlCommaDelimiters(key);\n }\n\n return [key, label].map(escapeUrlCommaDelimiters).join(',');\n}\n\nexport function dataFromResponse(response: GetTagResponse | MetricFindValue[]) {\n return Array.isArray(response) ? response : response.data;\n}\n\nexport function responseHasError(\n response: GetTagResponse | MetricFindValue[]\n): response is GetTagResponse & { error: DataQueryError } {\n return !Array.isArray(response) && Boolean(response.error);\n}\n\n// Collect a flat list of SelectableValues with a `group` property into a hierarchical list with groups\nexport function handleOptionGroups(values: SelectableValue[]): Array<SelectableValue<string>> {\n const result: Array<SelectableValue<string>> = [];\n const groupedResults = new Map<string, Array<SelectableValue<string>>>();\n\n for (const value of values) {\n const groupLabel = value.group;\n if (groupLabel) {\n let group = groupedResults.get(groupLabel);\n\n if (!group) {\n group = [];\n groupedResults.set(groupLabel, group);\n result.push({ label: groupLabel, options: group });\n }\n\n group.push(value);\n } else {\n result.push(value);\n }\n }\n\n return result;\n}\n"],"names":["value","_a"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/variables/utils.ts"],"sourcesContent":["import { isEqual } from 'lodash';\nimport { VariableValue } from './types';\nimport { AdHocVariableFilter, DataQueryError, GetTagResponse, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneDataQuery, SceneObject, SceneObjectState } from '../core/types';\nimport { SceneQueryRunner } from '../querying/SceneQueryRunner';\nimport { DataSourceRef } from '@grafana/schema';\n\nexport function isVariableValueEqual(a: VariableValue | null | undefined, b: VariableValue | null | undefined) {\n if (a === b) {\n return true;\n }\n\n return isEqual(a, b);\n}\n\nexport function safeStringifyValue(value: unknown) {\n // Avoid circular references ignoring those references\n const getCircularReplacer = () => {\n const seen = new WeakSet();\n return (_: string, value: object | null) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n }\n return value;\n };\n };\n\n try {\n return JSON.stringify(value, getCircularReplacer());\n } catch (error) {\n console.error(error);\n }\n\n return '';\n}\n\nexport function renderPrometheusLabelFilters(filters: AdHocVariableFilter[]) {\n return filters.map((filter) => renderFilter(filter)).join(',');\n}\n\nfunction renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n let operator = filter.operator;\n\n // map \"one of\" operator to regex\n if (operator === '=|') {\n operator = '=~';\n // TODO remove when we're on the latest version of @grafana/data\n // @ts-expect-error\n value = filter.values?.map(escapeLabelValueInRegexSelector).join('|');\n } else if (operator === '!=|') {\n operator = '!~';\n // TODO remove when we're on the latest version of @grafana/data\n // @ts-expect-error\n value = filter.values?.map(escapeLabelValueInRegexSelector).join('|');\n } else if (operator === '=~' || operator === '!~') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${operator}\"${value}\"`;\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n\n/**\n * Get all queries in the scene that have the same datasource as provided source object\n */\nexport function getQueriesForVariables(\n sourceObject: SceneObject<SceneObjectState & { datasource: DataSourceRef | null }>\n) {\n const runners = sceneGraph.findAllObjects(\n sourceObject.getRoot(),\n (o) => o instanceof SceneQueryRunner\n ) as SceneQueryRunner[];\n\n const interpolatedDsUuid = sceneGraph.interpolate(sourceObject, sourceObject.state.datasource?.uid);\n\n const applicableRunners = filterOutInactiveRunnerDuplicates(runners).filter((r) => {\n const interpolatedQueryDsUuid = sceneGraph.interpolate(sourceObject, r.state.datasource?.uid);\n\n return interpolatedQueryDsUuid === interpolatedDsUuid;\n });\n\n if (applicableRunners.length === 0) {\n return [];\n }\n\n const result: SceneDataQuery[] = [];\n applicableRunners.forEach((r) => {\n result.push(\n ...r.state.queries.filter((q) => {\n if (!q.datasource || !q.datasource.uid) {\n return true;\n }\n\n const interpolatedQueryDsUuid = sceneGraph.interpolate(sourceObject, q.datasource.uid);\n return interpolatedQueryDsUuid === interpolatedDsUuid;\n })\n );\n });\n\n return result;\n}\n\n// Filters out inactive runner duplicates, keeping only the ones that are currently active.\n// This is needed for scnearios whan a query runner is cloned and the original is not removed but de-activated.\n// Can happen i.e. when editing a panel in Grafana Core dashboards.\nfunction filterOutInactiveRunnerDuplicates(runners: SceneQueryRunner[]) {\n // Group items by key\n const groupedItems: { [key: string]: SceneQueryRunner[] } = {};\n\n for (const item of runners) {\n if (item.state.key) {\n if (!(item.state.key in groupedItems)) {\n groupedItems[item.state.key] = [];\n }\n groupedItems[item.state.key].push(item);\n }\n }\n\n // Filter out inactive items and concatenate active items\n return Object.values(groupedItems).flatMap((group) => {\n const activeItems = group.filter((item) => item.isActive);\n // Keep inactive items if there's only one item with the key\n if (activeItems.length === 0 && group.length === 1) {\n return group;\n }\n return activeItems;\n });\n}\n\nexport function escapeUrlPipeDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Replace the pipe due to using it as a filter separator\n return (value = /\\|/g[Symbol.replace](value, '__gfp__'));\n}\n\nexport function escapeUrlCommaDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Replace the comma due to using it as a value/label separator\n return /,/g[Symbol.replace](value, '__gfc__');\n}\n\nexport function escapeUrlHashDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Replace the hash due to using it as a value/label separator\n return /#/g[Symbol.replace](value, '__gfh__');\n}\n\nexport function escapeOriginFilterUrlDelimiters(value: string | undefined): string {\n return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));\n}\n\nexport function escapeURLDelimiters(value: string | undefined): string {\n return escapeUrlCommaDelimiters(escapeUrlPipeDelimiters(value));\n}\n\nexport function unescapeUrlDelimiters(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n value = /__gfp__/g[Symbol.replace](value, '|');\n value = /__gfc__/g[Symbol.replace](value, ',');\n value = /__gfh__/g[Symbol.replace](value, '#');\n\n return value;\n}\n\nexport function toUrlCommaDelimitedString(key: string, label?: string): string {\n // Omit for identical key/label or when label is not set at all\n if (!label || key === label) {\n return escapeUrlCommaDelimiters(key);\n }\n\n return [key, label].map(escapeUrlCommaDelimiters).join(',');\n}\n\nexport function dataFromResponse(response: GetTagResponse | MetricFindValue[]) {\n return Array.isArray(response) ? response : response.data;\n}\n\nexport function responseHasError(\n response: GetTagResponse | MetricFindValue[]\n): response is GetTagResponse & { error: DataQueryError } {\n return !Array.isArray(response) && Boolean(response.error);\n}\n\n// Collect a flat list of SelectableValues with a `group` property into a hierarchical list with groups\nexport function handleOptionGroups(values: SelectableValue[]): Array<SelectableValue<string>> {\n const result: Array<SelectableValue<string>> = [];\n const groupedResults = new Map<string, Array<SelectableValue<string>>>();\n\n for (const value of values) {\n const groupLabel = value.group;\n if (groupLabel) {\n let group = groupedResults.get(groupLabel);\n\n if (!group) {\n group = [];\n groupedResults.set(groupLabel, group);\n result.push({ label: groupLabel, options: group });\n }\n\n group.push(value);\n } else {\n result.push(value);\n }\n }\n\n return result;\n}\n"],"names":["value","_a"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
@@ -849,6 +849,8 @@ interface AdHocFiltersVariableState extends SceneVariableState {
|
|
849
849
|
filters: AdHocFilterWithLabels[];
|
850
850
|
/** Base filters to always apply when looking up keys*/
|
851
851
|
baseFilters?: AdHocFilterWithLabels[];
|
852
|
+
/** Filters originated from a source */
|
853
|
+
originFilters?: AdHocFilterWithLabels[];
|
852
854
|
/** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */
|
853
855
|
datasource: DataSourceRef | null;
|
854
856
|
/** Controls if the filters can be changed */
|
@@ -943,6 +945,7 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
|
|
943
945
|
private _scopedVars;
|
944
946
|
private _dataSourceSrv;
|
945
947
|
private _originalValues;
|
948
|
+
private _prevScopes;
|
946
949
|
/** Needed for scopes dependency */
|
947
950
|
protected _variableDependency: VariableDependencyConfig<AdHocFiltersVariableState>;
|
948
951
|
protected _urlSync: AdHocFiltersVariableUrlSyncHandler;
|
package/dist/index.js
CHANGED
@@ -2986,7 +2986,6 @@ class GroupByVariableUrlSyncHandler {
|
|
2986
2986
|
};
|
2987
2987
|
}
|
2988
2988
|
updateFromUrl(values) {
|
2989
|
-
var _a, _b, _c, _d;
|
2990
2989
|
let urlValue = values[this.getKey()];
|
2991
2990
|
let restorableValue = values[this.getRestorableKey()];
|
2992
2991
|
if (urlValue != null) {
|
@@ -2994,24 +2993,11 @@ class GroupByVariableUrlSyncHandler {
|
|
2994
2993
|
this._sceneObject.skipNextValidation = true;
|
2995
2994
|
}
|
2996
2995
|
const { values: values2, texts } = fromUrlValues(urlValue);
|
2997
|
-
if (restorableValue === "false") {
|
2998
|
-
if (this._sceneObject.state.defaultValue) {
|
2999
|
-
this._sceneObject.changeValueTo(
|
3000
|
-
(_a = this._sceneObject.state.defaultValue) == null ? void 0 : _a.value,
|
3001
|
-
(_b = this._sceneObject.state.defaultValue) == null ? void 0 : _b.text,
|
3002
|
-
false
|
3003
|
-
);
|
3004
|
-
return;
|
3005
|
-
}
|
3006
|
-
this._sceneObject.changeValueTo([], []);
|
2996
|
+
if (this._sceneObject.state.defaultValue && (restorableValue === "false" || restorableValue === void 0)) {
|
3007
2997
|
return;
|
3008
2998
|
}
|
3009
|
-
if (restorableValue ===
|
3010
|
-
this._sceneObject.changeValueTo(
|
3011
|
-
(_c = this._sceneObject.state.defaultValue) == null ? void 0 : _c.value,
|
3012
|
-
(_d = this._sceneObject.state.defaultValue) == null ? void 0 : _d.text,
|
3013
|
-
false
|
3014
|
-
);
|
2999
|
+
if (restorableValue === "false") {
|
3000
|
+
this._sceneObject.changeValueTo([], [], false);
|
3015
3001
|
return;
|
3016
3002
|
}
|
3017
3003
|
this._sceneObject.changeValueTo(values2, texts);
|
@@ -3226,17 +3212,8 @@ class GroupByVariable extends MultiValueVariable {
|
|
3226
3212
|
this._urlSync = new GroupByVariableUrlSyncHandler(this);
|
3227
3213
|
this._activationHandler = () => {
|
3228
3214
|
if (this.state.defaultValue) {
|
3229
|
-
|
3230
|
-
|
3231
|
-
partial.value = this.state.defaultValue.value;
|
3232
|
-
partial.text = this.state.defaultValue.text;
|
3233
|
-
partial.restorable = false;
|
3234
|
-
}
|
3235
|
-
if (this.state.defaultValue && this.checkIfRestorable(this.state.value)) {
|
3236
|
-
partial.restorable = true;
|
3237
|
-
}
|
3238
|
-
if (Object.keys(partial).length) {
|
3239
|
-
this.setState(partial);
|
3215
|
+
if (this.checkIfRestorable(this.state.value)) {
|
3216
|
+
this.setState({ restorable: true });
|
3240
3217
|
}
|
3241
3218
|
}
|
3242
3219
|
return () => {
|
@@ -3283,6 +3260,9 @@ class GroupByVariable extends MultiValueVariable {
|
|
3283
3260
|
}
|
3284
3261
|
return keys;
|
3285
3262
|
};
|
3263
|
+
if (this.state.defaultValue) {
|
3264
|
+
this.changeValueTo(this.state.defaultValue.value, this.state.defaultValue.text, false);
|
3265
|
+
}
|
3286
3266
|
if (this.state.applyMode === "auto") {
|
3287
3267
|
this.addActivationHandler(() => {
|
3288
3268
|
allActiveGroupByVariables.add(this);
|
@@ -3957,20 +3937,20 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
3957
3937
|
}
|
3958
3938
|
getUrlState() {
|
3959
3939
|
const filters = this._variable.state.filters;
|
3960
|
-
const
|
3940
|
+
const originFilters = this._variable.state.originFilters;
|
3961
3941
|
let value = [];
|
3962
|
-
if (filters.length === 0 && (
|
3942
|
+
if (filters.length === 0 && (originFilters == null ? void 0 : originFilters.length) === 0) {
|
3963
3943
|
return { [this.getKey()]: [""] };
|
3964
3944
|
}
|
3965
3945
|
if (filters.length) {
|
3966
3946
|
value.push(
|
3967
|
-
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(
|
3947
|
+
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeOriginFilterUrlDelimiters).join("|"))
|
3968
3948
|
);
|
3969
3949
|
}
|
3970
|
-
if (
|
3950
|
+
if (originFilters == null ? void 0 : originFilters.length) {
|
3971
3951
|
value.push(
|
3972
|
-
...
|
3973
|
-
(filter) => toArray(filter).map(
|
3952
|
+
...originFilters == null ? void 0 : originFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.restorable).map(
|
3953
|
+
(filter) => toArray(filter).map(escapeOriginFilterUrlDelimiters).join("|").concat(`#${filter.origin}#restorable`)
|
3974
3954
|
)
|
3975
3955
|
);
|
3976
3956
|
}
|
@@ -3984,31 +3964,35 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
3984
3964
|
return;
|
3985
3965
|
}
|
3986
3966
|
const filters = deserializeUrlToFilters(urlValue);
|
3987
|
-
const
|
3988
|
-
for (let i = 0; i < filters.length; i++) {
|
3989
|
-
const foundBaseFilterIndex = baseFilters.findIndex((f) => f.key === filters[i].key);
|
3990
|
-
if (foundBaseFilterIndex > -1) {
|
3991
|
-
if (!filters[i].origin && baseFilters[foundBaseFilterIndex].origin === "dashboard") {
|
3992
|
-
filters[i].origin = "dashboard";
|
3993
|
-
filters[i].restorable = true;
|
3994
|
-
}
|
3995
|
-
if (isMatchAllFilter(filters[i])) {
|
3996
|
-
filters[i].matchAllFilter = true;
|
3997
|
-
}
|
3998
|
-
baseFilters[foundBaseFilterIndex] = filters[i];
|
3999
|
-
} else if (filters[i].origin === "dashboard") {
|
4000
|
-
delete filters[i].origin;
|
4001
|
-
delete filters[i].restorable;
|
4002
|
-
} else if (foundBaseFilterIndex === -1 && filters[i].origin === "scope" && filters[i].restorable) {
|
4003
|
-
baseFilters.push(filters[i]);
|
4004
|
-
}
|
4005
|
-
}
|
3967
|
+
const originFilters = updateOriginFilters([...this._variable.state.originFilters || []], filters);
|
4006
3968
|
this._variable.setState({
|
4007
3969
|
filters: filters.filter((f) => !f.origin),
|
4008
|
-
|
3970
|
+
originFilters
|
4009
3971
|
});
|
4010
3972
|
}
|
4011
3973
|
}
|
3974
|
+
function updateOriginFilters(prevOriginFilters, filters) {
|
3975
|
+
const updatedOriginFilters = [...prevOriginFilters];
|
3976
|
+
for (let i = 0; i < filters.length; i++) {
|
3977
|
+
const foundOriginFilterIndex = prevOriginFilters.findIndex((f) => f.key === filters[i].key);
|
3978
|
+
if (foundOriginFilterIndex > -1) {
|
3979
|
+
if (!filters[i].origin && prevOriginFilters[foundOriginFilterIndex].origin === "dashboard") {
|
3980
|
+
filters[i].origin = "dashboard";
|
3981
|
+
filters[i].restorable = true;
|
3982
|
+
}
|
3983
|
+
if (isMatchAllFilter(filters[i])) {
|
3984
|
+
filters[i].matchAllFilter = true;
|
3985
|
+
}
|
3986
|
+
updatedOriginFilters[foundOriginFilterIndex] = filters[i];
|
3987
|
+
} else if (filters[i].origin === "dashboard") {
|
3988
|
+
delete filters[i].origin;
|
3989
|
+
delete filters[i].restorable;
|
3990
|
+
} else if (foundOriginFilterIndex === -1 && filters[i].origin === "scope" && filters[i].restorable) {
|
3991
|
+
updatedOriginFilters.push(filters[i]);
|
3992
|
+
}
|
3993
|
+
}
|
3994
|
+
return updatedOriginFilters;
|
3995
|
+
}
|
4012
3996
|
function deserializeUrlToFilters(value) {
|
4013
3997
|
if (Array.isArray(value)) {
|
4014
3998
|
const values = value;
|
@@ -5336,7 +5320,7 @@ const AdHocFiltersAlwaysWipCombobox = React.forwardRef(function AdHocFiltersAlwa
|
|
5336
5320
|
});
|
5337
5321
|
|
5338
5322
|
const AdHocFiltersComboboxRenderer = React.memo(function AdHocFiltersComboboxRenderer2({ model }) {
|
5339
|
-
const {
|
5323
|
+
const { originFilters, filters, readOnly } = model.useState();
|
5340
5324
|
const styles = ui.useStyles2(getStyles$a);
|
5341
5325
|
const focusOnWipInputRef = React.useRef();
|
5342
5326
|
return /* @__PURE__ */ React__default.default.createElement(
|
@@ -5349,7 +5333,7 @@ const AdHocFiltersComboboxRenderer = React.memo(function AdHocFiltersComboboxRen
|
|
5349
5333
|
}
|
5350
5334
|
},
|
5351
5335
|
/* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "filter", className: styles.filterIcon, size: "lg" }),
|
5352
|
-
|
5336
|
+
originFilters == null ? void 0 : originFilters.map(
|
5353
5337
|
(filter, index) => filter.origin ? /* @__PURE__ */ React__default.default.createElement(
|
5354
5338
|
AdHocFilterPill,
|
5355
5339
|
{
|
@@ -5513,17 +5497,14 @@ const OPERATORS = [
|
|
5513
5497
|
];
|
5514
5498
|
class AdHocFiltersVariable extends SceneObjectBase {
|
5515
5499
|
constructor(state) {
|
5516
|
-
var _a, _b, _c, _d, _e
|
5500
|
+
var _a, _b, _c, _d, _e;
|
5517
5501
|
super({
|
5518
5502
|
type: "adhoc",
|
5519
5503
|
name: (_a = state.name) != null ? _a : "Filters",
|
5520
5504
|
filters: [],
|
5521
5505
|
datasource: null,
|
5522
5506
|
applyMode: "auto",
|
5523
|
-
filterExpression: (
|
5524
|
-
...(_c = (_b = state.baseFilters) == null ? void 0 : _b.filter((filter) => filter.origin)) != null ? _c : [],
|
5525
|
-
...(_d = state.filters) != null ? _d : []
|
5526
|
-
]),
|
5507
|
+
filterExpression: (_d = state.filterExpression) != null ? _d : renderExpression(state.expressionBuilder, [...(_b = state.originFilters) != null ? _b : [], ...(_c = state.filters) != null ? _c : []]),
|
5527
5508
|
...state
|
5528
5509
|
});
|
5529
5510
|
this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
|
@@ -5532,6 +5513,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5532
5513
|
// are set on construct and used to restore a baseFilter with an origin
|
5533
5514
|
// to its original value if edited at some point
|
5534
5515
|
this._originalValues = /* @__PURE__ */ new Map();
|
5516
|
+
this._prevScopes = [];
|
5535
5517
|
/** Needed for scopes dependency */
|
5536
5518
|
this._variableDependency = new VariableDependencyConfig(this, {
|
5537
5519
|
dependsOnScopes: true,
|
@@ -5539,44 +5521,33 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5539
5521
|
});
|
5540
5522
|
this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
|
5541
5523
|
this._activationHandler = () => {
|
5542
|
-
this._updateScopesFilters();
|
5543
5524
|
return () => {
|
5544
|
-
var _a
|
5545
|
-
|
5546
|
-
|
5547
|
-
|
5548
|
-
}
|
5549
|
-
|
5550
|
-
if (filter.origin === "dashboard" && filter.restorable) {
|
5551
|
-
this.restoreOriginalFilter(filter);
|
5552
|
-
}
|
5553
|
-
});
|
5554
|
-
}
|
5525
|
+
var _a;
|
5526
|
+
(_a = this.state.originFilters) == null ? void 0 : _a.forEach((filter) => {
|
5527
|
+
if (filter.restorable) {
|
5528
|
+
this.restoreOriginalFilter(filter);
|
5529
|
+
}
|
5530
|
+
});
|
5555
5531
|
};
|
5556
5532
|
};
|
5557
5533
|
if (this.state.applyMode === "auto") {
|
5558
5534
|
patchGetAdhocFilters(this);
|
5559
5535
|
}
|
5560
|
-
(
|
5536
|
+
(_e = this.state.originFilters) == null ? void 0 : _e.forEach((filter) => {
|
5561
5537
|
var _a2;
|
5562
|
-
|
5563
|
-
|
5564
|
-
|
5565
|
-
|
5566
|
-
});
|
5567
|
-
}
|
5538
|
+
this._originalValues.set(filter.key, {
|
5539
|
+
operator: filter.operator,
|
5540
|
+
value: (_a2 = filter.values) != null ? _a2 : [filter.value]
|
5541
|
+
});
|
5568
5542
|
});
|
5569
5543
|
this.addActivationHandler(this._activationHandler);
|
5570
5544
|
}
|
5571
5545
|
_updateScopesFilters() {
|
5572
5546
|
var _a, _b;
|
5573
5547
|
const scopes = sceneGraph.getScopes(this);
|
5574
|
-
if (!scopes) {
|
5575
|
-
return;
|
5576
|
-
}
|
5577
|
-
if (!scopes.length) {
|
5548
|
+
if (!scopes || !scopes.length) {
|
5578
5549
|
this.setState({
|
5579
|
-
|
5550
|
+
originFilters: (_a = this.state.originFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scope")
|
5580
5551
|
});
|
5581
5552
|
return;
|
5582
5553
|
}
|
@@ -5594,13 +5565,18 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5594
5565
|
operator: scopeFilter.operator
|
5595
5566
|
});
|
5596
5567
|
});
|
5597
|
-
(_b = this.state.
|
5568
|
+
(_b = this.state.originFilters) == null ? void 0 : _b.forEach((filter) => {
|
5598
5569
|
if (filter.origin === "scope") {
|
5599
5570
|
scopeInjectedFilters.push(filter);
|
5600
5571
|
} else {
|
5601
5572
|
remainingFilters.push(filter);
|
5602
5573
|
}
|
5603
5574
|
});
|
5575
|
+
if (this._prevScopes.length) {
|
5576
|
+
this.setState({ originFilters: [...finalFilters, ...remainingFilters] });
|
5577
|
+
this._prevScopes = scopes;
|
5578
|
+
return;
|
5579
|
+
}
|
5604
5580
|
const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);
|
5605
5581
|
const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
|
5606
5582
|
const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
|
@@ -5608,18 +5584,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5608
5584
|
...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
|
5609
5585
|
...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
|
5610
5586
|
];
|
5611
|
-
this.setState({
|
5587
|
+
this.setState({ originFilters: [...finalFilters, ...remainingFilters] });
|
5588
|
+
this._prevScopes = scopes;
|
5612
5589
|
}
|
5613
5590
|
setState(update) {
|
5614
|
-
var _a, _b
|
5591
|
+
var _a, _b;
|
5615
5592
|
let filterExpressionChanged = false;
|
5616
|
-
if ((update.filters && update.filters !== this.state.filters || update.
|
5593
|
+
if ((update.filters && update.filters !== this.state.filters || update.originFilters && update.originFilters !== this.state.originFilters) && !update.filterExpression) {
|
5617
5594
|
const filters = (_a = update.filters) != null ? _a : this.state.filters;
|
5618
|
-
const
|
5619
|
-
update.filterExpression = renderExpression(this.state.expressionBuilder, [
|
5620
|
-
...(_c = baseFilters == null ? void 0 : baseFilters.filter((filter) => filter.origin)) != null ? _c : [],
|
5621
|
-
...filters != null ? filters : []
|
5622
|
-
]);
|
5595
|
+
const originFilters = (_b = update.originFilters) != null ? _b : this.state.originFilters;
|
5596
|
+
update.filterExpression = renderExpression(this.state.expressionBuilder, [...originFilters != null ? originFilters : [], ...filters]);
|
5623
5597
|
filterExpressionChanged = update.filterExpression !== this.state.filterExpression;
|
5624
5598
|
}
|
5625
5599
|
super.setState(update);
|
@@ -5633,12 +5607,12 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5633
5607
|
* allowing consumers to update the filters without triggering dependent data providers.
|
5634
5608
|
*/
|
5635
5609
|
updateFilters(filters, options) {
|
5636
|
-
var _a
|
5610
|
+
var _a;
|
5637
5611
|
let filterExpressionChanged = false;
|
5638
5612
|
let filterExpression = void 0;
|
5639
5613
|
if (filters && filters !== this.state.filters) {
|
5640
5614
|
filterExpression = renderExpression(this.state.expressionBuilder, [
|
5641
|
-
...(
|
5615
|
+
...(_a = this.state.originFilters) != null ? _a : [],
|
5642
5616
|
...filters
|
5643
5617
|
]);
|
5644
5618
|
filterExpressionChanged = filterExpression !== this.state.filterExpression;
|
@@ -5658,32 +5632,34 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5658
5632
|
};
|
5659
5633
|
if (filter.restorable) {
|
5660
5634
|
const originalFilter = this._originalValues.get(filter.key);
|
5635
|
+
if (!originalFilter) {
|
5636
|
+
return;
|
5637
|
+
}
|
5661
5638
|
original.value = originalFilter == null ? void 0 : originalFilter.value[0];
|
5662
5639
|
original.values = originalFilter == null ? void 0 : originalFilter.value;
|
5663
5640
|
original.valueLabels = originalFilter == null ? void 0 : originalFilter.value;
|
5664
5641
|
original.operator = originalFilter == null ? void 0 : originalFilter.operator;
|
5642
|
+
this._updateFilter(filter, original);
|
5665
5643
|
}
|
5666
|
-
this._updateFilter(filter, original);
|
5667
5644
|
}
|
5668
5645
|
getValue() {
|
5669
5646
|
return this.state.filterExpression;
|
5670
5647
|
}
|
5671
5648
|
_updateFilter(filter, update) {
|
5672
5649
|
var _a;
|
5673
|
-
const {
|
5650
|
+
const { originFilters, filters, _wip } = this.state;
|
5674
5651
|
if (filter.origin) {
|
5675
5652
|
const originalValues = this._originalValues.get(filter.key);
|
5676
5653
|
const updateValues = update.values || (update.value ? [update.value] : void 0);
|
5677
|
-
|
5678
|
-
if (!isRestorableOverride && (updateValues && !lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator))) {
|
5654
|
+
if (updateValues && !lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator)) {
|
5679
5655
|
update.restorable = true;
|
5680
5656
|
} else if (updateValues && lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value)) {
|
5681
5657
|
update.restorable = false;
|
5682
5658
|
}
|
5683
|
-
const
|
5659
|
+
const updatedFilters2 = (_a = originFilters == null ? void 0 : originFilters.map((f) => {
|
5684
5660
|
return f === filter ? { ...f, ...update } : f;
|
5685
5661
|
})) != null ? _a : [];
|
5686
|
-
this.setState({
|
5662
|
+
this.setState({ originFilters: updatedFilters2 });
|
5687
5663
|
return;
|
5688
5664
|
}
|
5689
5665
|
if (filter === _wip) {
|
@@ -5746,13 +5722,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5746
5722
|
return [...acc, f];
|
5747
5723
|
}, [])
|
5748
5724
|
});
|
5749
|
-
} else if ((_a = this.state.
|
5750
|
-
let filterToForceIndex = this.state.
|
5725
|
+
} else if ((_a = this.state.originFilters) == null ? void 0 : _a.length) {
|
5726
|
+
let filterToForceIndex = this.state.originFilters.length - 1;
|
5751
5727
|
if (filter !== this.state._wip) {
|
5752
5728
|
filterToForceIndex = -1;
|
5753
5729
|
}
|
5754
5730
|
this.setState({
|
5755
|
-
|
5731
|
+
originFilters: this.state.originFilters.reduce((acc, f, index) => {
|
5756
5732
|
if (index === filterToForceIndex && !f.readOnly) {
|
5757
5733
|
return [
|
5758
5734
|
...acc,
|
@@ -5822,8 +5798,8 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5822
5798
|
if (!ds || !ds.getTagValues) {
|
5823
5799
|
return [];
|
5824
5800
|
}
|
5825
|
-
const
|
5826
|
-
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(
|
5801
|
+
const originFilters = (_d = (_c = this.state.originFilters) == null ? void 0 : _c.filter((f) => f.key !== filter.key)) != null ? _d : [];
|
5802
|
+
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(originFilters);
|
5827
5803
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
5828
5804
|
const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
|
5829
5805
|
let scopes = sceneGraph.getScopes(this);
|
@@ -6307,12 +6283,10 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
6307
6283
|
...getEnrichedDataRequest(this)
|
6308
6284
|
};
|
6309
6285
|
if (this._adhocFiltersVar) {
|
6310
|
-
request.filters = [
|
6311
|
-
|
6312
|
-
|
6313
|
-
|
6314
|
-
}
|
6315
|
-
request.filters = request.filters.concat(this._adhocFiltersVar.state.filters.filter(isFilterComplete));
|
6286
|
+
request.filters = [
|
6287
|
+
...(_a = this._adhocFiltersVar.state.originFilters) != null ? _a : [],
|
6288
|
+
...this._adhocFiltersVar.state.filters
|
6289
|
+
].filter(isFilterComplete);
|
6316
6290
|
}
|
6317
6291
|
if (this._groupByVar) {
|
6318
6292
|
request.groupByKeys = this._groupByVar.state.value;
|
@@ -6549,7 +6523,7 @@ function escapeUrlHashDelimiters(value) {
|
|
6549
6523
|
}
|
6550
6524
|
return /#/g[Symbol.replace](value, "__gfh__");
|
6551
6525
|
}
|
6552
|
-
function
|
6526
|
+
function escapeOriginFilterUrlDelimiters(value) {
|
6553
6527
|
return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));
|
6554
6528
|
}
|
6555
6529
|
function escapeURLDelimiters(value) {
|
@@ -9052,7 +9026,6 @@ function executeAnnotationQuery(datasource, timeRange, query, layer) {
|
|
9052
9026
|
refId: "Anno"
|
9053
9027
|
}
|
9054
9028
|
],
|
9055
|
-
scopes: sceneGraph.getScopes(layer),
|
9056
9029
|
...getEnrichedDataRequest(layer)
|
9057
9030
|
};
|
9058
9031
|
const runRequest = runtime.getRunRequest();
|