@grafana/scenes 1.30.0 β†’ 2.0.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 CHANGED
@@ -1,3 +1,41 @@
1
+ # v2.0.0 (Mon Jan 22 2024)
2
+
3
+ ### Release Notes
4
+
5
+ #### Variables: Notify scene after each variable completion or value change ([#525](https://github.com/grafana/scenes/pull/525))
6
+
7
+ `VariableDependencyConfigLike` interface has changed so that scene objects now get notified after each variable update is completed (or changed value). Before, the `SceneVariableSet` waited for all variables to complete before notifying scene objects.
8
+
9
+ The function `variableUpdatesCompleted` has changed name and signature:
10
+
11
+ ```ts
12
+ variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean): void;
13
+ ```
14
+
15
+ `VariableDependencyConfig` has also some breaking changes. The function named `onVariableUpdatesCompleted` has changed name and signature to:
16
+
17
+ ```ts
18
+ onVariableUpdateCompleted?: () => void;
19
+ ```
20
+
21
+ `VariableDependencyConfig` now handles the state logic for "waitingForVariables". If you call `VariableDependencyConfig.hasDependencyInLoadingState` and it returns true it will remember this waiting state and call `onVariableUpdateCompleted` as soon as the next variable update is completed, no matter if that variable is a dependency or if it changed or not.
22
+
23
+ ---
24
+
25
+ #### πŸ’₯ Breaking Change
26
+
27
+ - Variables: Notify scene after each variable completion or value change [#525](https://github.com/grafana/scenes/pull/525) ([@torkelo](https://github.com/torkelo))
28
+
29
+ #### πŸš€ Enhancement
30
+
31
+ - UrlSync: Export new util functions [#529](https://github.com/grafana/scenes/pull/529) ([@torkelo](https://github.com/torkelo))
32
+
33
+ #### Authors: 1
34
+
35
+ - Torkel Γ–degaard ([@torkelo](https://github.com/torkelo))
36
+
37
+ ---
38
+
1
39
  # v1.30.0 (Thu Jan 18 2024)
2
40
 
3
41
  #### πŸš€ Enhancement
@@ -147,7 +185,7 @@
147
185
 
148
186
  #### πŸš€ Enhancement
149
187
 
150
- - Variables: Query - Add optional `definition` prop to state [#489](https://github.com/grafana/scenes/pull/489) ([@axelavargas](https://github.com/axelavargas))
188
+ - Variables: Query - Add optional `definition` prop to state [#489](https://github.com/grafana/scenes/pull/489) ([@axelavargas](https://github.com/axelavargas))
151
189
 
152
190
  #### πŸ› Bug Fix
153
191
 
@@ -164,7 +202,7 @@
164
202
 
165
203
  #### πŸš€ Enhancement
166
204
 
167
- - Macros: Support $_interval[_ms] variable [#487](https://github.com/grafana/scenes/pull/487) ([@dprokop](https://github.com/dprokop))
205
+ - Macros: Support $\_interval[_ms] variable [#487](https://github.com/grafana/scenes/pull/487) ([@dprokop](https://github.com/dprokop))
168
206
 
169
207
  #### πŸ› Bug Fix
170
208
 
@@ -338,7 +376,7 @@
338
376
  - Variables: Support for variables on lower levels to depend on variables on higher levels [#443](https://github.com/grafana/scenes/pull/443) ([@torkelo](https://github.com/torkelo))
339
377
  - VizPanel: Handle empty arrays when merging new panel options [#447](https://github.com/grafana/scenes/pull/447) ([@javiruiz01](https://github.com/javiruiz01))
340
378
  - PanelContext: Eventbus should not filter out local events [#445](https://github.com/grafana/scenes/pull/445) ([@torkelo](https://github.com/torkelo))
341
- - Variables: Support __org and __user variable macros [#449](https://github.com/grafana/scenes/pull/449) ([@torkelo](https://github.com/torkelo))
379
+ - Variables: Support **org and **user variable macros [#449](https://github.com/grafana/scenes/pull/449) ([@torkelo](https://github.com/torkelo))
342
380
  - SceneQueryRunner: Fixes adhoc filters when using a variable data source [#422](https://github.com/grafana/scenes/pull/422) ([@torkelo](https://github.com/torkelo))
343
381
  - VizPanel: Support passing legacyPanelId to PanelProps [#446](https://github.com/grafana/scenes/pull/446) ([@torkelo](https://github.com/torkelo))
344
382
 
@@ -7,22 +7,18 @@ class ActWhenVariableChanged extends SceneObjectBase {
7
7
  this._runningEffect = null;
8
8
  this._variableDependency = new VariableDependencyConfig(this, {
9
9
  variableNames: [this.state.variableName],
10
- onVariableUpdatesCompleted: this._onVariableChanged.bind(this)
10
+ onReferencedVariableValueChanged: this._onVariableChanged.bind(this)
11
11
  });
12
12
  }
13
- _onVariableChanged(changedVariables) {
13
+ _onVariableChanged(variable) {
14
14
  const effect = this.state.onChange;
15
- for (const variable of changedVariables) {
16
- if (this.state.variableName === variable.state.name) {
17
- if (this._runningEffect) {
18
- this._runningEffect();
19
- this._runningEffect = null;
20
- }
21
- const cancellation = effect(variable, this);
22
- if (cancellation) {
23
- this._runningEffect = cancellation;
24
- }
25
- }
15
+ if (this._runningEffect) {
16
+ this._runningEffect();
17
+ this._runningEffect = null;
18
+ }
19
+ const cancellation = effect(variable, this);
20
+ if (cancellation) {
21
+ this._runningEffect = cancellation;
26
22
  }
27
23
  }
28
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ActWhenVariableChanged.js","sources":["../../../src/behaviors/ActWhenVariableChanged.ts"],"sourcesContent":["import { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObjectState } from '../core/types';\nimport { SceneVariable } from '../variables/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\n\ninterface ActWhenVariableChangedState extends SceneObjectState {\n // The name of the variable to subscribe to changes to.\n variableName: string;\n /**\n * The handler to run when a variable changes.\n * @param variable The variable that changed\n * @param behavior The behavior instance where this onChange handler added to.\n * You can use this to access the parent SceneObject where this behavior exists.\n * You can also use this with the sceneGraph util functions to find objects from this scene graph location.\n * @returns Return a cancellation function if you do anything async like issue a query.\n */\n onChange: (variable: SceneVariable, behavior: ActWhenVariableChanged) => (() => void) | void;\n}\n\n/**\n * This behavior will run an effect function when specified variables change\n */\n\nexport class ActWhenVariableChanged extends SceneObjectBase<ActWhenVariableChangedState> {\n private _runningEffect: null | (() => void) = null;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n variableNames: [this.state.variableName],\n onVariableUpdatesCompleted: this._onVariableChanged.bind(this),\n });\n\n private _onVariableChanged(changedVariables: Set<SceneVariable>): void {\n const effect = this.state.onChange;\n\n for (const variable of changedVariables) {\n if (this.state.variableName === variable.state.name) {\n if (this._runningEffect) {\n this._runningEffect();\n this._runningEffect = null;\n }\n\n const cancellation = effect(variable, this);\n if (cancellation) {\n this._runningEffect = cancellation;\n }\n }\n }\n }\n}\n"],"names":[],"mappings":";;;AAuBO,MAAM,+BAA+B,eAA6C,CAAA;AAAA,EAAlF,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AACL,IAAA,IAAA,CAAQ,cAAsC,GAAA,IAAA,CAAA;AAE9C,IAAU,IAAA,CAAA,mBAAA,GAAsB,IAAI,wBAAA,CAAyB,IAAM,EAAA;AAAA,MACjE,aAAe,EAAA,CAAC,IAAK,CAAA,KAAA,CAAM,YAAY,CAAA;AAAA,MACvC,0BAA4B,EAAA,IAAA,CAAK,kBAAmB,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KAC9D,CAAA,CAAA;AAAA,GAAA;AAAA,EAEO,mBAAmB,gBAA4C,EAAA;AACrE,IAAM,MAAA,MAAA,GAAS,KAAK,KAAM,CAAA,QAAA,CAAA;AAE1B,IAAA,KAAA,MAAW,YAAY,gBAAkB,EAAA;AACvC,MAAA,IAAI,IAAK,CAAA,KAAA,CAAM,YAAiB,KAAA,QAAA,CAAS,MAAM,IAAM,EAAA;AACnD,QAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,UAAA,IAAA,CAAK,cAAe,EAAA,CAAA;AACpB,UAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAA;AAAA,SACxB;AAEA,QAAM,MAAA,YAAA,GAAe,MAAO,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAC1C,QAAA,IAAI,YAAc,EAAA;AAChB,UAAA,IAAA,CAAK,cAAiB,GAAA,YAAA,CAAA;AAAA,SACxB;AAAA,OACF;AAAA,KACF;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"ActWhenVariableChanged.js","sources":["../../../src/behaviors/ActWhenVariableChanged.ts"],"sourcesContent":["import { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObjectState } from '../core/types';\nimport { SceneVariable } from '../variables/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\n\ninterface ActWhenVariableChangedState extends SceneObjectState {\n // The name of the variable to subscribe to changes to.\n variableName: string;\n /**\n * The handler to run when a variable changes.\n * @param variable The variable that changed\n * @param behavior The behavior instance where this onChange handler added to.\n * You can use this to access the parent SceneObject where this behavior exists.\n * You can also use this with the sceneGraph util functions to find objects from this scene graph location.\n * @returns Return a cancellation function if you do anything async like issue a query.\n */\n onChange: (variable: SceneVariable, behavior: ActWhenVariableChanged) => (() => void) | void;\n}\n\n/**\n * This behavior will run an effect function when specified variables change\n */\n\nexport class ActWhenVariableChanged extends SceneObjectBase<ActWhenVariableChangedState> {\n private _runningEffect: null | (() => void) = null;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n variableNames: [this.state.variableName],\n onReferencedVariableValueChanged: this._onVariableChanged.bind(this),\n });\n\n private _onVariableChanged(variable: SceneVariable): void {\n const effect = this.state.onChange;\n\n if (this._runningEffect) {\n this._runningEffect();\n this._runningEffect = null;\n }\n\n const cancellation = effect(variable, this);\n if (cancellation) {\n this._runningEffect = cancellation;\n }\n }\n}\n"],"names":[],"mappings":";;;AAuBO,MAAM,+BAA+B,eAA6C,CAAA;AAAA,EAAlF,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AACL,IAAA,IAAA,CAAQ,cAAsC,GAAA,IAAA,CAAA;AAE9C,IAAU,IAAA,CAAA,mBAAA,GAAsB,IAAI,wBAAA,CAAyB,IAAM,EAAA;AAAA,MACjE,aAAe,EAAA,CAAC,IAAK,CAAA,KAAA,CAAM,YAAY,CAAA;AAAA,MACvC,gCAAkC,EAAA,IAAA,CAAK,kBAAmB,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,KACpE,CAAA,CAAA;AAAA,GAAA;AAAA,EAEO,mBAAmB,QAA+B,EAAA;AACxD,IAAM,MAAA,MAAA,GAAS,KAAK,KAAM,CAAA,QAAA,CAAA;AAE1B,IAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,MAAA,IAAA,CAAK,cAAe,EAAA,CAAA;AACpB,MAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAA;AAAA,KACxB;AAEA,IAAM,MAAA,YAAA,GAAe,MAAO,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAC1C,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,IAAA,CAAK,cAAiB,GAAA,YAAA,CAAA;AAAA,KACxB;AAAA,GACF;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../src/core/types.ts"],"sourcesContent":["import React from 'react';\nimport { MonoTypeOperatorFunction, Observable, Unsubscribable } from 'rxjs';\n\nimport {\n BusEvent,\n BusEventHandler,\n BusEventType,\n DataFrame,\n DataQueryRequest,\n DataTopic,\n DataTransformContext,\n PanelData,\n TimeRange,\n} from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\n\nimport { SceneVariableDependencyConfigLike, SceneVariables } from '../variables/types';\nimport { SceneObjectRef } from './SceneObjectRef';\n\nexport interface SceneObjectState {\n key?: string;\n $timeRange?: SceneTimeRangeLike;\n $data?: SceneDataProvider;\n $variables?: SceneVariables;\n /**\n * @experimental\n * Can be used to add extra behaviors to a scene object.\n * These are activated when the their parent scene object is activated.\n */\n $behaviors?: Array<SceneObject | SceneStatelessBehavior>;\n}\n\nexport interface SceneLayoutChildOptions {\n width?: number | string;\n height?: number | string;\n xSizing?: 'fill' | 'content';\n ySizing?: 'fill' | 'content';\n x?: number;\n y?: number;\n minWidth?: number | string;\n minHeight?: number | string;\n isDraggable?: boolean;\n isResizable?: boolean;\n}\n\nexport interface SceneComponentProps<T> {\n model: T;\n}\n\nexport type SceneComponent<TModel> = (props: SceneComponentProps<TModel>) => React.ReactElement | null;\n\nexport interface SceneDataState extends SceneObjectState {\n data?: PanelData;\n}\n\nexport interface SceneObject<TState extends SceneObjectState = SceneObjectState> {\n /** The current state */\n readonly state: TState;\n\n /** True when there is a React component mounted for this Object */\n readonly isActive: boolean;\n\n /** SceneObject parent */\n readonly parent?: SceneObject;\n\n /** This abtractions declares what variables the scene object depends on and how to handle when they change value. **/\n readonly variableDependency?: SceneVariableDependencyConfigLike;\n\n /** This abstraction declares URL sync dependencies of a scene object. **/\n readonly urlSync?: SceneObjectUrlSyncHandler;\n\n /** Subscribe to state changes */\n subscribeToState(handler: SceneStateChangedHandler<TState>): Unsubscribable;\n\n /** Subscribe to a scene event */\n subscribeToEvent<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;\n\n /** Publish an event and optionally bubble it up the scene */\n publishEvent(event: BusEvent, bubble?: boolean): void;\n\n /** Utility hook that wraps useObservable. Used by React components to subscribes to state changes */\n useState(): TState;\n\n /** How to modify state */\n setState(state: Partial<TState>): void;\n\n /**\n * Called when the Component is mounted. This will also activate any $data, $variables or $timeRange scene object on this level.\n * Don't override this in your custom SceneObjects, instead use addActivationHandler from the constructor.\n **/\n activate(): CancelActivationHandler;\n\n /** Get the scene root */\n getRoot(): SceneObject;\n\n /** Returns a deep clone this object and all its children */\n clone(state?: Partial<TState>): this;\n\n /** A React component to use for rendering the object */\n Component(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** Force a re-render, should only be needed when variable values change */\n forceRender(): void;\n\n /** Returns a SceneObjectRef that will resolve to this object */\n getRef(): SceneObjectRef<this>;\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 addActivationHandler(handler: SceneActivationHandler): void;\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 forEachChild(callback: (child: SceneObject) => void): void;\n}\n\nexport type SceneActivationHandler = () => SceneDeactivationHandler | void;\nexport type SceneDeactivationHandler = () => void;\n\n/**\n * Function returned by activate() that when called will deactivate the object if it's the last activator\n **/\nexport type CancelActivationHandler = () => void;\n\nexport interface SceneLayoutState extends SceneObjectState {\n children: SceneObject[];\n}\n\nexport interface SceneLayout<T extends SceneLayoutState = SceneLayoutState> extends SceneObject<T> {\n isDraggable(): boolean;\n getDragClass?(): string;\n getDragClassCancel?(): string;\n}\n\nexport interface SceneTimeRangeState extends SceneObjectState {\n from: string;\n to: string;\n fiscalYearStartMonth?: number;\n value: TimeRange;\n timeZone?: TimeZone;\n /** weekStart will change the global date locale so having multiple different weekStart values is not supported */\n weekStart?: string;\n /**\n * @internal\n * To enable feature parity with the old time range picker, not sure if it will be kept.\n * Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.\n * */\n UNSAFE_nowDelay?: string;\n}\n\nexport interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {\n onTimeZoneChange(timeZone: TimeZone): void;\n onTimeRangeChange(timeRange: TimeRange): void;\n onRefresh(): void;\n getTimeZone(): TimeZone;\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return obj.useState !== undefined;\n}\n\nexport interface SceneObjectWithUrlSync extends SceneObject {\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n}\n\nexport interface SceneObjectUrlSyncHandler {\n getKeys(): string[];\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n}\n\nexport interface DataRequestEnricher {\n // Return partial data query request that will be merged with the original request provided by SceneQueryRunner\n enrichDataRequest(source: SceneObject): Partial<DataQueryRequest> | null;\n}\n\nexport function isDataRequestEnricher(obj: any): obj is DataRequestEnricher {\n return 'enrichDataRequest' in obj;\n}\n\nexport type SceneObjectUrlValue = string | string[] | undefined | null;\nexport type SceneObjectUrlValues = Record<string, SceneObjectUrlValue>;\n\nexport type CustomTransformOperator = (context: DataTransformContext) => MonoTypeOperatorFunction<DataFrame[]>;\nexport type SceneStateChangedHandler<TState> = (newState: TState, prevState: TState) => void;\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport interface SceneDataProviderResultLike<O, T> {\n origin: O;\n data: T;\n}\n\nexport type SceneDataProviderResult = SceneDataProviderResultLike<SceneDataProvider, PanelData>;\nexport type SceneDataLayerProviderResult = SceneDataProviderResultLike<SceneDataLayerProvider, PanelData> & {\n topic: DataTopic;\n};\n\nexport interface SceneDataProvider extends SceneObject<SceneDataState> {\n setContainerWidth?: (width: number) => void;\n isDataReadyToDisplay?: () => boolean;\n cancelQuery?: () => void;\n getResultsStream?(): Observable<SceneDataProviderResult>;\n}\n\nexport interface SceneDataLayerProviderState extends SceneObjectState {\n name: string;\n description?: string;\n data?: PanelData;\n isEnabled?: boolean;\n isHidden?: boolean;\n\n // Private runtime state\n _isWaitingForVariables?: boolean;\n}\n\nexport interface SceneDataLayerProvider extends SceneObject<SceneDataLayerProviderState> {\n topic: DataTopic;\n cancelQuery?: () => void;\n getResultsStream(): Observable<SceneDataLayerProviderResult>;\n}\n\nexport interface DataLayerFilter {\n panelId: number;\n}\n\nexport interface SceneStatelessBehavior<T extends SceneObject = any> {\n (sceneObject: T): CancelActivationHandler | void;\n}\n\nexport type ControlsLayout = 'horizontal' | 'vertical';\n"],"names":[],"mappings":"AAiKO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,KAAA,CAAA,CAAA;AAC1B,CAAA;AAkBO,SAAS,sBAAsB,GAAsC,EAAA;AAC1E,EAAA,OAAO,mBAAuB,IAAA,GAAA,CAAA;AAChC;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../src/core/types.ts"],"sourcesContent":["import React from 'react';\nimport { MonoTypeOperatorFunction, Observable, Unsubscribable } from 'rxjs';\n\nimport {\n BusEvent,\n BusEventHandler,\n BusEventType,\n DataFrame,\n DataQueryRequest,\n DataTopic,\n DataTransformContext,\n PanelData,\n TimeRange,\n} from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\n\nimport { SceneVariableDependencyConfigLike, SceneVariables } from '../variables/types';\nimport { SceneObjectRef } from './SceneObjectRef';\n\nexport interface SceneObjectState {\n key?: string;\n $timeRange?: SceneTimeRangeLike;\n $data?: SceneDataProvider;\n $variables?: SceneVariables;\n /**\n * @experimental\n * Can be used to add extra behaviors to a scene object.\n * These are activated when the their parent scene object is activated.\n */\n $behaviors?: Array<SceneObject | SceneStatelessBehavior>;\n}\n\nexport interface SceneLayoutChildOptions {\n width?: number | string;\n height?: number | string;\n xSizing?: 'fill' | 'content';\n ySizing?: 'fill' | 'content';\n x?: number;\n y?: number;\n minWidth?: number | string;\n minHeight?: number | string;\n isDraggable?: boolean;\n isResizable?: boolean;\n}\n\nexport interface SceneComponentProps<T> {\n model: T;\n}\n\nexport type SceneComponent<TModel> = (props: SceneComponentProps<TModel>) => React.ReactElement | null;\n\nexport interface SceneDataState extends SceneObjectState {\n data?: PanelData;\n}\n\nexport interface SceneObject<TState extends SceneObjectState = SceneObjectState> {\n /** The current state */\n readonly state: TState;\n\n /** True when there is a React component mounted for this Object */\n readonly isActive: boolean;\n\n /** SceneObject parent */\n readonly parent?: SceneObject;\n\n /** This abtractions declares what variables the scene object depends on and how to handle when they change value. **/\n readonly variableDependency?: SceneVariableDependencyConfigLike;\n\n /** This abstraction declares URL sync dependencies of a scene object. **/\n readonly urlSync?: SceneObjectUrlSyncHandler;\n\n /** Subscribe to state changes */\n subscribeToState(handler: SceneStateChangedHandler<TState>): Unsubscribable;\n\n /** Subscribe to a scene event */\n subscribeToEvent<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;\n\n /** Publish an event and optionally bubble it up the scene */\n publishEvent(event: BusEvent, bubble?: boolean): void;\n\n /** Utility hook that wraps useObservable. Used by React components to subscribes to state changes */\n useState(): TState;\n\n /** How to modify state */\n setState(state: Partial<TState>): void;\n\n /**\n * Called when the Component is mounted. This will also activate any $data, $variables or $timeRange scene object on this level.\n * Don't override this in your custom SceneObjects, instead use addActivationHandler from the constructor.\n **/\n activate(): CancelActivationHandler;\n\n /** Get the scene root */\n getRoot(): SceneObject;\n\n /** Returns a deep clone this object and all its children */\n clone(state?: Partial<TState>): this;\n\n /** A React component to use for rendering the object */\n Component(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** Force a re-render, should only be needed when variable values change */\n forceRender(): void;\n\n /** Returns a SceneObjectRef that will resolve to this object */\n getRef(): SceneObjectRef<this>;\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 addActivationHandler(handler: SceneActivationHandler): void;\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 forEachChild(callback: (child: SceneObject) => void): void;\n}\n\nexport type SceneActivationHandler = () => SceneDeactivationHandler | void;\nexport type SceneDeactivationHandler = () => void;\n\n/**\n * Function returned by activate() that when called will deactivate the object if it's the last activator\n **/\nexport type CancelActivationHandler = () => void;\n\nexport interface SceneLayoutState extends SceneObjectState {\n children: SceneObject[];\n}\n\nexport interface SceneLayout<T extends SceneLayoutState = SceneLayoutState> extends SceneObject<T> {\n isDraggable(): boolean;\n getDragClass?(): string;\n getDragClassCancel?(): string;\n}\n\nexport interface SceneTimeRangeState extends SceneObjectState {\n from: string;\n to: string;\n fiscalYearStartMonth?: number;\n value: TimeRange;\n timeZone?: TimeZone;\n /** weekStart will change the global date locale so having multiple different weekStart values is not supported */\n weekStart?: string;\n /**\n * @internal\n * To enable feature parity with the old time range picker, not sure if it will be kept.\n * Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.\n * */\n UNSAFE_nowDelay?: string;\n}\n\nexport interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {\n onTimeZoneChange(timeZone: TimeZone): void;\n onTimeRangeChange(timeRange: TimeRange): void;\n onRefresh(): void;\n getTimeZone(): TimeZone;\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return obj.useState !== undefined;\n}\n\nexport interface SceneObjectWithUrlSync extends SceneObject {\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n}\n\nexport interface SceneObjectUrlSyncHandler {\n getKeys(): string[];\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n}\n\nexport interface DataRequestEnricher {\n // Return partial data query request that will be merged with the original request provided by SceneQueryRunner\n enrichDataRequest(source: SceneObject): Partial<DataQueryRequest> | null;\n}\n\nexport function isDataRequestEnricher(obj: any): obj is DataRequestEnricher {\n return 'enrichDataRequest' in obj;\n}\n\nexport type SceneObjectUrlValue = string | string[] | undefined | null;\nexport type SceneObjectUrlValues = Record<string, SceneObjectUrlValue>;\n\nexport type CustomTransformOperator = (context: DataTransformContext) => MonoTypeOperatorFunction<DataFrame[]>;\nexport type SceneStateChangedHandler<TState> = (newState: TState, prevState: TState) => void;\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport interface SceneDataProviderResultLike<O, T> {\n origin: O;\n data: T;\n}\n\nexport type SceneDataProviderResult = SceneDataProviderResultLike<SceneDataProvider, PanelData>;\nexport type SceneDataLayerProviderResult = SceneDataProviderResultLike<SceneDataLayerProvider, PanelData> & {\n topic: DataTopic;\n};\n\nexport interface SceneDataProvider extends SceneObject<SceneDataState> {\n setContainerWidth?: (width: number) => void;\n isDataReadyToDisplay?: () => boolean;\n cancelQuery?: () => void;\n getResultsStream?(): Observable<SceneDataProviderResult>;\n}\n\nexport interface SceneDataLayerProviderState extends SceneObjectState {\n name: string;\n description?: string;\n data?: PanelData;\n isEnabled?: boolean;\n isHidden?: boolean;\n}\n\nexport interface SceneDataLayerProvider extends SceneObject<SceneDataLayerProviderState> {\n topic: DataTopic;\n cancelQuery?: () => void;\n getResultsStream(): Observable<SceneDataLayerProviderResult>;\n}\n\nexport interface DataLayerFilter {\n panelId: number;\n}\n\nexport interface SceneStatelessBehavior<T extends SceneObject = any> {\n (sceneObject: T): CancelActivationHandler | void;\n}\n\nexport type ControlsLayout = 'horizontal' | 'vertical';\n"],"names":[],"mappings":"AAiKO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,KAAA,CAAA,CAAA;AAC1B,CAAA;AAkBO,SAAS,sBAAsB,GAAsC,EAAA;AAC1E,EAAA,OAAO,mBAAuB,IAAA,GAAA,CAAA;AAChC;;;;"}
package/dist/esm/index.js CHANGED
@@ -3,6 +3,7 @@ import { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntim
3
3
  import { cloneSceneObjectState } from './core/sceneGraph/utils.js';
4
4
  import { registerRuntimeDataSource } from './querying/RuntimeDataSource.js';
5
5
  export { RuntimeDataSource, registerRuntimeDataSource } from './querying/RuntimeDataSource.js';
6
+ import { syncStateFromSearchParams, getUrlState } from './services/utils.js';
6
7
  import { registerVariableMacro } from './variables/macros/index.js';
7
8
  import { renderPrometheusLabelFilters } from './variables/utils.js';
8
9
  import { isAdHocVariable, isConstantVariable, isCustomVariable, isDataSourceVariable, isIntervalVariable, isQueryVariable, isTextBoxVariable } from './variables/variants/guards.js';
@@ -38,7 +39,7 @@ export { LocalValueVariable } from './variables/variants/LocalValueVariable.js';
38
39
  export { IntervalVariable } from './variables/variants/IntervalVariable.js';
39
40
  export { AdHocFilterSet } from './variables/adhoc/AdHocFiltersSet.js';
40
41
  export { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable.js';
41
- export { getUrlSyncManager } from './services/UrlSyncManager.js';
42
+ export { UrlSyncManager, getUrlSyncManager } from './services/UrlSyncManager.js';
42
43
  export { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig.js';
43
44
  export { EmbeddedScene } from './components/EmbeddedScene.js';
44
45
  export { VizPanel } from './components/VizPanel/VizPanel.js';
@@ -74,6 +75,8 @@ const sceneUtils = {
74
75
  registerRuntimeDataSource,
75
76
  registerVariableMacro,
76
77
  cloneSceneObjectState,
78
+ syncStateFromSearchParams,
79
+ getUrlState,
77
80
  renderPrometheusLabelFilters,
78
81
  isAdHocVariable,
79
82
  isConstantVariable,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/utils';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { registerVariableMacro } from './variables/macros';\nimport { renderPrometheusLabelFilters } from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport * as behaviors from './behaviors';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { SceneDataLayers } from './querying/SceneDataLayers';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer } from './querying/SceneDataTransformer';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport { MultiValueVariable } from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport { AdHocFilterSet } from './variables/adhoc/AdHocFiltersSet';\nexport { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike as UrlSyncManager, getUrlSyncManager } from './services/UrlSyncManager';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport { PanelBuilders, PanelOptionsBuilders, FieldConfigBuilders } from './core/PanelBuilders';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n renderPrometheusLabelFilters,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8FO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,4BAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/utils';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\nimport { registerVariableMacro } from './variables/macros';\nimport { renderPrometheusLabelFilters } from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport * as behaviors from './behaviors';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { SceneDataLayers } from './querying/SceneDataLayers';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer } from './querying/SceneDataTransformer';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport { MultiValueVariable } from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport { AdHocFilterSet } from './variables/adhoc/AdHocFiltersSet';\nexport { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike, UrlSyncManager, getUrlSyncManager } from './services/UrlSyncManager';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport { PanelBuilders, PanelOptionsBuilders, FieldConfigBuilders } from './core/PanelBuilders';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n syncStateFromSearchParams,\n getUrlState,\n renderPrometheusLabelFilters,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+FO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,4BAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AACF;;;;"}
@@ -48,7 +48,7 @@ class SceneQueryRunner extends SceneObjectBase {
48
48
  this._scopedVars = { __sceneObject: { value: this, text: "__sceneObject" } };
49
49
  this._variableDependency = new VariableDependencyConfig(this, {
50
50
  statePaths: ["queries", "datasource"],
51
- onVariableUpdatesCompleted: (variables, dependencyChanged) => this.onVariableUpdatesCompleted(variables, dependencyChanged)
51
+ onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this)
52
52
  });
53
53
  this.prepareRequests = (timeRange, ds) => {
54
54
  const comparer = this.getTimeCompare();
@@ -210,22 +210,10 @@ class SceneQueryRunner extends SceneObjectBase {
210
210
  })
211
211
  });
212
212
  }
213
- onVariableUpdatesCompleted(_variablesThatHaveChanged, dependencyChanged) {
214
- if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {
215
- return;
216
- }
217
- if (this.state._isWaitingForVariables) {
218
- this.runQueries();
219
- return;
220
- }
221
- if (dependencyChanged) {
222
- this.runQueries();
223
- }
213
+ onVariableUpdatesCompleted() {
214
+ this.runQueries();
224
215
  }
225
216
  shouldRunQueriesOnActivate() {
226
- if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {
227
- return false;
228
- }
229
217
  if (this._variableValueRecorder.hasDependenciesChanged(this)) {
230
218
  writeSceneLog(
231
219
  "SceneQueryRunner",
@@ -308,19 +296,17 @@ class SceneQueryRunner extends SceneObjectBase {
308
296
  }
309
297
  async runWithTimeRange(timeRange) {
310
298
  var _a, _b;
299
+ if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {
300
+ return;
301
+ }
311
302
  if (!this._dataLayersSub) {
312
303
  this._handleDataLayers();
313
304
  }
314
- const runRequest = getRunRequest();
315
305
  (_a = this._querySub) == null ? void 0 : _a.unsubscribe();
316
- if (sceneGraph.hasVariableDependencyInLoadingState(this)) {
306
+ if (this._variableDependency.hasDependencyInLoadingState()) {
317
307
  writeSceneLog("SceneQueryRunner", "Variable dependency is in loading state, skipping query execution");
318
- this.setState({ _isWaitingForVariables: true });
319
308
  return;
320
309
  }
321
- if (this.state._isWaitingForVariables) {
322
- this.setState({ _isWaitingForVariables: false });
323
- }
324
310
  const { queries } = this.state;
325
311
  if (!(queries == null ? void 0 : queries.length)) {
326
312
  this._setNoDataState();
@@ -332,6 +318,7 @@ class SceneQueryRunner extends SceneObjectBase {
332
318
  if (!this._adhocFilterSet) {
333
319
  this.findAndSubscribeToAdhocFilters(datasource == null ? void 0 : datasource.uid);
334
320
  }
321
+ const runRequest = getRunRequest();
335
322
  const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);
336
323
  writeSceneLog("SceneQueryRunner", "Starting runRequest", this.state.key);
337
324
  if (secondaryRequest) {
@@ -1 +1 @@
1
- {"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { forkJoin, map, merge, mergeAll, Observable, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\nimport { getRunRequest, toDataQueryError } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataLayerProviderResult,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneVariable } from '../variables/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { SceneTimeRangeCompare } from '../components/SceneTimeRangeCompare';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { timeShiftQueryResponseOperator } from './timeShiftQueryResponseOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { AdHocFilterSet } from '../variables/adhoc/AdHocFiltersSet';\nimport { findActiveAdHocFilterSetByUid } from '../variables/adhoc/patchGetAdhocFilters';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: DataQueryExtended[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _isWaitingForVariables?: boolean;\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>();\n private _scopedVars = { __sceneObject: { value: this, text: '__sceneObject' } };\n private _layerAnnotations?: DataFrame[];\n private _resultAnnotations?: DataFrame[];\n\n // Closest filter set if found)\n private _adhocFilterSet?: AdHocFilterSet;\n private _adhocFilterSub?: Unsubscribable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onVariableUpdatesCompleted: (variables, dependencyChanged) =>\n this.onVariableUpdatesCompleted(variables, dependencyChanged),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n const timeRange = sceneGraph.getTimeRange(this);\n const comparer = this.getTimeCompare();\n\n if (comparer) {\n this._subs.add(\n comparer.subscribeToState((n, p) => {\n if (n.compareWith !== p.compareWith) {\n this.runQueries();\n }\n })\n );\n }\n\n this._subs.add(\n timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n })\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n const observables: Array<Observable<SceneDataLayerProviderResult>> = [];\n\n // This keeps track of multiple SceneDataLayers. The key responsibility od this map is to make sure individual from independent SceneDataLayers do not overwrite each other.\n const resultsMap: Map<string, PanelData> = new Map();\n\n if (dataLayers.length > 0) {\n dataLayers.forEach((layer) => {\n observables.push(layer.getResultsStream());\n });\n\n // possibly we want to combine the results from all layers and only then update, but this is tricky ;(\n this._dataLayersSub = merge(observables)\n .pipe(\n mergeAll(),\n map((v) => {\n // Is there a better, rxjs only way to combine multiple same-data-topic observables?\n // Indexing by origin state key is to make sure we do not duplicate/overwrite data from the different origins\n resultsMap.set(v.origin.state.key!, v.data);\n return resultsMap;\n })\n )\n .subscribe((result) => {\n this._onLayersReceived(result);\n });\n }\n }\n\n private _onLayersReceived(results: Map<string, PanelData>) {\n const timeRange = sceneGraph.getTimeRange(this);\n const dataLayers = sceneGraph.getDataLayers(this);\n const { dataLayerFilter } = this.state;\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n const layerKeys = Array.from(results.keys());\n\n Array.from(results.values()).forEach((result, i) => {\n const layerKey = layerKeys[i];\n const layer = dataLayers.find((l) => l.state.key === layerKey);\n if (layer) {\n if (layer.topic === DataTopic.Annotations && result[DataTopic.Annotations]) {\n annotations = annotations.concat(result[DataTopic.Annotations]);\n }\n\n // @ts-expect-error TODO: use DataTopic.AlertStates when exposed from core grafana\n if (layer.topic === 'alertStates') {\n alertStates = alertStates.concat(result.series);\n }\n }\n });\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n const baseStateUpdate = this.state.data ? this.state.data : { ...emptyPanelData, timeRange: timeRange.state.value };\n\n this._layerAnnotations = annotations;\n this.setState({\n data: {\n ...baseStateUpdate,\n annotations: [...(this._resultAnnotations ?? []), ...annotations],\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * Handles some tricky cases where we need to run queries even when they have not changed in case\n * the query execution on activate was stopped due to VariableSet still not having processed all variables.\n */\n private onVariableUpdatesCompleted(_variablesThatHaveChanged: Set<SceneVariable>, dependencyChanged: boolean) {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return;\n }\n\n if (this.state._isWaitingForVariables) {\n this.runQueries();\n return;\n }\n\n if (dependencyChanged) {\n this.runQueries();\n }\n }\n\n private shouldRunQueriesOnActivate() {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return false;\n }\n\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n stateTimeRange.from.unix() === dataTimeRange.from.unix() &&\n stateTimeRange.to.unix() === dataTimeRange.to.unix()\n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n if (this._adhocFilterSub) {\n this._adhocFilterSub.unsubscribe();\n }\n\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this.state._hasFetchedData) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...this.state.data!, state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If data layers subscription doesn't exist, create one\n //\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n const runRequest = getRunRequest();\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (sceneGraph.hasVariableDependencyInLoadingState(this)) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ _isWaitingForVariables: true });\n return;\n }\n\n // If we were waiting for variables, clear that flag\n if (this.state._isWaitingForVariables) {\n this.setState({ _isWaitingForVariables: false });\n }\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const ds = await getDataSource(datasource, this._scopedVars);\n\n if (!this._adhocFilterSet) {\n this.findAndSubscribeToAdhocFilters(datasource?.uid);\n }\n\n const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n if (secondaryRequest) {\n // change subscribe callback below to pipe operator\n this._querySub = forkJoin([runRequest(ds, request), runRequest(ds, secondaryRequest)])\n .pipe(timeShiftQueryResponseOperator)\n .subscribe(this.onDataReceived);\n } else {\n this._querySub = runRequest(ds, request).subscribe(this.onDataReceived);\n }\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n const result = {\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n };\n\n this.setState({\n data: result,\n });\n }\n }\n\n private prepareRequests = (\n timeRange: SceneTimeRangeLike,\n ds: DataSourceApi\n ): [DataQueryRequest, DataQueryRequest | undefined] => {\n const comparer = this.getTimeCompare();\n const { minInterval, queries } = this.state;\n\n let secondaryRequest: DataQueryRequest | undefined;\n\n let request: DataQueryRequest = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n panelId: 1,\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFilterSet) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = this._adhocFilterSet.state.filters;\n }\n\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n // TODO interpolate minInterval\n const lowerIntervalLimit = minInterval ? minInterval : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n const primaryTimeRange = timeRange.state.value;\n if (comparer) {\n const secondaryTimeRange = comparer.getCompareTimeRange(primaryTimeRange);\n if (secondaryTimeRange) {\n secondaryRequest = {\n ...request,\n range: secondaryTimeRange,\n requestId: getNextRequestId(),\n };\n\n request = {\n ...request,\n range: primaryTimeRange,\n };\n }\n }\n\n return [request, secondaryRequest];\n };\n\n private onDataReceived = (data: PanelData) => {\n this._results.next({ origin: this, data });\n\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Will combine annotations & alert state from data layer providers\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this._resultAnnotations = data.annotations;\n this.setState({\n data: dataWithLayersApplied,\n _hasFetchedData: hasFetchedData,\n });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this.state.data && this.state.data.annotations) {\n data.annotations = (data.annotations || []).concat(this._layerAnnotations ?? []);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Will walk up the scene graph and find the closest time range compare object\n * It performs buttom-up search, including shallow search across object children for supporting controls/header actions\n */\n private getTimeCompare() {\n if (!this.parent) {\n return null;\n }\n return getClosest(this.parent, (s) => {\n let found = null;\n if (s instanceof SceneTimeRangeCompare) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof SceneTimeRangeCompare) {\n found = child;\n }\n });\n\n return found;\n });\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdhocFilters(uid: string | undefined) {\n const set = findActiveAdHocFilterSetByUid(uid);\n\n if (!set || set.state.applyMode !== 'same-datasource') {\n return;\n }\n\n // Subscribe to filter set state changes so that queries are re-issued when it changes\n this._adhocFilterSet = set;\n this._adhocFilterSub = this._adhocFilterSet?.subscribeToState(() => this.runQueries());\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { forkJoin, map, merge, mergeAll, Observable, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\nimport { getRunRequest, toDataQueryError } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataLayerProviderResult,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { SceneTimeRangeCompare } from '../components/SceneTimeRangeCompare';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { timeShiftQueryResponseOperator } from './timeShiftQueryResponseOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { AdHocFilterSet } from '../variables/adhoc/AdHocFiltersSet';\nimport { findActiveAdHocFilterSetByUid } from '../variables/adhoc/patchGetAdhocFilters';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: DataQueryExtended[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>();\n private _scopedVars = { __sceneObject: { value: this, text: '__sceneObject' } };\n private _layerAnnotations?: DataFrame[];\n private _resultAnnotations?: DataFrame[];\n\n // Closest filter set if found)\n private _adhocFilterSet?: AdHocFilterSet;\n private _adhocFilterSub?: Unsubscribable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n const timeRange = sceneGraph.getTimeRange(this);\n const comparer = this.getTimeCompare();\n\n if (comparer) {\n this._subs.add(\n comparer.subscribeToState((n, p) => {\n if (n.compareWith !== p.compareWith) {\n this.runQueries();\n }\n })\n );\n }\n\n this._subs.add(\n timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n })\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n const observables: Array<Observable<SceneDataLayerProviderResult>> = [];\n\n // This keeps track of multiple SceneDataLayers. The key responsibility od this map is to make sure individual from independent SceneDataLayers do not overwrite each other.\n const resultsMap: Map<string, PanelData> = new Map();\n\n if (dataLayers.length > 0) {\n dataLayers.forEach((layer) => {\n observables.push(layer.getResultsStream());\n });\n\n // possibly we want to combine the results from all layers and only then update, but this is tricky ;(\n this._dataLayersSub = merge(observables)\n .pipe(\n mergeAll(),\n map((v) => {\n // Is there a better, rxjs only way to combine multiple same-data-topic observables?\n // Indexing by origin state key is to make sure we do not duplicate/overwrite data from the different origins\n resultsMap.set(v.origin.state.key!, v.data);\n return resultsMap;\n })\n )\n .subscribe((result) => {\n this._onLayersReceived(result);\n });\n }\n }\n\n private _onLayersReceived(results: Map<string, PanelData>) {\n const timeRange = sceneGraph.getTimeRange(this);\n const dataLayers = sceneGraph.getDataLayers(this);\n const { dataLayerFilter } = this.state;\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n const layerKeys = Array.from(results.keys());\n\n Array.from(results.values()).forEach((result, i) => {\n const layerKey = layerKeys[i];\n const layer = dataLayers.find((l) => l.state.key === layerKey);\n if (layer) {\n if (layer.topic === DataTopic.Annotations && result[DataTopic.Annotations]) {\n annotations = annotations.concat(result[DataTopic.Annotations]);\n }\n\n // @ts-expect-error TODO: use DataTopic.AlertStates when exposed from core grafana\n if (layer.topic === 'alertStates') {\n alertStates = alertStates.concat(result.series);\n }\n }\n });\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n const baseStateUpdate = this.state.data ? this.state.data : { ...emptyPanelData, timeRange: timeRange.state.value };\n\n this._layerAnnotations = annotations;\n this.setState({\n data: {\n ...baseStateUpdate,\n annotations: [...(this._resultAnnotations ?? []), ...annotations],\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * This tries to start a new query whenever a variable completes or is changed.\n *\n * We care about variable update completions even when the variable has not changed and even when it is not a direct dependency.\n * Example: Variables A and B (B depends on A). A update depends on time range. So when time change query runner will\n * find that variable A is loading which is a dependency on of variable B so will set _isWaitingForVariables to true and\n * not issue any query.\n *\n * When A completes it's loading (with no value change, so B never updates) it will cause a call of this function letting\n * the query runner know that A has completed, and in case _isWaitingForVariables we try to run the query. The query will\n * only run if all variables are in a non loading state so in other scenarios where a query depends on many variables this will\n * be called many times until all dependencies are in a non loading state. *\n */\n private onVariableUpdatesCompleted() {\n this.runQueries();\n }\n\n private shouldRunQueriesOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n stateTimeRange.from.unix() === dataTimeRange.from.unix() &&\n stateTimeRange.to.unix() === dataTimeRange.to.unix()\n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n if (this._adhocFilterSub) {\n this._adhocFilterSub.unsubscribe();\n }\n\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this.state._hasFetchedData) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...this.state.data!, state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return;\n }\n\n // If data layers subscription doesn't exist, create one\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n return;\n }\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const ds = await getDataSource(datasource, this._scopedVars);\n\n if (!this._adhocFilterSet) {\n this.findAndSubscribeToAdhocFilters(datasource?.uid);\n }\n\n const runRequest = getRunRequest();\n const [request, secondaryRequest] = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n if (secondaryRequest) {\n // change subscribe callback below to pipe operator\n this._querySub = forkJoin([runRequest(ds, request), runRequest(ds, secondaryRequest)])\n .pipe(timeShiftQueryResponseOperator)\n .subscribe(this.onDataReceived);\n } else {\n this._querySub = runRequest(ds, request).subscribe(this.onDataReceived);\n }\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n const result = {\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n };\n\n this.setState({\n data: result,\n });\n }\n }\n\n private prepareRequests = (\n timeRange: SceneTimeRangeLike,\n ds: DataSourceApi\n ): [DataQueryRequest, DataQueryRequest | undefined] => {\n const comparer = this.getTimeCompare();\n const { minInterval, queries } = this.state;\n\n let secondaryRequest: DataQueryRequest | undefined;\n\n let request: DataQueryRequest = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n panelId: 1,\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFilterSet) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = this._adhocFilterSet.state.filters;\n }\n\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n // TODO interpolate minInterval\n const lowerIntervalLimit = minInterval ? minInterval : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n const primaryTimeRange = timeRange.state.value;\n if (comparer) {\n const secondaryTimeRange = comparer.getCompareTimeRange(primaryTimeRange);\n if (secondaryTimeRange) {\n secondaryRequest = {\n ...request,\n range: secondaryTimeRange,\n requestId: getNextRequestId(),\n };\n\n request = {\n ...request,\n range: primaryTimeRange,\n };\n }\n }\n\n return [request, secondaryRequest];\n };\n\n private onDataReceived = (data: PanelData) => {\n this._results.next({ origin: this, data });\n\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Will combine annotations & alert state from data layer providers\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this._resultAnnotations = data.annotations;\n this.setState({\n data: dataWithLayersApplied,\n _hasFetchedData: hasFetchedData,\n });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this.state.data && this.state.data.annotations) {\n data.annotations = (data.annotations || []).concat(this._layerAnnotations ?? []);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Will walk up the scene graph and find the closest time range compare object\n * It performs buttom-up search, including shallow search across object children for supporting controls/header actions\n */\n private getTimeCompare() {\n if (!this.parent) {\n return null;\n }\n return getClosest(this.parent, (s) => {\n let found = null;\n if (s instanceof SceneTimeRangeCompare) {\n return s;\n }\n s.forEachChild((child) => {\n if (child instanceof SceneTimeRangeCompare) {\n found = child;\n }\n });\n\n return found;\n });\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdhocFilters(uid: string | undefined) {\n const set = findActiveAdHocFilterSetByUid(uid);\n\n if (!set || set.state.applyMode !== 'same-datasource') {\n return;\n }\n\n // Subscribe to filter set state changes so that queries are re-issued when it changes\n this._adhocFilterSet = set;\n this._adhocFilterSub = this._adhocFilterSet?.subscribeToState(() => this.runQueries());\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n"],"names":[],"mappings":"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"}
@@ -30,7 +30,7 @@ class SceneDataLayerBase extends SceneObjectBase {
30
30
  this._results = new ReplaySubject();
31
31
  this._variableValueRecorder = new VariableValueRecorder();
32
32
  this._variableDependency = new VariableDependencyConfig(this, {
33
- onVariableUpdatesCompleted: (variables, dependencyChanged) => this.onVariableUpdatesCompleted(variables, dependencyChanged)
33
+ onVariableUpdateCompleted: this.onVariableUpdateCompleted.bind(this)
34
34
  });
35
35
  this._variableDependency.setPaths(variableDependencyStatePaths);
36
36
  this.addActivationHandler(() => this.onActivate());
@@ -73,15 +73,8 @@ class SceneDataLayerBase extends SceneObjectBase {
73
73
  this.onDisable();
74
74
  this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);
75
75
  }
76
- onVariableUpdatesCompleted(variables, dependencyChanged) {
77
- writeSceneLog("SceneDataLayerBase", "onVariableUpdatesCompleted");
78
- if (this.state._isWaitingForVariables && this.shouldRunLayerOnActivate()) {
79
- this.runLayer();
80
- return;
81
- }
82
- if (dependencyChanged) {
83
- this.runLayer();
84
- }
76
+ onVariableUpdateCompleted() {
77
+ this.runLayer();
85
78
  }
86
79
  cancelQuery() {
87
80
  if (this.querySub) {
@@ -1 +1 @@
1
- {"version":3,"file":"SceneDataLayerBase.js","sources":["../../../../src/querying/layers/SceneDataLayerBase.ts"],"sourcesContent":["import { DataTopic, PanelData } from '@grafana/data';\nimport { ReplaySubject, Unsubscribable } from 'rxjs';\nimport { emptyPanelData } from '../../core/SceneDataNode';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport {\n CancelActivationHandler,\n SceneDataLayerProvider,\n SceneDataLayerProviderResult,\n SceneDataLayerProviderState,\n} from '../../core/types';\nimport { setBaseClassState } from '../../utils/utils';\nimport { writeSceneLog } from '../../utils/writeSceneLog';\nimport { SceneVariable } from '../../variables/types';\nimport { VariableDependencyConfig } from '../../variables/VariableDependencyConfig';\nimport { VariableValueRecorder } from '../../variables/VariableValueRecorder';\n\n/**\n * Base class for data layer. Handles common implementation including enabling/disabling layer and publishing results.\n */\nexport abstract class SceneDataLayerBase<T extends SceneDataLayerProviderState>\n extends SceneObjectBase<T>\n implements SceneDataLayerProvider\n{\n /**\n * Subscription to query results. Should be set when layer runs a query.\n */\n protected querySub?: Unsubscribable;\n\n /**\n * Subject to emit results to.\n */\n private _results = new ReplaySubject<SceneDataLayerProviderResult>();\n\n /**\n * Implement logic for enabling the layer. This is called when layer is enabled or when layer is enabled when activated.\n * Use i.e. to setup subscriptions that will trigger layer updates.\n */\n public abstract onEnable(): void;\n\n /**\n * Implement logic for disabling the layer. This is called when layer is disabled.\n * Use i.e. to unsubscribe from subscriptions that trigger layer updates.\n */\n public abstract onDisable(): void;\n\n /**\n * Implement logic running the layer and setting up the querySub subscription.\n */\n protected abstract runLayer(): void;\n\n /**\n * Data topic that a given layer is responsible for.\n */\n public abstract topic: DataTopic;\n\n private _variableValueRecorder = new VariableValueRecorder();\n\n protected _variableDependency: VariableDependencyConfig<T> = new VariableDependencyConfig(this, {\n onVariableUpdatesCompleted: (variables, dependencyChanged) =>\n this.onVariableUpdatesCompleted(variables, dependencyChanged),\n });\n\n /**\n * For variables support in data layer provide variableDependencyStatePaths with keys of the state to be scanned for variables.\n */\n public constructor(initialState: T, variableDependencyStatePaths: Array<keyof T> = []) {\n super({\n isEnabled: true,\n ...initialState,\n });\n\n this._variableDependency.setPaths(variableDependencyStatePaths);\n this.addActivationHandler(() => this.onActivate());\n }\n\n protected onActivate(): CancelActivationHandler {\n if (this.state.isEnabled) {\n this.onEnable();\n }\n\n if (this.shouldRunLayerOnActivate()) {\n this.runLayer();\n }\n\n // Subscribe to layer state changes and enable/disable layer accordingly.\n this.subscribeToState((n, p) => {\n if (!n.isEnabled && this.querySub) {\n // When layer disabled, cancel query and call onDisable that should publish empty results.\n this.querySub.unsubscribe();\n this.querySub = undefined;\n this.onDisable();\n\n // Manually publishing the results to state and results stream as publishPublish results has a guard for the layer to be enabled.\n this._results.next({\n origin: this,\n data: emptyPanelData,\n topic: this.topic,\n });\n this.setStateHelper({\n data: emptyPanelData,\n });\n }\n\n if (n.isEnabled && !p.isEnabled) {\n // When layer enabled, run queries.\n this.onEnable();\n this.runLayer();\n }\n });\n\n return () => {\n this.onDeactivate();\n };\n }\n\n protected onDeactivate(): void {\n if (this.querySub) {\n this.querySub.unsubscribe();\n this.querySub = undefined;\n }\n\n this.onDisable();\n\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n protected onVariableUpdatesCompleted(variables: Set<SceneVariable>, dependencyChanged: boolean): void {\n writeSceneLog('SceneDataLayerBase', 'onVariableUpdatesCompleted');\n if (this.state._isWaitingForVariables && this.shouldRunLayerOnActivate()) {\n this.runLayer();\n return;\n }\n\n if (dependencyChanged) {\n this.runLayer();\n }\n }\n\n public cancelQuery() {\n if (this.querySub) {\n this.querySub.unsubscribe();\n this.querySub = undefined;\n\n this.publishResults(emptyPanelData, this.topic);\n }\n }\n\n protected publishResults(data: PanelData, topic: DataTopic) {\n if (this.state.isEnabled) {\n this._results.next({\n origin: this,\n data,\n topic,\n });\n\n this.setStateHelper({\n data,\n });\n }\n }\n\n public getResultsStream() {\n return this._results;\n }\n\n private shouldRunLayerOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneDataLayerBase',\n 'Variable dependency changed while inactive, shouldRunLayerOnActivate returns true'\n );\n return true;\n }\n\n if (this.state.data) {\n return false;\n }\n\n return true;\n }\n\n /**\n * This helper function is to counter the contravariance of setState\n */\n private setStateHelper(state: Partial<SceneDataLayerProviderState>) {\n setBaseClassState<SceneDataLayerProviderState>(this, state);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SceneDataLayerBase.js","sources":["../../../../src/querying/layers/SceneDataLayerBase.ts"],"sourcesContent":["import { DataTopic, PanelData } from '@grafana/data';\nimport { ReplaySubject, Unsubscribable } from 'rxjs';\nimport { emptyPanelData } from '../../core/SceneDataNode';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport {\n CancelActivationHandler,\n SceneDataLayerProvider,\n SceneDataLayerProviderResult,\n SceneDataLayerProviderState,\n} from '../../core/types';\nimport { setBaseClassState } from '../../utils/utils';\nimport { writeSceneLog } from '../../utils/writeSceneLog';\nimport { VariableDependencyConfig } from '../../variables/VariableDependencyConfig';\nimport { VariableValueRecorder } from '../../variables/VariableValueRecorder';\n\n/**\n * Base class for data layer. Handles common implementation including enabling/disabling layer and publishing results.\n */\nexport abstract class SceneDataLayerBase<T extends SceneDataLayerProviderState>\n extends SceneObjectBase<T>\n implements SceneDataLayerProvider\n{\n /**\n * Subscription to query results. Should be set when layer runs a query.\n */\n protected querySub?: Unsubscribable;\n\n /**\n * Subject to emit results to.\n */\n private _results = new ReplaySubject<SceneDataLayerProviderResult>();\n\n /**\n * Implement logic for enabling the layer. This is called when layer is enabled or when layer is enabled when activated.\n * Use i.e. to setup subscriptions that will trigger layer updates.\n */\n public abstract onEnable(): void;\n\n /**\n * Implement logic for disabling the layer. This is called when layer is disabled.\n * Use i.e. to unsubscribe from subscriptions that trigger layer updates.\n */\n public abstract onDisable(): void;\n\n /**\n * Implement logic running the layer and setting up the querySub subscription.\n */\n protected abstract runLayer(): void;\n\n /**\n * Data topic that a given layer is responsible for.\n */\n public abstract topic: DataTopic;\n\n private _variableValueRecorder = new VariableValueRecorder();\n\n protected _variableDependency: VariableDependencyConfig<T> = new VariableDependencyConfig(this, {\n onVariableUpdateCompleted: this.onVariableUpdateCompleted.bind(this),\n });\n\n /**\n * For variables support in data layer provide variableDependencyStatePaths with keys of the state to be scanned for variables.\n */\n public constructor(initialState: T, variableDependencyStatePaths: Array<keyof T> = []) {\n super({\n isEnabled: true,\n ...initialState,\n });\n\n this._variableDependency.setPaths(variableDependencyStatePaths);\n this.addActivationHandler(() => this.onActivate());\n }\n\n protected onActivate(): CancelActivationHandler {\n if (this.state.isEnabled) {\n this.onEnable();\n }\n\n if (this.shouldRunLayerOnActivate()) {\n this.runLayer();\n }\n\n // Subscribe to layer state changes and enable/disable layer accordingly.\n this.subscribeToState((n, p) => {\n if (!n.isEnabled && this.querySub) {\n // When layer disabled, cancel query and call onDisable that should publish empty results.\n this.querySub.unsubscribe();\n this.querySub = undefined;\n this.onDisable();\n\n // Manually publishing the results to state and results stream as publishPublish results has a guard for the layer to be enabled.\n this._results.next({\n origin: this,\n data: emptyPanelData,\n topic: this.topic,\n });\n this.setStateHelper({\n data: emptyPanelData,\n });\n }\n\n if (n.isEnabled && !p.isEnabled) {\n // When layer enabled, run queries.\n this.onEnable();\n this.runLayer();\n }\n });\n\n return () => {\n this.onDeactivate();\n };\n }\n\n protected onDeactivate(): void {\n if (this.querySub) {\n this.querySub.unsubscribe();\n this.querySub = undefined;\n }\n\n this.onDisable();\n\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n protected onVariableUpdateCompleted(): void {\n this.runLayer();\n }\n\n public cancelQuery() {\n if (this.querySub) {\n this.querySub.unsubscribe();\n this.querySub = undefined;\n\n this.publishResults(emptyPanelData, this.topic);\n }\n }\n\n protected publishResults(data: PanelData, topic: DataTopic) {\n if (this.state.isEnabled) {\n this._results.next({\n origin: this,\n data,\n topic,\n });\n\n this.setStateHelper({\n data,\n });\n }\n }\n\n public getResultsStream() {\n return this._results;\n }\n\n private shouldRunLayerOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneDataLayerBase',\n 'Variable dependency changed while inactive, shouldRunLayerOnActivate returns true'\n );\n return true;\n }\n\n if (this.state.data) {\n return false;\n }\n\n return true;\n }\n\n /**\n * This helper function is to counter the contravariance of setState\n */\n private setStateHelper(state: Partial<SceneDataLayerProviderState>) {\n setBaseClassState<SceneDataLayerProviderState>(this, state);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -59,9 +59,8 @@ class AnnotationsDataLayer extends SceneDataLayerBase {
59
59
  if (this.querySub) {
60
60
  this.querySub.unsubscribe();
61
61
  }
62
- if (sceneGraph.hasVariableDependencyInLoadingState(this)) {
62
+ if (this._variableDependency.hasDependencyInLoadingState()) {
63
63
  writeSceneLog("AnnotationsDataLayer", "Variable dependency is in loading state, skipping query execution");
64
- this.setState({ _isWaitingForVariables: true });
65
64
  return;
66
65
  }
67
66
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"AnnotationsDataLayer.js","sources":["../../../../../src/querying/layers/annotations/AnnotationsDataLayer.ts"],"sourcesContent":["import { arrayToDataFrame, DataTopic, AnnotationQuery } from '@grafana/data';\nimport { LoadingState } from '@grafana/schema';\nimport { map, Unsubscribable } from 'rxjs';\nimport { emptyPanelData } from '../../../core/SceneDataNode';\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneDataLayerProvider, SceneTimeRangeLike, SceneDataLayerProviderState } from '../../../core/types';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { getMessageFromError } from '../../../utils/getMessageFromError';\nimport { writeSceneLog } from '../../../utils/writeSceneLog';\nimport { SceneDataLayerBase } from '../SceneDataLayerBase';\nimport { AnnotationQueryResults, executeAnnotationQuery } from './standardAnnotationQuery';\nimport { dedupAnnotations, postProcessQueryResult } from './utils';\n\ninterface AnnotationsDataLayerState extends SceneDataLayerProviderState {\n query: AnnotationQuery;\n}\n\nexport class AnnotationsDataLayer\n extends SceneDataLayerBase<AnnotationsDataLayerState>\n implements SceneDataLayerProvider\n{\n private _timeRangeSub: Unsubscribable | undefined;\n public topic = DataTopic.Annotations;\n\n public constructor(initialState: AnnotationsDataLayerState) {\n super(\n {\n isEnabled: true,\n ...initialState,\n },\n ['query']\n );\n }\n\n public onEnable(): void {\n const timeRange = sceneGraph.getTimeRange(this);\n\n this._timeRangeSub = timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n });\n }\n\n public onDisable(): void {\n this._timeRangeSub?.unsubscribe();\n }\n\n public runLayer() {\n writeSceneLog('AnnotationsDataLayer', 'run layer');\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange);\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n const { query } = this.state;\n\n if (this.querySub) {\n this.querySub.unsubscribe();\n }\n\n if (sceneGraph.hasVariableDependencyInLoadingState(this)) {\n writeSceneLog('AnnotationsDataLayer', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ _isWaitingForVariables: true });\n return;\n }\n\n try {\n const ds = await this.resolveDataSource(query);\n\n const queryExecution = executeAnnotationQuery(ds, timeRange, query, this).pipe(\n map((events) => {\n const stateUpdate = this.processEvents(query, events);\n return stateUpdate;\n })\n );\n\n this.querySub = queryExecution.subscribe((stateUpdate) => {\n this.publishResults(stateUpdate, DataTopic.Annotations);\n });\n } catch (e) {\n this.publishResults(\n {\n ...emptyPanelData,\n state: LoadingState.Error,\n errors: [\n {\n message: getMessageFromError(e),\n },\n ],\n },\n DataTopic.Annotations\n );\n console.error('AnnotationsDataLayer error', e);\n }\n }\n\n protected async resolveDataSource(query: AnnotationQuery) {\n return await getDataSource(query.datasource || undefined, {});\n }\n\n protected processEvents(query: AnnotationQuery, events: AnnotationQueryResults) {\n let processedEvents = postProcessQueryResult(query, events.events || []);\n processedEvents = dedupAnnotations(processedEvents);\n\n const stateUpdate = { ...emptyPanelData, state: events.state };\n const df = arrayToDataFrame(processedEvents);\n df.meta = {\n ...df.meta,\n dataTopic: DataTopic.Annotations,\n };\n\n stateUpdate.annotations = [df];\n\n return stateUpdate;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnnotationsDataLayer.js","sources":["../../../../../src/querying/layers/annotations/AnnotationsDataLayer.ts"],"sourcesContent":["import { arrayToDataFrame, DataTopic, AnnotationQuery } from '@grafana/data';\nimport { LoadingState } from '@grafana/schema';\nimport { map, Unsubscribable } from 'rxjs';\nimport { emptyPanelData } from '../../../core/SceneDataNode';\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneDataLayerProvider, SceneTimeRangeLike, SceneDataLayerProviderState } from '../../../core/types';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { getMessageFromError } from '../../../utils/getMessageFromError';\nimport { writeSceneLog } from '../../../utils/writeSceneLog';\nimport { SceneDataLayerBase } from '../SceneDataLayerBase';\nimport { AnnotationQueryResults, executeAnnotationQuery } from './standardAnnotationQuery';\nimport { dedupAnnotations, postProcessQueryResult } from './utils';\n\ninterface AnnotationsDataLayerState extends SceneDataLayerProviderState {\n query: AnnotationQuery;\n}\n\nexport class AnnotationsDataLayer\n extends SceneDataLayerBase<AnnotationsDataLayerState>\n implements SceneDataLayerProvider\n{\n private _timeRangeSub: Unsubscribable | undefined;\n public topic = DataTopic.Annotations;\n\n public constructor(initialState: AnnotationsDataLayerState) {\n super(\n {\n isEnabled: true,\n ...initialState,\n },\n ['query']\n );\n }\n\n public onEnable(): void {\n const timeRange = sceneGraph.getTimeRange(this);\n\n this._timeRangeSub = timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n });\n }\n\n public onDisable(): void {\n this._timeRangeSub?.unsubscribe();\n }\n\n public runLayer() {\n writeSceneLog('AnnotationsDataLayer', 'run layer');\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange);\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n const { query } = this.state;\n\n if (this.querySub) {\n this.querySub.unsubscribe();\n }\n\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('AnnotationsDataLayer', 'Variable dependency is in loading state, skipping query execution');\n return;\n }\n\n try {\n const ds = await this.resolveDataSource(query);\n\n const queryExecution = executeAnnotationQuery(ds, timeRange, query, this).pipe(\n map((events) => {\n const stateUpdate = this.processEvents(query, events);\n return stateUpdate;\n })\n );\n\n this.querySub = queryExecution.subscribe((stateUpdate) => {\n this.publishResults(stateUpdate, DataTopic.Annotations);\n });\n } catch (e) {\n this.publishResults(\n {\n ...emptyPanelData,\n state: LoadingState.Error,\n errors: [\n {\n message: getMessageFromError(e),\n },\n ],\n },\n DataTopic.Annotations\n );\n console.error('AnnotationsDataLayer error', e);\n }\n }\n\n protected async resolveDataSource(query: AnnotationQuery) {\n return await getDataSource(query.datasource || undefined, {});\n }\n\n protected processEvents(query: AnnotationQuery, events: AnnotationQueryResults) {\n let processedEvents = postProcessQueryResult(query, events.events || []);\n processedEvents = dedupAnnotations(processedEvents);\n\n const stateUpdate = { ...emptyPanelData, state: events.state };\n const df = arrayToDataFrame(processedEvents);\n df.meta = {\n ...df.meta,\n dataTopic: DataTopic.Annotations,\n };\n\n stateUpdate.annotations = [df];\n\n return stateUpdate;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ class UniqueUrlKeyMapper {
2
+ constructor() {
3
+ this.index = /* @__PURE__ */ new Map();
4
+ }
5
+ getUniqueKey(key, obj) {
6
+ const objectsWithKey = this.index.get(key);
7
+ if (!objectsWithKey) {
8
+ throw new Error("Cannot find any scene object that uses the key '" + key + "'");
9
+ }
10
+ const address = objectsWithKey.findIndex((o) => o.sceneObject === obj);
11
+ if (address > 0) {
12
+ return `${key}-${address + 1}`;
13
+ }
14
+ return key;
15
+ }
16
+ rebuildIndex(root) {
17
+ this.index.clear();
18
+ this.buildIndex(root, 0);
19
+ }
20
+ buildIndex(sceneObject, depth) {
21
+ if (sceneObject.urlSync) {
22
+ for (const key of sceneObject.urlSync.getKeys()) {
23
+ const hit = this.index.get(key);
24
+ if (hit) {
25
+ hit.push({ sceneObject, depth });
26
+ hit.sort((a, b) => a.depth - b.depth);
27
+ } else {
28
+ this.index.set(key, [{ sceneObject, depth }]);
29
+ }
30
+ }
31
+ }
32
+ sceneObject.forEachChild((child) => this.buildIndex(child, depth + 1));
33
+ }
34
+ }
35
+
36
+ export { UniqueUrlKeyMapper };
37
+ //# sourceMappingURL=UniqueUrlKeyMapper.js.map