@grafana/scenes 1.22.1 β 1.23.1
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 +34 -0
- package/dist/esm/components/VizPanel/VizPanel.js +9 -1
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +3 -3
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +3 -1
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersSet.js +4 -0
- package/dist/esm/variables/adhoc/AdHocFiltersSet.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelect.js +3 -1
- package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
- package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -1
- package/dist/esm/variables/variants/query/utils.js +50 -19
- package/dist/esm/variables/variants/query/utils.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.js +71 -24
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
# v1.23.1 (Fri Nov 17 2023)
|
|
2
|
+
|
|
3
|
+
#### π Bug Fix
|
|
4
|
+
|
|
5
|
+
- fix: compare time ranges using actual unix time vs objects [#468](https://github.com/grafana/scenes/pull/468) ([@darrenjaneczek](https://github.com/darrenjaneczek))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Darren Janeczek ([@darrenjaneczek](https://github.com/darrenjaneczek))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# v1.23.0 (Fri Nov 17 2023)
|
|
14
|
+
|
|
15
|
+
#### π Enhancement
|
|
16
|
+
|
|
17
|
+
- Variables: Add natural sort from core grafana to query variables [#459](https://github.com/grafana/scenes/pull/459) ([@axelavargas](https://github.com/axelavargas))
|
|
18
|
+
|
|
19
|
+
#### π Bug Fix
|
|
20
|
+
|
|
21
|
+
- Adhoc filters: Add tagKeyRegexFilter prop [#469](https://github.com/grafana/scenes/pull/469) ([@anaivanov](https://github.com/anaivanov))
|
|
22
|
+
- VizPanel: Don't show popup when description is empty [#465](https://github.com/grafana/scenes/pull/465) ([@dprokop](https://github.com/dprokop))
|
|
23
|
+
- VIzPanel: Support markdown in panel description [#464](https://github.com/grafana/scenes/pull/464) ([@dprokop](https://github.com/dprokop))
|
|
24
|
+
- Variables: No wrapping selects [#461](https://github.com/grafana/scenes/pull/461) ([@torkelo](https://github.com/torkelo))
|
|
25
|
+
|
|
26
|
+
#### Authors: 4
|
|
27
|
+
|
|
28
|
+
- Alexa V ([@axelavargas](https://github.com/axelavargas))
|
|
29
|
+
- Ana Ivanov ([@anaivanov](https://github.com/anaivanov))
|
|
30
|
+
- Dominik Prokop ([@dprokop](https://github.com/dprokop))
|
|
31
|
+
- Torkel Γdegaard ([@torkelo](https://github.com/torkelo))
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
1
35
|
# v1.22.1 (Tue Nov 14 2023)
|
|
2
36
|
|
|
3
37
|
#### π Bug Fix
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { toUtc, getPanelOptionsWithDefaults, compareArrayValues, compareDataFrameStructures, applyFieldOverrides, CoreApp, DashboardCursorSync, PanelPlugin, PluginType } from '@grafana/data';
|
|
1
|
+
import { toUtc, getPanelOptionsWithDefaults, renderMarkdown, compareArrayValues, compareDataFrameStructures, applyFieldOverrides, CoreApp, DashboardCursorSync, PanelPlugin, PluginType } from '@grafana/data';
|
|
2
2
|
import { getPluginImportUtils, config, getAppEvents } from '@grafana/runtime';
|
|
3
3
|
import { SceneObjectBase } from '../../core/SceneObjectBase.js';
|
|
4
4
|
import { sceneGraph } from '../../core/sceneGraph/index.js';
|
|
@@ -96,6 +96,14 @@ class VizPanel extends SceneObjectBase {
|
|
|
96
96
|
this.interpolate = (value, scoped, format) => {
|
|
97
97
|
return sceneGraph.interpolate(this, value, scoped, format);
|
|
98
98
|
};
|
|
99
|
+
this.getDescription = () => {
|
|
100
|
+
const { description } = this.state;
|
|
101
|
+
if (description) {
|
|
102
|
+
const markdown = this.interpolate(description);
|
|
103
|
+
return renderMarkdown(markdown);
|
|
104
|
+
}
|
|
105
|
+
return "";
|
|
106
|
+
};
|
|
99
107
|
this.onCancelQuery = () => {
|
|
100
108
|
var _a;
|
|
101
109
|
const data = sceneGraph.getData(this);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanel.js","sources":["../../../../src/components/VizPanel/VizPanel.tsx"],"sourcesContent":["import {\n AbsoluteTimeRange,\n FieldConfigSource,\n PanelModel,\n PanelPlugin,\n toUtc,\n getPanelOptionsWithDefaults,\n ScopedVars,\n InterpolateFunction,\n CoreApp,\n DashboardCursorSync,\n PanelData,\n compareArrayValues,\n compareDataFrameStructures,\n applyFieldOverrides,\n PluginType,\n} from '@grafana/data';\nimport { PanelContext, SeriesVisibilityChangeMode, VizLegendOptions } from '@grafana/ui';\nimport { config, getAppEvents, getPluginImportUtils } from '@grafana/runtime';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { DeepPartial, SceneObject, SceneObjectState } from '../../core/types';\n\nimport { VizPanelRenderer } from './VizPanelRenderer';\nimport { VizPanelMenu } from './VizPanelMenu';\nimport { VariableDependencyConfig } from '../../variables/VariableDependencyConfig';\nimport { VariableCustomFormatterFn } from '../../variables/types';\nimport { seriesVisibilityConfigFactory } from './seriesVisibilityConfigFactory';\nimport { emptyPanelData } from '../../core/SceneDataNode';\nimport { changeSeriesColorConfigFactory } from './colorSeriesConfigFactory';\nimport { loadPanelPluginSync } from './registerRuntimePanelPlugin';\nimport { getCursorSyncScope } from '../../behaviors/CursorSync';\nimport { cloneDeep, isArray, merge, mergeWith } from 'lodash';\n\nexport interface VizPanelState<TOptions = {}, TFieldConfig = {}> extends SceneObjectState {\n /**\n * This is usually a plugin id that references a core plugin or an external plugin. But this can also reference a\n * runtime registered PanelPlugin registered via function registerScenePanelPlugin.\n */\n pluginId: string;\n title: string;\n description?: string;\n options: DeepPartial<TOptions>;\n fieldConfig: FieldConfigSource<DeepPartial<TFieldConfig>>;\n pluginVersion?: string;\n displayMode?: 'default' | 'transparent';\n /**\n * Only shows header on hover, absolutly positioned above the panel.\n */\n hoverHeader?: boolean;\n /**\n * Defines a menu in the top right of the panel. The menu object is only activated when the dropdown menu itself is shown.\n * So the best way to add dynamic menu actions and links is by adding them in a behavior attached to the menu.\n */\n menu?: VizPanelMenu;\n /**\n * Defines a menu that renders panel link.\n **/\n titleItems?: React.ReactNode | SceneObject | SceneObject[];\n /**\n * Add action to the top right panel header\n */\n headerActions?: React.ReactNode | SceneObject | SceneObject[];\n /**\n * Mainly for advanced use cases that need custom handling of PanelContext callbacks.\n */\n extendPanelContext?: (vizPanel: VizPanel, context: PanelContext) => void;\n /**\n * @internal\n * Only for use from core to handle migration from old angular panels\n **/\n _UNSAFE_customMigrationHandler?: (panel: PanelModel, plugin: PanelPlugin) => void;\n /** Internal */\n _pluginLoadError?: string;\n /** Internal */\n _pluginInstanceState?: any;\n}\n\nexport class VizPanel<TOptions = {}, TFieldConfig extends {} = {}> extends SceneObjectBase<\n VizPanelState<TOptions, TFieldConfig>\n> {\n public static Component = VizPanelRenderer;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['title', 'options', 'fieldConfig'],\n });\n\n // Not part of state as this is not serializable\n protected _panelContext?: PanelContext;\n private _plugin?: PanelPlugin;\n private _prevData?: PanelData;\n private _dataWithFieldConfig?: PanelData;\n private _structureRev: number = 0;\n\n public constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>) {\n super({\n options: {} as TOptions,\n fieldConfig: { defaults: {}, overrides: [] },\n title: 'Title',\n pluginId: 'timeseries',\n ...state,\n });\n\n this.addActivationHandler(() => {\n this._onActivate();\n });\n }\n\n private _onActivate() {\n if (!this._plugin) {\n this._loadPlugin(this.state.pluginId);\n }\n }\n\n private _loadPlugin(pluginId: string) {\n const plugin = loadPanelPluginSync(pluginId);\n\n if (plugin) {\n this._pluginLoaded(plugin);\n } else {\n const { importPanelPlugin } = getPluginImportUtils();\n\n try {\n importPanelPlugin(pluginId).then((result) => {\n return this._pluginLoaded(result);\n });\n } catch (err: unknown) {\n this._pluginLoaded(getPanelPluginNotFound(pluginId));\n this.setState({ _pluginLoadError: (err as Error).message });\n }\n }\n }\n\n private async _pluginLoaded(plugin: PanelPlugin) {\n const { options, fieldConfig, title, pluginVersion, _UNSAFE_customMigrationHandler } = this.state;\n\n const panel: PanelModel = {\n title,\n options,\n fieldConfig,\n id: 1,\n type: plugin.meta.id,\n pluginVersion: pluginVersion,\n };\n\n const currentVersion = this._getPluginVersion(plugin);\n\n if (_UNSAFE_customMigrationHandler) {\n _UNSAFE_customMigrationHandler(panel, plugin);\n }\n\n if (plugin.onPanelMigration) {\n if (currentVersion !== this.state.pluginVersion) {\n // These migration handlers also mutate panel.fieldConfig to migrate fieldConfig\n panel.options = await plugin.onPanelMigration(panel);\n }\n }\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: panel.options,\n currentFieldConfig: panel.fieldConfig,\n isAfterPluginChange: false,\n });\n\n this._plugin = plugin;\n\n this.setState({\n options: withDefaults.options,\n fieldConfig: withDefaults.fieldConfig,\n pluginVersion: currentVersion,\n });\n }\n\n private _getPluginVersion(plugin: PanelPlugin): string {\n return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;\n }\n\n public getPlugin(): PanelPlugin | undefined {\n return this._plugin;\n }\n\n public getPanelContext(): PanelContext {\n if (!this._panelContext) {\n this._panelContext = this.buildPanelContext();\n }\n\n return this._panelContext!;\n }\n\n public onTimeRangeChange = (timeRange: AbsoluteTimeRange) => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n sceneTimeRange.onTimeRangeChange({\n raw: {\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n },\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n });\n };\n\n public onTitleChange = (title: string) => {\n this.setState({ title });\n };\n\n public onDescriptionChange = (description: string) => {\n this.setState({ description });\n };\n\n public onDisplayModeChange = (displayMode: 'default' | 'transparent') => {\n this.setState({ displayMode });\n };\n\n public onOptionsChange = (optionsUpdate: DeepPartial<TOptions>, replace = false) => {\n const { fieldConfig, options } = this.state;\n\n // When replace is true, we want to replace the entire options object. Default will be applied.\n const nextOptions = replace\n ? optionsUpdate\n : mergeWith(cloneDeep(options), optionsUpdate, (_, srcValue) => {\n if (isArray(srcValue)) {\n return srcValue;\n }\n return;\n });\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin: this._plugin!,\n currentOptions: nextOptions,\n currentFieldConfig: fieldConfig,\n isAfterPluginChange: false,\n });\n\n this.setState({\n options: withDefaults.options,\n });\n };\n\n public onFieldConfigChange = (fieldConfigUpdate: FieldConfigSource<DeepPartial<TFieldConfig>>, replace?: boolean) => {\n const { fieldConfig, options } = this.state;\n\n // When replace is true, we want to replace the entire field config. Default will be applied.\n const nextFieldConfig = replace ? fieldConfigUpdate : merge(cloneDeep(fieldConfig), fieldConfigUpdate);\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin: this._plugin!,\n currentOptions: options,\n currentFieldConfig: nextFieldConfig,\n isAfterPluginChange: false,\n });\n\n this.setState({\n fieldConfig: withDefaults.fieldConfig,\n });\n };\n\n public interpolate = ((value: string, scoped?: ScopedVars, format?: string | VariableCustomFormatterFn) => {\n return sceneGraph.interpolate(this, value, scoped, format);\n }) as InterpolateFunction;\n\n /**\n * Called from the react render path to apply the field config to the data provided by the data provider\n */\n public applyFieldConfig(rawData?: PanelData): PanelData {\n const plugin = this._plugin!;\n\n if (!plugin || plugin.meta.skipDataQuery || !rawData) {\n // TODO setup time range subscription instead\n return emptyPanelData;\n }\n\n const fieldConfigRegistry = plugin.fieldConfigRegistry;\n const prevFrames = this._prevData?.series;\n const newFrames = rawData?.series;\n\n if (\n rawData.structureRev == null &&\n newFrames &&\n prevFrames &&\n !compareArrayValues(newFrames, prevFrames, compareDataFrameStructures)\n ) {\n this._structureRev++;\n }\n\n this._dataWithFieldConfig = {\n ...rawData,\n structureRev: this._structureRev,\n series: applyFieldOverrides({\n data: newFrames,\n fieldConfig: this.state.fieldConfig,\n fieldConfigRegistry,\n replaceVariables: this.interpolate,\n theme: config.theme2,\n timeZone: rawData.request?.timezone,\n }),\n };\n\n return this._dataWithFieldConfig;\n }\n\n public onCancelQuery = () => {\n const data = sceneGraph.getData(this);\n data.cancelQuery?.();\n };\n\n /**\n * Panel context functions\n */\n private _onSeriesColorChange = (label: string, color: string) => {\n this.onFieldConfigChange(changeSeriesColorConfigFactory(label, color, this.state.fieldConfig));\n };\n\n private _onSeriesVisibilityChange = (label: string, mode: SeriesVisibilityChangeMode) => {\n if (!this._dataWithFieldConfig) {\n return;\n }\n\n this.onFieldConfigChange(\n seriesVisibilityConfigFactory(label, mode, this.state.fieldConfig, this._dataWithFieldConfig.series),\n true\n );\n };\n\n private _onInstanceStateChange = (state: any) => {\n this.setState({ _pluginInstanceState: state });\n };\n\n private _onToggleLegendSort = (sortKey: string) => {\n const legendOptions: VizLegendOptions = (this.state.options as any).legend;\n\n // We don't want to do anything when legend options are not available\n if (!legendOptions) {\n return;\n }\n\n let sortDesc = legendOptions.sortDesc;\n let sortBy = legendOptions.sortBy;\n if (sortKey !== sortBy) {\n sortDesc = undefined;\n }\n\n // if already sort ascending, disable sorting\n if (sortDesc === false) {\n sortBy = undefined;\n sortDesc = undefined;\n } else {\n sortDesc = !sortDesc;\n sortBy = sortKey;\n }\n\n this.onOptionsChange({\n ...this.state.options,\n legend: { ...legendOptions, sortBy, sortDesc },\n } as TOptions);\n };\n\n private buildPanelContext(): PanelContext {\n const sync = getCursorSyncScope(this);\n\n const context = {\n eventsScope: sync ? sync.getEventsScope() : '__global_',\n eventBus: sync ? sync.getEventsBus(this) : getAppEvents(),\n app: CoreApp.Unknown,\n sync: () => {\n if (sync) {\n return sync.state.sync;\n }\n return DashboardCursorSync.Off;\n },\n onSeriesColorChange: this._onSeriesColorChange,\n onToggleSeriesVisibility: this._onSeriesVisibilityChange,\n onToggleLegendSort: this._onToggleLegendSort,\n onInstanceStateChange: this._onInstanceStateChange,\n };\n\n if (this.state.extendPanelContext) {\n this.state.extendPanelContext(this, context);\n }\n\n return context;\n }\n}\n\nfunction getPanelPluginNotFound(id: string, silent?: boolean): PanelPlugin {\n const plugin = new PanelPlugin(() => null);\n\n plugin.meta = {\n id: id,\n name: id,\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: 'public/img/grafana_icon.svg',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n return plugin;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VizPanel.js","sources":["../../../../src/components/VizPanel/VizPanel.tsx"],"sourcesContent":["import {\n AbsoluteTimeRange,\n FieldConfigSource,\n PanelModel,\n PanelPlugin,\n toUtc,\n getPanelOptionsWithDefaults,\n ScopedVars,\n InterpolateFunction,\n CoreApp,\n DashboardCursorSync,\n PanelData,\n compareArrayValues,\n compareDataFrameStructures,\n applyFieldOverrides,\n PluginType,\n renderMarkdown,\n} from '@grafana/data';\nimport { PanelContext, SeriesVisibilityChangeMode, VizLegendOptions } from '@grafana/ui';\nimport { config, getAppEvents, getPluginImportUtils } from '@grafana/runtime';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { DeepPartial, SceneObject, SceneObjectState } from '../../core/types';\n\nimport { VizPanelRenderer } from './VizPanelRenderer';\nimport { VizPanelMenu } from './VizPanelMenu';\nimport { VariableDependencyConfig } from '../../variables/VariableDependencyConfig';\nimport { VariableCustomFormatterFn } from '../../variables/types';\nimport { seriesVisibilityConfigFactory } from './seriesVisibilityConfigFactory';\nimport { emptyPanelData } from '../../core/SceneDataNode';\nimport { changeSeriesColorConfigFactory } from './colorSeriesConfigFactory';\nimport { loadPanelPluginSync } from './registerRuntimePanelPlugin';\nimport { getCursorSyncScope } from '../../behaviors/CursorSync';\nimport { cloneDeep, isArray, merge, mergeWith } from 'lodash';\n\nexport interface VizPanelState<TOptions = {}, TFieldConfig = {}> extends SceneObjectState {\n /**\n * This is usually a plugin id that references a core plugin or an external plugin. But this can also reference a\n * runtime registered PanelPlugin registered via function registerScenePanelPlugin.\n */\n pluginId: string;\n title: string;\n description?: string;\n options: DeepPartial<TOptions>;\n fieldConfig: FieldConfigSource<DeepPartial<TFieldConfig>>;\n pluginVersion?: string;\n displayMode?: 'default' | 'transparent';\n /**\n * Only shows header on hover, absolutly positioned above the panel.\n */\n hoverHeader?: boolean;\n /**\n * Defines a menu in the top right of the panel. The menu object is only activated when the dropdown menu itself is shown.\n * So the best way to add dynamic menu actions and links is by adding them in a behavior attached to the menu.\n */\n menu?: VizPanelMenu;\n /**\n * Defines a menu that renders panel link.\n **/\n titleItems?: React.ReactNode | SceneObject | SceneObject[];\n /**\n * Add action to the top right panel header\n */\n headerActions?: React.ReactNode | SceneObject | SceneObject[];\n /**\n * Mainly for advanced use cases that need custom handling of PanelContext callbacks.\n */\n extendPanelContext?: (vizPanel: VizPanel, context: PanelContext) => void;\n /**\n * @internal\n * Only for use from core to handle migration from old angular panels\n **/\n _UNSAFE_customMigrationHandler?: (panel: PanelModel, plugin: PanelPlugin) => void;\n /** Internal */\n _pluginLoadError?: string;\n /** Internal */\n _pluginInstanceState?: any;\n}\n\nexport class VizPanel<TOptions = {}, TFieldConfig extends {} = {}> extends SceneObjectBase<\n VizPanelState<TOptions, TFieldConfig>\n> {\n public static Component = VizPanelRenderer;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['title', 'options', 'fieldConfig'],\n });\n\n // Not part of state as this is not serializable\n protected _panelContext?: PanelContext;\n private _plugin?: PanelPlugin;\n private _prevData?: PanelData;\n private _dataWithFieldConfig?: PanelData;\n private _structureRev: number = 0;\n\n public constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>) {\n super({\n options: {} as TOptions,\n fieldConfig: { defaults: {}, overrides: [] },\n title: 'Title',\n pluginId: 'timeseries',\n ...state,\n });\n\n this.addActivationHandler(() => {\n this._onActivate();\n });\n }\n\n private _onActivate() {\n if (!this._plugin) {\n this._loadPlugin(this.state.pluginId);\n }\n }\n\n private _loadPlugin(pluginId: string) {\n const plugin = loadPanelPluginSync(pluginId);\n\n if (plugin) {\n this._pluginLoaded(plugin);\n } else {\n const { importPanelPlugin } = getPluginImportUtils();\n\n try {\n importPanelPlugin(pluginId).then((result) => {\n return this._pluginLoaded(result);\n });\n } catch (err: unknown) {\n this._pluginLoaded(getPanelPluginNotFound(pluginId));\n this.setState({ _pluginLoadError: (err as Error).message });\n }\n }\n }\n\n private async _pluginLoaded(plugin: PanelPlugin) {\n const { options, fieldConfig, title, pluginVersion, _UNSAFE_customMigrationHandler } = this.state;\n\n const panel: PanelModel = {\n title,\n options,\n fieldConfig,\n id: 1,\n type: plugin.meta.id,\n pluginVersion: pluginVersion,\n };\n\n const currentVersion = this._getPluginVersion(plugin);\n\n if (_UNSAFE_customMigrationHandler) {\n _UNSAFE_customMigrationHandler(panel, plugin);\n }\n\n if (plugin.onPanelMigration) {\n if (currentVersion !== this.state.pluginVersion) {\n // These migration handlers also mutate panel.fieldConfig to migrate fieldConfig\n panel.options = await plugin.onPanelMigration(panel);\n }\n }\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: panel.options,\n currentFieldConfig: panel.fieldConfig,\n isAfterPluginChange: false,\n });\n\n this._plugin = plugin;\n\n this.setState({\n options: withDefaults.options,\n fieldConfig: withDefaults.fieldConfig,\n pluginVersion: currentVersion,\n });\n }\n\n private _getPluginVersion(plugin: PanelPlugin): string {\n return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;\n }\n\n public getPlugin(): PanelPlugin | undefined {\n return this._plugin;\n }\n\n public getPanelContext(): PanelContext {\n if (!this._panelContext) {\n this._panelContext = this.buildPanelContext();\n }\n\n return this._panelContext!;\n }\n\n public onTimeRangeChange = (timeRange: AbsoluteTimeRange) => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n sceneTimeRange.onTimeRangeChange({\n raw: {\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n },\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n });\n };\n\n public onTitleChange = (title: string) => {\n this.setState({ title });\n };\n\n public onDescriptionChange = (description: string) => {\n this.setState({ description });\n };\n\n public onDisplayModeChange = (displayMode: 'default' | 'transparent') => {\n this.setState({ displayMode });\n };\n\n public onOptionsChange = (optionsUpdate: DeepPartial<TOptions>, replace = false) => {\n const { fieldConfig, options } = this.state;\n\n // When replace is true, we want to replace the entire options object. Default will be applied.\n const nextOptions = replace\n ? optionsUpdate\n : mergeWith(cloneDeep(options), optionsUpdate, (_, srcValue) => {\n if (isArray(srcValue)) {\n return srcValue;\n }\n return;\n });\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin: this._plugin!,\n currentOptions: nextOptions,\n currentFieldConfig: fieldConfig,\n isAfterPluginChange: false,\n });\n\n this.setState({\n options: withDefaults.options,\n });\n };\n\n public onFieldConfigChange = (fieldConfigUpdate: FieldConfigSource<DeepPartial<TFieldConfig>>, replace?: boolean) => {\n const { fieldConfig, options } = this.state;\n\n // When replace is true, we want to replace the entire field config. Default will be applied.\n const nextFieldConfig = replace ? fieldConfigUpdate : merge(cloneDeep(fieldConfig), fieldConfigUpdate);\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin: this._plugin!,\n currentOptions: options,\n currentFieldConfig: nextFieldConfig,\n isAfterPluginChange: false,\n });\n\n this.setState({\n fieldConfig: withDefaults.fieldConfig,\n });\n };\n\n public interpolate = ((value: string, scoped?: ScopedVars, format?: string | VariableCustomFormatterFn) => {\n return sceneGraph.interpolate(this, value, scoped, format);\n }) as InterpolateFunction;\n\n public getDescription = () => {\n const { description } = this.state;\n if (description) {\n const markdown = this.interpolate(description);\n return renderMarkdown(markdown);\n }\n return '';\n };\n\n /**\n * Called from the react render path to apply the field config to the data provided by the data provider\n */\n public applyFieldConfig(rawData?: PanelData): PanelData {\n const plugin = this._plugin!;\n\n if (!plugin || plugin.meta.skipDataQuery || !rawData) {\n // TODO setup time range subscription instead\n return emptyPanelData;\n }\n\n const fieldConfigRegistry = plugin.fieldConfigRegistry;\n const prevFrames = this._prevData?.series;\n const newFrames = rawData?.series;\n\n if (\n rawData.structureRev == null &&\n newFrames &&\n prevFrames &&\n !compareArrayValues(newFrames, prevFrames, compareDataFrameStructures)\n ) {\n this._structureRev++;\n }\n\n this._dataWithFieldConfig = {\n ...rawData,\n structureRev: this._structureRev,\n series: applyFieldOverrides({\n data: newFrames,\n fieldConfig: this.state.fieldConfig,\n fieldConfigRegistry,\n replaceVariables: this.interpolate,\n theme: config.theme2,\n timeZone: rawData.request?.timezone,\n }),\n };\n\n return this._dataWithFieldConfig;\n }\n\n public onCancelQuery = () => {\n const data = sceneGraph.getData(this);\n data.cancelQuery?.();\n };\n\n /**\n * Panel context functions\n */\n private _onSeriesColorChange = (label: string, color: string) => {\n this.onFieldConfigChange(changeSeriesColorConfigFactory(label, color, this.state.fieldConfig));\n };\n\n private _onSeriesVisibilityChange = (label: string, mode: SeriesVisibilityChangeMode) => {\n if (!this._dataWithFieldConfig) {\n return;\n }\n\n this.onFieldConfigChange(\n seriesVisibilityConfigFactory(label, mode, this.state.fieldConfig, this._dataWithFieldConfig.series),\n true\n );\n };\n\n private _onInstanceStateChange = (state: any) => {\n this.setState({ _pluginInstanceState: state });\n };\n\n private _onToggleLegendSort = (sortKey: string) => {\n const legendOptions: VizLegendOptions = (this.state.options as any).legend;\n\n // We don't want to do anything when legend options are not available\n if (!legendOptions) {\n return;\n }\n\n let sortDesc = legendOptions.sortDesc;\n let sortBy = legendOptions.sortBy;\n if (sortKey !== sortBy) {\n sortDesc = undefined;\n }\n\n // if already sort ascending, disable sorting\n if (sortDesc === false) {\n sortBy = undefined;\n sortDesc = undefined;\n } else {\n sortDesc = !sortDesc;\n sortBy = sortKey;\n }\n\n this.onOptionsChange({\n ...this.state.options,\n legend: { ...legendOptions, sortBy, sortDesc },\n } as TOptions);\n };\n\n private buildPanelContext(): PanelContext {\n const sync = getCursorSyncScope(this);\n\n const context = {\n eventsScope: sync ? sync.getEventsScope() : '__global_',\n eventBus: sync ? sync.getEventsBus(this) : getAppEvents(),\n app: CoreApp.Unknown,\n sync: () => {\n if (sync) {\n return sync.state.sync;\n }\n return DashboardCursorSync.Off;\n },\n onSeriesColorChange: this._onSeriesColorChange,\n onToggleSeriesVisibility: this._onSeriesVisibilityChange,\n onToggleLegendSort: this._onToggleLegendSort,\n onInstanceStateChange: this._onInstanceStateChange,\n };\n\n if (this.state.extendPanelContext) {\n this.state.extendPanelContext(this, context);\n }\n\n return context;\n }\n}\n\nfunction getPanelPluginNotFound(id: string, silent?: boolean): PanelPlugin {\n const plugin = new PanelPlugin(() => null);\n\n plugin.meta = {\n id: id,\n name: id,\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: 'public/img/grafana_icon.svg',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n return plugin;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,6 @@ function VizPanelRenderer({ model }) {
|
|
|
11
11
|
var _a, _b, _c;
|
|
12
12
|
const {
|
|
13
13
|
title,
|
|
14
|
-
description,
|
|
15
14
|
options,
|
|
16
15
|
fieldConfig,
|
|
17
16
|
_pluginLoadError,
|
|
@@ -20,7 +19,8 @@ function VizPanelRenderer({ model }) {
|
|
|
20
19
|
hoverHeader,
|
|
21
20
|
menu,
|
|
22
21
|
headerActions,
|
|
23
|
-
titleItems
|
|
22
|
+
titleItems,
|
|
23
|
+
description
|
|
24
24
|
} = model.useState();
|
|
25
25
|
const [ref, { width, height }] = useMeasure();
|
|
26
26
|
const plugin = model.getPlugin();
|
|
@@ -119,7 +119,7 @@ function VizPanelRenderer({ model }) {
|
|
|
119
119
|
"data-viz-panel-key": model.state.key
|
|
120
120
|
}, width > 0 && height > 0 && /* @__PURE__ */ React.createElement(PanelChrome, {
|
|
121
121
|
title: titleInterpolated,
|
|
122
|
-
description: description ? ()
|
|
122
|
+
description: (description == null ? void 0 : description.trim()) ? model.getDescription : void 0,
|
|
123
123
|
loadingState: data.state,
|
|
124
124
|
statusMessage: getChromeStatusMessage(data, _pluginLoadError),
|
|
125
125
|
width,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import React, { RefCallback } from 'react';\nimport { useMeasure } from 'react-use';\n\nimport { AlertState, GrafanaTheme2, PanelData, PluginContextProvider } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, PanelContextProvider, Tooltip, useStyles2, Icon } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { isSceneObject, SceneComponentProps, SceneLayout, SceneObject } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n description,\n options,\n fieldConfig,\n _pluginLoadError,\n $data,\n displayMode,\n hoverHeader,\n menu,\n headerActions,\n titleItems,\n } = model.useState();\n const [ref, { width, height }] = useMeasure();\n const plugin = model.getPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dataObject = sceneGraph.getData(model);\n const rawData = dataObject.useState();\n const dataWithFieldConfig = model.applyFieldConfig(rawData.data!);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n\n // Not sure we need to subscribe to this state\n const timeZone = sceneGraph.getTimeRange(model).getTimeZone();\n\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin) {\n return <div>Loading plugin panel...</div>;\n }\n\n if (!plugin.panel) {\n return <div>Panel plugin has no panel component</div>;\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if ($data && $data.setContainerWidth) {\n $data.setContainerWidth(width);\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n titleItemsElement.push(\n <Tooltip content={dataWithFieldConfig.alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n className={cx({\n [alertStateStyles.ok]: dataWithFieldConfig.alertState.state === AlertState.OK,\n [alertStateStyles.pending]: dataWithFieldConfig.alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: dataWithFieldConfig.alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={dataWithFieldConfig.alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n const panelId = context.instanceState?.legacyPanelId ?? 1;\n\n return (\n <div className={relativeWrapper}>\n <div ref={ref as RefCallback<HTMLDivElement>} className={absoluteWrapper} data-viz-panel-key={model.state.key}>\n {width > 0 && height > 0 && (\n <PanelChrome\n title={titleInterpolated}\n description={description ? () => model.interpolate(description) : ''}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n width={width}\n height={height}\n displayMode={displayMode}\n hoverHeader={hoverHeader}\n titleItems={titleItemsElement}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n >\n {(innerWidth, innerHeight) => (\n <>\n <ErrorBoundaryAlert dependencies={[plugin, data]}>\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={data.timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={false}\n width={innerWidth}\n height={innerHeight}\n renderCounter={0}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={getAppEvents()}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n </>\n )}\n </PanelChrome>\n )}\n </div>\n </div>\n );\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let ancestor = item.parent;\n\n while (ancestor && ancestor !== layout) {\n if ('isDraggable' in ancestor.state && ancestor.state.isDraggable === false) {\n return true;\n }\n\n ancestor = ancestor.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import React, { RefCallback } from 'react';\nimport { useMeasure } from 'react-use';\n\nimport { AlertState, GrafanaTheme2, PanelData, PluginContextProvider } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, PanelContextProvider, Tooltip, useStyles2, Icon } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { isSceneObject, SceneComponentProps, SceneLayout, SceneObject } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n $data,\n displayMode,\n hoverHeader,\n menu,\n headerActions,\n titleItems,\n description,\n } = model.useState();\n const [ref, { width, height }] = useMeasure();\n const plugin = model.getPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dataObject = sceneGraph.getData(model);\n const rawData = dataObject.useState();\n const dataWithFieldConfig = model.applyFieldConfig(rawData.data!);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n\n // Not sure we need to subscribe to this state\n const timeZone = sceneGraph.getTimeRange(model).getTimeZone();\n\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin) {\n return <div>Loading plugin panel...</div>;\n }\n\n if (!plugin.panel) {\n return <div>Panel plugin has no panel component</div>;\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if ($data && $data.setContainerWidth) {\n $data.setContainerWidth(width);\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n titleItemsElement.push(\n <Tooltip content={dataWithFieldConfig.alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n className={cx({\n [alertStateStyles.ok]: dataWithFieldConfig.alertState.state === AlertState.OK,\n [alertStateStyles.pending]: dataWithFieldConfig.alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: dataWithFieldConfig.alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={dataWithFieldConfig.alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n const panelId = context.instanceState?.legacyPanelId ?? 1;\n\n return (\n <div className={relativeWrapper}>\n <div ref={ref as RefCallback<HTMLDivElement>} className={absoluteWrapper} data-viz-panel-key={model.state.key}>\n {width > 0 && height > 0 && (\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n width={width}\n height={height}\n displayMode={displayMode}\n hoverHeader={hoverHeader}\n titleItems={titleItemsElement}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n >\n {(innerWidth, innerHeight) => (\n <>\n <ErrorBoundaryAlert dependencies={[plugin, data]}>\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={data.timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={false}\n width={innerWidth}\n height={innerHeight}\n renderCounter={0}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={getAppEvents()}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n </>\n )}\n </PanelChrome>\n )}\n </div>\n </div>\n );\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let ancestor = item.parent;\n\n while (ancestor && ancestor !== layout) {\n if ('isDraggable' in ancestor.state && ancestor.state.isDraggable === false) {\n return true;\n }\n\n ancestor = ancestor.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -233,7 +233,9 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
233
233
|
}
|
|
234
234
|
_isDataTimeRangeStale(data) {
|
|
235
235
|
const timeRange = sceneGraph.getTimeRange(this);
|
|
236
|
-
|
|
236
|
+
const stateTimeRange = timeRange.state.value;
|
|
237
|
+
const dataTimeRange = data.timeRange;
|
|
238
|
+
if (stateTimeRange.from.unix() === dataTimeRange.from.unix() && stateTimeRange.to.unix() === dataTimeRange.to.unix()) {
|
|
237
239
|
return false;
|
|
238
240
|
}
|
|
239
241
|
writeSceneLog("SceneQueryRunner", "Data time range is stale");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { forkJoin, map, merge, mergeAll, Observable, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\nimport { getRunRequest, toDataQueryError } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n // SceneDataLayerProvider,\n SceneDataLayerProviderResult,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneVariable } from '../variables/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { SceneTimeRangeCompare } from '../components/SceneTimeRangeCompare';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { timeShiftQueryResponseOperator } from './timeShiftQueryResponseOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { AdHocFilterSet } from '../variables/adhoc/AdHocFiltersSet';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: DataQueryExtended[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _isWaitingForVariables?: boolean;\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>();\n private _scopedVars = { __sceneObject: { value: this, text: '__sceneObject' } };\n\n // Closest filter set if found)\n private _adhocFilterSet?: AdHocFilterSet;\n private _adhocFilterSub?: Unsubscribable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onVariableUpdatesCompleted: (variables, dependencyChanged) =>\n this.onVariableUpdatesCompleted(variables, dependencyChanged),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n const timeRange = sceneGraph.getTimeRange(this);\n const comparer = this.getTimeCompare();\n\n if (comparer) {\n this._subs.add(\n comparer.subscribeToState((n, p) => {\n if (n.compareWith !== p.compareWith) {\n this.runQueries();\n }\n })\n );\n }\n\n this._subs.add(\n timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n })\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n const observables: Array<Observable<SceneDataLayerProviderResult>> = [];\n\n // This keeps track of multiple SceneDataLayers. The key responsibility od this map is to make sure individual from independent SceneDataLayers do not overwrite each other.\n const resultsMap: Map<string, PanelData> = new Map();\n\n if (dataLayers.length > 0) {\n dataLayers.forEach((layer) => {\n observables.push(layer.getResultsStream());\n });\n\n // possibly we want to combine the results from all layers and only then update, but this is tricky ;(\n this._dataLayersSub = merge(observables)\n .pipe(\n mergeAll(),\n map((v) => {\n // Is there a better, rxjs only way to combine multiple same-data-topic observables?\n // Indexing by origin state key is to make sure we do not duplicate/overwrite data from the different origins\n resultsMap.set(v.origin.state.key!, v.data);\n return resultsMap;\n })\n )\n .subscribe((result) => {\n this._onLayersReceived(result);\n });\n }\n }\n\n private _onLayersReceived(results: Map<string, PanelData>) {\n const dataLayers = sceneGraph.getDataLayers(this);\n const { dataLayerFilter } = this.state;\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n const layerKeys = Array.from(results.keys());\n\n Array.from(results.values()).forEach((result, i) => {\n const layerKey = layerKeys[i];\n const layer = dataLayers.find((l) => l.state.key === layerKey);\n if (layer) {\n if (layer.topic === DataTopic.Annotations && result[DataTopic.Annotations]) {\n annotations = annotations.concat(result[DataTopic.Annotations]);\n }\n\n // @ts-expect-error TODO: use DataTopic.AlertStates when exposed from core grafana\n if (layer.topic === 'alertStates') {\n alertStates = alertStates.concat(result.series);\n }\n }\n });\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n this.setState({\n data: {\n ...this.state.data!,\n annotations,\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * Handles some tricky cases where we need to run queries even when they have not changed in case\n * the query execution on activate was stopped due to VariableSet still not having processed all variables.\n */\n private onVariableUpdatesCompleted(_variablesThatHaveChanged: Set<SceneVariable>, dependencyChanged: boolean) {\n if (this.state._isWaitingForVariables && this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n return;\n }\n\n if (dependencyChanged) {\n this.runQueries();\n }\n }\n\n private shouldRunQueriesOnActivate() {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return false;\n }\n\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (data.timeRange === timeRange.state.value) {\n return false;\n }\n\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n if (this._adhocFilterSub) {\n this._adhocFilterSub.unsubscribe();\n }\n\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this._querySub) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...this.state.data!, state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If data layers subscription doesn't exist, create one\n //\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n const runRequest = getRunRequest();\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (sceneGraph.hasVariableDependencyInLoadingState(this)) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ _isWaitingForVariables: true });\n return;\n }\n\n // If we were waiting for variables, clear that flag\n if (this.state._isWaitingForVariables) {\n this.setState({ _isWaitingForVariables: false });\n }\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const ds = await getDataSource(datasource, this._scopedVars);\n\n if (!this._adhocFilterSet) {\n this.findAndSubscribeToAdhocFilters();\n }\n\n const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n if (secondaryRequest) {\n // change subscribe callback below to pipe operator\n this._querySub = forkJoin([runRequest(ds, request), runRequest(ds, secondaryRequest)])\n .pipe(timeShiftQueryResponseOperator)\n .subscribe(this.onDataReceived);\n } else {\n this._querySub = runRequest(ds, request).subscribe(this.onDataReceived);\n }\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n const result = {\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n };\n\n this.setState({\n data: result,\n });\n }\n }\n\n private prepareRequests = (\n timeRange: SceneTimeRangeLike,\n ds: DataSourceApi\n ): [DataQueryRequest, DataQueryRequest | undefined] => {\n const comparer = this.getTimeCompare();\n const { minInterval, queries } = this.state;\n\n let secondaryRequest: DataQueryRequest | undefined;\n\n let request: DataQueryRequest = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n panelId: 1,\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFilterSet) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = this._adhocFilterSet.state.filters;\n }\n\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n // TODO interpolate minInterval\n const lowerIntervalLimit = minInterval ? minInterval : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n const primaryTimeRange = timeRange.state.value;\n if (comparer) {\n const secondaryTimeRange = comparer.getCompareTimeRange(primaryTimeRange);\n if (secondaryTimeRange) {\n secondaryRequest = {\n ...request,\n range: secondaryTimeRange,\n requestId: getNextRequestId(),\n };\n\n request = {\n ...request,\n range: primaryTimeRange,\n };\n }\n }\n\n return [request, secondaryRequest];\n };\n\n private onDataReceived = (data: PanelData) => {\n this._results.next({ origin: this, data });\n\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Will combine annotations & alert state from data layer providers\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this.state.data && this.state.data.annotations) {\n data.annotations = (data.annotations || []).concat(this.state.data.annotations);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Will walk up the scene graph and find the closest time range compare object\n * It performs buttom-up search, including shallow search across object children for supporting controls/header actions\n */\n private getTimeCompare() {\n if (!this.parent) {\n return null;\n }\n return getClosest(this.parent, (s) => {\n let found = null;\n if (s instanceof SceneTimeRangeCompare) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof SceneTimeRangeCompare) {\n found = child;\n }\n });\n\n return found;\n });\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdhocFilters() {\n const set = getClosest(this, (s) => {\n let found = null;\n if (s instanceof AdHocFilterSet && s.state.datasource?.uid === this.state.datasource?.uid) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof AdHocFilterSet && child.state.datasource?.uid === this.state.datasource?.uid) {\n found = child;\n }\n });\n return found;\n });\n\n if (!set || set.state.applyMode !== 'same-datasource') {\n return;\n }\n\n // Subscribe to filter set state changes so that queries are re-issued when it changes\n this._adhocFilterSet = set;\n this._adhocFilterSub = this._adhocFilterSet?.subscribeToState(() => this.runQueries());\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { forkJoin, map, merge, mergeAll, Observable, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\nimport { getRunRequest, toDataQueryError } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n // SceneDataLayerProvider,\n SceneDataLayerProviderResult,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneVariable } from '../variables/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { SceneTimeRangeCompare } from '../components/SceneTimeRangeCompare';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { timeShiftQueryResponseOperator } from './timeShiftQueryResponseOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { AdHocFilterSet } from '../variables/adhoc/AdHocFiltersSet';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: DataQueryExtended[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _isWaitingForVariables?: boolean;\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>();\n private _scopedVars = { __sceneObject: { value: this, text: '__sceneObject' } };\n\n // Closest filter set if found)\n private _adhocFilterSet?: AdHocFilterSet;\n private _adhocFilterSub?: Unsubscribable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onVariableUpdatesCompleted: (variables, dependencyChanged) =>\n this.onVariableUpdatesCompleted(variables, dependencyChanged),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n const timeRange = sceneGraph.getTimeRange(this);\n const comparer = this.getTimeCompare();\n\n if (comparer) {\n this._subs.add(\n comparer.subscribeToState((n, p) => {\n if (n.compareWith !== p.compareWith) {\n this.runQueries();\n }\n })\n );\n }\n\n this._subs.add(\n timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n })\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n const observables: Array<Observable<SceneDataLayerProviderResult>> = [];\n\n // This keeps track of multiple SceneDataLayers. The key responsibility od this map is to make sure individual from independent SceneDataLayers do not overwrite each other.\n const resultsMap: Map<string, PanelData> = new Map();\n\n if (dataLayers.length > 0) {\n dataLayers.forEach((layer) => {\n observables.push(layer.getResultsStream());\n });\n\n // possibly we want to combine the results from all layers and only then update, but this is tricky ;(\n this._dataLayersSub = merge(observables)\n .pipe(\n mergeAll(),\n map((v) => {\n // Is there a better, rxjs only way to combine multiple same-data-topic observables?\n // Indexing by origin state key is to make sure we do not duplicate/overwrite data from the different origins\n resultsMap.set(v.origin.state.key!, v.data);\n return resultsMap;\n })\n )\n .subscribe((result) => {\n this._onLayersReceived(result);\n });\n }\n }\n\n private _onLayersReceived(results: Map<string, PanelData>) {\n const dataLayers = sceneGraph.getDataLayers(this);\n const { dataLayerFilter } = this.state;\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n const layerKeys = Array.from(results.keys());\n\n Array.from(results.values()).forEach((result, i) => {\n const layerKey = layerKeys[i];\n const layer = dataLayers.find((l) => l.state.key === layerKey);\n if (layer) {\n if (layer.topic === DataTopic.Annotations && result[DataTopic.Annotations]) {\n annotations = annotations.concat(result[DataTopic.Annotations]);\n }\n\n // @ts-expect-error TODO: use DataTopic.AlertStates when exposed from core grafana\n if (layer.topic === 'alertStates') {\n alertStates = alertStates.concat(result.series);\n }\n }\n });\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n this.setState({\n data: {\n ...this.state.data!,\n annotations,\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * Handles some tricky cases where we need to run queries even when they have not changed in case\n * the query execution on activate was stopped due to VariableSet still not having processed all variables.\n */\n private onVariableUpdatesCompleted(_variablesThatHaveChanged: Set<SceneVariable>, dependencyChanged: boolean) {\n if (this.state._isWaitingForVariables && this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n return;\n }\n\n if (dependencyChanged) {\n this.runQueries();\n }\n }\n\n private shouldRunQueriesOnActivate() {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return false;\n }\n\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n (stateTimeRange.from.unix() === dataTimeRange.from.unix()) &&\n (stateTimeRange.to.unix() === dataTimeRange.to.unix()) \n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n if (this._adhocFilterSub) {\n this._adhocFilterSub.unsubscribe();\n }\n\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this._querySub) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...this.state.data!, state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If data layers subscription doesn't exist, create one\n //\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n const runRequest = getRunRequest();\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (sceneGraph.hasVariableDependencyInLoadingState(this)) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ _isWaitingForVariables: true });\n return;\n }\n\n // If we were waiting for variables, clear that flag\n if (this.state._isWaitingForVariables) {\n this.setState({ _isWaitingForVariables: false });\n }\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const ds = await getDataSource(datasource, this._scopedVars);\n\n if (!this._adhocFilterSet) {\n this.findAndSubscribeToAdhocFilters();\n }\n\n const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n if (secondaryRequest) {\n // change subscribe callback below to pipe operator\n this._querySub = forkJoin([runRequest(ds, request), runRequest(ds, secondaryRequest)])\n .pipe(timeShiftQueryResponseOperator)\n .subscribe(this.onDataReceived);\n } else {\n this._querySub = runRequest(ds, request).subscribe(this.onDataReceived);\n }\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n const result = {\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n };\n\n this.setState({\n data: result,\n });\n }\n }\n\n private prepareRequests = (\n timeRange: SceneTimeRangeLike,\n ds: DataSourceApi\n ): [DataQueryRequest, DataQueryRequest | undefined] => {\n const comparer = this.getTimeCompare();\n const { minInterval, queries } = this.state;\n\n let secondaryRequest: DataQueryRequest | undefined;\n\n let request: DataQueryRequest = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n panelId: 1,\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFilterSet) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = this._adhocFilterSet.state.filters;\n }\n\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n // TODO interpolate minInterval\n const lowerIntervalLimit = minInterval ? minInterval : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n const primaryTimeRange = timeRange.state.value;\n if (comparer) {\n const secondaryTimeRange = comparer.getCompareTimeRange(primaryTimeRange);\n if (secondaryTimeRange) {\n secondaryRequest = {\n ...request,\n range: secondaryTimeRange,\n requestId: getNextRequestId(),\n };\n\n request = {\n ...request,\n range: primaryTimeRange,\n };\n }\n }\n\n return [request, secondaryRequest];\n };\n\n private onDataReceived = (data: PanelData) => {\n this._results.next({ origin: this, data });\n\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Will combine annotations & alert state from data layer providers\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this.state.data && this.state.data.annotations) {\n data.annotations = (data.annotations || []).concat(this.state.data.annotations);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Will walk up the scene graph and find the closest time range compare object\n * It performs buttom-up search, including shallow search across object children for supporting controls/header actions\n */\n private getTimeCompare() {\n if (!this.parent) {\n return null;\n }\n return getClosest(this.parent, (s) => {\n let found = null;\n if (s instanceof SceneTimeRangeCompare) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof SceneTimeRangeCompare) {\n found = child;\n }\n });\n\n return found;\n });\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdhocFilters() {\n const set = getClosest(this, (s) => {\n let found = null;\n if (s instanceof AdHocFilterSet && s.state.datasource?.uid === this.state.datasource?.uid) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof AdHocFilterSet && child.state.datasource?.uid === this.state.datasource?.uid) {\n found = child;\n }\n });\n return found;\n });\n\n if (!set || set.state.applyMode !== 'same-datasource') {\n return;\n }\n\n // Subscribe to filter set state changes so that queries are re-issued when it changes\n this._adhocFilterSet = set;\n this._adhocFilterSub = this._adhocFilterSet?.subscribeToState(() => this.runQueries());\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n"],"names":["_a","_b"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,IAAI,OAAU,GAAA,GAAA,CAAA;AAEP,SAAS,gBAAmB,GAAA;AACjC,EAAA,OAAO,KAAQ,GAAA,OAAA,EAAA,CAAA;AACjB,CAAA;AAqBO,MAAM,yBAAyB,eAA+D,CAAA;AAAA,EAsB5F,YAAY,YAAgC,EAAA;AACjD,IAAA,KAAA,CAAM,YAAY,CAAA,CAAA;AAnBpB,IAAQ,IAAA,CAAA,sBAAA,GAAyB,IAAI,qBAAsB,EAAA,CAAA;AAC3D,IAAQ,IAAA,CAAA,QAAA,GAAW,IAAI,aAAuC,EAAA,CAAA;AAC9D,IAAQ,IAAA,CAAA,WAAA,GAAc,EAAE,aAAe,EAAA,EAAE,OAAO,IAAM,EAAA,IAAA,EAAM,iBAAkB,EAAA,CAAA;AAU9E,IAAU,IAAA,CAAA,mBAAA,GAAkE,IAAI,wBAAA,CAAyB,IAAM,EAAA;AAAA,MAC7G,UAAA,EAAY,CAAC,SAAA,EAAW,YAAY,CAAA;AAAA,MACpC,4BAA4B,CAAC,SAAA,EAAW,sBACtC,IAAK,CAAA,0BAAA,CAA2B,WAAW,iBAAiB,CAAA;AAAA,KAC/D,CAAA,CAAA;AAwTD,IAAQ,IAAA,CAAA,eAAA,GAAkB,CACxB,SAAA,EACA,EACqD,KAAA;AACrD,MAAM,MAAA,QAAA,GAAW,KAAK,cAAe,EAAA,CAAA;AACrC,MAAA,MAAM,EAAE,WAAA,EAAa,OAAQ,EAAA,GAAI,IAAK,CAAA,KAAA,CAAA;AAEtC,MAAI,IAAA,gBAAA,CAAA;AAEJ,MAAA,IAAI,OAA4B,GAAA,cAAA,CAAA;AAAA,QAC9B,GAAK,EAAA,QAAA;AAAA,QACL,WAAW,gBAAiB,EAAA;AAAA,QAC5B,QAAA,EAAU,UAAU,WAAY,EAAA;AAAA,QAChC,OAAS,EAAA,CAAA;AAAA,QACT,KAAA,EAAO,UAAU,KAAM,CAAA,KAAA;AAAA,QACvB,QAAU,EAAA,IAAA;AAAA,QACV,UAAY,EAAA,GAAA;AAAA,QACZ,OAAA,EAAS,UAAU,OAAO,CAAA;AAAA,QAC1B,aAAA,EAAe,KAAK,gBAAiB,EAAA;AAAA,QACrC,YAAY,IAAK,CAAA,WAAA;AAAA,QACjB,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,QACpB,aAAA,EAAe,KAAK,KAAM,CAAA,aAAA;AAAA,QAC1B,QAAU,EAAA;AAAA,UACR,IAAA,EAAM,UAAU,KAAM,CAAA,IAAA;AAAA,UACtB,EAAA,EAAI,UAAU,KAAM,CAAA,EAAA;AAAA,SACtB;AAAA,OAAA,EAEG,uBAAuB,IAAI,CAAA,CAAA,CAAA;AAGhC,MAAA,IAAI,KAAK,eAAiB,EAAA;AAExB,QAAQ,OAAA,CAAA,OAAA,GAAU,IAAK,CAAA,eAAA,CAAgB,KAAM,CAAA,OAAA,CAAA;AAAA,OAC/C;AAEA,MAAA,OAAA,CAAQ,OAAU,GAAA,OAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,CAAC,KAAU,KAAA;AAC/C,QAAI,IAAA,CAAC,MAAM,UAAY,EAAA;AACrB,UAAM,KAAA,CAAA,UAAA,GAAa,GAAG,MAAO,EAAA,CAAA;AAAA,SAC/B;AACA,QAAO,OAAA,KAAA,CAAA;AAAA,OACR,CAAA,CAAA;AAGD,MAAM,MAAA,kBAAA,GAAqB,WAAc,GAAA,WAAA,GAAc,EAAG,CAAA,QAAA,CAAA;AAC1D,MAAM,MAAA,IAAA,GAAO,UAAU,iBAAkB,CAAA,SAAA,CAAU,MAAM,KAAO,EAAA,OAAA,CAAQ,eAAgB,kBAAkB,CAAA,CAAA;AAI1G,MAAA,OAAA,CAAQ,aAAa,MAAO,CAAA,MAAA,CAAO,EAAC,EAAG,QAAQ,UAAY,EAAA;AAAA,QACzD,YAAY,EAAE,IAAA,EAAM,KAAK,QAAU,EAAA,KAAA,EAAO,KAAK,QAAS,EAAA;AAAA,QACxD,aAAA,EAAe,EAAE,IAAM,EAAA,IAAA,CAAK,WAAW,QAAS,EAAA,EAAG,KAAO,EAAA,IAAA,CAAK,UAAW,EAAA;AAAA,OAC3E,CAAA,CAAA;AAED,MAAA,OAAA,CAAQ,WAAW,IAAK,CAAA,QAAA,CAAA;AACxB,MAAA,OAAA,CAAQ,aAAa,IAAK,CAAA,UAAA,CAAA;AAE1B,MAAM,MAAA,gBAAA,GAAmB,UAAU,KAAM,CAAA,KAAA,CAAA;AACzC,MAAA,IAAI,QAAU,EAAA;AACZ,QAAM,MAAA,kBAAA,GAAqB,QAAS,CAAA,mBAAA,CAAoB,gBAAgB,CAAA,CAAA;AACxE,QAAA,IAAI,kBAAoB,EAAA;AACtB,UAAA,gBAAA,GAAmB,iCACd,OADc,CAAA,EAAA;AAAA,YAEjB,KAAO,EAAA,kBAAA;AAAA,YACP,WAAW,gBAAiB,EAAA;AAAA,WAC9B,CAAA,CAAA;AAEA,UAAA,OAAA,GAAU,iCACL,OADK,CAAA,EAAA;AAAA,YAER,KAAO,EAAA,gBAAA;AAAA,WACT,CAAA,CAAA;AAAA,SACF;AAAA,OACF;AAEA,MAAO,OAAA,CAAC,SAAS,gBAAgB,CAAA,CAAA;AAAA,KACnC,CAAA;AAEA,IAAQ,IAAA,CAAA,cAAA,GAAiB,CAAC,IAAoB,KAAA;AAC5C,MAAA,IAAA,CAAK,SAAS,IAAK,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,MAAM,CAAA,CAAA;AAGzC,MAAA,MAAM,gBAAmB,GAAA,mBAAA,CAAoB,IAAM,EAAA,IAAA,CAAK,MAAM,IAAI,CAAA,CAAA;AAGlE,MAAM,MAAA,qBAAA,GAAwB,IAAK,CAAA,kBAAA,CAAmB,gBAAgB,CAAA,CAAA;AAEtE,MAAI,IAAA,cAAA,GAAiB,KAAK,KAAM,CAAA,eAAA,CAAA;AAEhC,MAAA,IAAI,CAAC,cAAA,IAAkB,gBAAiB,CAAA,KAAA,KAAU,aAAa,OAAS,EAAA;AACtE,QAAiB,cAAA,GAAA,IAAA,CAAA;AAAA,OACnB;AAEA,MAAA,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,qBAAuB,EAAA,eAAA,EAAiB,gBAAgB,CAAA,CAAA;AAAA,KAChF,CAAA;AA/YE,IAAA,IAAA,CAAK,oBAAqB,CAAA,MAAM,IAAK,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA,GACpD;AAAA,EAdO,gBAAmB,GAAA;AACxB,IAAA,OAAO,IAAK,CAAA,QAAA,CAAA;AAAA,GACd;AAAA,EAcQ,WAAc,GAAA;AACpB,IAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAC9C,IAAM,MAAA,QAAA,GAAW,KAAK,cAAe,EAAA,CAAA;AAErC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAA,CAAK,KAAM,CAAA,GAAA;AAAA,QACT,QAAS,CAAA,gBAAA,CAAiB,CAAC,CAAA,EAAG,CAAM,KAAA;AAClC,UAAI,IAAA,CAAA,CAAE,WAAgB,KAAA,CAAA,CAAE,WAAa,EAAA;AACnC,YAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAAA,WAClB;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,KAAM,CAAA,GAAA;AAAA,MACT,SAAA,CAAU,iBAAiB,MAAM;AAC/B,QAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA,CAAA;AAAA,OAChC,CAAA;AAAA,KACH,CAAA;AAEA,IAAI,IAAA,IAAA,CAAK,4BAA8B,EAAA;AACrC,MAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAAA,KAClB;AAEA,IAAO,OAAA,MAAM,KAAK,aAAc,EAAA,CAAA;AAAA,GAClC;AAAA,EAGQ,iBAAoB,GAAA;AAC1B,IAAM,MAAA,UAAA,GAAa,UAAW,CAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAEhD,IAAA,MAAM,cAA+D,EAAC,CAAA;AAGtE,IAAM,MAAA,UAAA,uBAAyC,GAAI,EAAA,CAAA;AAEnD,IAAI,IAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AACzB,MAAW,UAAA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AAC5B,QAAY,WAAA,CAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,EAAkB,CAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAGD,MAAK,IAAA,CAAA,cAAA,GAAiB,KAAM,CAAA,WAAW,CACpC,CAAA,IAAA;AAAA,QACC,QAAS,EAAA;AAAA,QACT,GAAA,CAAI,CAAC,CAAM,KAAA;AAGT,UAAA,UAAA,CAAW,IAAI,CAAE,CAAA,MAAA,CAAO,KAAM,CAAA,GAAA,EAAM,EAAE,IAAI,CAAA,CAAA;AAC1C,UAAO,OAAA,UAAA,CAAA;AAAA,SACR,CAAA;AAAA,OACH,CACC,SAAU,CAAA,CAAC,MAAW,KAAA;AACrB,QAAA,IAAA,CAAK,kBAAkB,MAAM,CAAA,CAAA;AAAA,OAC9B,CAAA,CAAA;AAAA,KACL;AAAA,GACF;AAAA,EAEQ,kBAAkB,OAAiC,EAAA;AAzJ7D,IAAA,IAAA,EAAA,CAAA;AA0JI,IAAM,MAAA,UAAA,GAAa,UAAW,CAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAChD,IAAM,MAAA,EAAE,eAAgB,EAAA,GAAI,IAAK,CAAA,KAAA,CAAA;AACjC,IAAA,IAAI,cAA2B,EAAC,CAAA;AAChC,IAAA,IAAI,cAA2B,EAAC,CAAA;AAChC,IAAI,IAAA,UAAA,CAAA;AACJ,IAAA,MAAM,SAAY,GAAA,KAAA,CAAM,IAAK,CAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAE3C,IAAM,KAAA,CAAA,IAAA,CAAK,QAAQ,MAAO,EAAC,EAAE,OAAQ,CAAA,CAAC,QAAQ,CAAM,KAAA;AAClD,MAAA,MAAM,WAAW,SAAU,CAAA,CAAA,CAAA,CAAA;AAC3B,MAAM,MAAA,KAAA,GAAQ,WAAW,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA,CAAA;AAC7D,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,IAAI,MAAM,KAAU,KAAA,SAAA,CAAU,WAAe,IAAA,MAAA,CAAO,UAAU,WAAc,CAAA,EAAA;AAC1E,UAAA,WAAA,GAAc,WAAY,CAAA,MAAA,CAAO,MAAO,CAAA,SAAA,CAAU,WAAY,CAAA,CAAA,CAAA;AAAA,SAChE;AAGA,QAAI,IAAA,KAAA,CAAM,UAAU,aAAe,EAAA;AACjC,UAAc,WAAA,GAAA,WAAA,CAAY,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,SAChD;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAED,IAAA,IAAI,mDAAiB,OAAS,EAAA;AAC5B,MAAI,IAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AAC1B,QAAc,WAAA,GAAA,iBAAA,CAAkB,aAAa,eAAe,CAAA,CAAA;AAAA,OAC9D;AAEA,MAAI,IAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AAC1B,QAAA,KAAA,MAAW,SAAS,WAAa,EAAA;AAC/B,UAAM,MAAA,SAAA,GAAY,IAAI,aAAA,CAA8B,KAAK,CAAA,CAAA;AAEzD,UAAA,KAAA,MAAW,OAAO,SAAW,EAAA;AAC3B,YAAI,IAAA,GAAA,CAAI,OAAY,KAAA,eAAA,CAAgB,OAAS,EAAA;AAC3C,cAAa,UAAA,GAAA,GAAA,CAAA;AACb,cAAA,MAAA;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,QAAS,CAAA;AAAA,MACZ,IAAM,EAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACD,IAAK,CAAA,KAAA,CAAM,IADV,CAAA,EAAA;AAAA,QAEJ,WAAA;AAAA,QACA,UAAY,EAAA,UAAA,IAAA,IAAA,GAAA,UAAA,GAAA,CAAc,EAAK,GAAA,IAAA,CAAA,KAAA,CAAM,SAAX,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA;AAAA,OAC7C,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAMQ,0BAAA,CAA2B,2BAA+C,iBAA4B,EAAA;AAC5G,IAAA,IAAI,IAAK,CAAA,KAAA,CAAM,sBAA0B,IAAA,IAAA,CAAK,4BAA8B,EAAA;AAC1E,MAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAChB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAAA,KAClB;AAAA,GACF;AAAA,EAEQ,0BAA6B,GAAA;AAEnC,IAAI,IAAA,CAAC,KAAK,KAAM,CAAA,aAAA,IAAiB,KAAK,KAAM,CAAA,sBAAA,IAA0B,CAAC,IAAA,CAAK,eAAiB,EAAA;AAC3F,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAA,IAAI,IAAK,CAAA,sBAAA,CAAuB,sBAAuB,CAAA,IAAI,CAAG,EAAA;AAC5D,MAAA,aAAA;AAAA,QACE,kBAAA;AAAA,QACA,qFAAA;AAAA,OACF,CAAA;AACA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAGA,IAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA;AACpB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAGA,IAAA,IAAI,IAAK,CAAA,qBAAA,CAAsB,IAAK,CAAA,KAAA,CAAM,IAAI,CAAG,EAAA;AAC/C,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEQ,sBAAsB,IAAiB,EAAA;AAC7C,IAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAE9C,IAAM,MAAA,cAAA,GAAiB,UAAU,KAAM,CAAA,KAAA,CAAA;AACvC,IAAA,MAAM,gBAAgB,IAAK,CAAA,SAAA,CAAA;AAE3B,IAAA,IACG,cAAe,CAAA,IAAA,CAAK,IAAK,EAAA,KAAM,cAAc,IAAK,CAAA,IAAA,EAClD,IAAA,cAAA,CAAe,GAAG,IAAK,EAAA,KAAM,aAAc,CAAA,EAAA,CAAG,MAC/C,EAAA;AACA,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AACA,IAAA,aAAA,CAAc,oBAAoB,0BAA0B,CAAA,CAAA;AAC5D,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEQ,aAAsB,GAAA;AAC5B,IAAA,IAAI,KAAK,SAAW,EAAA;AAClB,MAAA,IAAA,CAAK,UAAU,WAAY,EAAA,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAY,GAAA,KAAA,CAAA,CAAA;AAAA,KACnB;AAEA,IAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,MAAA,IAAA,CAAK,eAAe,WAAY,EAAA,CAAA;AAChC,MAAA,IAAA,CAAK,cAAiB,GAAA,KAAA,CAAA,CAAA;AAAA,KACxB;AAEA,IAAA,IAAI,KAAK,eAAiB,EAAA;AACxB,MAAA,IAAA,CAAK,gBAAgB,WAAY,EAAA,CAAA;AAAA,KACnC;AAEA,IAAK,IAAA,CAAA,sBAAA,CAAuB,4CAA4C,IAAI,CAAA,CAAA;AAAA,GAC9E;AAAA,EAEO,kBAAkB,KAAe,EAAA;AAEtC,IAAA,IAAI,CAAC,IAAA,CAAK,eAAmB,IAAA,KAAA,GAAQ,CAAG,EAAA;AACtC,MAAA,IAAA,CAAK,eAAkB,GAAA,KAAA,CAAA;AAGvB,MAAA,IAAI,KAAK,KAAM,CAAA,sBAAA,IAA0B,CAAC,IAAA,CAAK,MAAM,aAAe,EAAA;AAElE,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAI,IAAK,CAAA,QAAA,IAAY,CAAC,IAAA,CAAK,SAAW,EAAA;AACpC,YAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAAA,WAClB;AAAA,WACC,CAAC,CAAA,CAAA;AAAA,OACN;AAAA,KACK,MAAA;AAEL,MAAA,IAAI,QAAQ,CAAG,EAAA;AACb,QAAA,IAAA,CAAK,eAAkB,GAAA,KAAA,CAAA;AAAA,OACzB;AAAA,KACF;AAAA,GACF;AAAA,EAEO,oBAAuB,GAAA;AAC5B,IAAO,OAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,eAAe,CAAA,CAAA;AAAA,GAC3C;AAAA,EAEO,UAAa,GAAA;AAClB,IAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAC9C,IAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA,CAAA;AAAA,GACjC;AAAA,EAEQ,gBAAmB,GAAA;AAvT7B,IAAA,IAAA,EAAA,CAAA;AAwTI,IAAI,IAAA,IAAA,CAAK,MAAM,aAAe,EAAA;AAC5B,MAAA,OAAO,KAAK,KAAM,CAAA,aAAA,CAAA;AAAA,KACpB;AAEA,IAAA,OAAO,KAAK,KAAM,CAAA,sBAAA,GAAA,CAAyB,EAAK,GAAA,IAAA,CAAA,eAAA,KAAL,YAAwB,GAAM,GAAA,GAAA,CAAA;AAAA,GAC3E;AAAA,EAEO,WAAc,GAAA;AA/TvB,IAAA,IAAA,EAAA,CAAA;AAgUI,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,cAAL,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,EAAA,CAAA;AAEhB,IAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,MAAA,IAAA,CAAK,eAAe,WAAY,EAAA,CAAA;AAChC,MAAA,IAAA,CAAK,cAAiB,GAAA,KAAA,CAAA,CAAA;AAAA,KACxB;AAEA,IAAA,IAAA,CAAK,QAAS,CAAA;AAAA,MACZ,IAAA,EAAM,iCAAK,IAAK,CAAA,KAAA,CAAM,OAAhB,EAAuB,KAAA,EAAO,aAAa,IAAK,EAAA,CAAA;AAAA,KACvD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAc,iBAAiB,SAA+B,EAAA;AA5UhE,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA+UI,IAAI,IAAA,CAAC,KAAK,cAAgB,EAAA;AACxB,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AAAA,KACzB;AAEA,IAAA,MAAM,aAAa,aAAc,EAAA,CAAA;AAEjC,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,cAAL,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,EAAA,CAAA;AAGhB,IAAI,IAAA,UAAA,CAAW,mCAAoC,CAAA,IAAI,CAAG,EAAA;AACxD,MAAA,aAAA,CAAc,oBAAoB,mEAAmE,CAAA,CAAA;AACrG,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,sBAAwB,EAAA,IAAA,EAAM,CAAA,CAAA;AAC9C,MAAA,OAAA;AAAA,KACF;AAGA,IAAI,IAAA,IAAA,CAAK,MAAM,sBAAwB,EAAA;AACrC,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,sBAAwB,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,KACjD;AAEA,IAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,IAAK,CAAA,KAAA,CAAA;AAGzB,IAAI,IAAA,EAAC,mCAAS,MAAQ,CAAA,EAAA;AACpB,MAAA,IAAA,CAAK,eAAgB,EAAA,CAAA;AACrB,MAAA,OAAA;AAAA,KACF;AAEA,IAAI,IAAA;AACF,MAAA,MAAM,cAAa,EAAK,GAAA,IAAA,CAAA,KAAA,CAAM,UAAX,KAAA,IAAA,GAAA,EAAA,GAAyB,oBAAoB,OAAO,CAAA,CAAA;AACvE,MAAA,MAAM,EAAK,GAAA,MAAM,aAAc,CAAA,UAAA,EAAY,KAAK,WAAW,CAAA,CAAA;AAE3D,MAAI,IAAA,CAAC,KAAK,eAAiB,EAAA;AACzB,QAAA,IAAA,CAAK,8BAA+B,EAAA,CAAA;AAAA,OACtC;AAEA,MAAA,MAAM,CAAC,OAAS,EAAA,gBAAgB,IAAI,IAAK,CAAA,eAAA,CAAgB,WAAW,EAAE,CAAA,CAAA;AAEtE,MAAA,aAAA,CAAc,kBAAoB,EAAA,qBAAA,EAAuB,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAEvE,MAAA,IAAI,gBAAkB,EAAA;AAEpB,QAAA,IAAA,CAAK,YAAY,QAAS,CAAA,CAAC,WAAW,EAAI,EAAA,OAAO,GAAG,UAAW,CAAA,EAAA,EAAI,gBAAgB,CAAC,CAAC,CAClF,CAAA,IAAA,CAAK,8BAA8B,CACnC,CAAA,SAAA,CAAU,KAAK,cAAc,CAAA,CAAA;AAAA,OAC3B,MAAA;AACL,QAAA,IAAA,CAAK,YAAY,UAAW,CAAA,EAAA,EAAI,OAAO,CAAE,CAAA,SAAA,CAAU,KAAK,cAAc,CAAA,CAAA;AAAA,OACxE;AAAA,aACO,GAAP,EAAA;AACA,MAAQ,OAAA,CAAA,KAAA,CAAM,0BAA0B,GAAG,CAAA,CAAA;AAE3C,MAAA,MAAM,MAAS,GAAA,aAAA,CAAA,cAAA,CAAA,cAAA,CAAA,EAAA,EACV,cACA,CAAA,EAAA,IAAA,CAAK,MAAM,IAFD,CAAA,EAAA;AAAA,QAGb,OAAO,YAAa,CAAA,KAAA;AAAA,QACpB,MAAQ,EAAA,CAAC,gBAAiB,CAAA,GAAG,CAAC,CAAA;AAAA,OAChC,CAAA,CAAA;AAEA,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,IAAM,EAAA,MAAA;AAAA,OACP,CAAA,CAAA;AAAA,KACH;AAAA,GACF;AAAA,EAgGQ,mBAAmB,IAAiB,EAAA;AAC1C,IAAA,IAAI,KAAK,KAAM,CAAA,IAAA,IAAQ,IAAK,CAAA,KAAA,CAAM,KAAK,WAAa,EAAA;AAClD,MAAK,IAAA,CAAA,WAAA,GAAA,CAAe,KAAK,WAAe,IAAA,IAAI,MAAO,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,KAChF;AAEA,IAAA,IAAI,KAAK,KAAM,CAAA,IAAA,IAAQ,IAAK,CAAA,KAAA,CAAM,KAAK,UAAY,EAAA;AACjD,MAAK,IAAA,CAAA,UAAA,GAAa,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,UAAA,CAAA;AAAA,KACpC;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEQ,eAAkB,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,IAAA,KAAS,cAAgB,EAAA;AACtC,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,IAAM,EAAA,cAAA,EAAgB,CAAA,CAAA;AAAA,KACxC;AAAA,GACF;AAAA,EAMQ,cAAiB,GAAA;AACvB,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AACA,IAAA,OAAO,UAAW,CAAA,IAAA,CAAK,MAAQ,EAAA,CAAC,CAAM,KAAA;AACpC,MAAA,IAAI,KAAQ,GAAA,IAAA,CAAA;AACZ,MAAA,IAAI,aAAa,qBAAuB,EAAA;AACtC,QAAO,OAAA,CAAA,CAAA;AAAA,OACT;AACA,MAAE,CAAA,CAAA,YAAA,CAAa,CAAC,KAAU,KAAA;AACxB,QAAA,IAAI,iBAAiB,qBAAuB,EAAA;AAC1C,UAAQ,KAAA,GAAA,KAAA,CAAA;AAAA,SACV;AAAA,OACD,CAAA,CAAA;AAED,MAAO,OAAA,KAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH;AAAA,EAKQ,8BAAiC,GAAA;AAzhB3C,IAAA,IAAA,EAAA,CAAA;AA0hBI,IAAA,MAAM,GAAM,GAAA,UAAA,CAAW,IAAM,EAAA,CAAC,CAAM,KAAA;AA1hBxC,MAAA,IAAAA,GAAA,EAAA,EAAA,CAAA;AA2hBM,MAAA,IAAI,KAAQ,GAAA,IAAA,CAAA;AACZ,MAAA,IAAI,CAAa,YAAA,cAAA,IAAA,CAAA,CAAkBA,GAAA,GAAA,CAAA,CAAE,KAAM,CAAA,UAAA,KAAR,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAoB,GAAQ,OAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,UAAA,KAAX,mBAAuB,GAAK,CAAA,EAAA;AACzF,QAAO,OAAA,CAAA,CAAA;AAAA,OACT;AACA,MAAE,CAAA,CAAA,YAAA,CAAa,CAAC,KAAU,KAAA;AA/hBhC,QAAA,IAAAA,GAAAC,EAAAA,GAAAA,CAAAA;AAgiBQ,QAAA,IAAI,KAAiB,YAAA,cAAA,IAAA,CAAA,CAAkBD,GAAA,GAAA,KAAA,CAAM,MAAM,UAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAwB,CAAA,GAAA,OAAA,CAAQC,MAAA,IAAK,CAAA,KAAA,CAAM,UAAX,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAuB,GAAK,CAAA,EAAA;AACjG,UAAQ,KAAA,GAAA,KAAA,CAAA;AAAA,SACV;AAAA,OACD,CAAA,CAAA;AACD,MAAO,OAAA,KAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAA,IAAI,CAAC,GAAA,IAAO,GAAI,CAAA,KAAA,CAAM,cAAc,iBAAmB,EAAA;AACrD,MAAA,OAAA;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,eAAkB,GAAA,GAAA,CAAA;AACvB,IAAA,IAAA,CAAK,mBAAkB,EAAK,GAAA,IAAA,CAAA,eAAA,KAAL,mBAAsB,gBAAiB,CAAA,MAAM,KAAK,UAAW,EAAA,CAAA,CAAA;AAAA,GACtF;AACF,CAAA;AAEO,SAAS,oBAAoB,OAAiD,EAAA;AAjjBrF,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAkjBE,EAAO,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,eAAe,IAAI,CAAA,KAAzC,IAA4C,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAA,KAA5C,IAA0D,GAAA,EAAA,GAAA,KAAA,CAAA,CAAA;AACnE;;;;"}
|
|
@@ -88,6 +88,10 @@ class AdHocFilterSet extends SceneObjectBase {
|
|
|
88
88
|
if (override) {
|
|
89
89
|
keys = keys.concat(override.values);
|
|
90
90
|
}
|
|
91
|
+
const tagKeyRegexFilter = this.state.tagKeyRegexFilter;
|
|
92
|
+
if (tagKeyRegexFilter) {
|
|
93
|
+
keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));
|
|
94
|
+
}
|
|
91
95
|
return keys.map(toSelectableValue);
|
|
92
96
|
}
|
|
93
97
|
async _getValuesFor(filter) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersSet.js","sources":["../../../../src/variables/adhoc/AdHocFiltersSet.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { AdHocVariableFilter, GrafanaTheme2, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { DataSourceRef } from '@grafana/schema';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { SceneComponentProps, SceneObjectState, SceneObjectUrlSyncHandler, ControlsLayout } from '../../core/types';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { css } from '@emotion/css';\n\nexport interface AdHocFilterSetState extends SceneObjectState {\n /** Defaults to Filters */\n name?: string;\n /** The visible filters */\n filters: AdHocVariableFilter[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n * Vertical layout does not yet support operator selector.\n */\n layout?: ControlsLayout;\n /**\n * Defaults to same-datasource which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'same-datasource' | 'manual';\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocVariableFilter;\n}\n\nexport type getTagKeysProvider = (\n set: AdHocFilterSet,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n set: AdHocFilterSet,\n filter: AdHocVariableFilter\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport class AdHocFilterSet extends SceneObjectBase<AdHocFilterSetState> {\n static Component = AdHocFiltersSetRenderer;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new AdHocFiltersVariableUrlSyncHandler(this);\n\n private _scopedVars = { __sceneObject: { value: this } };\n private _dataSourceSrv = getDataSourceSrv();\n\n public constructor(initialState: Partial<AdHocFilterSetState>) {\n super({\n name: 'Filters',\n filters: [],\n baseFilters: [],\n datasource: null,\n applyMode: 'same-datasource',\n layout: 'horizontal',\n ...initialState,\n });\n\n if (this.state.applyMode === 'same-datasource') {\n patchGetAdhocFilters(this);\n }\n }\n\n public _updateFilter(filter: AdHocVariableFilter, prop: keyof AdHocVariableFilter, value: string | undefined | null) {\n if (value == null) {\n return;\n }\n\n const { filters, _wip } = this.state;\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if (prop === 'value') {\n this.setState({ filters: [...filters, { ..._wip, [prop]: value }], _wip: undefined });\n } else {\n this.setState({ _wip: { ...filter, [prop]: value } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n if (f === filter) {\n return { ...f, [prop]: value };\n }\n return f;\n });\n\n this.setState({ filters: updatedFilters });\n }\n\n public _removeFilter(filter: AdHocVariableFilter) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters!);\n let keys = await ds.getTagKeys({ filters: otherFilters });\n\n if (override) {\n keys = keys.concat(override.values);\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocVariableFilter): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(this.state.baseFilters!);\n let values = await ds.getTagValues({ key: filter.key, filters: otherFilters });\n\n if (override) {\n values = values.concat(override.values);\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({ _wip: { key: '', value: '', operator: '=', condition: '' } });\n }\n\n public _getOperators() {\n return ['=', '!=', '<', '>', '=~', '!~'].map<SelectableValue<string>>((value) => ({\n label: value,\n value,\n }));\n }\n}\n\nexport function AdHocFiltersSetRenderer({ model }: SceneComponentProps<AdHocFilterSet>) {\n const { filters, readOnly, layout, name } = model.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n {layout !== 'vertical' && <ControlsLabel label={name ?? 'Filters'} icon=\"filter\" />}\n\n {filters.map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n gap: theme.spacing(2),\n alignItems: 'flex-end',\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n paddingRight: theme.spacing(0.5),\n }),\n});\n\nfunction toSelectableValue({ text, value }: MetricFindValue): SelectableValue<string> {\n return {\n label: text,\n value: String(value ?? text),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdHocFiltersSet.js","sources":["../../../../src/variables/adhoc/AdHocFiltersSet.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { AdHocVariableFilter, GrafanaTheme2, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { DataSourceRef } from '@grafana/schema';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { SceneComponentProps, SceneObjectState, SceneObjectUrlSyncHandler, ControlsLayout } from '../../core/types';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { css } from '@emotion/css';\n\nexport interface AdHocFilterSetState extends SceneObjectState {\n /** Defaults to Filters */\n name?: string;\n /** The visible filters */\n filters: AdHocVariableFilter[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n * Vertical layout does not yet support operator selector.\n */\n layout?: ControlsLayout;\n /**\n * Defaults to same-datasource which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'same-datasource' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocVariableFilter;\n}\n\nexport type getTagKeysProvider = (\n set: AdHocFilterSet,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n set: AdHocFilterSet,\n filter: AdHocVariableFilter\n) => Promise<{ replace?: boolean; values: MetricFindValue[] }>;\n\nexport class AdHocFilterSet extends SceneObjectBase<AdHocFilterSetState> {\n static Component = AdHocFiltersSetRenderer;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new AdHocFiltersVariableUrlSyncHandler(this);\n\n private _scopedVars = { __sceneObject: { value: this } };\n private _dataSourceSrv = getDataSourceSrv();\n\n public constructor(initialState: Partial<AdHocFilterSetState>) {\n super({\n name: 'Filters',\n filters: [],\n baseFilters: [],\n datasource: null,\n applyMode: 'same-datasource',\n layout: 'horizontal',\n ...initialState,\n });\n\n if (this.state.applyMode === 'same-datasource') {\n patchGetAdhocFilters(this);\n }\n }\n\n public _updateFilter(filter: AdHocVariableFilter, prop: keyof AdHocVariableFilter, value: string | undefined | null) {\n if (value == null) {\n return;\n }\n\n const { filters, _wip } = this.state;\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if (prop === 'value') {\n this.setState({ filters: [...filters, { ..._wip, [prop]: value }], _wip: undefined });\n } else {\n this.setState({ _wip: { ...filter, [prop]: value } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n if (f === filter) {\n return { ...f, [prop]: value };\n }\n return f;\n });\n\n this.setState({ filters: updatedFilters });\n }\n\n public _removeFilter(filter: AdHocVariableFilter) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this.setState({ filters: this.state.filters.filter((f) => f !== filter) });\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const otherFilters = this.state.filters.filter((f) => f.key !== currentKey).concat(this.state.baseFilters!);\n let keys = await ds.getTagKeys({ filters: otherFilters });\n\n if (override) {\n keys = keys.concat(override.values);\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocVariableFilter): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return override.values.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(this.state.baseFilters!);\n let values = await ds.getTagValues({ key: filter.key, filters: otherFilters });\n\n if (override) {\n values = values.concat(override.values);\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({ _wip: { key: '', value: '', operator: '=', condition: '' } });\n }\n\n public _getOperators() {\n return ['=', '!=', '<', '>', '=~', '!~'].map<SelectableValue<string>>((value) => ({\n label: value,\n value,\n }));\n }\n}\n\nexport function AdHocFiltersSetRenderer({ model }: SceneComponentProps<AdHocFilterSet>) {\n const { filters, readOnly, layout, name } = model.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n {layout !== 'vertical' && <ControlsLabel label={name ?? 'Filters'} icon=\"filter\" />}\n\n {filters.map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n gap: theme.spacing(2),\n alignItems: 'flex-end',\n }),\n filterIcon: css({\n color: theme.colors.text.secondary,\n paddingRight: theme.spacing(0.5),\n }),\n});\n\nfunction toSelectableValue({ text, value }: MetricFindValue): SelectableValue<string> {\n return {\n label: text,\n value: String(value ?? text),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent } from '../types';\nimport { AdHocFilterSet, AdHocFilterSetState } from './AdHocFiltersSet';\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableHide } from '@grafana/schema';\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /**\n * Important that you set applyFiltersTo: 'manual' when you create the set.\n */\n set: AdHocFilterSet;\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label fitler expression\n */\n filterExpression?: string;\n}\n\nexport type AdHocFiltersVariableCreateHelperArgs = Pick<\n AdHocFilterSetState,\n 'name' | 'filters' | 'baseFilters' | 'datasource' | 'getTagKeysProvider' | 'getTagValuesProvider' | 'name' | 'layout'\n>;\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n /** Helper factory function that makes sure AdHocFilterSet is created correctly */\n public static create(state: AdHocFiltersVariableCreateHelperArgs): AdHocFiltersVariable {\n return new AdHocFiltersVariable({\n type: 'adhoc',\n hide: VariableHide.hideLabel,\n name: state.name ?? 'Filters',\n set: new AdHocFilterSet({\n ...state,\n // Main reason for this helper factory functyion\n applyMode: 'manual',\n }),\n });\n }\n\n public constructor(state: AdHocFiltersVariableState) {\n super({\n ...state,\n filterExpression: state.filterExpression ?? renderFilters(state.set.state.filters),\n });\n\n // Subscribe to filter changes and up the variable value (filterExpression)\n this.addActivationHandler(() => {\n this._subs.add(\n this.state.set.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._updateFilterExpression(newState.filters, true);\n }\n })\n );\n\n this._updateFilterExpression(this.state.set.state.filters, false);\n });\n }\n\n public getValue() {\n return this.state.filterExpression;\n }\n\n private _updateFilterExpression(filters: AdHocVariableFilter[], publishEvent: boolean) {\n let expr = renderFilters(filters);\n\n if (expr === this.state.filterExpression) {\n return;\n }\n\n this.setState({ filterExpression: expr });\n\n if (publishEvent) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n // Same UI as the standalone AdHocFilterSet\n public static Component = ({ model }: SceneComponentProps<AdHocFiltersVariable>) => {\n return <AdHocFilterSet.Component model={model.state.set} />;\n };\n}\n\nfunction renderFilters(filters: AdHocVariableFilter[]) {\n let expr = '';\n for (const filter of filters) {\n expr += `${renderFilter(filter)},`;\n }\n\n if (expr.length > 0) {\n expr = expr.slice(0, -1);\n }\n\n return expr;\n}\n\nfunction renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~Β¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent } from '../types';\nimport { AdHocFilterSet, AdHocFilterSetState } from './AdHocFiltersSet';\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableHide } from '@grafana/schema';\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /**\n * Important that you set applyFiltersTo: 'manual' when you create the set.\n */\n set: AdHocFilterSet;\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label fitler expression\n */\n filterExpression?: string;\n}\n\nexport type AdHocFiltersVariableCreateHelperArgs = Pick<\n AdHocFilterSetState,\n 'name' | 'filters' | 'baseFilters' | 'datasource' | 'tagKeyRegexFilter' | 'getTagKeysProvider' | 'getTagValuesProvider' | 'name' | 'layout'\n>;\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n /** Helper factory function that makes sure AdHocFilterSet is created correctly */\n public static create(state: AdHocFiltersVariableCreateHelperArgs): AdHocFiltersVariable {\n return new AdHocFiltersVariable({\n type: 'adhoc',\n hide: VariableHide.hideLabel,\n name: state.name ?? 'Filters',\n set: new AdHocFilterSet({\n ...state,\n // Main reason for this helper factory functyion\n applyMode: 'manual',\n }),\n });\n }\n\n public constructor(state: AdHocFiltersVariableState) {\n super({\n ...state,\n filterExpression: state.filterExpression ?? renderFilters(state.set.state.filters),\n });\n\n // Subscribe to filter changes and up the variable value (filterExpression)\n this.addActivationHandler(() => {\n this._subs.add(\n this.state.set.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._updateFilterExpression(newState.filters, true);\n }\n })\n );\n\n this._updateFilterExpression(this.state.set.state.filters, false);\n });\n }\n\n public getValue() {\n return this.state.filterExpression;\n }\n\n private _updateFilterExpression(filters: AdHocVariableFilter[], publishEvent: boolean) {\n let expr = renderFilters(filters);\n\n if (expr === this.state.filterExpression) {\n return;\n }\n\n this.setState({ filterExpression: expr });\n\n if (publishEvent) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n // Same UI as the standalone AdHocFilterSet\n public static Component = ({ model }: SceneComponentProps<AdHocFiltersVariable>) => {\n return <AdHocFilterSet.Component model={model.state.set} />;\n };\n}\n\nfunction renderFilters(filters: AdHocVariableFilter[]) {\n let expr = '';\n for (const filter of filters) {\n expr += `${renderFilter(filter)},`;\n }\n\n if (expr.length > 0) {\n expr = expr.slice(0, -1);\n }\n\n return expr;\n}\n\nfunction renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~Β¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.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"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,7 @@ function VariableValueSelect({ model }) {
|
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
function VariableValueSelectMulti({ model }) {
|
|
27
|
-
const { value, key } = model.useState();
|
|
27
|
+
const { value, key, maxVisibleValues } = model.useState();
|
|
28
28
|
const arrayValue = useMemo(() => isArray(value) ? value : [value], [value]);
|
|
29
29
|
const [uncommittedValue, setUncommittedValue] = useState(arrayValue);
|
|
30
30
|
useEffect(() => {
|
|
@@ -40,6 +40,8 @@ function VariableValueSelectMulti({ model }) {
|
|
|
40
40
|
placeholder: "Select value",
|
|
41
41
|
width: "auto",
|
|
42
42
|
value: uncommittedValue,
|
|
43
|
+
noMultiValueWrap: true,
|
|
44
|
+
maxVisibleValues: maxVisibleValues != null ? maxVisibleValues : 5,
|
|
43
45
|
tabSelectsValue: false,
|
|
44
46
|
allowCustomValue: true,
|
|
45
47
|
options: model.getOptionsForSelect(),
|