@grafana/scenes 6.18.2--canary.1146.15588416655.0 → 6.19.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 +12 -0
- package/dist/esm/querying/SceneQueryRunner.js +6 -4
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/querying/layers/annotations/standardAnnotationQuery.js +2 -0
- 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 +51 -43
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +28 -32
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariable.js +11 -5
- package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.js +17 -3
- 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 +0 -3
- package/dist/index.js +115 -88
- 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 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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"}
|
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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"}
|
package/dist/index.d.ts
CHANGED
@@ -849,8 +849,6 @@ 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[];
|
854
852
|
/** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */
|
855
853
|
datasource: DataSourceRef | null;
|
856
854
|
/** Controls if the filters can be changed */
|
@@ -945,7 +943,6 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
|
|
945
943
|
private _scopedVars;
|
946
944
|
private _dataSourceSrv;
|
947
945
|
private _originalValues;
|
948
|
-
private _prevScopes;
|
949
946
|
/** Needed for scopes dependency */
|
950
947
|
protected _variableDependency: VariableDependencyConfig<AdHocFiltersVariableState>;
|
951
948
|
protected _urlSync: AdHocFiltersVariableUrlSyncHandler;
|
package/dist/index.js
CHANGED
@@ -2986,6 +2986,7 @@ class GroupByVariableUrlSyncHandler {
|
|
2986
2986
|
};
|
2987
2987
|
}
|
2988
2988
|
updateFromUrl(values) {
|
2989
|
+
var _a, _b, _c, _d;
|
2989
2990
|
let urlValue = values[this.getKey()];
|
2990
2991
|
let restorableValue = values[this.getRestorableKey()];
|
2991
2992
|
if (urlValue != null) {
|
@@ -2993,11 +2994,24 @@ class GroupByVariableUrlSyncHandler {
|
|
2993
2994
|
this._sceneObject.skipNextValidation = true;
|
2994
2995
|
}
|
2995
2996
|
const { values: values2, texts } = fromUrlValues(urlValue);
|
2996
|
-
if (
|
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([], []);
|
2997
3007
|
return;
|
2998
3008
|
}
|
2999
|
-
if (restorableValue ===
|
3000
|
-
this._sceneObject.changeValueTo(
|
3009
|
+
if (restorableValue === void 0 && this._sceneObject.state.defaultValue) {
|
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
|
+
);
|
3001
3015
|
return;
|
3002
3016
|
}
|
3003
3017
|
this._sceneObject.changeValueTo(values2, texts);
|
@@ -3212,8 +3226,17 @@ class GroupByVariable extends MultiValueVariable {
|
|
3212
3226
|
this._urlSync = new GroupByVariableUrlSyncHandler(this);
|
3213
3227
|
this._activationHandler = () => {
|
3214
3228
|
if (this.state.defaultValue) {
|
3215
|
-
|
3216
|
-
|
3229
|
+
const partial = {};
|
3230
|
+
if (lodash.isArray(this.state.value) && !this.state.value.length || !this.state.value) {
|
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);
|
3217
3240
|
}
|
3218
3241
|
}
|
3219
3242
|
return () => {
|
@@ -3260,9 +3283,6 @@ class GroupByVariable extends MultiValueVariable {
|
|
3260
3283
|
}
|
3261
3284
|
return keys;
|
3262
3285
|
};
|
3263
|
-
if (this.state.defaultValue) {
|
3264
|
-
this.changeValueTo(this.state.defaultValue.value, this.state.defaultValue.text, false);
|
3265
|
-
}
|
3266
3286
|
if (this.state.applyMode === "auto") {
|
3267
3287
|
this.addActivationHandler(() => {
|
3268
3288
|
allActiveGroupByVariables.add(this);
|
@@ -3937,20 +3957,20 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
3937
3957
|
}
|
3938
3958
|
getUrlState() {
|
3939
3959
|
const filters = this._variable.state.filters;
|
3940
|
-
const
|
3960
|
+
const baseFilters = this._variable.state.baseFilters;
|
3941
3961
|
let value = [];
|
3942
|
-
if (filters.length === 0 && (
|
3962
|
+
if (filters.length === 0 && (baseFilters == null ? void 0 : baseFilters.length) === 0) {
|
3943
3963
|
return { [this.getKey()]: [""] };
|
3944
3964
|
}
|
3945
3965
|
if (filters.length) {
|
3946
3966
|
value.push(
|
3947
|
-
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(
|
3967
|
+
...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|"))
|
3948
3968
|
);
|
3949
3969
|
}
|
3950
|
-
if (
|
3970
|
+
if (baseFilters == null ? void 0 : baseFilters.length) {
|
3951
3971
|
value.push(
|
3952
|
-
...
|
3953
|
-
(filter) => toArray(filter).map(
|
3972
|
+
...baseFilters == null ? void 0 : baseFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.restorable).map(
|
3973
|
+
(filter) => toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|").concat(`#${filter.origin}#restorable`)
|
3954
3974
|
)
|
3955
3975
|
);
|
3956
3976
|
}
|
@@ -3964,35 +3984,31 @@ class AdHocFiltersVariableUrlSyncHandler {
|
|
3964
3984
|
return;
|
3965
3985
|
}
|
3966
3986
|
const filters = deserializeUrlToFilters(urlValue);
|
3967
|
-
const
|
3987
|
+
const baseFilters = [...this._variable.state.baseFilters || []];
|
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
|
+
}
|
3968
4006
|
this._variable.setState({
|
3969
4007
|
filters: filters.filter((f) => !f.origin),
|
3970
|
-
|
4008
|
+
baseFilters
|
3971
4009
|
});
|
3972
4010
|
}
|
3973
4011
|
}
|
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
|
-
}
|
3996
4012
|
function deserializeUrlToFilters(value) {
|
3997
4013
|
if (Array.isArray(value)) {
|
3998
4014
|
const values = value;
|
@@ -5320,7 +5336,7 @@ const AdHocFiltersAlwaysWipCombobox = React.forwardRef(function AdHocFiltersAlwa
|
|
5320
5336
|
});
|
5321
5337
|
|
5322
5338
|
const AdHocFiltersComboboxRenderer = React.memo(function AdHocFiltersComboboxRenderer2({ model }) {
|
5323
|
-
const {
|
5339
|
+
const { baseFilters, filters, readOnly } = model.useState();
|
5324
5340
|
const styles = ui.useStyles2(getStyles$a);
|
5325
5341
|
const focusOnWipInputRef = React.useRef();
|
5326
5342
|
return /* @__PURE__ */ React__default.default.createElement(
|
@@ -5333,7 +5349,7 @@ const AdHocFiltersComboboxRenderer = React.memo(function AdHocFiltersComboboxRen
|
|
5333
5349
|
}
|
5334
5350
|
},
|
5335
5351
|
/* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "filter", className: styles.filterIcon, size: "lg" }),
|
5336
|
-
|
5352
|
+
baseFilters == null ? void 0 : baseFilters.map(
|
5337
5353
|
(filter, index) => filter.origin ? /* @__PURE__ */ React__default.default.createElement(
|
5338
5354
|
AdHocFilterPill,
|
5339
5355
|
{
|
@@ -5497,14 +5513,17 @@ const OPERATORS = [
|
|
5497
5513
|
];
|
5498
5514
|
class AdHocFiltersVariable extends SceneObjectBase {
|
5499
5515
|
constructor(state) {
|
5500
|
-
var _a, _b, _c, _d, _e;
|
5516
|
+
var _a, _b, _c, _d, _e, _f;
|
5501
5517
|
super({
|
5502
5518
|
type: "adhoc",
|
5503
5519
|
name: (_a = state.name) != null ? _a : "Filters",
|
5504
5520
|
filters: [],
|
5505
5521
|
datasource: null,
|
5506
5522
|
applyMode: "auto",
|
5507
|
-
filterExpression: (
|
5523
|
+
filterExpression: (_e = state.filterExpression) != null ? _e : renderExpression(state.expressionBuilder, [
|
5524
|
+
...(_c = (_b = state.baseFilters) == null ? void 0 : _b.filter((filter) => filter.origin)) != null ? _c : [],
|
5525
|
+
...(_d = state.filters) != null ? _d : []
|
5526
|
+
]),
|
5508
5527
|
...state
|
5509
5528
|
});
|
5510
5529
|
this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
|
@@ -5513,7 +5532,6 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5513
5532
|
// are set on construct and used to restore a baseFilter with an origin
|
5514
5533
|
// to its original value if edited at some point
|
5515
5534
|
this._originalValues = /* @__PURE__ */ new Map();
|
5516
|
-
this._prevScopes = [];
|
5517
5535
|
/** Needed for scopes dependency */
|
5518
5536
|
this._variableDependency = new VariableDependencyConfig(this, {
|
5519
5537
|
dependsOnScopes: true,
|
@@ -5521,33 +5539,44 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5521
5539
|
});
|
5522
5540
|
this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
|
5523
5541
|
this._activationHandler = () => {
|
5542
|
+
this._updateScopesFilters();
|
5524
5543
|
return () => {
|
5525
|
-
var _a;
|
5526
|
-
(_a = this.state.
|
5527
|
-
|
5528
|
-
this.
|
5529
|
-
}
|
5530
|
-
|
5544
|
+
var _a, _b;
|
5545
|
+
if ((_a = this.state.baseFilters) == null ? void 0 : _a.length) {
|
5546
|
+
this.setState({
|
5547
|
+
baseFilters: [...this.state.baseFilters.filter((filter) => filter.origin !== "scope")]
|
5548
|
+
});
|
5549
|
+
(_b = this.state.baseFilters) == null ? void 0 : _b.forEach((filter) => {
|
5550
|
+
if (filter.origin === "dashboard" && filter.restorable) {
|
5551
|
+
this.restoreOriginalFilter(filter);
|
5552
|
+
}
|
5553
|
+
});
|
5554
|
+
}
|
5531
5555
|
};
|
5532
5556
|
};
|
5533
5557
|
if (this.state.applyMode === "auto") {
|
5534
5558
|
patchGetAdhocFilters(this);
|
5535
5559
|
}
|
5536
|
-
(
|
5560
|
+
(_f = this.state.baseFilters) == null ? void 0 : _f.forEach((baseFilter) => {
|
5537
5561
|
var _a2;
|
5538
|
-
|
5539
|
-
|
5540
|
-
|
5541
|
-
|
5562
|
+
if (baseFilter.origin === "dashboard") {
|
5563
|
+
this._originalValues.set(baseFilter.key, {
|
5564
|
+
operator: baseFilter.operator,
|
5565
|
+
value: (_a2 = baseFilter.values) != null ? _a2 : [baseFilter.value]
|
5566
|
+
});
|
5567
|
+
}
|
5542
5568
|
});
|
5543
5569
|
this.addActivationHandler(this._activationHandler);
|
5544
5570
|
}
|
5545
5571
|
_updateScopesFilters() {
|
5546
5572
|
var _a, _b;
|
5547
5573
|
const scopes = sceneGraph.getScopes(this);
|
5548
|
-
if (!scopes
|
5574
|
+
if (!scopes) {
|
5575
|
+
return;
|
5576
|
+
}
|
5577
|
+
if (!scopes.length) {
|
5549
5578
|
this.setState({
|
5550
|
-
|
5579
|
+
baseFilters: (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scope")
|
5551
5580
|
});
|
5552
5581
|
return;
|
5553
5582
|
}
|
@@ -5565,18 +5594,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5565
5594
|
operator: scopeFilter.operator
|
5566
5595
|
});
|
5567
5596
|
});
|
5568
|
-
(_b = this.state.
|
5597
|
+
(_b = this.state.baseFilters) == null ? void 0 : _b.forEach((filter) => {
|
5569
5598
|
if (filter.origin === "scope") {
|
5570
5599
|
scopeInjectedFilters.push(filter);
|
5571
5600
|
} else {
|
5572
5601
|
remainingFilters.push(filter);
|
5573
5602
|
}
|
5574
5603
|
});
|
5575
|
-
if (this._prevScopes.length) {
|
5576
|
-
this.setState({ originFilters: [...finalFilters, ...remainingFilters] });
|
5577
|
-
this._prevScopes = scopes;
|
5578
|
-
return;
|
5579
|
-
}
|
5580
5604
|
const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);
|
5581
5605
|
const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
|
5582
5606
|
const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
|
@@ -5584,16 +5608,18 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5584
5608
|
...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
|
5585
5609
|
...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
|
5586
5610
|
];
|
5587
|
-
this.setState({
|
5588
|
-
this._prevScopes = scopes;
|
5611
|
+
this.setState({ baseFilters: [...finalFilters, ...remainingFilters] });
|
5589
5612
|
}
|
5590
5613
|
setState(update) {
|
5591
|
-
var _a, _b;
|
5614
|
+
var _a, _b, _c;
|
5592
5615
|
let filterExpressionChanged = false;
|
5593
|
-
if ((update.filters && update.filters !== this.state.filters || update.
|
5616
|
+
if ((update.filters && update.filters !== this.state.filters || update.baseFilters && update.baseFilters !== this.state.baseFilters) && !update.filterExpression) {
|
5594
5617
|
const filters = (_a = update.filters) != null ? _a : this.state.filters;
|
5595
|
-
const
|
5596
|
-
update.filterExpression = renderExpression(this.state.expressionBuilder, [
|
5618
|
+
const baseFilters = (_b = update.baseFilters) != null ? _b : this.state.baseFilters;
|
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
|
+
]);
|
5597
5623
|
filterExpressionChanged = update.filterExpression !== this.state.filterExpression;
|
5598
5624
|
}
|
5599
5625
|
super.setState(update);
|
@@ -5607,12 +5633,12 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5607
5633
|
* allowing consumers to update the filters without triggering dependent data providers.
|
5608
5634
|
*/
|
5609
5635
|
updateFilters(filters, options) {
|
5610
|
-
var _a;
|
5636
|
+
var _a, _b;
|
5611
5637
|
let filterExpressionChanged = false;
|
5612
5638
|
let filterExpression = void 0;
|
5613
5639
|
if (filters && filters !== this.state.filters) {
|
5614
5640
|
filterExpression = renderExpression(this.state.expressionBuilder, [
|
5615
|
-
...(_a = this.state.
|
5641
|
+
...(_b = (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin)) != null ? _b : [],
|
5616
5642
|
...filters
|
5617
5643
|
]);
|
5618
5644
|
filterExpressionChanged = filterExpression !== this.state.filterExpression;
|
@@ -5632,34 +5658,32 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5632
5658
|
};
|
5633
5659
|
if (filter.restorable) {
|
5634
5660
|
const originalFilter = this._originalValues.get(filter.key);
|
5635
|
-
if (!originalFilter) {
|
5636
|
-
return;
|
5637
|
-
}
|
5638
5661
|
original.value = originalFilter == null ? void 0 : originalFilter.value[0];
|
5639
5662
|
original.values = originalFilter == null ? void 0 : originalFilter.value;
|
5640
5663
|
original.valueLabels = originalFilter == null ? void 0 : originalFilter.value;
|
5641
5664
|
original.operator = originalFilter == null ? void 0 : originalFilter.operator;
|
5642
|
-
this._updateFilter(filter, original);
|
5643
5665
|
}
|
5666
|
+
this._updateFilter(filter, original);
|
5644
5667
|
}
|
5645
5668
|
getValue() {
|
5646
5669
|
return this.state.filterExpression;
|
5647
5670
|
}
|
5648
5671
|
_updateFilter(filter, update) {
|
5649
5672
|
var _a;
|
5650
|
-
const {
|
5673
|
+
const { baseFilters, filters, _wip } = this.state;
|
5651
5674
|
if (filter.origin) {
|
5652
5675
|
const originalValues = this._originalValues.get(filter.key);
|
5653
5676
|
const updateValues = update.values || (update.value ? [update.value] : void 0);
|
5654
|
-
|
5677
|
+
const isRestorableOverride = update.hasOwnProperty("restorable");
|
5678
|
+
if (!isRestorableOverride && (updateValues && !lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator))) {
|
5655
5679
|
update.restorable = true;
|
5656
5680
|
} else if (updateValues && lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value)) {
|
5657
5681
|
update.restorable = false;
|
5658
5682
|
}
|
5659
|
-
const
|
5683
|
+
const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
|
5660
5684
|
return f === filter ? { ...f, ...update } : f;
|
5661
5685
|
})) != null ? _a : [];
|
5662
|
-
this.setState({
|
5686
|
+
this.setState({ baseFilters: updatedBaseFilters });
|
5663
5687
|
return;
|
5664
5688
|
}
|
5665
5689
|
if (filter === _wip) {
|
@@ -5722,13 +5746,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5722
5746
|
return [...acc, f];
|
5723
5747
|
}, [])
|
5724
5748
|
});
|
5725
|
-
} else if ((_a = this.state.
|
5726
|
-
let filterToForceIndex = this.state.
|
5749
|
+
} else if ((_a = this.state.baseFilters) == null ? void 0 : _a.length) {
|
5750
|
+
let filterToForceIndex = this.state.baseFilters.length - 1;
|
5727
5751
|
if (filter !== this.state._wip) {
|
5728
5752
|
filterToForceIndex = -1;
|
5729
5753
|
}
|
5730
5754
|
this.setState({
|
5731
|
-
|
5755
|
+
baseFilters: this.state.baseFilters.reduce((acc, f, index) => {
|
5732
5756
|
if (index === filterToForceIndex && !f.readOnly) {
|
5733
5757
|
return [
|
5734
5758
|
...acc,
|
@@ -5798,8 +5822,8 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
5798
5822
|
if (!ds || !ds.getTagValues) {
|
5799
5823
|
return [];
|
5800
5824
|
}
|
5801
|
-
const
|
5802
|
-
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(
|
5825
|
+
const filteredBaseFilters = (_d = (_c = this.state.baseFilters) == null ? void 0 : _c.filter((f) => f.origin && f.key !== filter.key)) != null ? _d : [];
|
5826
|
+
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);
|
5803
5827
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
5804
5828
|
const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
|
5805
5829
|
let scopes = sceneGraph.getScopes(this);
|
@@ -6283,10 +6307,12 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
6283
6307
|
...getEnrichedDataRequest(this)
|
6284
6308
|
};
|
6285
6309
|
if (this._adhocFiltersVar) {
|
6286
|
-
request.filters = [
|
6287
|
-
|
6288
|
-
|
6289
|
-
|
6310
|
+
request.filters = [];
|
6311
|
+
if ((_a = this._adhocFiltersVar.state.baseFilters) == null ? void 0 : _a.length) {
|
6312
|
+
const injectedBaseFilters = this._adhocFiltersVar.state.baseFilters.filter((filter) => filter.origin);
|
6313
|
+
request.filters = request.filters.concat(injectedBaseFilters);
|
6314
|
+
}
|
6315
|
+
request.filters = request.filters.concat(this._adhocFiltersVar.state.filters.filter(isFilterComplete));
|
6290
6316
|
}
|
6291
6317
|
if (this._groupByVar) {
|
6292
6318
|
request.groupByKeys = this._groupByVar.state.value;
|
@@ -6523,7 +6549,7 @@ function escapeUrlHashDelimiters(value) {
|
|
6523
6549
|
}
|
6524
6550
|
return /#/g[Symbol.replace](value, "__gfh__");
|
6525
6551
|
}
|
6526
|
-
function
|
6552
|
+
function escapeInjectedFilterUrlDelimiters(value) {
|
6527
6553
|
return escapeUrlHashDelimiters(escapeUrlPipeDelimiters(value));
|
6528
6554
|
}
|
6529
6555
|
function escapeURLDelimiters(value) {
|
@@ -9026,6 +9052,7 @@ function executeAnnotationQuery(datasource, timeRange, query, layer) {
|
|
9026
9052
|
refId: "Anno"
|
9027
9053
|
}
|
9028
9054
|
],
|
9055
|
+
scopes: sceneGraph.getScopes(layer),
|
9029
9056
|
...getEnrichedDataRequest(layer)
|
9030
9057
|
};
|
9031
9058
|
const runRequest = runtime.getRunRequest();
|