@grafana/scenes 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/esm/behaviors/CursorSync.js +76 -0
- package/dist/esm/behaviors/CursorSync.js.map +1 -0
- package/dist/esm/behaviors/index.js +1 -0
- package/dist/esm/behaviors/index.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +25 -11
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/core/SceneObjectBase.js +1 -1
- package/dist/esm/core/SceneObjectBase.js.map +1 -1
- package/dist/index.d.ts +30 -4
- package/dist/index.js +211 -128
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# v0.23.0 (Wed Jul 19 2023)
|
|
2
|
+
|
|
3
|
+
#### 🚀 Enhancement
|
|
4
|
+
|
|
5
|
+
- Behaviors: Provide behavior for visualization cursor sync [#259](https://github.com/grafana/scenes/pull/259) ([@dprokop](https://github.com/dprokop))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Dominik Prokop ([@dprokop](https://github.com/dprokop))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
1
13
|
# v0.22.0 (Wed Jul 19 2023)
|
|
2
14
|
|
|
3
15
|
#### 🚀 Enhancement
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { DashboardCursorSync } from '@grafana/schema';
|
|
2
|
+
import { Observable, filter } from 'rxjs';
|
|
3
|
+
import { sceneGraph } from '../core/sceneGraph/index.js';
|
|
4
|
+
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
5
|
+
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __defProps = Object.defineProperties;
|
|
8
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
9
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
10
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
12
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
|
+
var __spreadValues = (a, b) => {
|
|
14
|
+
for (var prop in b || (b = {}))
|
|
15
|
+
if (__hasOwnProp.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
if (__getOwnPropSymbols)
|
|
18
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
19
|
+
if (__propIsEnum.call(b, prop))
|
|
20
|
+
__defNormalProp(a, prop, b[prop]);
|
|
21
|
+
}
|
|
22
|
+
return a;
|
|
23
|
+
};
|
|
24
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
25
|
+
class CursorSync extends SceneObjectBase {
|
|
26
|
+
constructor(state) {
|
|
27
|
+
super(__spreadProps(__spreadValues({}, state), {
|
|
28
|
+
sync: state.sync || DashboardCursorSync.Off
|
|
29
|
+
}));
|
|
30
|
+
this.getEventsBus = (panel) => {
|
|
31
|
+
if (!this.parent) {
|
|
32
|
+
throw new Error("EnableCursorSync cannot be used as a standalone scene object");
|
|
33
|
+
}
|
|
34
|
+
return new PanelContextEventBus(this.parent, panel);
|
|
35
|
+
};
|
|
36
|
+
this.getEventsScope = () => {
|
|
37
|
+
if (!this.parent) {
|
|
38
|
+
throw new Error("EnableCursorSync cannot be used as a standalone scene object");
|
|
39
|
+
}
|
|
40
|
+
return this.parent.state.key;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
class PanelContextEventBus {
|
|
45
|
+
constructor(_source, _eventsOrigin) {
|
|
46
|
+
this._source = _source;
|
|
47
|
+
this._eventsOrigin = _eventsOrigin;
|
|
48
|
+
}
|
|
49
|
+
publish(event) {
|
|
50
|
+
event.origin = this._eventsOrigin;
|
|
51
|
+
this._eventsOrigin.publishEvent(event, true);
|
|
52
|
+
}
|
|
53
|
+
getStream(eventType) {
|
|
54
|
+
return new Observable((observer) => {
|
|
55
|
+
const handler = (event) => {
|
|
56
|
+
observer.next(event);
|
|
57
|
+
};
|
|
58
|
+
const sub = this._source.subscribeToEvent(eventType, handler);
|
|
59
|
+
return () => sub.unsubscribe();
|
|
60
|
+
}).pipe(filter((event) => event.origin !== this._eventsOrigin));
|
|
61
|
+
}
|
|
62
|
+
subscribe(eventType, handler) {
|
|
63
|
+
return this.getStream(eventType).pipe().subscribe(handler);
|
|
64
|
+
}
|
|
65
|
+
removeAllListeners() {
|
|
66
|
+
}
|
|
67
|
+
newScopedBus(key, filter2) {
|
|
68
|
+
throw new Error("For internal use only");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function getCursorSyncScope(sceneObject) {
|
|
72
|
+
return sceneGraph.findObject(sceneObject, (o) => o instanceof CursorSync);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export { CursorSync, getCursorSyncScope };
|
|
76
|
+
//# sourceMappingURL=CursorSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CursorSync.js","sources":["../../../src/behaviors/CursorSync.ts"],"sourcesContent":["import { BusEvent, BusEventHandler, BusEventType, EventBus, EventFilterOptions } from '@grafana/data';\nimport { DashboardCursorSync } from '@grafana/schema';\nimport { filter, Observable, Unsubscribable } from 'rxjs';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObject, SceneObjectState } from '../core/types';\n\ninterface CursorSyncState extends SceneObjectState {\n sync: DashboardCursorSync;\n}\n\n/**\n * This behavior will provide a cursor sync context within a scene.\n */\n\nexport class CursorSync extends SceneObjectBase<CursorSyncState> {\n public constructor(state: Partial<CursorSyncState>) {\n super({\n ...state,\n sync: state.sync || DashboardCursorSync.Off,\n });\n }\n\n public getEventsBus = (panel: SceneObject) => {\n if (!this.parent) {\n throw new Error('EnableCursorSync cannot be used as a standalone scene object');\n }\n // Since EnableCursorSync is a behavior, it is not a parent to any object in the scene graph.\n // We need to get it's parent in order to provide correct EventBus context to the children.\n return new PanelContextEventBus(this.parent, panel);\n };\n\n public getEventsScope = () => {\n if (!this.parent) {\n throw new Error('EnableCursorSync cannot be used as a standalone scene object');\n }\n // Since EnableCursorSync is a behavior, it is not a parent to any object in the scene graph.\n // We need to get it's parent in order to provide correct EventBus context to the children.\n return this.parent.state.key;\n };\n}\n\n// This serves as a shared EventsBus that is shared by children or CursorSync behavior.\nclass PanelContextEventBus implements EventBus {\n public constructor(private _source: SceneObject, private _eventsOrigin: SceneObject) {}\n\n public publish<T extends BusEvent>(event: T): void {\n (event as any).origin = this._eventsOrigin;\n this._eventsOrigin.publishEvent(event, true);\n }\n\n public getStream<T extends BusEvent>(eventType: BusEventType<T>): Observable<T> {\n return new Observable<T>((observer) => {\n const handler = (event: T) => {\n observer.next(event);\n };\n\n const sub = this._source.subscribeToEvent(eventType, handler);\n\n return () => sub.unsubscribe();\n }).pipe(filter((event) => (event as any).origin !== this._eventsOrigin));\n }\n\n public subscribe<T extends BusEvent>(eventType: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n return this.getStream(eventType).pipe().subscribe(handler);\n }\n\n public removeAllListeners(): void {}\n\n public newScopedBus(key: string, filter: EventFilterOptions): EventBus {\n throw new Error('For internal use only');\n }\n}\n\nexport function getCursorSyncScope(sceneObject: SceneObject): CursorSync | null {\n return sceneGraph.findObject(sceneObject, (o) => o instanceof CursorSync) as CursorSync;\n}\n"],"names":["filter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,mBAAmB,eAAiC,CAAA;AAAA,EACxD,YAAY,KAAiC,EAAA;AAClD,IAAA,KAAA,CAAM,iCACD,KADC,CAAA,EAAA;AAAA,MAEJ,IAAA,EAAM,KAAM,CAAA,IAAA,IAAQ,mBAAoB,CAAA,GAAA;AAAA,KACzC,CAAA,CAAA,CAAA;AAGH,IAAO,IAAA,CAAA,YAAA,GAAe,CAAC,KAAuB,KAAA;AAC5C,MAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,QAAM,MAAA,IAAI,MAAM,8DAA8D,CAAA,CAAA;AAAA,OAChF;AAGA,MAAA,OAAO,IAAI,oBAAA,CAAqB,IAAK,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,KACpD,CAAA;AAEA,IAAA,IAAA,CAAO,iBAAiB,MAAM;AAC5B,MAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,QAAM,MAAA,IAAI,MAAM,8DAA8D,CAAA,CAAA;AAAA,OAChF;AAGA,MAAO,OAAA,IAAA,CAAK,OAAO,KAAM,CAAA,GAAA,CAAA;AAAA,KAC3B,CAAA;AAAA,GAlBA;AAmBF,CAAA;AAGA,MAAM,oBAAyC,CAAA;AAAA,EACtC,WAAA,CAAoB,SAA8B,aAA4B,EAAA;AAA1D,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AAA8B,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA,CAAA;AAAA,GAA6B;AAAA,EAE/E,QAA4B,KAAgB,EAAA;AACjD,IAAC,KAAA,CAAc,SAAS,IAAK,CAAA,aAAA,CAAA;AAC7B,IAAK,IAAA,CAAA,aAAA,CAAc,YAAa,CAAA,KAAA,EAAO,IAAI,CAAA,CAAA;AAAA,GAC7C;AAAA,EAEO,UAA8B,SAA2C,EAAA;AAC9E,IAAO,OAAA,IAAI,UAAc,CAAA,CAAC,QAAa,KAAA;AACrC,MAAM,MAAA,OAAA,GAAU,CAAC,KAAa,KAAA;AAC5B,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAA;AAAA,OACrB,CAAA;AAEA,MAAA,MAAM,GAAM,GAAA,IAAA,CAAK,OAAQ,CAAA,gBAAA,CAAiB,WAAW,OAAO,CAAA,CAAA;AAE5D,MAAO,OAAA,MAAM,IAAI,WAAY,EAAA,CAAA;AAAA,KAC9B,CAAE,CAAA,IAAA,CAAK,MAAO,CAAA,CAAC,UAAW,KAAc,CAAA,MAAA,KAAW,IAAK,CAAA,aAAa,CAAC,CAAA,CAAA;AAAA,GACzE;AAAA,EAEO,SAAA,CAA8B,WAA4B,OAA6C,EAAA;AAC5G,IAAA,OAAO,KAAK,SAAU,CAAA,SAAS,EAAE,IAAK,EAAA,CAAE,UAAU,OAAO,CAAA,CAAA;AAAA,GAC3D;AAAA,EAEO,kBAA2B,GAAA;AAAA,GAAC;AAAA,EAE5B,YAAA,CAAa,KAAaA,OAAsC,EAAA;AACrE,IAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAAA;AAAA,GACzC;AACF,CAAA;AAEO,SAAS,mBAAmB,WAA6C,EAAA;AAC9E,EAAA,OAAO,WAAW,UAAW,CAAA,WAAA,EAAa,CAAC,CAAA,KAAM,aAAa,UAAU,CAAA,CAAA;AAC1E;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { toUtc,
|
|
2
|
-
import {
|
|
1
|
+
import { toUtc, getPanelOptionsWithDefaults, compareArrayValues, compareDataFrameStructures, applyFieldOverrides, CoreApp, DashboardCursorSync } from '@grafana/data';
|
|
2
|
+
import { getPluginImportUtils, config, getAppEvents } from '@grafana/runtime';
|
|
3
3
|
import { SceneObjectBase } from '../../core/SceneObjectBase.js';
|
|
4
4
|
import { sceneGraph } from '../../core/sceneGraph/index.js';
|
|
5
5
|
import { VizPanelRenderer } from './VizPanelRenderer.js';
|
|
@@ -8,6 +8,7 @@ import { seriesVisibilityConfigFactory } from './seriesVisibilityConfigFactory.j
|
|
|
8
8
|
import { emptyPanelData } from '../../core/SceneDataNode.js';
|
|
9
9
|
import { changeSeriesColorConfigFactory } from './colorSeriesConfigFactory.js';
|
|
10
10
|
import { loadPanelPluginSync } from './registerRuntimePanelPlugin.js';
|
|
11
|
+
import { getCursorSyncScope } from '../../behaviors/CursorSync.js';
|
|
11
12
|
|
|
12
13
|
var __defProp = Object.defineProperty;
|
|
13
14
|
var __defProps = Object.defineProperties;
|
|
@@ -100,15 +101,6 @@ class VizPanel extends SceneObjectBase {
|
|
|
100
101
|
legend: __spreadProps(__spreadValues({}, legendOptions), { sortBy, sortDesc })
|
|
101
102
|
}));
|
|
102
103
|
};
|
|
103
|
-
this._panelContext = {
|
|
104
|
-
eventBus: getAppEvents(),
|
|
105
|
-
app: CoreApp.Unknown,
|
|
106
|
-
sync: () => DashboardCursorSync.Off,
|
|
107
|
-
onSeriesColorChange: this._onSeriesColorChange,
|
|
108
|
-
onToggleSeriesVisibility: this._onSeriesVisibilityChange,
|
|
109
|
-
onToggleLegendSort: this._onToggleLegendSort,
|
|
110
|
-
onInstanceStateChange: this._onInstanceStateChange
|
|
111
|
-
};
|
|
112
104
|
this.addActivationHandler(() => {
|
|
113
105
|
this._onActivate();
|
|
114
106
|
});
|
|
@@ -117,6 +109,7 @@ class VizPanel extends SceneObjectBase {
|
|
|
117
109
|
if (!this._plugin) {
|
|
118
110
|
this._loadPlugin(this.state.pluginId);
|
|
119
111
|
}
|
|
112
|
+
this.buildPanelContext();
|
|
120
113
|
}
|
|
121
114
|
_loadPlugin(pluginId) {
|
|
122
115
|
const plugin = loadPanelPluginSync(pluginId);
|
|
@@ -165,6 +158,9 @@ class VizPanel extends SceneObjectBase {
|
|
|
165
158
|
return this._plugin;
|
|
166
159
|
}
|
|
167
160
|
getPanelContext() {
|
|
161
|
+
if (!this._panelContext) {
|
|
162
|
+
this.buildPanelContext();
|
|
163
|
+
}
|
|
168
164
|
return this._panelContext;
|
|
169
165
|
}
|
|
170
166
|
applyFieldConfig(rawData) {
|
|
@@ -192,6 +188,24 @@ class VizPanel extends SceneObjectBase {
|
|
|
192
188
|
});
|
|
193
189
|
return this._dataWithFieldConfig;
|
|
194
190
|
}
|
|
191
|
+
buildPanelContext() {
|
|
192
|
+
const sync = getCursorSyncScope(this);
|
|
193
|
+
this._panelContext = {
|
|
194
|
+
eventsScope: sync ? sync.getEventsScope() : "__global_",
|
|
195
|
+
eventBus: sync ? sync.getEventsBus(this) : getAppEvents(),
|
|
196
|
+
app: CoreApp.Unknown,
|
|
197
|
+
sync: () => {
|
|
198
|
+
if (sync) {
|
|
199
|
+
return sync.state.sync;
|
|
200
|
+
}
|
|
201
|
+
return DashboardCursorSync.Off;
|
|
202
|
+
},
|
|
203
|
+
onSeriesColorChange: this._onSeriesColorChange,
|
|
204
|
+
onToggleSeriesVisibility: this._onSeriesVisibilityChange,
|
|
205
|
+
onToggleLegendSort: this._onToggleLegendSort,
|
|
206
|
+
onInstanceStateChange: this._onInstanceStateChange
|
|
207
|
+
};
|
|
208
|
+
}
|
|
195
209
|
}
|
|
196
210
|
VizPanel.Component = VizPanelRenderer;
|
|
197
211
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanel.js","sources":["../../../../src/components/VizPanel/VizPanel.tsx"],"sourcesContent":["import {\n AbsoluteTimeRange,\n FieldConfigSource,\n PanelModel,\n PanelPlugin,\n toUtc,\n getPanelOptionsWithDefaults,\n ScopedVars,\n InterpolateFunction,\n CoreApp,\n DashboardCursorSync,\n PanelData,\n compareArrayValues,\n compareDataFrameStructures,\n applyFieldOverrides,\n} 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';\n\nexport interface VizPanelState<TOptions = {}, TFieldConfig = {}> extends SceneObjectState {\n title: string;\n description?: string;\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 options: DeepPartial<TOptions>;\n fieldConfig: FieldConfigSource<DeepPartial<TFieldConfig>>;\n pluginVersion?: string;\n displayMode?: 'default' | 'transparent';\n hoverHeader?: boolean;\n menu?: VizPanelMenu;\n isDraggable?: boolean;\n isResizable?: boolean;\n headerActions?: React.ReactNode | SceneObject;\n // internal state\n pluginLoadError?: string;\n pluginInstanceState?: any;\n}\n\nexport class VizPanel<TOptions = {}, TFieldConfig = {}> extends SceneObjectBase<VizPanelState<TOptions, TFieldConfig>> {\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 private _plugin?: PanelPlugin;\n private _panelContext: PanelContext;\n private _prevData?: PanelData;\n private _dataWithFieldConfig?: PanelData;\n private _structureRev: number = 0;\n\n public constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>) {\n super({\n options: {} as TOptions,\n fieldConfig: { defaults: {}, overrides: [] },\n title: 'Title',\n pluginId: 'timeseries',\n ...state,\n });\n\n this._panelContext = {\n eventBus: getAppEvents(),\n app: CoreApp.Unknown, // TODO,\n sync: () => DashboardCursorSync.Off, // TODO\n onSeriesColorChange: this._onSeriesColorChange,\n onToggleSeriesVisibility: this._onSeriesVisibilityChange,\n onToggleLegendSort: this._onToggleLegendSort,\n onInstanceStateChange: this._onInstanceStateChange,\n // onAnnotationCreate: this.onAnnotationCreate,\n // onAnnotationUpdate: this.onAnnotationUpdate,\n // onAnnotationDelete: this.onAnnotationDelete,\n // canAddAnnotations: props.dashboard.canAddAnnotations.bind(props.dashboard),\n // canEditAnnotations: props.dashboard.canEditAnnotations.bind(props.dashboard),\n // canDeleteAnnotations: props.dashboard.canDeleteAnnotations.bind(props.dashboard),\n };\n\n this.addActivationHandler(() => {\n this._onActivate();\n });\n }\n\n private _onActivate() {\n if (!this._plugin) {\n this._loadPlugin(this.state.pluginId);\n }\n }\n\n private _loadPlugin(pluginId: string) {\n const plugin = loadPanelPluginSync(pluginId);\n\n if (plugin) {\n this._pluginLoaded(plugin);\n } else {\n const { importPanelPlugin } = getPluginImportUtils();\n\n importPanelPlugin(pluginId)\n .then((result) => this._pluginLoaded(result))\n .catch((err: Error) => {\n this.setState({ pluginLoadError: err.message });\n });\n }\n }\n\n private _pluginLoaded(plugin: PanelPlugin) {\n const { options, fieldConfig, title, pluginVersion } = this.state;\n\n const panel: PanelModel = {\n title,\n options,\n fieldConfig,\n id: 1,\n type: plugin.meta.id,\n pluginVersion: pluginVersion,\n };\n\n const currentVersion = this._getPluginVersion(plugin);\n\n if (plugin.onPanelMigration) {\n if (currentVersion !== this.state.pluginVersion) {\n // These migration handlers also mutate panel.fieldConfig to migrate fieldConfig\n panel.options = plugin.onPanelMigration(panel);\n }\n }\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: panel.options,\n currentFieldConfig: panel.fieldConfig,\n isAfterPluginChange: false,\n });\n\n this._plugin = plugin;\n\n this.setState({\n options: withDefaults.options,\n fieldConfig: withDefaults.fieldConfig,\n pluginVersion: currentVersion,\n });\n }\n\n private _getPluginVersion(plugin: PanelPlugin): string {\n return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;\n }\n\n public getPlugin(): PanelPlugin | undefined {\n return this._plugin;\n }\n\n public getPanelContext(): PanelContext {\n return this._panelContext;\n }\n\n public onChangeTimeRange = (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 onOptionsChange = (options: TOptions) => {\n this.setState({ options });\n };\n\n public onFieldConfigChange = (fieldConfig: FieldConfigSource<TFieldConfig>) => {\n this.setState({ 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 /**\n * Called from the react render path to apply the field config to the data provided by the data provider\n */\n public applyFieldConfig(rawData?: PanelData): PanelData {\n const plugin = this._plugin!;\n\n if (!plugin || plugin.meta.skipDataQuery || !rawData) {\n // TODO setup time range subscription instead\n return emptyPanelData;\n }\n\n const fieldConfigRegistry = plugin.fieldConfigRegistry;\n const prevFrames = this._prevData?.series;\n const newFrames = rawData?.series;\n\n if (\n rawData.structureRev == null &&\n newFrames &&\n prevFrames &&\n !compareArrayValues(newFrames, prevFrames, compareDataFrameStructures)\n ) {\n this._structureRev++;\n }\n\n this._dataWithFieldConfig = {\n ...rawData,\n structureRev: this._structureRev,\n series: applyFieldOverrides({\n data: newFrames,\n fieldConfig: this.state.fieldConfig,\n fieldConfigRegistry,\n replaceVariables: this.interpolate,\n theme: config.theme2,\n timeZone: rawData.request?.timezone,\n }),\n };\n\n return this._dataWithFieldConfig;\n }\n\n public onCancelQuery = () => {\n const data = sceneGraph.getData(this);\n data.cancelQuery?.();\n };\n\n /**\n * Panel context functions\n */\n private _onSeriesColorChange = (label: string, color: string) => {\n this.onFieldConfigChange(changeSeriesColorConfigFactory(label, color, this.state.fieldConfig));\n };\n\n private _onSeriesVisibilityChange = (label: string, mode: SeriesVisibilityChangeMode) => {\n if (!this._dataWithFieldConfig) {\n return;\n }\n\n this.onFieldConfigChange(\n seriesVisibilityConfigFactory(label, mode, this.state.fieldConfig, this._dataWithFieldConfig.series)\n );\n };\n\n private _onInstanceStateChange = (state: any) => {\n this.setState({ pluginInstanceState: state });\n };\n\n private _onToggleLegendSort = (sortKey: string) => {\n const legendOptions: VizLegendOptions = (this.state.options as any).legend;\n\n // We don't want to do anything when legend options are not available\n if (!legendOptions) {\n return;\n }\n\n let sortDesc = legendOptions.sortDesc;\n let sortBy = legendOptions.sortBy;\n if (sortKey !== sortBy) {\n sortDesc = undefined;\n }\n\n // if already sort ascending, disable sorting\n if (sortDesc === false) {\n sortBy = undefined;\n sortDesc = undefined;\n } else {\n sortDesc = !sortDesc;\n sortBy = sortKey;\n }\n\n this.onOptionsChange({\n ...this.state.options,\n legend: { ...legendOptions, sortBy, sortDesc },\n } as TOptions);\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VizPanel.js","sources":["../../../../src/components/VizPanel/VizPanel.tsx"],"sourcesContent":["import {\n AbsoluteTimeRange,\n FieldConfigSource,\n PanelModel,\n PanelPlugin,\n toUtc,\n getPanelOptionsWithDefaults,\n ScopedVars,\n InterpolateFunction,\n CoreApp,\n DashboardCursorSync,\n PanelData,\n compareArrayValues,\n compareDataFrameStructures,\n applyFieldOverrides,\n} 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';\n\nexport interface VizPanelState<TOptions = {}, TFieldConfig = {}> extends SceneObjectState {\n title: string;\n description?: string;\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 options: DeepPartial<TOptions>;\n fieldConfig: FieldConfigSource<DeepPartial<TFieldConfig>>;\n pluginVersion?: string;\n displayMode?: 'default' | 'transparent';\n hoverHeader?: boolean;\n menu?: VizPanelMenu;\n isDraggable?: boolean;\n isResizable?: boolean;\n headerActions?: React.ReactNode | SceneObject;\n // internal state\n pluginLoadError?: string;\n pluginInstanceState?: any;\n}\n\nexport class VizPanel<TOptions = {}, TFieldConfig = {}> extends SceneObjectBase<VizPanelState<TOptions, TFieldConfig>> {\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 private _plugin?: PanelPlugin;\n private _panelContext?: PanelContext;\n private _prevData?: PanelData;\n private _dataWithFieldConfig?: PanelData;\n private _structureRev: number = 0;\n\n public constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>) {\n super({\n options: {} as TOptions,\n fieldConfig: { defaults: {}, overrides: [] },\n title: 'Title',\n pluginId: 'timeseries',\n ...state,\n });\n\n this.addActivationHandler(() => {\n this._onActivate();\n });\n }\n\n private _onActivate() {\n if (!this._plugin) {\n this._loadPlugin(this.state.pluginId);\n }\n\n this.buildPanelContext();\n }\n\n private _loadPlugin(pluginId: string) {\n const plugin = loadPanelPluginSync(pluginId);\n\n if (plugin) {\n this._pluginLoaded(plugin);\n } else {\n const { importPanelPlugin } = getPluginImportUtils();\n\n importPanelPlugin(pluginId)\n .then((result) => this._pluginLoaded(result))\n .catch((err: Error) => {\n this.setState({ pluginLoadError: err.message });\n });\n }\n }\n\n private _pluginLoaded(plugin: PanelPlugin) {\n const { options, fieldConfig, title, pluginVersion } = this.state;\n\n const panel: PanelModel = {\n title,\n options,\n fieldConfig,\n id: 1,\n type: plugin.meta.id,\n pluginVersion: pluginVersion,\n };\n\n const currentVersion = this._getPluginVersion(plugin);\n\n if (plugin.onPanelMigration) {\n if (currentVersion !== this.state.pluginVersion) {\n // These migration handlers also mutate panel.fieldConfig to migrate fieldConfig\n panel.options = plugin.onPanelMigration(panel);\n }\n }\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: panel.options,\n currentFieldConfig: panel.fieldConfig,\n isAfterPluginChange: false,\n });\n\n this._plugin = plugin;\n\n this.setState({\n options: withDefaults.options,\n fieldConfig: withDefaults.fieldConfig,\n pluginVersion: currentVersion,\n });\n }\n\n private _getPluginVersion(plugin: PanelPlugin): string {\n return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;\n }\n\n public getPlugin(): PanelPlugin | undefined {\n return this._plugin;\n }\n\n public getPanelContext(): PanelContext {\n if (!this._panelContext) {\n this.buildPanelContext();\n }\n\n return this._panelContext!;\n }\n\n public onChangeTimeRange = (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 onOptionsChange = (options: TOptions) => {\n this.setState({ options });\n };\n\n public onFieldConfigChange = (fieldConfig: FieldConfigSource<TFieldConfig>) => {\n this.setState({ 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 /**\n * Called from the react render path to apply the field config to the data provided by the data provider\n */\n public applyFieldConfig(rawData?: PanelData): PanelData {\n const plugin = this._plugin!;\n\n if (!plugin || plugin.meta.skipDataQuery || !rawData) {\n // TODO setup time range subscription instead\n return emptyPanelData;\n }\n\n const fieldConfigRegistry = plugin.fieldConfigRegistry;\n const prevFrames = this._prevData?.series;\n const newFrames = rawData?.series;\n\n if (\n rawData.structureRev == null &&\n newFrames &&\n prevFrames &&\n !compareArrayValues(newFrames, prevFrames, compareDataFrameStructures)\n ) {\n this._structureRev++;\n }\n\n this._dataWithFieldConfig = {\n ...rawData,\n structureRev: this._structureRev,\n series: applyFieldOverrides({\n data: newFrames,\n fieldConfig: this.state.fieldConfig,\n fieldConfigRegistry,\n replaceVariables: this.interpolate,\n theme: config.theme2,\n timeZone: rawData.request?.timezone,\n }),\n };\n\n return this._dataWithFieldConfig;\n }\n\n public onCancelQuery = () => {\n const data = sceneGraph.getData(this);\n data.cancelQuery?.();\n };\n\n /**\n * Panel context functions\n */\n private _onSeriesColorChange = (label: string, color: string) => {\n this.onFieldConfigChange(changeSeriesColorConfigFactory(label, color, this.state.fieldConfig));\n };\n\n private _onSeriesVisibilityChange = (label: string, mode: SeriesVisibilityChangeMode) => {\n if (!this._dataWithFieldConfig) {\n return;\n }\n\n this.onFieldConfigChange(\n seriesVisibilityConfigFactory(label, mode, this.state.fieldConfig, this._dataWithFieldConfig.series)\n );\n };\n\n private _onInstanceStateChange = (state: any) => {\n this.setState({ pluginInstanceState: state });\n };\n\n private _onToggleLegendSort = (sortKey: string) => {\n const legendOptions: VizLegendOptions = (this.state.options as any).legend;\n\n // We don't want to do anything when legend options are not available\n if (!legendOptions) {\n return;\n }\n\n let sortDesc = legendOptions.sortDesc;\n let sortBy = legendOptions.sortBy;\n if (sortKey !== sortBy) {\n sortDesc = undefined;\n }\n\n // if already sort ascending, disable sorting\n if (sortDesc === false) {\n sortBy = undefined;\n sortDesc = undefined;\n } else {\n sortDesc = !sortDesc;\n sortBy = sortKey;\n }\n\n this.onOptionsChange({\n ...this.state.options,\n legend: { ...legendOptions, sortBy, sortDesc },\n } as TOptions);\n };\n\n private buildPanelContext() {\n const sync = getCursorSyncScope(this);\n\n this._panelContext = {\n // @ts-ignore Waits for core release\n eventsScope: sync ? sync.getEventsScope() : '__global_',\n eventBus: sync ? sync.getEventsBus(this) : getAppEvents(),\n app: CoreApp.Unknown, // TODO,\n sync: () => {\n if (sync) {\n return sync.state.sync;\n }\n return DashboardCursorSync.Off;\n }, // TODO\n onSeriesColorChange: this._onSeriesColorChange,\n onToggleSeriesVisibility: this._onSeriesVisibilityChange,\n onToggleLegendSort: this._onToggleLegendSort,\n onInstanceStateChange: this._onInstanceStateChange,\n // onAnnotationCreate: this.onAnnotationCreate,\n // onAnnotationUpdate: this.onAnnotationUpdate,\n // onAnnotationDelete: this.onAnnotationDelete,\n // canAddAnnotations: props.dashboard.canAddAnnotations.bind(props.dashboard),\n // canEditAnnotations: props.dashboard.canEditAnnotations.bind(props.dashboard),\n // canDeleteAnnotations: props.dashboard.canDeleteAnnotations.bind(props.dashboard),\n };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,6 @@ var __spreadValues = (a, b) => {
|
|
|
25
25
|
class SceneObjectBase {
|
|
26
26
|
constructor(state) {
|
|
27
27
|
this._isActive = false;
|
|
28
|
-
this._events = new EventBusSrv();
|
|
29
28
|
this._activationHandlers = [];
|
|
30
29
|
this._deactivationHandlers = [];
|
|
31
30
|
this._subs = new Subscription();
|
|
@@ -33,6 +32,7 @@ class SceneObjectBase {
|
|
|
33
32
|
if (!state.key) {
|
|
34
33
|
state.key = v4();
|
|
35
34
|
}
|
|
35
|
+
this._events = new EventBusSrv();
|
|
36
36
|
this._state = Object.freeze(state);
|
|
37
37
|
this._setParent();
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneObjectBase.js","sources":["../../../src/core/SceneObjectBase.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Subscription, Unsubscribable } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { BusEvent, BusEventHandler, BusEventType, EventBusSrv } from '@grafana/data';\nimport {\n SceneObject,\n SceneComponent,\n SceneObjectUrlSyncHandler,\n SceneStateChangedHandler,\n SceneActivationHandler,\n SceneDeactivationHandler,\n CancelActivationHandler,\n SceneObjectState,\n} from './types';\n\nimport { SceneComponentWrapper } from './SceneComponentWrapper';\nimport { SceneObjectStateChangedEvent } from './events';\nimport { cloneSceneObject } from './sceneGraph/utils';\nimport { SceneVariableDependencyConfigLike } from '../variables/types';\n\nexport abstract class SceneObjectBase<TState extends SceneObjectState = SceneObjectState>\n implements SceneObject<TState>\n{\n private _isActive = false;\n private _state: TState;\n private _events = new EventBusSrv();\n private _activationHandlers: SceneActivationHandler[] = [];\n private _deactivationHandlers: SceneDeactivationHandler[] = [];\n\n protected _parent?: SceneObject;\n protected _subs = new Subscription();\n protected _refCount = 0;\n\n protected _variableDependency: SceneVariableDependencyConfigLike | undefined;\n protected _urlSync: SceneObjectUrlSyncHandler | undefined;\n\n public constructor(state: TState) {\n if (!state.key) {\n state.key = uuidv4();\n }\n\n this._state = Object.freeze(state);\n this._setParent();\n }\n\n /** Current state */\n public get state(): TState {\n return this._state;\n }\n\n /** True if currently being active (ie displayed for visual objects) */\n public get isActive(): boolean {\n return this._isActive;\n }\n\n /** Returns the parent, undefined for root object */\n public get parent(): SceneObject | undefined {\n return this._parent;\n }\n\n /** Returns variable dependency config */\n public get variableDependency(): SceneVariableDependencyConfigLike | undefined {\n return this._variableDependency;\n }\n\n /** Returns url sync config */\n public get urlSync(): SceneObjectUrlSyncHandler | undefined {\n return this._urlSync;\n }\n\n /**\n * Used in render functions when rendering a SceneObject.\n * Wraps the component in an EditWrapper that handles edit mode\n */\n public get Component(): SceneComponent<this> {\n return SceneComponentWrapper;\n }\n\n private _setParent() {\n this.forEachChild((child) => {\n child._parent = this;\n });\n }\n\n /**\n * Subscribe to the scene state subject\n **/\n public subscribeToState(handler: SceneStateChangedHandler<TState>): Unsubscribable {\n return this._events.subscribe(SceneObjectStateChangedEvent, (event) => {\n if (event.payload.changedObject === this) {\n handler(event.payload.newState as TState, event.payload.prevState as TState);\n }\n });\n }\n\n /**\n * Subscribe to the scene event\n **/\n public subscribeToEvent<T extends BusEvent>(eventType: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n return this._events.subscribe(eventType, handler);\n }\n\n public setState(update: Partial<TState>) {\n const prevState = this._state;\n const newState: TState = {\n ...this._state,\n ...update,\n };\n\n this._state = Object.freeze(newState);\n\n this._setParent();\n\n // Bubble state change event. This is event is subscribed to by UrlSyncManager and UndoManager\n this.publishEvent(\n new SceneObjectStateChangedEvent({\n prevState,\n newState,\n partialUpdate: update,\n changedObject: this,\n }),\n true\n );\n }\n /*\n * Publish an event and optionally bubble it up the scene\n **/\n public publishEvent(event: BusEvent, bubble?: boolean) {\n this._events.publish(event);\n\n if (bubble && this.parent) {\n this.parent.publishEvent(event, bubble);\n }\n }\n\n public getRoot(): SceneObject {\n return !this._parent ? this : this._parent.getRoot();\n }\n\n private _internalActivate() {\n this._isActive = true;\n\n const { $data, $variables, $timeRange, $behaviors } = this.state;\n\n if ($timeRange && !$timeRange.isActive) {\n this._deactivationHandlers.push($timeRange.activate());\n }\n\n if ($variables && !$variables.isActive) {\n this._deactivationHandlers.push($variables.activate());\n }\n\n if ($data && !$data.isActive) {\n this._deactivationHandlers.push($data.activate());\n }\n\n if ($behaviors) {\n for (const behavior of $behaviors) {\n if (behavior instanceof SceneObjectBase) {\n this._deactivationHandlers.push(behavior.activate());\n } else if (typeof behavior === 'function') {\n const deactivationHandler = behavior(this);\n if (deactivationHandler) {\n this._deactivationHandlers.push();\n }\n }\n }\n }\n\n this._activationHandlers.forEach((handler) => {\n const result = handler();\n if (result) {\n this._deactivationHandlers.push(result);\n }\n });\n }\n\n /**\n * This is primarily called from SceneComponentWrapper when the SceneObject's Component is mounted.\n * But in some scenarios this can also be called directly from another scene object. When called manually from another scene object\n * make sure to call the returned function when the source scene object is deactivated.\n */\n public activate(): CancelActivationHandler {\n if (!this.isActive) {\n this._internalActivate();\n }\n\n this._refCount++;\n\n let called = false;\n\n return () => {\n this._refCount--;\n\n if (called) {\n const msg = `SceneObject cancelation handler returned by activate() called a second time`;\n console.error(msg, this);\n throw new Error(msg);\n }\n\n called = true;\n\n if (this._refCount === 0) {\n this._internalDeactivate();\n }\n };\n }\n\n /**\n * Called by the SceneComponentWrapper when the react component is unmounted.\n * Don't override this, instead use addActivationHandler. The activation handler can return a deactivation handler.\n */\n private _internalDeactivate(): void {\n this._isActive = false;\n\n this._deactivationHandlers.forEach((handler) => handler());\n this._deactivationHandlers = [];\n\n // Clear subscriptions and listeners\n this._events.removeAllListeners();\n this._subs.unsubscribe();\n this._subs = new Subscription();\n }\n\n /**\n * Utility hook to get and subscribe to state\n */\n public useState() {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSceneObjectState(this);\n }\n\n /** Force a re-render, should only be needed when variable values change */\n public forceRender(): void {\n this.setState({});\n }\n\n /**\n * Will create new SceneObject with shallow-cloned state, but all state items of type SceneObject are deep cloned\n */\n public clone(withState?: Partial<TState>): this {\n return cloneSceneObject(this, withState);\n }\n\n /**\n * Allows external code to register code that is executed on activate and deactivate. This allow you\n * to wire up scene objects that need to respond to state changes in other objects from the outside.\n **/\n public addActivationHandler(handler: SceneActivationHandler) {\n this._activationHandlers.push(handler);\n }\n\n /**\n * Loop through state and call callback for each direct child scene object.\n * Checks 1 level deep properties and arrays. So a scene object hidden in a nested plain object will not be detected.\n */\n public forEachChild(callback: (child: SceneObjectBase) => void) {\n for (const propValue of Object.values(this.state)) {\n if (propValue instanceof SceneObjectBase) {\n callback(propValue);\n }\n\n if (Array.isArray(propValue)) {\n for (const child of propValue) {\n if (child instanceof SceneObjectBase) {\n callback(child);\n }\n }\n }\n }\n }\n}\n\n/**\n * This hook is always returning model.state instead of a useState that remembers the last state emitted on the subject\n * The reason for this is so that if the model instance change this function will always return the latest state.\n */\nfunction useSceneObjectState<TState extends SceneObjectState>(model: SceneObjectBase<TState>): TState {\n const [_, setState] = useState<TState>(model.state);\n const stateAtFirstRender = model.state;\n\n useEffect(() => {\n const s = model.subscribeToState(setState);\n\n // Re-render component if the state changed between first render and useEffect (mount)\n if (model.state !== stateAtFirstRender) {\n setState(model.state);\n }\n\n return () => s.unsubscribe();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model]);\n\n return model.state;\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneObjectBase.js","sources":["../../../src/core/SceneObjectBase.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Subscription, Unsubscribable } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { BusEvent, BusEventHandler, BusEventType, EventBus, EventBusSrv } from '@grafana/data';\nimport {\n SceneObject,\n SceneComponent,\n SceneObjectUrlSyncHandler,\n SceneStateChangedHandler,\n SceneActivationHandler,\n SceneDeactivationHandler,\n CancelActivationHandler,\n SceneObjectState,\n} from './types';\n\nimport { SceneComponentWrapper } from './SceneComponentWrapper';\nimport { SceneObjectStateChangedEvent } from './events';\nimport { cloneSceneObject } from './sceneGraph/utils';\nimport { SceneVariableDependencyConfigLike } from '../variables/types';\n\nexport abstract class SceneObjectBase<TState extends SceneObjectState = SceneObjectState>\n implements SceneObject<TState>\n{\n private _isActive = false;\n private _state: TState;\n private _activationHandlers: SceneActivationHandler[] = [];\n private _deactivationHandlers: SceneDeactivationHandler[] = [];\n\n protected _events?: EventBus;\n protected _parent?: SceneObject;\n protected _subs = new Subscription();\n protected _refCount = 0;\n\n protected _variableDependency: SceneVariableDependencyConfigLike | undefined;\n protected _urlSync: SceneObjectUrlSyncHandler | undefined;\n\n public constructor(state: TState) {\n if (!state.key) {\n state.key = uuidv4();\n }\n\n this._events = new EventBusSrv();\n\n this._state = Object.freeze(state);\n this._setParent();\n }\n\n /** Current state */\n public get state(): TState {\n return this._state;\n }\n\n /** True if currently being active (ie displayed for visual objects) */\n public get isActive(): boolean {\n return this._isActive;\n }\n\n /** Returns the parent, undefined for root object */\n public get parent(): SceneObject | undefined {\n return this._parent;\n }\n\n /** Returns variable dependency config */\n public get variableDependency(): SceneVariableDependencyConfigLike | undefined {\n return this._variableDependency;\n }\n\n /** Returns url sync config */\n public get urlSync(): SceneObjectUrlSyncHandler | undefined {\n return this._urlSync;\n }\n\n /**\n * Used in render functions when rendering a SceneObject.\n * Wraps the component in an EditWrapper that handles edit mode\n */\n public get Component(): SceneComponent<this> {\n return SceneComponentWrapper;\n }\n\n private _setParent() {\n this.forEachChild((child) => {\n child._parent = this;\n });\n }\n\n /**\n * Subscribe to the scene state subject\n **/\n public subscribeToState(handler: SceneStateChangedHandler<TState>): Unsubscribable {\n return this._events!.subscribe(SceneObjectStateChangedEvent, (event) => {\n if (event.payload.changedObject === this) {\n handler(event.payload.newState as TState, event.payload.prevState as TState);\n }\n });\n }\n\n /**\n * Subscribe to the scene event\n **/\n public subscribeToEvent<T extends BusEvent>(eventType: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n return this._events!.subscribe(eventType, handler);\n }\n\n public setState(update: Partial<TState>) {\n const prevState = this._state;\n const newState: TState = {\n ...this._state,\n ...update,\n };\n\n this._state = Object.freeze(newState);\n\n this._setParent();\n\n // Bubble state change event. This is event is subscribed to by UrlSyncManager and UndoManager\n this.publishEvent(\n new SceneObjectStateChangedEvent({\n prevState,\n newState,\n partialUpdate: update,\n changedObject: this,\n }),\n true\n );\n }\n /*\n * Publish an event and optionally bubble it up the scene\n **/\n public publishEvent(event: BusEvent, bubble?: boolean) {\n this._events!.publish(event);\n\n if (bubble && this.parent) {\n this.parent.publishEvent(event, bubble);\n }\n }\n\n public getRoot(): SceneObject {\n return !this._parent ? this : this._parent.getRoot();\n }\n\n private _internalActivate() {\n this._isActive = true;\n\n const { $data, $variables, $timeRange, $behaviors } = this.state;\n\n if ($timeRange && !$timeRange.isActive) {\n this._deactivationHandlers.push($timeRange.activate());\n }\n\n if ($variables && !$variables.isActive) {\n this._deactivationHandlers.push($variables.activate());\n }\n\n if ($data && !$data.isActive) {\n this._deactivationHandlers.push($data.activate());\n }\n\n if ($behaviors) {\n for (const behavior of $behaviors) {\n if (behavior instanceof SceneObjectBase) {\n this._deactivationHandlers.push(behavior.activate());\n } else if (typeof behavior === 'function') {\n const deactivationHandler = behavior(this);\n if (deactivationHandler) {\n this._deactivationHandlers.push();\n }\n }\n }\n }\n\n this._activationHandlers.forEach((handler) => {\n const result = handler();\n if (result) {\n this._deactivationHandlers.push(result);\n }\n });\n }\n\n /**\n * This is primarily called from SceneComponentWrapper when the SceneObject's Component is mounted.\n * But in some scenarios this can also be called directly from another scene object. When called manually from another scene object\n * make sure to call the returned function when the source scene object is deactivated.\n */\n public activate(): CancelActivationHandler {\n if (!this.isActive) {\n this._internalActivate();\n }\n\n this._refCount++;\n\n let called = false;\n\n return () => {\n this._refCount--;\n\n if (called) {\n const msg = `SceneObject cancelation handler returned by activate() called a second time`;\n console.error(msg, this);\n throw new Error(msg);\n }\n\n called = true;\n\n if (this._refCount === 0) {\n this._internalDeactivate();\n }\n };\n }\n\n /**\n * Called by the SceneComponentWrapper when the react component is unmounted.\n * Don't override this, instead use addActivationHandler. The activation handler can return a deactivation handler.\n */\n private _internalDeactivate(): void {\n this._isActive = false;\n\n this._deactivationHandlers.forEach((handler) => handler());\n this._deactivationHandlers = [];\n\n // Clear subscriptions and listeners\n this._events!.removeAllListeners();\n this._subs.unsubscribe();\n this._subs = new Subscription();\n }\n\n /**\n * Utility hook to get and subscribe to state\n */\n public useState() {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSceneObjectState(this);\n }\n\n /** Force a re-render, should only be needed when variable values change */\n public forceRender(): void {\n this.setState({});\n }\n\n /**\n * Will create new SceneObject with shallow-cloned state, but all state items of type SceneObject are deep cloned\n */\n public clone(withState?: Partial<TState>): this {\n return cloneSceneObject(this, withState);\n }\n\n /**\n * Allows external code to register code that is executed on activate and deactivate. This allow you\n * to wire up scene objects that need to respond to state changes in other objects from the outside.\n **/\n public addActivationHandler(handler: SceneActivationHandler) {\n this._activationHandlers.push(handler);\n }\n\n /**\n * Loop through state and call callback for each direct child scene object.\n * Checks 1 level deep properties and arrays. So a scene object hidden in a nested plain object will not be detected.\n */\n public forEachChild(callback: (child: SceneObjectBase) => void) {\n for (const propValue of Object.values(this.state)) {\n if (propValue instanceof SceneObjectBase) {\n callback(propValue);\n }\n\n if (Array.isArray(propValue)) {\n for (const child of propValue) {\n if (child instanceof SceneObjectBase) {\n callback(child);\n }\n }\n }\n }\n }\n}\n\n/**\n * This hook is always returning model.state instead of a useState that remembers the last state emitted on the subject\n * The reason for this is so that if the model instance change this function will always return the latest state.\n */\nfunction useSceneObjectState<TState extends SceneObjectState>(model: SceneObjectBase<TState>): TState {\n const [_, setState] = useState<TState>(model.state);\n const stateAtFirstRender = model.state;\n\n useEffect(() => {\n const s = model.subscribeToState(setState);\n\n // Re-render component if the state changed between first render and useEffect (mount)\n if (model.state !== stateAtFirstRender) {\n setState(model.state);\n }\n\n return () => s.unsubscribe();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model]);\n\n return model.state;\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { BusEventWithPayload, PanelData, BusEvent, BusEventType, BusEventHandler, TimeRange, DataTransformContext, DataFrame, PanelPlugin, DataQuery, DataSourceApi, ScopedVars, DataTransformerConfig, Registry, RegistryItem, DataSourceRef as DataSourceRef$1, VariableRefresh, VariableSort, PanelMenuItem, FieldConfigSource, AbsoluteTimeRange, InterpolateFunction, IconName as IconName$1, FieldConfig, FieldType, FieldValueMatcherConfig } from '@grafana/data';
|
|
1
|
+
import { BusEventWithPayload, PanelData, BusEvent, BusEventType, BusEventHandler, TimeRange, DataTransformContext, DataFrame, PanelPlugin, DataQuery, DataSourceApi, ScopedVars, EventBus, EventFilterOptions, DataTransformerConfig, Registry, RegistryItem, DataSourceRef as DataSourceRef$1, VariableRefresh, VariableSort, PanelMenuItem, FieldConfigSource, AbsoluteTimeRange, InterpolateFunction, IconName as IconName$1, FieldConfig, FieldType, FieldValueMatcherConfig } from '@grafana/data';
|
|
2
2
|
import React$1, { CSSProperties } from 'react';
|
|
3
3
|
import { Observable, Unsubscribable, MonoTypeOperatorFunction, Subscription } from 'rxjs';
|
|
4
|
-
import { VariableType, VariableHide, TimeZone, DataSourceRef, DataQuery as DataQuery$1, MatcherConfig, TableFieldOptions } from '@grafana/schema';
|
|
4
|
+
import { VariableType, VariableHide, TimeZone, DashboardCursorSync, DataSourceRef, DataQuery as DataQuery$1, MatcherConfig, TableFieldOptions } from '@grafana/schema';
|
|
5
5
|
import { PanelContext, IconName } from '@grafana/ui';
|
|
6
6
|
import ReactGridLayout from 'react-grid-layout';
|
|
7
7
|
import { RouteComponentProps } from 'react-router-dom';
|
|
@@ -333,9 +333,9 @@ declare const sceneGraph: {
|
|
|
333
333
|
declare abstract class SceneObjectBase<TState extends SceneObjectState = SceneObjectState> implements SceneObject<TState> {
|
|
334
334
|
private _isActive;
|
|
335
335
|
private _state;
|
|
336
|
-
private _events;
|
|
337
336
|
private _activationHandlers;
|
|
338
337
|
private _deactivationHandlers;
|
|
338
|
+
protected _events?: EventBus;
|
|
339
339
|
protected _parent?: SceneObject;
|
|
340
340
|
protected _subs: Subscription;
|
|
341
341
|
protected _refCount: number;
|
|
@@ -460,11 +460,36 @@ declare class ActWhenVariableChanged extends SceneObjectBase<ActWhenVariableChan
|
|
|
460
460
|
private _onVariableChanged;
|
|
461
461
|
}
|
|
462
462
|
|
|
463
|
+
interface CursorSyncState extends SceneObjectState {
|
|
464
|
+
sync: DashboardCursorSync;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* This behavior will provide a cursor sync context within a scene.
|
|
468
|
+
*/
|
|
469
|
+
declare class CursorSync extends SceneObjectBase<CursorSyncState> {
|
|
470
|
+
constructor(state: Partial<CursorSyncState>);
|
|
471
|
+
getEventsBus: (panel: SceneObject) => PanelContextEventBus;
|
|
472
|
+
getEventsScope: () => string | undefined;
|
|
473
|
+
}
|
|
474
|
+
declare class PanelContextEventBus implements EventBus {
|
|
475
|
+
private _source;
|
|
476
|
+
private _eventsOrigin;
|
|
477
|
+
constructor(_source: SceneObject, _eventsOrigin: SceneObject);
|
|
478
|
+
publish<T extends BusEvent>(event: T): void;
|
|
479
|
+
getStream<T extends BusEvent>(eventType: BusEventType<T>): Observable<T>;
|
|
480
|
+
subscribe<T extends BusEvent>(eventType: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;
|
|
481
|
+
removeAllListeners(): void;
|
|
482
|
+
newScopedBus(key: string, filter: EventFilterOptions): EventBus;
|
|
483
|
+
}
|
|
484
|
+
|
|
463
485
|
type index_ActWhenVariableChanged = ActWhenVariableChanged;
|
|
464
486
|
declare const index_ActWhenVariableChanged: typeof ActWhenVariableChanged;
|
|
487
|
+
type index_CursorSync = CursorSync;
|
|
488
|
+
declare const index_CursorSync: typeof CursorSync;
|
|
465
489
|
declare namespace index {
|
|
466
490
|
export {
|
|
467
491
|
index_ActWhenVariableChanged as ActWhenVariableChanged,
|
|
492
|
+
index_CursorSync as CursorSync,
|
|
468
493
|
};
|
|
469
494
|
}
|
|
470
495
|
|
|
@@ -876,7 +901,7 @@ declare class VizPanel<TOptions = {}, TFieldConfig = {}> extends SceneObjectBase
|
|
|
876
901
|
static Component: typeof VizPanelRenderer;
|
|
877
902
|
protected _variableDependency: VariableDependencyConfig<VizPanelState<TOptions, TFieldConfig>>;
|
|
878
903
|
private _plugin?;
|
|
879
|
-
private _panelContext
|
|
904
|
+
private _panelContext?;
|
|
880
905
|
private _prevData?;
|
|
881
906
|
private _dataWithFieldConfig?;
|
|
882
907
|
private _structureRev;
|
|
@@ -903,6 +928,7 @@ declare class VizPanel<TOptions = {}, TFieldConfig = {}> extends SceneObjectBase
|
|
|
903
928
|
private _onSeriesVisibilityChange;
|
|
904
929
|
private _onInstanceStateChange;
|
|
905
930
|
private _onToggleLegendSort;
|
|
931
|
+
private buildPanelContext;
|
|
906
932
|
}
|
|
907
933
|
|
|
908
934
|
interface NestedSceneState extends SceneObjectState {
|