@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.
@@ -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":";;;;AAQgB,SAAA,oBAAA,CAAqB,GAAqC,CAAqC,EAAA;AAC7G,EAAA,IAAI,MAAM,CAAG,EAAA;AACX,IAAO,OAAA,IAAA;AAAA;AAGT,EAAO,OAAA,OAAA,CAAQ,GAAG,CAAC,CAAA;AACrB;AAEO,SAAS,mBAAmB,KAAgB,EAAA;AAEjD,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAM,MAAA,IAAA,uBAAW,OAAQ,EAAA;AACzB,IAAO,OAAA,CAAC,GAAWA,MAAyB,KAAA;AAC1C,MAAA,IAAI,OAAOA,MAAAA,KAAU,QAAYA,IAAAA,MAAAA,KAAU,IAAM,EAAA;AAC/C,QAAI,IAAA,IAAA,CAAK,GAAIA,CAAAA,MAAK,CAAG,EAAA;AACnB,UAAA;AAAA;AAEF,QAAA,IAAA,CAAK,IAAIA,MAAK,CAAA;AAAA;AAEhB,MAAOA,OAAAA,MAAAA;AAAA,KACT;AAAA,GACF;AAEA,EAAI,IAAA;AACF,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,KAAO,EAAA,mBAAA,EAAqB,CAAA;AAAA,WAC3C,KAAO,EAAA;AACd,IAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA;AAGrB,EAAO,OAAA,EAAA;AACT;AAEO,SAAS,6BAA6B,OAAgC,EAAA;AAC3E,EAAO,OAAA,OAAA,CAAQ,IAAI,CAAC,MAAA,KAAW,aAAa,MAAM,CAAC,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA;AAC/D;AAEA,SAAS,aAAa,MAA6B,EAAA;AA5CnD,EAAA,IAAA,EAAA,EAAA,EAAA;AA6CE,EAAA,IAAI,KAAQ,GAAA,EAAA;AACZ,EAAA,IAAI,WAAW,MAAO,CAAA,QAAA;AAGtB,EAAA,IAAI,aAAa,IAAM,EAAA;AACrB,IAAW,QAAA,GAAA,IAAA;AAGX,IAAA,KAAA,GAAA,CAAQ,EAAO,GAAA,MAAA,CAAA,MAAA,KAAP,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,GAAA,CAAI,iCAAiC,IAAK,CAAA,GAAA,CAAA;AAAA,GACnE,MAAA,IAAW,aAAa,KAAO,EAAA;AAC7B,IAAW,QAAA,GAAA,IAAA;AAGX,IAAA,KAAA,GAAA,CAAQ,EAAO,GAAA,MAAA,CAAA,MAAA,KAAP,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,GAAA,CAAI,iCAAiC,IAAK,CAAA,GAAA,CAAA;AAAA,GACxD,MAAA,IAAA,QAAA,KAAa,IAAQ,IAAA,QAAA,KAAa,IAAM,EAAA;AACjD,IAAQ,KAAA,GAAA,+BAAA,CAAgC,OAAO,KAAK,CAAA;AAAA,GAC/C,MAAA;AACL,IAAQ,KAAA,GAAA,+BAAA,CAAgC,OAAO,KAAK,CAAA;AAAA;AAGtD,EAAA,OAAO,GAAG,MAAO,CAAA,GAAG,CAAG,EAAA,QAAQ,IAAI,KAAK,CAAA,CAAA,CAAA;AAC1C;AAMO,SAAS,gCAAgC,UAA4B,EAAA;AAC1E,EAAO,OAAA,UAAA,CAAW,OAAQ,CAAA,KAAA,EAAO,MAAM,CAAA,CAAE,OAAQ,CAAA,KAAA,EAAO,KAAK,CAAA,CAAE,OAAQ,CAAA,IAAA,EAAM,KAAK,CAAA;AACpF;AAEO,SAAS,gCAAgC,UAA4B,EAAA;AAC1E,EAAO,OAAA,+BAAA,CAAgC,gBAAiB,CAAA,UAAU,CAAC,CAAA;AACrE;AAaA,MAAM,kBAAqB,GAAA,sBAAA;AAC3B,SAAS,iBAAiB,KAAuB,EAAA;AAC/C,EAAO,OAAA,KAAA,CAAM,OAAQ,CAAA,kBAAA,EAAoB,MAAM,CAAA;AACjD;AAKO,SAAS,uBACd,YACA,EAAA;AArGF,EAAA,IAAA,EAAA;AAsGE,EAAA,MAAM,UAAU,UAAW,CAAA,cAAA;AAAA,IACzB,aAAa,OAAQ,EAAA;AAAA,IACrB,CAAC,MAAM,CAAa,YAAA;AAAA,GACtB;AAEA,EAAM,MAAA,kBAAA,GAAqB,WAAW,WAAY,CAAA,YAAA,EAAA,CAAc,kBAAa,KAAM,CAAA,UAAA,KAAnB,mBAA+B,GAAG,CAAA;AAElG,EAAA,MAAM,oBAAoB,iCAAkC,CAAA,OAAO,CAAE,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA;AA7GrF,IAAAC,IAAAA,GAAAA;AA8GI,IAAM,MAAA,uBAAA,GAA0B,UAAW,CAAA,WAAA,CAAY,YAAcA,EAAAA,CAAAA,GAAAA,GAAA,EAAE,KAAM,CAAA,UAAA,KAAR,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAoB,GAAG,CAAA;AAE5F,IAAA,OAAO,uBAA4B,KAAA,kBAAA;AAAA,GACpC,CAAA;AAED,EAAI,IAAA,iBAAA,CAAkB,WAAW,CAAG,EAAA;AAClC,IAAA,OAAO,EAAC;AAAA;AAGV,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAkB,iBAAA,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA;AAC/B,IAAO,MAAA,CAAA,IAAA;AAAA,MACL,GAAG,CAAE,CAAA,KAAA,CAAM,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA;AAC/B,QAAA,IAAI,CAAC,CAAE,CAAA,UAAA,IAAc,CAAC,CAAA,CAAE,WAAW,GAAK,EAAA;AACtC,UAAO,OAAA,IAAA;AAAA;AAGT,QAAA,MAAM,0BAA0B,UAAW,CAAA,WAAA,CAAY,YAAc,EAAA,CAAA,CAAE,WAAW,GAAG,CAAA;AACrF,QAAA,OAAO,uBAA4B,KAAA,kBAAA;AAAA,OACpC;AAAA,KACH;AAAA,GACD,CAAA;AAED,EAAO,OAAA,MAAA;AACT;AAKA,SAAS,kCAAkC,OAA6B,EAAA;AAEtE,EAAA,MAAM,eAAsD,EAAC;AAE7D,EAAA,KAAA,MAAW,QAAQ,OAAS,EAAA;AAC1B,IAAI,IAAA,IAAA,CAAK,MAAM,GAAK,EAAA;AAClB,MAAA,IAAI,EAAE,IAAA,CAAK,KAAM,CAAA,GAAA,IAAO,YAAe,CAAA,EAAA;AACrC,QAAA,YAAA,CAAa,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,GAAI,EAAC;AAAA;AAElC,MAAA,YAAA,CAAa,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA;AACxC;AAIF,EAAA,OAAO,OAAO,MAAO,CAAA,YAAY,CAAE,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACpD,IAAA,MAAM,cAAc,KAAM,CAAA,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,QAAQ,CAAA;AAExD,IAAA,IAAI,WAAY,CAAA,MAAA,KAAW,CAAK,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AAClD,MAAO,OAAA,KAAA;AAAA;AAET,IAAO,OAAA,WAAA;AAAA,GACR,CAAA;AACH;AAEO,SAAS,wBAAwB,KAAmC,EAAA;AACzE,EAAI,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,KAAU,MAAW,EAAA;AACzC,IAAO,OAAA,EAAA;AAAA;AAIT,EAAA,OAAQ,QAAQ,KAAM,CAAA,MAAA,CAAO,OAAO,CAAA,CAAE,OAAO,SAAS,CAAA;AACxD;AAEO,SAAS,yBAAyB,KAAmC,EAAA;AAC1E,EAAI,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,KAAU,MAAW,EAAA;AACzC,IAAO,OAAA,EAAA;AAAA;AAIT,EAAA,OAAO,IAAK,CAAA,MAAA,CAAO,OAAO,CAAA,CAAE,OAAO,SAAS,CAAA;AAC9C;AAEO,SAAS,wBAAwB,KAAmC,EAAA;AACzE,EAAI,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,KAAU,MAAW,EAAA;AACzC,IAAO,OAAA,EAAA;AAAA;AAIT,EAAA,OAAO,IAAK,CAAA,MAAA,CAAO,OAAO,CAAA,CAAE,OAAO,SAAS,CAAA;AAC9C;AAEO,SAAS,kCAAkC,KAAmC,EAAA;AACnF,EAAO,OAAA,uBAAA,CAAwB,uBAAwB,CAAA,KAAK,CAAC,CAAA;AAC/D;AAEO,SAAS,oBAAoB,KAAmC,EAAA;AACrE,EAAO,OAAA,wBAAA,CAAyB,uBAAwB,CAAA,KAAK,CAAC,CAAA;AAChE;AAEO,SAAS,sBAAsB,KAAmC,EAAA;AACvE,EAAI,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,KAAU,MAAW,EAAA;AACzC,IAAO,OAAA,EAAA;AAAA;AAGT,EAAA,KAAA,GAAQ,UAAW,CAAA,MAAA,CAAO,OAAO,CAAA,CAAE,OAAO,GAAG,CAAA;AAC7C,EAAA,KAAA,GAAQ,UAAW,CAAA,MAAA,CAAO,OAAO,CAAA,CAAE,OAAO,GAAG,CAAA;AAC7C,EAAA,KAAA,GAAQ,UAAW,CAAA,MAAA,CAAO,OAAO,CAAA,CAAE,OAAO,GAAG,CAAA;AAE7C,EAAO,OAAA,KAAA;AACT;AAEgB,SAAA,yBAAA,CAA0B,KAAa,KAAwB,EAAA;AAE7E,EAAI,IAAA,CAAC,KAAS,IAAA,GAAA,KAAQ,KAAO,EAAA;AAC3B,IAAA,OAAO,yBAAyB,GAAG,CAAA;AAAA;AAGrC,EAAO,OAAA,CAAC,KAAK,KAAK,CAAA,CAAE,IAAI,wBAAwB,CAAA,CAAE,KAAK,GAAG,CAAA;AAC5D;AAEO,SAAS,iBAAiB,QAA8C,EAAA;AAC7E,EAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,QAAS,CAAA,IAAA;AACvD;AAEO,SAAS,iBACd,QACwD,EAAA;AACxD,EAAA,OAAO,CAAC,KAAM,CAAA,OAAA,CAAQ,QAAQ,CAAK,IAAA,OAAA,CAAQ,SAAS,KAAK,CAAA;AAC3D;AAGO,SAAS,mBAAmB,MAA2D,EAAA;AAC5F,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAM,MAAA,cAAA,uBAAqB,GAA4C,EAAA;AAEvE,EAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,IAAA,MAAM,aAAa,KAAM,CAAA,KAAA;AACzB,IAAA,IAAI,UAAY,EAAA;AACd,MAAI,IAAA,KAAA,GAAQ,cAAe,CAAA,GAAA,CAAI,UAAU,CAAA;AAEzC,MAAA,IAAI,CAAC,KAAO,EAAA;AACV,QAAA,KAAA,GAAQ,EAAC;AACT,QAAe,cAAA,CAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AACpC,QAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,UAAY,EAAA,OAAA,EAAS,OAAO,CAAA;AAAA;AAGnD,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,KACX,MAAA;AACL,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA;AACnB;AAGF,EAAO,OAAA,MAAA;AACT;;;;"}
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 (this._sceneObject.state.defaultValue && (restorableValue === "false" || restorableValue === void 0)) {
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 === "false") {
3000
- this._sceneObject.changeValueTo([], [], false);
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
- if (this.checkIfRestorable(this.state.value)) {
3216
- this.setState({ restorable: true });
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 originFilters = this._variable.state.originFilters;
3960
+ const baseFilters = this._variable.state.baseFilters;
3941
3961
  let value = [];
3942
- if (filters.length === 0 && (originFilters == null ? void 0 : originFilters.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(escapeOriginFilterUrlDelimiters).join("|"))
3967
+ ...filters.filter(isFilterComplete).filter((filter) => !filter.hidden).map((filter) => toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|"))
3948
3968
  );
3949
3969
  }
3950
- if (originFilters == null ? void 0 : originFilters.length) {
3970
+ if (baseFilters == null ? void 0 : baseFilters.length) {
3951
3971
  value.push(
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`)
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 originFilters = updateOriginFilters([...this._variable.state.originFilters || []], filters);
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
- originFilters
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 { originFilters, filters, readOnly } = model.useState();
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
- originFilters == null ? void 0 : originFilters.map(
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: (_d = state.filterExpression) != null ? _d : renderExpression(state.expressionBuilder, [...(_b = state.originFilters) != null ? _b : [], ...(_c = state.filters) != null ? _c : []]),
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.originFilters) == null ? void 0 : _a.forEach((filter) => {
5527
- if (filter.restorable) {
5528
- this.restoreOriginalFilter(filter);
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
- (_e = this.state.originFilters) == null ? void 0 : _e.forEach((filter) => {
5560
+ (_f = this.state.baseFilters) == null ? void 0 : _f.forEach((baseFilter) => {
5537
5561
  var _a2;
5538
- this._originalValues.set(filter.key, {
5539
- operator: filter.operator,
5540
- value: (_a2 = filter.values) != null ? _a2 : [filter.value]
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 || !scopes.length) {
5574
+ if (!scopes) {
5575
+ return;
5576
+ }
5577
+ if (!scopes.length) {
5549
5578
  this.setState({
5550
- originFilters: (_a = this.state.originFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scope")
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.originFilters) == null ? void 0 : _b.forEach((filter) => {
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({ originFilters: [...finalFilters, ...remainingFilters] });
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.originFilters && update.originFilters !== this.state.originFilters) && !update.filterExpression) {
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 originFilters = (_b = update.originFilters) != null ? _b : this.state.originFilters;
5596
- update.filterExpression = renderExpression(this.state.expressionBuilder, [...originFilters != null ? originFilters : [], ...filters]);
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.originFilters) != null ? _a : [],
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 { originFilters, filters, _wip } = this.state;
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
- if (updateValues && !lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator)) {
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 updatedFilters2 = (_a = originFilters == null ? void 0 : originFilters.map((f) => {
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({ originFilters: updatedFilters2 });
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.originFilters) == null ? void 0 : _a.length) {
5726
- let filterToForceIndex = this.state.originFilters.length - 1;
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
- originFilters: this.state.originFilters.reduce((acc, f, index) => {
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 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);
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
- ...(_a = this._adhocFiltersVar.state.originFilters) != null ? _a : [],
6288
- ...this._adhocFiltersVar.state.filters
6289
- ].filter(isFilterComplete);
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 escapeOriginFilterUrlDelimiters(value) {
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();