@grafana/scenes 8.13.1 → 8.13.3
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 +24 -0
- package/dist/esm/components/VizPanel/VizPanel.js +5 -1
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +2 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
# v8.13.3 (Mon Jul 20 2026)
|
|
2
|
+
|
|
3
|
+
#### 🐛 Bug Fix
|
|
4
|
+
|
|
5
|
+
- Dashboards: Invalidate fieldConfig cache on variable change when vars are used [#1579](https://github.com/grafana/scenes/pull/1579) ([@mdvictor](https://github.com/mdvictor))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Victor Marin ([@mdvictor](https://github.com/mdvictor))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# v8.13.2 (Fri Jul 17 2026)
|
|
14
|
+
|
|
15
|
+
#### 🐛 Bug Fix
|
|
16
|
+
|
|
17
|
+
- feat: add data-testid to viz panel renderer [#1557](https://github.com/grafana/scenes/pull/1557) ([@jackw](https://github.com/jackw))
|
|
18
|
+
|
|
19
|
+
#### Authors: 1
|
|
20
|
+
|
|
21
|
+
- Jack Westbrook ([@jackw](https://github.com/jackw))
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
1
25
|
# v8.13.1 (Fri Jul 17 2026)
|
|
2
26
|
|
|
3
27
|
#### 🐛 Bug Fix
|
|
@@ -32,7 +32,11 @@ class VizPanel extends SceneObjectBase {
|
|
|
32
32
|
...state
|
|
33
33
|
});
|
|
34
34
|
this._variableDependency = new VariableDependencyConfig(this, {
|
|
35
|
-
statePaths: ["title", "options", "fieldConfig"]
|
|
35
|
+
statePaths: ["title", "options", "fieldConfig"],
|
|
36
|
+
onReferencedVariableValueChanged: () => {
|
|
37
|
+
this.clearFieldConfigCache();
|
|
38
|
+
this.forceRender();
|
|
39
|
+
}
|
|
36
40
|
});
|
|
37
41
|
this._structureRev = 0;
|
|
38
42
|
this.onTimeRangeChange = (timeRange) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanel.js","sources":["../../../../src/components/VizPanel/VizPanel.tsx"],"sourcesContent":["import { t } from '@grafana/i18n';\nimport {\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';\nimport { VizPanelRenderProfiler } from '../../performance/VizPanelRenderProfiler';\nimport { registerQueryWithController, wrapPromiseInStateObservable } from '../../querying/registerQueryWithController';\nimport { SceneDataTransformer } from '../../querying/SceneDataTransformer';\nimport { SceneQueryRunner } from '../../querying/SceneQueryRunner';\nimport { buildPathIdFor } from '../../utils/pathId';\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 /** Shown in info icon tooltip next to the title, supports markdown */\n description?: string;\n /** Shown as text below the title, supports markdown */\n subtitle?: 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 * Allows adding elements to the subheader of the panel.\n */\n subHeader?: React.ReactNode | SceneObject | SceneObject[];\n /**\n * Only shows vizPanelMenu on hover if false, otherwise the menu is always visible in the header\n */\n showMenuAlways?: 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 seriesLimit?: number;\n seriesLimitShowAll?: boolean;\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 /**\n * @internal\n * experimental / temporary\n *\n * clears field.values arrays of previous/stale/retained series and annotations frames in PanelData\n *\n * see https://github.com/facebook/react/issues/36176\n * see https://github.com/grafana/grafana/pull/121682\n * see https://github.com/grafana/grafana/pull/120190\n **/\n _UNSAFE_clearPreviousFieldValues?: boolean;\n\n /**\n * Sets panel chrome collapsed state\n */\n collapsible?: boolean;\n collapsed?: boolean;\n /** Marks object as a repeated object and a key pointer to source object */\n repeatSourceKey?: string;\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 _renderCounter?: number;\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 = 0;\n\n public constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>) {\n super({\n options: {} as TOptions,\n fieldConfig: { defaults: {}, overrides: [] },\n title: t('grafana-scenes.components.viz-panel.title.title', 'Title'),\n pluginId: 'timeseries',\n _renderCounter: 0,\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 /**\n * Get the VizPanelRenderProfiler behavior if attached\n */\n public getProfiler(): VizPanelRenderProfiler | undefined {\n if (!this.state.$behaviors) {\n return undefined;\n }\n\n for (const behavior of this.state.$behaviors) {\n if (behavior instanceof VizPanelRenderProfiler) {\n return behavior;\n }\n }\n\n return undefined;\n }\n\n private _onActivate() {\n if (!this._plugin) {\n this._loadPlugin(this.state.pluginId);\n }\n }\n\n public forceRender(): void {\n // Incrementing the render counter means VizRepeater and its children will also re-render\n this.setState({ _renderCounter: (this.state._renderCounter ?? 0) + 1 });\n }\n\n private async _loadPlugin(\n pluginId: string,\n overwriteOptions?: DeepPartial<{}>,\n overwriteFieldConfig?: FieldConfigSource,\n isAfterPluginChange?: boolean\n ) {\n const profiler = this.getProfiler();\n const plugin = loadPanelPluginSync(pluginId);\n\n if (plugin) {\n // Plugin was loaded from cache\n const endPluginLoadCallback = profiler?.onPluginLoadStart(pluginId);\n endPluginLoadCallback?.(plugin, true);\n this._pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);\n } else {\n const { importPanelPlugin } = getPluginImportUtils();\n\n try {\n // Start profiling plugin load - get end callback\n const endPluginLoadCallback = profiler?.onPluginLoadStart(pluginId);\n\n const panelPromise = importPanelPlugin(pluginId);\n\n const queryControler = sceneGraph.getQueryController(this);\n if (queryControler && queryControler.state.enableProfiling) {\n wrapPromiseInStateObservable(panelPromise)\n .pipe(registerQueryWithController({ type: `VizPanel/loadPlugin/${pluginId}`, origin: this }))\n .subscribe(() => {});\n }\n\n const result = await panelPromise;\n\n // End profiling plugin load (not from cache)\n endPluginLoadCallback?.(result, false);\n\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 /**\n * The `/` part is here because a panel key can be in a clone chain\n * A clone chain looks like `panel-1-clone-0/grid-item-5/panel-14` where the last part is the panel key\n */\n const parts = this.state.key?.split('/') ?? [];\n\n if (parts.length === 0) {\n return 0;\n }\n\n const part = parts[parts.length - 1];\n const panelId = parseInt(part!.replace('panel-', ''), 10);\n\n if (isNaN(panelId)) {\n return 0;\n }\n\n return panelId;\n }\n\n /**\n * Unique id string that includes local variable values (for repeated panels)\n */\n public getPathId() {\n return buildPathIdFor(this);\n }\n\n private async _pluginLoaded(\n plugin: PanelPlugin,\n overwriteOptions?: DeepPartial<{}>,\n overwriteFieldConfig?: FieldConfigSource,\n isAfterPluginChange?: boolean\n ) {\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 //@ts-expect-error (TODO: remove after upgrading with https://github.com/grafana/grafana/pull/108998)\n const needsMigration = currentVersion !== pluginVersion || plugin.shouldMigrate?.(panel);\n\n if (plugin.onPanelMigration && needsMigration && !isAfterPluginChange) {\n // These migration handlers also mutate panel.fieldConfig to migrate fieldConfig\n panel.options = await plugin.onPanelMigration(panel);\n }\n\n // Some panels mutate the transformations on the panel as part of migrations.\n // Unfortunately, these mutations are not available until the panel plugin is loaded.\n // At this time, the data provider is already set, so this is the easiest way to fix it.\n let $data = this.state.$data;\n if (panel.transformations && $data) {\n if ($data instanceof SceneDataTransformer) {\n $data.setState({ transformations: panel.transformations });\n } else if ($data instanceof SceneQueryRunner) {\n $data.clearParent();\n $data = new SceneDataTransformer({\n transformations: panel.transformations,\n $data,\n });\n }\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 $data,\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\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 sceneTimeRange.state.weekStart\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 { options: prevOptions, fieldConfig: prevFieldConfig, pluginId: prevPluginId } = this.state;\n\n //clear field config cache to update it later\n this._dataWithFieldConfig = undefined;\n\n // If state.pluginId is already the correct plugin we don't treat this as plain user panel type change\n const isAfterPluginChange = this.state.pluginId !== pluginId;\n await this._loadPlugin(pluginId, newOptions ?? {}, newFieldConfig, isAfterPluginChange);\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 onToggleCollapse = (collapsed: boolean) => {\n this.setState({\n collapsed,\n });\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 _renderCounter: (this.state._renderCounter ?? 0) + 1,\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 timestamp = performance.now();\n const plugin = this._plugin;\n\n const profiler = this.getProfiler();\n\n if (!plugin || plugin.meta.skipDataQuery || !rawData) {\n // TODO setup time range subscription instead\n return emptyPanelData;\n }\n\n // SceneQueryRunner preserves series array identity when frames haven't changed, but\n // still emits new PanelData on state transitions (onDataReceived). Detect this and skip\n // the expensive applyFieldOverrides step.\n if (this._prevData && this._dataWithFieldConfig) {\n if (this._prevData === rawData) {\n return this._dataWithFieldConfig;\n }\n if (this._prevData.series === rawData.series) {\n this._prevData = rawData;\n this._dataWithFieldConfig = {\n ...rawData,\n structureRev: this._dataWithFieldConfig.structureRev,\n series: this._dataWithFieldConfig.series,\n };\n return this._dataWithFieldConfig;\n }\n }\n\n // Start profiling data processing - get end callback\n const endFieldConfigCallback = profiler?.onFieldConfigStart(timestamp);\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 // @ts-ignore - @grafana/data is getting this type in Grafana 13.\n featureToggles: config.featureToggles,\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 // @ts-ignore - @grafana/data is getting this type in Grafana 13.\n featureToggles: config.featureToggles,\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\n // End profiling data processing\n if (profiler) {\n endFieldConfigCallback?.(performance.now());\n }\n\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 public clone(withState?: Partial<VizPanelState>) {\n // Clear _pluginInstanceState and _pluginLoadError as it's not safe to clone\n return super.clone({ _pluginInstanceState: undefined, _pluginLoadError: undefined, ...withState });\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 { t } from '@grafana/i18n';\nimport {\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';\nimport { VizPanelRenderProfiler } from '../../performance/VizPanelRenderProfiler';\nimport { registerQueryWithController, wrapPromiseInStateObservable } from '../../querying/registerQueryWithController';\nimport { SceneDataTransformer } from '../../querying/SceneDataTransformer';\nimport { SceneQueryRunner } from '../../querying/SceneQueryRunner';\nimport { buildPathIdFor } from '../../utils/pathId';\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 /** Shown in info icon tooltip next to the title, supports markdown */\n description?: string;\n /** Shown as text below the title, supports markdown */\n subtitle?: 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 * Allows adding elements to the subheader of the panel.\n */\n subHeader?: React.ReactNode | SceneObject | SceneObject[];\n /**\n * Only shows vizPanelMenu on hover if false, otherwise the menu is always visible in the header\n */\n showMenuAlways?: 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 seriesLimit?: number;\n seriesLimitShowAll?: boolean;\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 /**\n * @internal\n * experimental / temporary\n *\n * clears field.values arrays of previous/stale/retained series and annotations frames in PanelData\n *\n * see https://github.com/facebook/react/issues/36176\n * see https://github.com/grafana/grafana/pull/121682\n * see https://github.com/grafana/grafana/pull/120190\n **/\n _UNSAFE_clearPreviousFieldValues?: boolean;\n\n /**\n * Sets panel chrome collapsed state\n */\n collapsible?: boolean;\n collapsed?: boolean;\n /** Marks object as a repeated object and a key pointer to source object */\n repeatSourceKey?: string;\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 _renderCounter?: number;\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 onReferencedVariableValueChanged: () => {\n this.clearFieldConfigCache();\n this.forceRender();\n },\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 = 0;\n\n public constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>) {\n super({\n options: {} as TOptions,\n fieldConfig: { defaults: {}, overrides: [] },\n title: t('grafana-scenes.components.viz-panel.title.title', 'Title'),\n pluginId: 'timeseries',\n _renderCounter: 0,\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 /**\n * Get the VizPanelRenderProfiler behavior if attached\n */\n public getProfiler(): VizPanelRenderProfiler | undefined {\n if (!this.state.$behaviors) {\n return undefined;\n }\n\n for (const behavior of this.state.$behaviors) {\n if (behavior instanceof VizPanelRenderProfiler) {\n return behavior;\n }\n }\n\n return undefined;\n }\n\n private _onActivate() {\n if (!this._plugin) {\n this._loadPlugin(this.state.pluginId);\n }\n }\n\n public forceRender(): void {\n // Incrementing the render counter means VizRepeater and its children will also re-render\n this.setState({ _renderCounter: (this.state._renderCounter ?? 0) + 1 });\n }\n\n private async _loadPlugin(\n pluginId: string,\n overwriteOptions?: DeepPartial<{}>,\n overwriteFieldConfig?: FieldConfigSource,\n isAfterPluginChange?: boolean\n ) {\n const profiler = this.getProfiler();\n const plugin = loadPanelPluginSync(pluginId);\n\n if (plugin) {\n // Plugin was loaded from cache\n const endPluginLoadCallback = profiler?.onPluginLoadStart(pluginId);\n endPluginLoadCallback?.(plugin, true);\n this._pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);\n } else {\n const { importPanelPlugin } = getPluginImportUtils();\n\n try {\n // Start profiling plugin load - get end callback\n const endPluginLoadCallback = profiler?.onPluginLoadStart(pluginId);\n\n const panelPromise = importPanelPlugin(pluginId);\n\n const queryControler = sceneGraph.getQueryController(this);\n if (queryControler && queryControler.state.enableProfiling) {\n wrapPromiseInStateObservable(panelPromise)\n .pipe(registerQueryWithController({ type: `VizPanel/loadPlugin/${pluginId}`, origin: this }))\n .subscribe(() => {});\n }\n\n const result = await panelPromise;\n\n // End profiling plugin load (not from cache)\n endPluginLoadCallback?.(result, false);\n\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 /**\n * The `/` part is here because a panel key can be in a clone chain\n * A clone chain looks like `panel-1-clone-0/grid-item-5/panel-14` where the last part is the panel key\n */\n const parts = this.state.key?.split('/') ?? [];\n\n if (parts.length === 0) {\n return 0;\n }\n\n const part = parts[parts.length - 1];\n const panelId = parseInt(part!.replace('panel-', ''), 10);\n\n if (isNaN(panelId)) {\n return 0;\n }\n\n return panelId;\n }\n\n /**\n * Unique id string that includes local variable values (for repeated panels)\n */\n public getPathId() {\n return buildPathIdFor(this);\n }\n\n private async _pluginLoaded(\n plugin: PanelPlugin,\n overwriteOptions?: DeepPartial<{}>,\n overwriteFieldConfig?: FieldConfigSource,\n isAfterPluginChange?: boolean\n ) {\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 //@ts-expect-error (TODO: remove after upgrading with https://github.com/grafana/grafana/pull/108998)\n const needsMigration = currentVersion !== pluginVersion || plugin.shouldMigrate?.(panel);\n\n if (plugin.onPanelMigration && needsMigration && !isAfterPluginChange) {\n // These migration handlers also mutate panel.fieldConfig to migrate fieldConfig\n panel.options = await plugin.onPanelMigration(panel);\n }\n\n // Some panels mutate the transformations on the panel as part of migrations.\n // Unfortunately, these mutations are not available until the panel plugin is loaded.\n // At this time, the data provider is already set, so this is the easiest way to fix it.\n let $data = this.state.$data;\n if (panel.transformations && $data) {\n if ($data instanceof SceneDataTransformer) {\n $data.setState({ transformations: panel.transformations });\n } else if ($data instanceof SceneQueryRunner) {\n $data.clearParent();\n $data = new SceneDataTransformer({\n transformations: panel.transformations,\n $data,\n });\n }\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 $data,\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\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 sceneTimeRange.state.weekStart\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 { options: prevOptions, fieldConfig: prevFieldConfig, pluginId: prevPluginId } = this.state;\n\n //clear field config cache to update it later\n this._dataWithFieldConfig = undefined;\n\n // If state.pluginId is already the correct plugin we don't treat this as plain user panel type change\n const isAfterPluginChange = this.state.pluginId !== pluginId;\n await this._loadPlugin(pluginId, newOptions ?? {}, newFieldConfig, isAfterPluginChange);\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 onToggleCollapse = (collapsed: boolean) => {\n this.setState({\n collapsed,\n });\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 _renderCounter: (this.state._renderCounter ?? 0) + 1,\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 timestamp = performance.now();\n const plugin = this._plugin;\n\n const profiler = this.getProfiler();\n\n if (!plugin || plugin.meta.skipDataQuery || !rawData) {\n // TODO setup time range subscription instead\n return emptyPanelData;\n }\n\n // SceneQueryRunner preserves series array identity when frames haven't changed, but\n // still emits new PanelData on state transitions (onDataReceived). Detect this and skip\n // the expensive applyFieldOverrides step.\n if (this._prevData && this._dataWithFieldConfig) {\n if (this._prevData === rawData) {\n return this._dataWithFieldConfig;\n }\n if (this._prevData.series === rawData.series) {\n this._prevData = rawData;\n this._dataWithFieldConfig = {\n ...rawData,\n structureRev: this._dataWithFieldConfig.structureRev,\n series: this._dataWithFieldConfig.series,\n };\n return this._dataWithFieldConfig;\n }\n }\n\n // Start profiling data processing - get end callback\n const endFieldConfigCallback = profiler?.onFieldConfigStart(timestamp);\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 // @ts-ignore - @grafana/data is getting this type in Grafana 13.\n featureToggles: config.featureToggles,\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 // @ts-ignore - @grafana/data is getting this type in Grafana 13.\n featureToggles: config.featureToggles,\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\n // End profiling data processing\n if (profiler) {\n endFieldConfigCallback?.(performance.now());\n }\n\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 public clone(withState?: Partial<VizPanelState>) {\n // Clear _pluginInstanceState and _pluginLoadError as it's not safe to clone\n return super.clone({ _pluginInstanceState: undefined, _pluginLoadError: undefined, ...withState });\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":";;;;;;;;;;;;;;;;;;;;;;AA+HO,MAAM,iBAA8D,eAAA,CAEzE;AAAA,EAkBO,YAAY,KAAA,EAAuD;AAnJ5E,IAAA,IAAA,EAAA;AAoJI,IAAA,KAAA,CAAM;AAAA,MACJ,SAAS,EAAC;AAAA,MACV,aAAa,EAAE,QAAA,EAAU,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAAA,MAC3C,KAAA,EAAO,CAAA,CAAE,iDAAA,EAAmD,OAAO,CAAA;AAAA,MACnE,QAAA,EAAU,YAAA;AAAA,MACV,cAAA,EAAgB,CAAA;AAAA,MAChB,GAAG;AAAA,KACJ,CAAA;AAvBH,IAAA,IAAA,CAAU,mBAAA,GAAsB,IAAI,wBAAA,CAAyB,IAAA,EAAM;AAAA,MACjE,UAAA,EAAY,CAAC,OAAA,EAAS,SAAA,EAAW,aAAa,CAAA;AAAA,MAC9C,kCAAkC,MAAM;AACtC,QAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,QAAA,IAAA,CAAK,WAAA,EAAY;AAAA,MACnB;AAAA,KACD,CAAA;AAOD,IAAA,IAAA,CAAQ,aAAA,GAAgB,CAAA;AAsNxB,IAAA,IAAA,CAAO,iBAAA,GAAoB,CAAC,SAAA,KAAiC;AAC3D,MAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AACnD,MAAA,cAAA,CAAe,iBAAA,CAAkB;AAAA,QAC/B,GAAA,EAAK;AAAA,UACH,IAAA,EAAM,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,UAC1B,EAAA,EAAI,KAAA,CAAM,SAAA,CAAU,EAAE;AAAA,SACxB;AAAA,QACA,IAAA,EAAM,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,QAC1B,EAAA,EAAI,KAAA,CAAM,SAAA,CAAU,EAAE;AAAA,OACvB,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,IAAA,CAAO,YAAA,GAAe,CAAC,IAAA,KAAqB;AAC1C,MAAA,MAAM,eAAe,UAAA,CAAW,UAAA,CAAW,MAAM,CAAC,CAAA,KAAM,aAAa,YAAY,CAAA;AACjF,MAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AAEnD,MAAA,IAAI,YAAA,YAAwB,YAAA,IAAgB,YAAA,CAAa,SAAA,EAAW;AAClE,QAAA,OAAO,iBAAA;AAAA,UACL,eAAe,KAAA,CAAM,IAAA;AAAA,UACrB,eAAe,KAAA,CAAM,EAAA;AAAA,UACrB,eAAe,WAAA,EAAY;AAAA,UAC3B,eAAe,KAAA,CAAM,oBAAA;AAAA,UACrB,eAAe,KAAA,CAAM,eAAA;AAAA,UACrB,eAAe,KAAA,CAAM;AAAA,SACvB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,MAAA,IAAI,UAAU,CAAC,MAAA,CAAO,KAAK,aAAA,IAAiB,IAAA,IAAQ,KAAK,SAAA,EAAW;AAClE,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACd;AAEA,MAAA,OAAO,eAAe,KAAA,CAAM,KAAA;AAAA,IAC9B,CAAA;AA6BA,IAAA,IAAA,CAAO,aAAA,GAAgB,CAAC,KAAA,KAAkB;AACxC,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,KAAA,EAAO,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAO,mBAAA,GAAsB,CAAC,WAAA,KAAwB;AACpD,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,WAAA,EAAa,CAAA;AAAA,IAC/B,CAAA;AAEA,IAAA,IAAA,CAAO,mBAAA,GAAsB,CAAC,WAAA,KAA2C;AACvE,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,WAAA,EAAa,CAAA;AAAA,IAC/B,CAAA;AAEA,IAAA,IAAA,CAAO,gBAAA,GAAmB,CAAC,SAAA,KAAuB;AAChD,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,IAAA,CAAO,kBAAkB,CAAC,aAAA,EAAsC,OAAA,GAAU,KAAA,EAAO,sBAAsB,KAAA,KAAU;AAvbnH,MAAA,IAAA,EAAA;AAwbI,MAAA,MAAM,EAAE,WAAA,EAAa,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA;AAGtC,MAAA,MAAM,WAAA,GAAc,OAAA,GAChB,aAAA,GACA,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,EAAG,aAAA,EAAe,CAAC,QAAA,EAAU,QAAA,EAAU,GAAA,EAAK,GAAA,KAAQ;AAC7E,QAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrB,UAAA,OAAO,QAAA;AAAA,QACT;AAGA,QAAA,IAAI,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,KAAa,WAAA,EAAa;AAC5D,UAAA,GAAA,CAAI,GAAG,CAAA,GAAI,QAAA;AACX,UAAA;AAAA,QACF;AACA,QAAA;AAAA,MACF,CAAC,CAAA;AAEL,MAAA,MAAM,eAAe,2BAAA,CAA4B;AAAA,QAC/C,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,cAAA,EAAgB,WAAA;AAAA,QAChB,kBAAA,EAAoB,WAAA;AAAA,QACpB;AAAA,OACD,CAAA;AAED,MAAA,IAAA,CAAK,QAAA,CAAS;AAAA,QACZ,SAAS,YAAA,CAAa,OAAA;AAAA,QACtB,cAAA,EAAA,CAAA,CAAiB,EAAA,GAAA,IAAA,CAAK,KAAA,CAAM,cAAA,KAAX,YAA6B,CAAA,IAAK;AAAA,OACpD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,IAAA,CAAO,mBAAA,GAAsB,CAAC,iBAAA,EAAiE,OAAA,KAAsB;AACnH,MAAA,MAAM,EAAE,WAAA,EAAa,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAA;AAGtC,MAAA,MAAM,kBAAkB,OAAA,GAAU,iBAAA,GAAoB,MAAM,SAAA,CAAU,WAAW,GAAG,iBAAiB,CAAA;AAErG,MAAA,MAAM,eAAe,2BAAA,CAA4B;AAAA,QAC/C,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,cAAA,EAAgB,OAAA;AAAA,QAChB,kBAAA,EAAoB,eAAA;AAAA,QACpB,mBAAA,EAAqB;AAAA,OACtB,CAAA;AAED,MAAA,IAAA,CAAK,oBAAA,GAAuB,MAAA;AAC5B,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,WAAA,EAAa,YAAA,CAAa,aAAa,CAAA;AAAA,IACzD,CAAA;AAEA,IAAA,IAAA,CAAO,WAAA,IAAe,CAAC,KAAA,EAAe,MAAA,EAAqB,MAAA,KAAgD;AACzG,MAAA,OAAO,UAAA,CAAW,WAAA,CAAY,IAAA,EAAM,KAAA,EAAO,QAAQ,MAAM,CAAA;AAAA,IAC3D,CAAA,CAAA;AAEA,IAAA,IAAA,CAAO,iBAAiB,MAAM;AAC5B,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,eAAA,CAAgB,EAAE,MAAA,EAAQ,MAAM,WAAA,EAAa,yBAAA,EAA2B,CAAA,EAAG,IAAI,CAAA;AAErG,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA;AAC7B,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA;AAC7C,QAAA,OAAO,eAAe,QAAQ,CAAA;AAAA,MAChC;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAoGA,IAAA,IAAA,CAAO,gBAAgB,MAAM;AAzlB/B,MAAA,IAAA,EAAA;AA0lBI,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,eAAA,CAAgB,EAAE,MAAA,EAAQ,MAAM,WAAA,EAAa,4BAAA,EAA8B,CAAA,EAAG,IAAI,CAAA;AACxG,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AACpC,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,WAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,CAAA;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAO,uBAAuB,MAAM;AAClC,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,eAAA,CAAgB,EAAE,MAAA,EAAQ,MAAM,WAAA,EAAa,8BAAA,EAAgC,CAAA,EAAG,IAAI,CAAA;AAAA,IAC5G,CAAA;AAKA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,oBAAA,GAAuB,CAAC,KAAA,EAAe,KAAA,KAAkB;AAC/D,MAAA,IAAA,CAAK,oBAAoB,8BAAA,CAA+B,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,IAC/F,CAAA;AAEA,IAAA,IAAA,CAAQ,yBAAA,GAA4B,CAAC,KAAA,EAAe,IAAA,KAAqC;AACvF,MAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAC9B,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,mBAAA;AAAA,QACH,6BAAA,CAA8B,OAAO,IAAA,EAAM,IAAA,CAAK,MAAM,WAAA,EAAa,IAAA,CAAK,qBAAqB,MAAM,CAAA;AAAA,QACnG;AAAA,OACF;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAQ,sBAAA,GAAyB,CAAC,KAAA,KAAe;AAC/C,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,UACnB,GAAG,IAAA,CAAK,aAAA;AAAA,UACR,aAAA,EAAe;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,oBAAA,EAAsB,KAAA,EAAO,CAAA;AAAA,IAC/C,CAAA;AAEA,IAAA,IAAA,CAAQ,mBAAA,GAAsB,CAAC,OAAA,KAAoB;AACjD,MAAA,MAAM,aAAA,GAAmC,IAAA,CAAK,KAAA,CAAM,OAAA,CAAgB,MAAA;AAGpE,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,WAAW,aAAA,CAAc,QAAA;AAC7B,MAAA,IAAI,SAAS,aAAA,CAAc,MAAA;AAC3B,MAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,QAAA,QAAA,GAAW,MAAA;AAAA,MACb;AAGA,MAAA,IAAI,aAAa,KAAA,EAAO;AACtB,QAAA,MAAA,GAAS,MAAA;AACT,QAAA,QAAA,GAAW,MAAA;AAAA,MACb,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,CAAC,QAAA;AACZ,QAAA,MAAA,GAAS,OAAA;AAAA,MACX;AAEA,MAAA,IAAA,CAAK,eAAA;AAAA,QACH;AAAA,UACE,GAAG,KAAK,KAAA,CAAM,OAAA;AAAA,UACd,MAAA,EAAQ,EAAE,GAAG,aAAA,EAAe,QAAQ,QAAA;AAAS,SAC/C;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAjgBE,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,WAAA,EAAY;AAAA,IACnB,CAAC,CAAA;AAED,IAAA,CAAA,EAAA,GAAA,KAAA,CAAM,IAAA,KAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAY,oBAAA,CAAqB,MAAM;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,eAAA,CAAgB,EAAE,MAAA,EAAQ,MAAM,WAAA,EAAa,kBAAA,EAAoB,CAAA,EAAG,IAAI,CAAA;AAAA,IAChG,CAAA,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,WAAA,GAAkD;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY;AAC1B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY;AAC5C,MAAA,IAAI,oBAAoB,sBAAA,EAAwB;AAC9C,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,WAAA,GAAc;AACpB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,IACtC;AAAA,EACF;AAAA,EAEO,WAAA,GAAoB;AA7L7B,IAAA,IAAA,EAAA;AA+LI,IAAA,IAAA,CAAK,QAAA,CAAS,EAAE,cAAA,EAAA,CAAA,CAAiB,EAAA,GAAA,IAAA,CAAK,MAAM,cAAA,KAAX,IAAA,GAAA,EAAA,GAA6B,CAAA,IAAK,CAAA,EAAG,CAAA;AAAA,EACxE;AAAA,EAEA,MAAc,WAAA,CACZ,QAAA,EACA,gBAAA,EACA,sBACA,mBAAA,EACA;AACA,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAE3C,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,MAAM,qBAAA,GAAwB,qCAAU,iBAAA,CAAkB,QAAA,CAAA;AAC1D,MAAA,qBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,qBAAA,CAAwB,MAAA,EAAQ,IAAA,CAAA;AAChC,MAAA,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,gBAAA,EAAkB,oBAAA,EAAsB,mBAAmB,CAAA;AAAA,IACxF,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,oBAAA,EAAqB;AAEnD,MAAA,IAAI;AAEF,QAAA,MAAM,qBAAA,GAAwB,qCAAU,iBAAA,CAAkB,QAAA,CAAA;AAE1D,QAAA,MAAM,YAAA,GAAe,kBAAkB,QAAQ,CAAA;AAE/C,QAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,kBAAA,CAAmB,IAAI,CAAA;AACzD,QAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,KAAA,CAAM,eAAA,EAAiB;AAC1D,UAAA,4BAAA,CAA6B,YAAY,CAAA,CACtC,IAAA,CAAK,2BAAA,CAA4B,EAAE,IAAA,EAAM,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAA,EAAM,CAAC,CAAA,CAC3F,UAAU,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QACvB;AAEA,QAAA,MAAM,SAAS,MAAM,YAAA;AAGrB,QAAA,qBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAwB,MAAA,EAAQ,KAAA,CAAA;AAEhC,QAAA,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,gBAAA,EAAkB,oBAAA,EAAsB,mBAAmB,CAAA;AAAA,MACxF,SAAS,GAAA,EAAc;AACrB,QAAA,IAAA,CAAK,aAAA,CAAc,sBAAA,CAAuB,QAAQ,CAAC,CAAA;AAEnD,QAAA,IAAI,eAAe,KAAA,EAAO;AACxB,UAAA,IAAA,CAAK,QAAA,CAAS,EAAE,gBAAA,EAAkB,GAAA,CAAI,SAAS,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,gBAAA,GAAmB;AAhP5B,IAAA,IAAA,EAAA,EAAA,EAAA;AAqPI,IAAA,MAAM,KAAA,GAAA,CAAQ,gBAAK,KAAA,CAAM,GAAA,KAAX,mBAAgB,KAAA,CAAM,GAAA,CAAA,KAAtB,YAA8B,EAAC;AAE7C,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAM,QAAQ,QAAA,EAAU,EAAE,GAAG,EAAE,CAAA;AAExD,IAAA,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAClB,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,SAAA,GAAY;AACjB,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAc,aAAA,CACZ,MAAA,EACA,gBAAA,EACA,sBACA,mBAAA,EACA;AAjRJ,IAAA,IAAA,EAAA;AAkRI,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,OAAO,aAAA,EAAe,8BAAA,KAAmC,IAAA,CAAK,KAAA;AAE5F,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,KAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,EAAA,EAAI,KAAK,gBAAA,EAAiB;AAAA,MAC1B,IAAA,EAAM,OAAO,IAAA,CAAK,EAAA;AAAA,MAClB;AAAA,KACF;AAEA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,KAAA,CAAM,OAAA,GAAU,gBAAA;AAAA,IAClB;AAEA,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,KAAA,CAAM,WAAA,GAAc,oBAAA;AAAA,IACtB;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAEpD,IAAA,8BAAA,IAAA,IAAA,GAAA,MAAA,GAAA,8BAAA,CAAiC,KAAA,EAAO,MAAA,CAAA;AAGxC,IAAA,MAAM,cAAA,GAAiB,cAAA,KAAmB,aAAA,KAAA,CAAiB,EAAA,GAAA,MAAA,CAAO,kBAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,EAAuB,KAAA,CAAA,CAAA;AAElF,IAAA,IAAI,MAAA,CAAO,gBAAA,IAAoB,cAAA,IAAkB,CAAC,mBAAA,EAAqB;AAErE,MAAA,KAAA,CAAM,OAAA,GAAU,MAAM,MAAA,CAAO,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACrD;AAKA,IAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AACvB,IAAA,IAAI,KAAA,CAAM,mBAAmB,KAAA,EAAO;AAClC,MAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,QAAA,KAAA,CAAM,QAAA,CAAS,EAAE,eAAA,EAAiB,KAAA,CAAM,iBAAiB,CAAA;AAAA,MAC3D,CAAA,MAAA,IAAW,iBAAiB,gBAAA,EAAkB;AAC5C,QAAA,KAAA,CAAM,WAAA,EAAY;AAClB,QAAA,KAAA,GAAQ,IAAI,oBAAA,CAAqB;AAAA,UAC/B,iBAAiB,KAAA,CAAM,eAAA;AAAA,UACvB;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,2BAAA,CAA4B;AAAA,MAC/C,MAAA;AAAA,MACA,gBAAgB,KAAA,CAAM,OAAA;AAAA,MACtB,oBAAoB,KAAA,CAAM,WAAA;AAAA,MAC1B,qBAAqB,mBAAA,IAAA,IAAA,GAAA,mBAAA,GAAuB;AAAA,KAC7C,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,KAAA;AAAA,MACA,SAAS,YAAA,CAAa,OAAA;AAAA,MACtB,aAAa,YAAA,CAAa,WAAA;AAAA,MAC1B,aAAA,EAAe,cAAA;AAAA,MACf,QAAA,EAAU,OAAO,IAAA,CAAK;AAAA,KACvB,CAAA;AAGD,IAAA,IAAI,MAAA,CAAO,KAAK,aAAA,EAAe;AAC7B,MAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,YAAA,CAAa,IAAI,CAAA;AACnD,MAAA,IAAA,CAAK,KAAA,CAAM,IAAI,cAAA,CAAe,gBAAA,CAAiB,MAAM,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA,EAEQ,kBAAkB,MAAA,EAA6B;AACrD,IAAA,OAAO,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,OAAA;AAAA,EAC1F;AAAA,EAEO,SAAA,GAAqC;AAC1C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEO,eAAA,GAAgC;AAjWzC,IAAA,IAAA,EAAA;AAkWI,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,aAAA,KAAL,IAAA,GAAA,EAAA,GAAA,IAAA,CAAK,aAAA,GAAkB,IAAA,CAAK,iBAAA,EAAkB;AAE9C,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAqCA,MAAa,gBAAA,CAAiB,QAAA,EAAkB,UAAA,EAA8B,cAAA,EAAoC;AA1YpH,IAAA,IAAA,EAAA,EAAA,EAAA;AA2YI,IAAA,MAAM,EAAE,SAAS,WAAA,EAAa,WAAA,EAAa,iBAAiB,QAAA,EAAU,YAAA,KAAiB,IAAA,CAAK,KAAA;AAG5F,IAAA,IAAA,CAAK,oBAAA,GAAuB,MAAA;AAG5B,IAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,KAAA,CAAM,QAAA,KAAa,QAAA;AACpD,IAAA,MAAM,KAAK,WAAA,CAAY,QAAA,EAAU,kCAAc,EAAC,EAAG,gBAAgB,mBAAmB,CAAA;AAEtF,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA;AAAA,MAClB,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,MACpB,WAAA,EAAa,KAAK,KAAA,CAAM,WAAA;AAAA,MACxB,EAAA,EAAI,CAAA;AAAA,MACJ,IAAA,EAAM;AAAA,KACR;AAIA,IAAA,MAAM,cAAA,GAAA,CAAiB,gBAAK,OAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,uBAAd,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAmC,KAAA,EAAO,cAAc,WAAA,EAAa,eAAA,CAAA;AAE5F,IAAA,IAAI,cAAA,IAAkB,CAAC,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,eAAA,CAAgB,cAAA,EAAgB,IAAA,EAAM,IAAI,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAoFO,qBAAA,GAAwB;AAC7B,IAAA,IAAA,CAAK,oBAAA,GAAuB,MAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAiB,OAAA,EAAgC;AA9f1D,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA+fI,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AAEpB,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAElC,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,aAAA,IAAiB,CAAC,OAAA,EAAS;AAEpD,MAAA,OAAO,cAAA;AAAA,IACT;AAKA,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,oBAAA,EAAsB;AAC/C,MAAA,IAAI,IAAA,CAAK,cAAc,OAAA,EAAS;AAC9B,QAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,MACd;AACA,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AAC5C,QAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AACjB,QAAA,IAAA,CAAK,oBAAA,GAAuB;AAAA,UAC1B,GAAG,OAAA;AAAA,UACH,YAAA,EAAc,KAAK,oBAAA,CAAqB,YAAA;AAAA,UACxC,MAAA,EAAQ,KAAK,oBAAA,CAAqB;AAAA,SACpC;AACA,QAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,MACd;AAAA,IACF;AAGA,IAAA,MAAM,sBAAA,GAAyB,qCAAU,kBAAA,CAAmB,SAAA,CAAA;AAE5D,IAAA,MAAM,oBAA4C,MAAA,CAAO,WAAA,IAAe,EAAE,WAAA,EAAa,KAAA,EAAO,aAAa,KAAA,EAAM;AAEjH,IAAA,MAAM,sBAAsB,MAAA,CAAO,mBAAA;AACnC,IAAA,MAAM,cAAa,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,oBAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAA2B,MAAA,KAA3B,YAAqC,EAAC;AACzD,IAAA,MAAM,YAAY,mBAAA,CAAoB;AAAA,MACpC,MAAM,OAAA,CAAQ,MAAA;AAAA,MACd,WAAA,EAAa,KAAK,KAAA,CAAM,WAAA;AAAA,MACxB,mBAAA;AAAA,MACA,kBAAkB,IAAA,CAAK,WAAA;AAAA,MACvB,OAAO,MAAA,CAAO,MAAA;AAAA,MACd,QAAA,EAAA,CAAU,EAAA,GAAA,OAAA,CAAQ,OAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,QAAA;AAAA;AAAA,MAE3B,gBAAgB,MAAA,CAAO;AAAA,KACxB,CAAA;AAED,IAAA,IAAI,CAAC,kBAAA,CAAmB,SAAA,EAAW,UAAA,EAAY,0BAA0B,CAAA,EAAG;AAC1E,MAAA,IAAA,CAAK,aAAA,EAAA;AAAA,IACP;AAEA,IAAA,IAAA,CAAK,oBAAA,GAAuB;AAAA,MAC1B,GAAG,OAAA;AAAA,MACH,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAI,IAAA,CAAK,qBAAqB,WAAA,EAAa;AACzC,MAAA,IAAA,CAAK,oBAAA,CAAqB,cAAc,mBAAA,CAAoB;AAAA,QAC1D,IAAA,EAAM,KAAK,oBAAA,CAAqB,WAAA;AAAA,QAChC,WAAA,EAAa;AAAA,UACX,UAAU,EAAC;AAAA,UACX,WAAW;AAAC,SACd;AAAA,QACA,mBAAA;AAAA,QACA,kBAAkB,IAAA,CAAK,WAAA;AAAA,QACvB,OAAO,MAAA,CAAO,MAAA;AAAA,QACd,QAAA,EAAA,CAAU,EAAA,GAAA,OAAA,CAAQ,OAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,QAAA;AAAA;AAAA,QAE3B,gBAAgB,MAAA,CAAO;AAAA,OACxB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,kBAAkB,WAAA,EAAa;AAClC,MAAA,IAAA,CAAK,qBAAqB,UAAA,GAAa,MAAA;AAAA,IACzC;AAEA,IAAA,IAAI,CAAC,kBAAkB,WAAA,EAAa;AAClC,MAAA,IAAA,CAAK,qBAAqB,WAAA,GAAc,MAAA;AAAA,IAC1C;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AAGjB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,sBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,sBAAA,CAAyB,YAAY,GAAA,EAAI,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,EACd;AAAA,EAyEO,MAAM,SAAA,EAAoC;AAE/C,IAAA,OAAO,KAAA,CAAM,MAAM,EAAE,oBAAA,EAAsB,QAAW,gBAAA,EAAkB,MAAA,EAAW,GAAG,SAAA,EAAW,CAAA;AAAA,EACnG;AAAA,EAEQ,iBAAA,GAAkC;AACxC,IAAA,MAAM,IAAA,GAAO,mBAAmB,IAAI,CAAA;AAEpC,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,WAAA,EAAa,IAAA,GAAO,IAAA,CAAK,cAAA,EAAe,GAAI,WAAA;AAAA,MAC5C,UAAU,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,YAAA,EAAa;AAAA,MACxD,KAAK,OAAA,CAAQ,OAAA;AAAA,MACb,MAAM,MAAM;AACV,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,QACpB;AACA,QAAA,OAAO,mBAAA,CAAoB,GAAA;AAAA,MAC7B,CAAA;AAAA,MACA,qBAAqB,IAAA,CAAK,oBAAA;AAAA,MAC1B,0BAA0B,IAAA,CAAK,yBAAA;AAAA,MAC/B,oBAAoB,IAAA,CAAK,mBAAA;AAAA,MACzB,uBAAuB,IAAA,CAAK;AAAA,KAC9B;AAEA,IAAA,IAAI,IAAA,CAAK,MAAM,kBAAA,EAAoB;AACjC,MAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AA/jBa,QAAA,CAGG,SAAA,GAAY,gBAAA;AA8jB5B,SAAS,uBAAuB,EAAA,EAAyB;AACvD,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,MAAM,IAAI,CAAA;AAEzC,EAAA,MAAA,CAAO,IAAA,GAAO;AAAA,IACZ,EAAA;AAAA,IACA,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM,GAAA;AAAA,IACN,MAAM,UAAA,CAAW,KAAA;AAAA,IACjB,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAS,EAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA,WAAA,EAAa,EAAA;AAAA,MACb,OAAO,EAAC;AAAA,MACR,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,EAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,MACA,aAAa,EAAC;AAAA,MACd,OAAA,EAAS,EAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
@@ -196,7 +196,8 @@ function VizPanelRenderer({ model }) {
|
|
|
196
196
|
ref,
|
|
197
197
|
className: absoluteWrapper,
|
|
198
198
|
"data-viz-panel-key": model.state.key,
|
|
199
|
-
"data-viz-panel-id": model.getPathId()
|
|
199
|
+
"data-viz-panel-id": model.getPathId(),
|
|
200
|
+
"data-testid": `${plugin.meta.id}-${model.state.key}`
|
|
200
201
|
},
|
|
201
202
|
/* @__PURE__ */ React.createElement(
|
|
202
203
|
PanelChrome,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans, t } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n QueryResultMetaNotice,\n renderMarkdown,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\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';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n subtitle,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n const subtitleContent = useMemo(() => {\n if (subtitle) {\n return renderMarkdown(model.interpolate(subtitle, undefined, 'text'));\n }\n return undefined;\n }, [subtitle, model]);\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\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 (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\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 (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\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 // The host (e.g. dashboard) only provides an inspector opener when the new panel errors UI\n // is enabled. Use its presence to decide between the new errors/notices popover and the\n // legacy single status message.\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n const showNewPanelErrorsUI = Boolean(context.onOpenInspector);\n const panelId = model.getLegacyPanelId();\n const outdatedPluginError = t(\n 'grafana-scenes.components.viz-panel-renderer.outdated-plugin-error',\n 'An unexpected error occurred. Updating the \"{{pluginName}}\" plugin to the latest version may fix the problem.',\n { pluginName: plugin.meta.name }\n );\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n >\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n // @ts-expect-error remove this on next grafana/ui update\n subtitle={subtitleContent}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusItems={showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : undefined}\n statusMessageOnClick={() => {\n // Report the interaction for analytics, then let the container (e.g. dashboard) open the inspector.\n model.onStatusMessageClick();\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n context.onOpenInspector?.();\n }}\n width={width === 0 ? undefined : width}\n height={height === 0 ? undefined : height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n if (innerWidth === 0 || innerHeight === 0) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert\n title={plugin.meta.hasUpdate ? outdatedPluginError : undefined}\n dependencies={[plugin, data]}\n >\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={displayMode === 'transparent'}\n width={innerWidth}\n height={innerHeight}\n renderCounter={_renderCounter}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={context.eventBus}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n );\n }}\n </PanelChrome>\n </div>\n </div>\n );\n}\n\nfunction useClearPreviousData(data?: DataFrame[]) {\n // this holds all value arrays from all series or anno frames\n // so we can empty any previous ones that no longer appear in current data\n // why? because React fiber: https://github.com/facebook/react/issues/36176\n const prevVals = useRef<Set<any[]>>();\n const currVals = useRef<Set<any[]>>();\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n // skip legacy CircularDataFrame streaming frames\n if ('appendRow' in currFrames[i]) {\n continue;\n }\n\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\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\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\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 obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.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\ntype PanelStatusSeverity = QueryResultMetaNotice['severity'];\n\ninterface PanelStatusItem {\n severity: PanelStatusSeverity;\n text: string;\n}\n\n/**\n * Builds the combined list of query errors and result notices shown in the panel header\n * status popover. Errors come from the query response, notices from the frame metadata.\n */\nfunction getChromeStatusItems(data: PanelData, pluginLoadingError: string | undefined): PanelStatusItem[] {\n const items: PanelStatusItem[] = [];\n\n if (pluginLoadingError) {\n items.push({ severity: 'error', text: pluginLoadingError });\n }\n\n const errors = data.errors ?? (data.error ? [data.error] : []);\n for (const error of errors) {\n items.push({ severity: 'error', text: error.message ?? 'Query error' });\n }\n\n const seen = new Set<string>();\n for (const frame of data.series ?? []) {\n for (const notice of frame.meta?.notices ?? []) {\n const severity: PanelStatusSeverity = notice.severity ?? 'info';\n const key = `${severity}:${notice.text}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push({ severity, text: notice.text });\n }\n }\n\n return items;\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\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\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: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans, t } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n QueryResultMetaNotice,\n renderMarkdown,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\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';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n subtitle,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n const subtitleContent = useMemo(() => {\n if (subtitle) {\n return renderMarkdown(model.interpolate(subtitle, undefined, 'text'));\n }\n return undefined;\n }, [subtitle, model]);\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\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 (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\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 (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\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 // The host (e.g. dashboard) only provides an inspector opener when the new panel errors UI\n // is enabled. Use its presence to decide between the new errors/notices popover and the\n // legacy single status message.\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n const showNewPanelErrorsUI = Boolean(context.onOpenInspector);\n const panelId = model.getLegacyPanelId();\n const outdatedPluginError = t(\n 'grafana-scenes.components.viz-panel-renderer.outdated-plugin-error',\n 'An unexpected error occurred. Updating the \"{{pluginName}}\" plugin to the latest version may fix the problem.',\n { pluginName: plugin.meta.name }\n );\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n >\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n // @ts-expect-error remove this on next grafana/ui update\n subtitle={subtitleContent}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusItems={showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : undefined}\n statusMessageOnClick={() => {\n // Report the interaction for analytics, then let the container (e.g. dashboard) open the inspector.\n model.onStatusMessageClick();\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n context.onOpenInspector?.();\n }}\n width={width === 0 ? undefined : width}\n height={height === 0 ? undefined : height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n if (innerWidth === 0 || innerHeight === 0) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert\n title={plugin.meta.hasUpdate ? outdatedPluginError : undefined}\n dependencies={[plugin, data]}\n >\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={displayMode === 'transparent'}\n width={innerWidth}\n height={innerHeight}\n renderCounter={_renderCounter}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={context.eventBus}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n );\n }}\n </PanelChrome>\n </div>\n </div>\n );\n}\n\nfunction useClearPreviousData(data?: DataFrame[]) {\n // this holds all value arrays from all series or anno frames\n // so we can empty any previous ones that no longer appear in current data\n // why? because React fiber: https://github.com/facebook/react/issues/36176\n const prevVals = useRef<Set<any[]>>();\n const currVals = useRef<Set<any[]>>();\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n // skip legacy CircularDataFrame streaming frames\n if ('appendRow' in currFrames[i]) {\n continue;\n }\n\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\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\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\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 obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.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\ntype PanelStatusSeverity = QueryResultMetaNotice['severity'];\n\ninterface PanelStatusItem {\n severity: PanelStatusSeverity;\n text: string;\n}\n\n/**\n * Builds the combined list of query errors and result notices shown in the panel header\n * status popover. Errors come from the query response, notices from the frame metadata.\n */\nfunction getChromeStatusItems(data: PanelData, pluginLoadingError: string | undefined): PanelStatusItem[] {\n const items: PanelStatusItem[] = [];\n\n if (pluginLoadingError) {\n items.push({ severity: 'error', text: pluginLoadingError });\n }\n\n const errors = data.errors ?? (data.error ? [data.error] : []);\n for (const error of errors) {\n items.push({ severity: 'error', text: error.message ?? 'Query error' });\n }\n\n const seen = new Set<string>();\n for (const frame of data.series ?? []) {\n for (const notice of frame.meta?.notices ?? []) {\n const severity: PanelStatusSeverity = notice.severity ?? 'info';\n const key = `${severity}:${notice.text}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push({ severity, text: notice.text });\n }\n }\n\n return items;\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\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\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: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3789,7 +3789,8 @@ function VizPanelRenderer({ model }) {
|
|
|
3789
3789
|
ref,
|
|
3790
3790
|
className: absoluteWrapper,
|
|
3791
3791
|
"data-viz-panel-key": model.state.key,
|
|
3792
|
-
"data-viz-panel-id": model.getPathId()
|
|
3792
|
+
"data-viz-panel-id": model.getPathId(),
|
|
3793
|
+
"data-testid": `${plugin.meta.id}-${model.state.key}`
|
|
3793
3794
|
},
|
|
3794
3795
|
/* @__PURE__ */ React__default.default.createElement(
|
|
3795
3796
|
ui.PanelChrome,
|
|
@@ -5021,7 +5022,11 @@ class VizPanel extends SceneObjectBase {
|
|
|
5021
5022
|
...state
|
|
5022
5023
|
});
|
|
5023
5024
|
this._variableDependency = new VariableDependencyConfig(this, {
|
|
5024
|
-
statePaths: ["title", "options", "fieldConfig"]
|
|
5025
|
+
statePaths: ["title", "options", "fieldConfig"],
|
|
5026
|
+
onReferencedVariableValueChanged: () => {
|
|
5027
|
+
this.clearFieldConfigCache();
|
|
5028
|
+
this.forceRender();
|
|
5029
|
+
}
|
|
5025
5030
|
});
|
|
5026
5031
|
this._structureRev = 0;
|
|
5027
5032
|
this.onTimeRangeChange = (timeRange) => {
|