@grafana/scenes 5.4.1 → 5.5.0--canary.836.9987320115.0

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -1,17 +1,3 @@
1
- # v5.4.1 (Thu Jul 18 2024)
2
-
3
- #### 🐛 Bug Fix
4
-
5
- - QueryVariable: Query is empty string by default [#837](https://github.com/grafana/scenes/pull/837) ([@ivanortegaalba](https://github.com/ivanortegaalba))
6
- - fix(lazyloader): fix trying to run inexistent callbacks [#833](https://github.com/grafana/scenes/pull/833) ([@svennergr](https://github.com/svennergr))
7
-
8
- #### Authors: 2
9
-
10
- - Ivan Ortega Alba ([@ivanortegaalba](https://github.com/ivanortegaalba))
11
- - Sven Grossmann ([@svennergr](https://github.com/svennergr))
12
-
13
- ---
14
-
15
1
  # v5.4.0 (Tue Jul 16 2024)
16
2
 
17
3
  #### 🚀 Enhancement
@@ -9,7 +9,7 @@ import { emptyPanelData } from '../../core/SceneDataNode.js';
9
9
  import { changeSeriesColorConfigFactory } from './colorSeriesConfigFactory.js';
10
10
  import { loadPanelPluginSync } from './registerRuntimePanelPlugin.js';
11
11
  import { getCursorSyncScope } from '../../behaviors/CursorSync.js';
12
- import { mergeWith, cloneDeep, isArray, merge } from 'lodash';
12
+ import { mergeWith, cloneDeep, isArray, merge, isEmpty } from 'lodash';
13
13
  import { UserActionEvent } from '../../core/events.js';
14
14
  import { evaluateTimeRange } from '../../utils/evaluateTimeRange.js';
15
15
  import { LiveNowTimer } from '../../behaviors/LiveNowTimer.js';
@@ -195,15 +195,15 @@ class VizPanel extends SceneObjectBase {
195
195
  this._loadPlugin(this.state.pluginId);
196
196
  }
197
197
  }
198
- async _loadPlugin(pluginId) {
198
+ async _loadPlugin(pluginId, overwriteOptions, overwriteFieldConfig, isAfterPluginChange) {
199
199
  const plugin = loadPanelPluginSync(pluginId);
200
200
  if (plugin) {
201
- this._pluginLoaded(plugin);
201
+ this._pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
202
202
  } else {
203
203
  const { importPanelPlugin } = getPluginImportUtils();
204
204
  try {
205
205
  const result = await importPanelPlugin(pluginId);
206
- this._pluginLoaded(result);
206
+ this._pluginLoaded(result, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
207
207
  } catch (err) {
208
208
  this._pluginLoaded(getPanelPluginNotFound(pluginId));
209
209
  if (err instanceof Error) {
@@ -219,7 +219,7 @@ class VizPanel extends SceneObjectBase {
219
219
  }
220
220
  return panelId;
221
221
  }
222
- async _pluginLoaded(plugin) {
222
+ async _pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange) {
223
223
  const { options, fieldConfig, title, pluginVersion, _UNSAFE_customMigrationHandler } = this.state;
224
224
  const panel = {
225
225
  title,
@@ -229,6 +229,12 @@ class VizPanel extends SceneObjectBase {
229
229
  type: plugin.meta.id,
230
230
  pluginVersion
231
231
  };
232
+ if (overwriteOptions) {
233
+ panel.options = overwriteOptions;
234
+ }
235
+ if (overwriteFieldConfig) {
236
+ panel.fieldConfig = overwriteFieldConfig;
237
+ }
232
238
  const currentVersion = this._getPluginVersion(plugin);
233
239
  _UNSAFE_customMigrationHandler == null ? void 0 : _UNSAFE_customMigrationHandler(panel, plugin);
234
240
  if (plugin.onPanelMigration && currentVersion !== this.state.pluginVersion) {
@@ -238,13 +244,14 @@ class VizPanel extends SceneObjectBase {
238
244
  plugin,
239
245
  currentOptions: panel.options,
240
246
  currentFieldConfig: panel.fieldConfig,
241
- isAfterPluginChange: false
247
+ isAfterPluginChange: isAfterPluginChange != null ? isAfterPluginChange : false
242
248
  });
243
249
  this._plugin = plugin;
244
250
  this.setState({
245
251
  options: withDefaults.options,
246
252
  fieldConfig: withDefaults.fieldConfig,
247
- pluginVersion: currentVersion
253
+ pluginVersion: currentVersion,
254
+ pluginId: plugin.meta.id
248
255
  });
249
256
  if (plugin.meta.skipDataQuery) {
250
257
  const sceneTimeRange = sceneGraph.getTimeRange(this);
@@ -262,6 +269,27 @@ class VizPanel extends SceneObjectBase {
262
269
  (_a = this._panelContext) != null ? _a : this._panelContext = this.buildPanelContext();
263
270
  return this._panelContext;
264
271
  }
272
+ async changePluginType(pluginId, newOptions, newFieldConfig) {
273
+ var _a, _b;
274
+ const {
275
+ options: prevOptions,
276
+ fieldConfig: prevFieldConfig,
277
+ pluginId: prevPluginId
278
+ } = this.state;
279
+ this._dataWithFieldConfig = void 0;
280
+ await this._loadPlugin(pluginId, newOptions != null ? newOptions : {}, newFieldConfig, true);
281
+ const panel = {
282
+ title: this.state.title,
283
+ options: this.state.options,
284
+ fieldConfig: this.state.fieldConfig,
285
+ id: 1,
286
+ type: pluginId
287
+ };
288
+ const updatedOptions = (_b = (_a = this._plugin) == null ? void 0 : _a.onPanelTypeChanged) == null ? void 0 : _b.call(_a, panel, prevPluginId, prevOptions, prevFieldConfig);
289
+ if (updatedOptions && !isEmpty(updatedOptions)) {
290
+ this.onOptionsChange(updatedOptions, true, true);
291
+ }
292
+ }
265
293
  clearFieldConfigCache() {
266
294
  this._dataWithFieldConfig = void 0;
267
295
  }
@@ -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 renderMarkdown,\n PanelPluginDataSupport,\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';\nimport { UserActionEvent } from '../../core/events';\nimport { evaluateTimeRange } from '../../utils/evaluateTimeRange';\nimport { LiveNowTimer } from '../../behaviors/LiveNowTimer';\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 * Offset hoverHeader position on the y axis\n */\n hoverHeaderOffset?: number;\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 state.menu?.addActivationHandler(() => {\n this.publishEvent(new UserActionEvent({ origin: this, interaction: 'panel-menu-shown' }), true);\n });\n }\n\n private _onActivate() {\n if (!this._plugin) {\n this._loadPlugin(this.state.pluginId);\n }\n }\n\n private async _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 const result = await importPanelPlugin(pluginId);\n this._pluginLoaded(result);\n } catch (err: unknown) {\n this._pluginLoaded(getPanelPluginNotFound(pluginId));\n\n if (err instanceof Error) {\n this.setState({ _pluginLoadError: err.message });\n }\n }\n }\n }\n\n public getLegacyPanelId() {\n const panelId = parseInt(this.state.key!.replace('panel-', ''), 10);\n if (isNaN(panelId)) {\n return 0;\n }\n\n return panelId;\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: this.getLegacyPanelId(),\n type: plugin.meta.id,\n pluginVersion: pluginVersion,\n };\n\n const currentVersion = this._getPluginVersion(plugin);\n\n _UNSAFE_customMigrationHandler?.(panel, plugin);\n\n if (plugin.onPanelMigration && 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 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 as DeepPartial<TOptions>,\n fieldConfig: withDefaults.fieldConfig,\n pluginVersion: currentVersion,\n });\n\n // Non data panels needs to be re-rendered when time range change\n if (plugin.meta.skipDataQuery) {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n this._subs.add(sceneTimeRange.subscribeToState(() => this.forceRender()));\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 this._panelContext ??= this.buildPanelContext();\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 getTimeRange = (data?: PanelData) => {\n const liveNowTimer = sceneGraph.findObject(this, (o) => o instanceof LiveNowTimer);\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n if (liveNowTimer instanceof LiveNowTimer && liveNowTimer.isEnabled) {\n return evaluateTimeRange(\n sceneTimeRange.state.from,\n sceneTimeRange.state.to,\n sceneTimeRange.getTimeZone(),\n sceneTimeRange.state.fiscalYearStartMonth,\n sceneTimeRange.state.UNSAFE_nowDelay\n );\n }\n\n const plugin = this.getPlugin();\n if (plugin && !plugin.meta.skipDataQuery && data && data.timeRange) {\n return data.timeRange;\n }\n\n return sceneTimeRange.state.value;\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, isAfterPluginChange = 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, (objValue, srcValue, key, obj) => {\n if (isArray(srcValue)) {\n return srcValue;\n }\n // If customizer returns undefined, merging is handled by the method instead\n // so we need to override the value in the object instead\n if (objValue !== srcValue && typeof srcValue === 'undefined') {\n obj[key] = srcValue;\n return;\n }\n return;\n });\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin: this._plugin!,\n currentOptions: nextOptions,\n currentFieldConfig: fieldConfig,\n isAfterPluginChange: isAfterPluginChange,\n });\n\n this.setState({\n options: withDefaults.options as DeepPartial<TOptions>,\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._dataWithFieldConfig = undefined;\n this.setState({ fieldConfig: withDefaults.fieldConfig });\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 this.publishEvent(new UserActionEvent({ origin: this, interaction: 'panel-description-shown' }), true);\n\n const { description } = this.state;\n if (description) {\n const markdown = this.interpolate(description);\n return renderMarkdown(markdown);\n }\n return '';\n };\n\n public clearFieldConfigCache() {\n this._dataWithFieldConfig = undefined;\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 // If the data is the same as last time, we can skip the field config apply step and just return same result as last time\n if (this._prevData === rawData && this._dataWithFieldConfig) {\n return this._dataWithFieldConfig;\n }\n\n const pluginDataSupport: PanelPluginDataSupport = plugin.dataSupport || { alertStates: false, annotations: false };\n\n const fieldConfigRegistry = plugin.fieldConfigRegistry;\n const prevFrames = this._dataWithFieldConfig?.series ?? [];\n const newFrames = applyFieldOverrides({\n data: rawData.series,\n fieldConfig: this.state.fieldConfig,\n fieldConfigRegistry,\n replaceVariables: this.interpolate,\n theme: config.theme2,\n timeZone: rawData.request?.timezone,\n });\n\n if (!compareArrayValues(newFrames, prevFrames, compareDataFrameStructures)) {\n this._structureRev++;\n }\n\n this._dataWithFieldConfig = {\n ...rawData,\n structureRev: this._structureRev,\n series: newFrames,\n };\n\n if (this._dataWithFieldConfig.annotations) {\n this._dataWithFieldConfig.annotations = applyFieldOverrides({\n data: this._dataWithFieldConfig.annotations,\n fieldConfig: {\n defaults: {},\n overrides: [],\n },\n fieldConfigRegistry,\n replaceVariables: this.interpolate,\n theme: config.theme2,\n timeZone: rawData.request?.timezone,\n });\n }\n\n if (!pluginDataSupport.alertStates) {\n this._dataWithFieldConfig.alertState = undefined;\n }\n\n if (!pluginDataSupport.annotations) {\n this._dataWithFieldConfig.annotations = undefined;\n }\n\n this._prevData = rawData;\n return this._dataWithFieldConfig;\n }\n\n public onCancelQuery = () => {\n this.publishEvent(new UserActionEvent({ origin: this, interaction: 'panel-cancel-query-clicked' }), true);\n const data = sceneGraph.getData(this);\n data.cancelQuery?.();\n };\n\n public onStatusMessageClick = () => {\n this.publishEvent(new UserActionEvent({ origin: this, interaction: 'panel-status-message-clicked' }), true);\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 if (this._panelContext) {\n this._panelContext = {\n ...this._panelContext,\n instanceState: state,\n };\n }\n\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 {\n ...this.state.options,\n legend: { ...legendOptions, sortBy, sortDesc },\n } as TOptions,\n true\n );\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): 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\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 PanelPluginDataSupport,\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, isEmpty, merge, mergeWith } from 'lodash';\nimport { UserActionEvent } from '../../core/events';\nimport { evaluateTimeRange } from '../../utils/evaluateTimeRange';\nimport { LiveNowTimer } from '../../behaviors/LiveNowTimer';\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 * Offset hoverHeader position on the y axis\n */\n hoverHeaderOffset?: number;\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 state.menu?.addActivationHandler(() => {\n this.publishEvent(new UserActionEvent({ origin: this, interaction: 'panel-menu-shown' }), true);\n });\n }\n\n private _onActivate() {\n if (!this._plugin) {\n this._loadPlugin(this.state.pluginId);\n }\n }\n\n private async _loadPlugin(pluginId: string, overwriteOptions?: DeepPartial<{}>, overwriteFieldConfig?: FieldConfigSource, isAfterPluginChange?: boolean) {\n const plugin = loadPanelPluginSync(pluginId);\n\n if (plugin) {\n this._pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);\n } else {\n const { importPanelPlugin } = getPluginImportUtils();\n\n try {\n const result = await importPanelPlugin(pluginId);\n this._pluginLoaded(result, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);\n } catch (err: unknown) {\n this._pluginLoaded(getPanelPluginNotFound(pluginId));\n\n if (err instanceof Error) {\n this.setState({ _pluginLoadError: err.message });\n }\n }\n }\n }\n\n public getLegacyPanelId() {\n const panelId = parseInt(this.state.key!.replace('panel-', ''), 10);\n if (isNaN(panelId)) {\n return 0;\n }\n\n return panelId;\n }\n\n private async _pluginLoaded(plugin: PanelPlugin, overwriteOptions?: DeepPartial<{}>, overwriteFieldConfig?: FieldConfigSource, isAfterPluginChange?: boolean) {\n const { options, fieldConfig, title, pluginVersion, _UNSAFE_customMigrationHandler } = this.state;\n\n const panel: PanelModel = {\n title,\n options,\n fieldConfig,\n id: this.getLegacyPanelId(),\n type: plugin.meta.id,\n pluginVersion: pluginVersion,\n };\n\n if (overwriteOptions) {\n panel.options = overwriteOptions;\n }\n\n if (overwriteFieldConfig) {\n panel.fieldConfig = overwriteFieldConfig;\n }\n\n const currentVersion = this._getPluginVersion(plugin);\n\n _UNSAFE_customMigrationHandler?.(panel, plugin);\n\n if (plugin.onPanelMigration && 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 const withDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: panel.options,\n currentFieldConfig: panel.fieldConfig,\n isAfterPluginChange: isAfterPluginChange ?? false,\n });\n\n this._plugin = plugin;\n\n this.setState({\n options: withDefaults.options as DeepPartial<TOptions>,\n fieldConfig: withDefaults.fieldConfig,\n pluginVersion: currentVersion,\n pluginId: plugin.meta.id,\n });\n\n // Non data panels needs to be re-rendered when time range change\n if (plugin.meta.skipDataQuery) {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n this._subs.add(sceneTimeRange.subscribeToState(() => this.forceRender()));\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 this._panelContext ??= this.buildPanelContext();\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 getTimeRange = (data?: PanelData) => {\n const liveNowTimer = sceneGraph.findObject(this, (o) => o instanceof LiveNowTimer);\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n if (liveNowTimer instanceof LiveNowTimer && liveNowTimer.isEnabled) {\n return evaluateTimeRange(\n sceneTimeRange.state.from,\n sceneTimeRange.state.to,\n sceneTimeRange.getTimeZone(),\n sceneTimeRange.state.fiscalYearStartMonth,\n sceneTimeRange.state.UNSAFE_nowDelay\n );\n }\n\n const plugin = this.getPlugin();\n if (plugin && !plugin.meta.skipDataQuery && data && data.timeRange) {\n return data.timeRange;\n }\n\n return sceneTimeRange.state.value;\n };\n\n public async changePluginType(pluginId: string, newOptions?: DeepPartial<{}>, newFieldConfig?: FieldConfigSource) {\n const {\n options: prevOptions,\n fieldConfig: prevFieldConfig,\n pluginId: prevPluginId,\n } = this.state;\n\n //clear field config cache to update it later\n this._dataWithFieldConfig = undefined;\n\n await this._loadPlugin(pluginId, newOptions ?? {}, newFieldConfig, true);\n\n const panel: PanelModel = {\n title: this.state.title,\n options: this.state.options,\n fieldConfig: this.state.fieldConfig,\n id: 1,\n type: pluginId,\n };\n\n // onPanelTypeChanged is mainly used by plugins to migrate from Angular to React. \n // For example, this will migrate options from 'graph' to 'timeseries' if the previous and new plugin ID matches. \n const updatedOptions = this._plugin?.onPanelTypeChanged?.(panel, prevPluginId, prevOptions, prevFieldConfig);\n\n if (updatedOptions && !isEmpty(updatedOptions)) {\n this.onOptionsChange(updatedOptions, true, true);\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, isAfterPluginChange = 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, (objValue, srcValue, key, obj) => {\n if (isArray(srcValue)) {\n return srcValue;\n }\n // If customizer returns undefined, merging is handled by the method instead\n // so we need to override the value in the object instead\n if (objValue !== srcValue && typeof srcValue === 'undefined') {\n obj[key] = srcValue;\n return;\n }\n return;\n });\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin: this._plugin!,\n currentOptions: nextOptions,\n currentFieldConfig: fieldConfig,\n isAfterPluginChange: isAfterPluginChange,\n });\n\n this.setState({\n options: withDefaults.options as DeepPartial<TOptions>,\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._dataWithFieldConfig = undefined;\n this.setState({ fieldConfig: withDefaults.fieldConfig });\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 this.publishEvent(new UserActionEvent({ origin: this, interaction: 'panel-description-shown' }), true);\n\n const { description } = this.state;\n if (description) {\n const markdown = this.interpolate(description);\n return renderMarkdown(markdown);\n }\n return '';\n };\n\n public clearFieldConfigCache() {\n this._dataWithFieldConfig = undefined;\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 // If the data is the same as last time, we can skip the field config apply step and just return same result as last time\n if (this._prevData === rawData && this._dataWithFieldConfig) {\n return this._dataWithFieldConfig;\n }\n\n const pluginDataSupport: PanelPluginDataSupport = plugin.dataSupport || { alertStates: false, annotations: false };\n\n const fieldConfigRegistry = plugin.fieldConfigRegistry;\n const prevFrames = this._dataWithFieldConfig?.series ?? [];\n const newFrames = applyFieldOverrides({\n data: rawData.series,\n fieldConfig: this.state.fieldConfig,\n fieldConfigRegistry,\n replaceVariables: this.interpolate,\n theme: config.theme2,\n timeZone: rawData.request?.timezone,\n });\n\n if (!compareArrayValues(newFrames, prevFrames, compareDataFrameStructures)) {\n this._structureRev++;\n }\n\n this._dataWithFieldConfig = {\n ...rawData,\n structureRev: this._structureRev,\n series: newFrames,\n };\n\n if (this._dataWithFieldConfig.annotations) {\n this._dataWithFieldConfig.annotations = applyFieldOverrides({\n data: this._dataWithFieldConfig.annotations,\n fieldConfig: {\n defaults: {},\n overrides: [],\n },\n fieldConfigRegistry,\n replaceVariables: this.interpolate,\n theme: config.theme2,\n timeZone: rawData.request?.timezone,\n });\n }\n\n if (!pluginDataSupport.alertStates) {\n this._dataWithFieldConfig.alertState = undefined;\n }\n\n if (!pluginDataSupport.annotations) {\n this._dataWithFieldConfig.annotations = undefined;\n }\n\n this._prevData = rawData;\n return this._dataWithFieldConfig;\n }\n\n public onCancelQuery = () => {\n this.publishEvent(new UserActionEvent({ origin: this, interaction: 'panel-cancel-query-clicked' }), true);\n const data = sceneGraph.getData(this);\n data.cancelQuery?.();\n };\n\n public onStatusMessageClick = () => {\n this.publishEvent(new UserActionEvent({ origin: this, interaction: 'panel-status-message-clicked' }), true);\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 if (this._panelContext) {\n this._panelContext = {\n ...this._panelContext,\n instanceState: state,\n };\n }\n\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 {\n ...this.state.options,\n legend: { ...legendOptions, sortBy, sortDesc },\n } as TOptions,\n true\n );\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): 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\n return plugin;\n}\n"],"names":[],"mappings":"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"}
@@ -40,7 +40,7 @@ class QueryVariable extends MultiValueVariable {
40
40
  options: [],
41
41
  datasource: null,
42
42
  regex: "",
43
- query: "",
43
+ query: { refId: "A" },
44
44
  refresh: VariableRefresh.onDashboardLoad,
45
45
  sort: VariableSort.disabled
46
46
  }, initialState));
@@ -1 +1 @@
1
- {"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import { Observable, of, filter, take, mergeMap, catchError, throwError, from, lastValueFrom } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQueryRequest,\n LoadingState,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n} from '@grafana/data';\n\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneComponentProps, SceneDataQuery } from '../../../core/types';\nimport { VariableDependencyConfig } from '../../VariableDependencyConfig';\nimport { renderSelectForVariable } from '../../components/VariableValueSelect';\nimport { VariableValueOption } from '../../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../MultiValueVariable';\n\nimport { createQueryVariableRunner } from './createQueryVariableRunner';\nimport { metricNamesToVariableValues } from './utils';\nimport { toMetricFindValues } from './toMetricFindValues';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { safeStringifyValue } from '../../utils';\nimport { DataQuery, DataSourceRef } from '@grafana/schema';\nimport { SEARCH_FILTER_VARIABLE } from '../../constants';\nimport { debounce } from 'lodash';\nimport { registerQueryWithController } from '../../../querying/registerQueryWithController';\n\nexport interface QueryVariableState extends MultiValueVariableState {\n type: 'query';\n datasource: DataSourceRef | null;\n query: string | SceneDataQuery;\n regex: string;\n refresh: VariableRefresh;\n sort: VariableSort;\n /** @internal Only for use inside core dashboards */\n definition?: string;\n}\n\nexport class QueryVariable extends MultiValueVariable<QueryVariableState> {\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['regex', 'query', 'datasource'],\n });\n\n public constructor(initialState: Partial<QueryVariableState>) {\n super({\n type: 'query',\n name: '',\n value: '',\n text: '',\n options: [],\n datasource: null,\n regex: '',\n query: '',\n refresh: VariableRefresh.onDashboardLoad,\n sort: VariableSort.disabled,\n ...initialState,\n });\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (!this.state.query) {\n return of([]);\n }\n\n this.setState({ loading: true, error: null });\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: { text: '__sceneObject', value: this },\n })\n ).pipe(\n mergeMap((ds) => {\n const runner = createQueryVariableRunner(ds);\n const target = runner.getTarget(this);\n const request = this.getRequest(target, args.searchFilter);\n\n return runner.runRequest({ variable: this, searchFilter: args.searchFilter }, request).pipe(\n registerQueryWithController({\n type: 'variable',\n request: request,\n origin: this,\n }),\n filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error), // we only care about done or error for now\n take(1), // take the first result, using first caused a bug where it in some situations throw an uncaught error because of no results had been received yet\n mergeMap((data: PanelData) => {\n if (data.state === LoadingState.Error) {\n return throwError(() => data.error);\n }\n return of(data);\n }),\n toMetricFindValues(),\n mergeMap((values) => {\n let regex = '';\n if (this.state.regex) {\n regex = sceneGraph.interpolate(this, this.state.regex, undefined, 'regex');\n }\n return of(metricNamesToVariableValues(regex, this.state.sort, values));\n }),\n catchError((error) => {\n if (error.cancelled) {\n return of([]);\n }\n return throwError(() => error);\n })\n );\n })\n );\n }\n\n private getRequest(target: DataQuery | string, searchFilter?: string) {\n const scopedVars: ScopedVars = {\n __sceneObject: { text: '__sceneObject', value: this },\n };\n\n if (searchFilter) {\n scopedVars.__searchFilter = { value: searchFilter, text: searchFilter };\n }\n\n const range = sceneGraph.getTimeRange(this).state.value;\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: uuidv4(),\n timezone: '',\n range,\n interval: '',\n intervalMs: 0,\n // @ts-ignore\n targets: [target],\n scopedVars,\n startTime: Date.now(),\n };\n\n return request;\n }\n\n onSearchChange = (searchFilter: string) => {\n if (!containsSearchFilter(this.state.query)) {\n return;\n }\n\n this._updateOptionsBasedOnSearchFilter(searchFilter);\n };\n\n private _updateOptionsBasedOnSearchFilter = debounce(async (searchFilter: string) => {\n const result = await lastValueFrom(this.getValueOptions({ searchFilter }));\n this.setState({ options: result, loading: false });\n }, 400);\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return renderSelectForVariable(model);\n };\n}\n\nfunction containsSearchFilter(query: string | DataQuery) {\n const str = safeStringifyValue(query);\n return str.indexOf(SEARCH_FILTER_VARIABLE) > -1;\n}\n"],"names":["uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import { Observable, of, filter, take, mergeMap, catchError, throwError, from, lastValueFrom } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQueryRequest,\n LoadingState,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n} from '@grafana/data';\n\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneComponentProps, SceneDataQuery } from '../../../core/types';\nimport { VariableDependencyConfig } from '../../VariableDependencyConfig';\nimport { renderSelectForVariable } from '../../components/VariableValueSelect';\nimport { VariableValueOption } from '../../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../MultiValueVariable';\n\nimport { createQueryVariableRunner } from './createQueryVariableRunner';\nimport { metricNamesToVariableValues } from './utils';\nimport { toMetricFindValues } from './toMetricFindValues';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { safeStringifyValue } from '../../utils';\nimport { DataQuery, DataSourceRef } from '@grafana/schema';\nimport { SEARCH_FILTER_VARIABLE } from '../../constants';\nimport { debounce } from 'lodash';\nimport { registerQueryWithController } from '../../../querying/registerQueryWithController';\n\nexport interface QueryVariableState extends MultiValueVariableState {\n type: 'query';\n datasource: DataSourceRef | null;\n query: string | SceneDataQuery;\n regex: string;\n refresh: VariableRefresh;\n sort: VariableSort;\n /** @internal Only for use inside core dashboards */\n definition?: string;\n}\n\nexport class QueryVariable extends MultiValueVariable<QueryVariableState> {\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['regex', 'query', 'datasource'],\n });\n\n public constructor(initialState: Partial<QueryVariableState>) {\n super({\n type: 'query',\n name: '',\n value: '',\n text: '',\n options: [],\n datasource: null,\n regex: '',\n query: { refId: 'A' },\n refresh: VariableRefresh.onDashboardLoad,\n sort: VariableSort.disabled,\n ...initialState,\n });\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (!this.state.query) {\n return of([]);\n }\n\n this.setState({ loading: true, error: null });\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: { text: '__sceneObject', value: this },\n })\n ).pipe(\n mergeMap((ds) => {\n const runner = createQueryVariableRunner(ds);\n const target = runner.getTarget(this);\n const request = this.getRequest(target, args.searchFilter);\n\n return runner.runRequest({ variable: this, searchFilter: args.searchFilter }, request).pipe(\n registerQueryWithController({\n type: 'variable',\n request: request,\n origin: this,\n }),\n filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error), // we only care about done or error for now\n take(1), // take the first result, using first caused a bug where it in some situations throw an uncaught error because of no results had been received yet\n mergeMap((data: PanelData) => {\n if (data.state === LoadingState.Error) {\n return throwError(() => data.error);\n }\n return of(data);\n }),\n toMetricFindValues(),\n mergeMap((values) => {\n let regex = '';\n if (this.state.regex) {\n regex = sceneGraph.interpolate(this, this.state.regex, undefined, 'regex');\n }\n return of(metricNamesToVariableValues(regex, this.state.sort, values));\n }),\n catchError((error) => {\n if (error.cancelled) {\n return of([]);\n }\n return throwError(() => error);\n })\n );\n })\n );\n }\n\n private getRequest(target: DataQuery | string, searchFilter?: string) {\n const scopedVars: ScopedVars = {\n __sceneObject: { text: '__sceneObject', value: this },\n };\n\n if (searchFilter) {\n scopedVars.__searchFilter = { value: searchFilter, text: searchFilter };\n }\n\n const range = sceneGraph.getTimeRange(this).state.value;\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: uuidv4(),\n timezone: '',\n range,\n interval: '',\n intervalMs: 0,\n // @ts-ignore\n targets: [target],\n scopedVars,\n startTime: Date.now(),\n };\n\n return request;\n }\n\n onSearchChange = (searchFilter: string) => {\n if (!containsSearchFilter(this.state.query)) {\n return;\n }\n\n this._updateOptionsBasedOnSearchFilter(searchFilter);\n };\n\n private _updateOptionsBasedOnSearchFilter = debounce(async (searchFilter: string) => {\n const result = await lastValueFrom(this.getValueOptions({ searchFilter }));\n this.setState({ options: result, loading: false });\n }, 400);\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return renderSelectForVariable(model);\n };\n}\n\nfunction containsSearchFilter(query: string | DataQuery) {\n const str = safeStringifyValue(query);\n return str.indexOf(SEARCH_FILTER_VARIABLE) > -1;\n}\n"],"names":["uuidv4"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1698,6 +1698,7 @@ declare class VizPanel<TOptions = {}, TFieldConfig extends {} = {}> extends Scen
1698
1698
  getPanelContext(): PanelContext;
1699
1699
  onTimeRangeChange: (timeRange: AbsoluteTimeRange) => void;
1700
1700
  getTimeRange: (data?: PanelData) => _grafana_data.TimeRange;
1701
+ changePluginType(pluginId: string, newOptions?: DeepPartial<{}>, newFieldConfig?: FieldConfigSource): Promise<void>;
1701
1702
  onTitleChange: (title: string) => void;
1702
1703
  onDescriptionChange: (description: string) => void;
1703
1704
  onDisplayModeChange: (displayMode: 'default' | 'transparent') => void;
package/dist/index.js CHANGED
@@ -5304,15 +5304,15 @@ class VizPanel extends SceneObjectBase {
5304
5304
  this._loadPlugin(this.state.pluginId);
5305
5305
  }
5306
5306
  }
5307
- async _loadPlugin(pluginId) {
5307
+ async _loadPlugin(pluginId, overwriteOptions, overwriteFieldConfig, isAfterPluginChange) {
5308
5308
  const plugin = loadPanelPluginSync(pluginId);
5309
5309
  if (plugin) {
5310
- this._pluginLoaded(plugin);
5310
+ this._pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
5311
5311
  } else {
5312
5312
  const { importPanelPlugin } = runtime.getPluginImportUtils();
5313
5313
  try {
5314
5314
  const result = await importPanelPlugin(pluginId);
5315
- this._pluginLoaded(result);
5315
+ this._pluginLoaded(result, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
5316
5316
  } catch (err) {
5317
5317
  this._pluginLoaded(getPanelPluginNotFound(pluginId));
5318
5318
  if (err instanceof Error) {
@@ -5328,7 +5328,7 @@ class VizPanel extends SceneObjectBase {
5328
5328
  }
5329
5329
  return panelId;
5330
5330
  }
5331
- async _pluginLoaded(plugin) {
5331
+ async _pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange) {
5332
5332
  const { options, fieldConfig, title, pluginVersion, _UNSAFE_customMigrationHandler } = this.state;
5333
5333
  const panel = {
5334
5334
  title,
@@ -5338,6 +5338,12 @@ class VizPanel extends SceneObjectBase {
5338
5338
  type: plugin.meta.id,
5339
5339
  pluginVersion
5340
5340
  };
5341
+ if (overwriteOptions) {
5342
+ panel.options = overwriteOptions;
5343
+ }
5344
+ if (overwriteFieldConfig) {
5345
+ panel.fieldConfig = overwriteFieldConfig;
5346
+ }
5341
5347
  const currentVersion = this._getPluginVersion(plugin);
5342
5348
  _UNSAFE_customMigrationHandler == null ? void 0 : _UNSAFE_customMigrationHandler(panel, plugin);
5343
5349
  if (plugin.onPanelMigration && currentVersion !== this.state.pluginVersion) {
@@ -5347,13 +5353,14 @@ class VizPanel extends SceneObjectBase {
5347
5353
  plugin,
5348
5354
  currentOptions: panel.options,
5349
5355
  currentFieldConfig: panel.fieldConfig,
5350
- isAfterPluginChange: false
5356
+ isAfterPluginChange: isAfterPluginChange != null ? isAfterPluginChange : false
5351
5357
  });
5352
5358
  this._plugin = plugin;
5353
5359
  this.setState({
5354
5360
  options: withDefaults.options,
5355
5361
  fieldConfig: withDefaults.fieldConfig,
5356
- pluginVersion: currentVersion
5362
+ pluginVersion: currentVersion,
5363
+ pluginId: plugin.meta.id
5357
5364
  });
5358
5365
  if (plugin.meta.skipDataQuery) {
5359
5366
  const sceneTimeRange = sceneGraph.getTimeRange(this);
@@ -5371,6 +5378,27 @@ class VizPanel extends SceneObjectBase {
5371
5378
  (_a = this._panelContext) != null ? _a : this._panelContext = this.buildPanelContext();
5372
5379
  return this._panelContext;
5373
5380
  }
5381
+ async changePluginType(pluginId, newOptions, newFieldConfig) {
5382
+ var _a, _b;
5383
+ const {
5384
+ options: prevOptions,
5385
+ fieldConfig: prevFieldConfig,
5386
+ pluginId: prevPluginId
5387
+ } = this.state;
5388
+ this._dataWithFieldConfig = void 0;
5389
+ await this._loadPlugin(pluginId, newOptions != null ? newOptions : {}, newFieldConfig, true);
5390
+ const panel = {
5391
+ title: this.state.title,
5392
+ options: this.state.options,
5393
+ fieldConfig: this.state.fieldConfig,
5394
+ id: 1,
5395
+ type: pluginId
5396
+ };
5397
+ const updatedOptions = (_b = (_a = this._plugin) == null ? void 0 : _a.onPanelTypeChanged) == null ? void 0 : _b.call(_a, panel, prevPluginId, prevOptions, prevFieldConfig);
5398
+ if (updatedOptions && !lodash.isEmpty(updatedOptions)) {
5399
+ this.onOptionsChange(updatedOptions, true, true);
5400
+ }
5401
+ }
5374
5402
  clearFieldConfigCache() {
5375
5403
  this._dataWithFieldConfig = void 0;
5376
5404
  }
@@ -7391,7 +7419,7 @@ class QueryVariable extends MultiValueVariable {
7391
7419
  options: [],
7392
7420
  datasource: null,
7393
7421
  regex: "",
7394
- query: "",
7422
+ query: { refId: "A" },
7395
7423
  refresh: data.VariableRefresh.onDashboardLoad,
7396
7424
  sort: data.VariableSort.disabled
7397
7425
  }, initialState));