@grafana/scenes 5.6.1--canary.840.10038144895.0 → 5.6.1--canary.835.10040331799.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/esm/core/SceneTimeRange.js +47 -14
- package/dist/esm/core/SceneTimeRange.js.map +1 -1
- package/dist/esm/core/types.js.map +1 -1
- package/dist/index.d.ts +19 -0
- package/dist/index.js +45 -12
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
@@ -1,10 +1,10 @@
|
|
1
|
-
import { getTimeZone, setWeekStart } from '@grafana/data';
|
1
|
+
import { getTimeZone, setWeekStart, rangeUtil } from '@grafana/data';
|
2
2
|
import { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig.js';
|
3
3
|
import { SceneObjectBase } from './SceneObjectBase.js';
|
4
4
|
import { getClosest } from './sceneGraph/utils.js';
|
5
5
|
import { parseUrlParam } from '../utils/parseUrlParam.js';
|
6
6
|
import { evaluateTimeRange } from '../utils/evaluateTimeRange.js';
|
7
|
-
import { RefreshEvent,
|
7
|
+
import { RefreshEvent, config } from '@grafana/runtime';
|
8
8
|
|
9
9
|
var __defProp = Object.defineProperty;
|
10
10
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
@@ -35,7 +35,8 @@ class SceneTimeRange extends SceneObjectBase {
|
|
35
35
|
state.fiscalYearStartMonth,
|
36
36
|
state.UNSAFE_nowDelay
|
37
37
|
);
|
38
|
-
|
38
|
+
const refreshOnActivate = (_c = state.refreshOnActivate) != null ? _c : { percent: 10 };
|
39
|
+
super(__spreadValues({ from, to, timeZone, value, refreshOnActivate }, state));
|
39
40
|
this._urlSync = new SceneObjectUrlSyncConfig(this, { keys: ["from", "to", "timezone"] });
|
40
41
|
this.onTimeRangeChange = (timeRange) => {
|
41
42
|
const update = {};
|
@@ -80,7 +81,6 @@ class SceneTimeRange extends SceneObjectBase {
|
|
80
81
|
});
|
81
82
|
this.publishEvent(new RefreshEvent());
|
82
83
|
};
|
83
|
-
(_c = getTemplateSrv()) == null ? void 0 : _c.updateTimeRange(value);
|
84
84
|
this.addActivationHandler(this._onActivate.bind(this));
|
85
85
|
}
|
86
86
|
_onActivate() {
|
@@ -89,19 +89,16 @@ class SceneTimeRange extends SceneObjectBase {
|
|
89
89
|
if (timeZoneSource !== this) {
|
90
90
|
this._subs.add(
|
91
91
|
timeZoneSource.subscribeToState((n, p) => {
|
92
|
-
var _a;
|
93
92
|
if (n.timeZone !== void 0 && n.timeZone !== p.timeZone) {
|
94
|
-
const timeRange = evaluateTimeRange(
|
95
|
-
this.state.from,
|
96
|
-
this.state.to,
|
97
|
-
timeZoneSource.getTimeZone(),
|
98
|
-
this.state.fiscalYearStartMonth,
|
99
|
-
this.state.UNSAFE_nowDelay
|
100
|
-
);
|
101
93
|
this.setState({
|
102
|
-
value:
|
94
|
+
value: evaluateTimeRange(
|
95
|
+
this.state.from,
|
96
|
+
this.state.to,
|
97
|
+
timeZoneSource.getTimeZone(),
|
98
|
+
this.state.fiscalYearStartMonth,
|
99
|
+
this.state.UNSAFE_nowDelay
|
100
|
+
)
|
103
101
|
});
|
104
|
-
(_a = getTemplateSrv()) == null ? void 0 : _a.updateTimeRange(timeRange);
|
105
102
|
}
|
106
103
|
})
|
107
104
|
);
|
@@ -110,12 +107,28 @@ class SceneTimeRange extends SceneObjectBase {
|
|
110
107
|
if (this.state.weekStart) {
|
111
108
|
setWeekStart(this.state.weekStart);
|
112
109
|
}
|
110
|
+
if (rangeUtil.isRelativeTimeRange(this.state.value.raw)) {
|
111
|
+
this.refreshIfStale();
|
112
|
+
}
|
113
113
|
return () => {
|
114
114
|
if (this.state.weekStart) {
|
115
115
|
setWeekStart(config.bootData.user.weekStart);
|
116
116
|
}
|
117
117
|
};
|
118
118
|
}
|
119
|
+
refreshIfStale() {
|
120
|
+
var _a, _b, _c, _d;
|
121
|
+
let ms;
|
122
|
+
if (((_b = (_a = this.state) == null ? void 0 : _a.refreshOnActivate) == null ? void 0 : _b.percent) !== void 0) {
|
123
|
+
ms = this.calculatePercentOfInterval(this.state.refreshOnActivate.percent);
|
124
|
+
}
|
125
|
+
if (((_d = (_c = this.state) == null ? void 0 : _c.refreshOnActivate) == null ? void 0 : _d.afterMs) !== void 0) {
|
126
|
+
ms = Math.min(this.state.refreshOnActivate.afterMs, ms != null ? ms : Infinity);
|
127
|
+
}
|
128
|
+
if (ms !== void 0) {
|
129
|
+
this.refreshRange(ms);
|
130
|
+
}
|
131
|
+
}
|
119
132
|
getTimeZoneSource() {
|
120
133
|
if (!this.parent || !this.parent.parent) {
|
121
134
|
return this;
|
@@ -131,6 +144,26 @@ class SceneTimeRange extends SceneObjectBase {
|
|
131
144
|
}
|
132
145
|
return source;
|
133
146
|
}
|
147
|
+
refreshRange(refreshAfterMs) {
|
148
|
+
var _a;
|
149
|
+
const value = evaluateTimeRange(
|
150
|
+
this.state.from,
|
151
|
+
this.state.to,
|
152
|
+
(_a = this.state.timeZone) != null ? _a : getTimeZone(),
|
153
|
+
this.state.fiscalYearStartMonth,
|
154
|
+
this.state.UNSAFE_nowDelay
|
155
|
+
);
|
156
|
+
const diff = value.to.diff(this.state.value.to, "milliseconds");
|
157
|
+
if (diff >= refreshAfterMs) {
|
158
|
+
this.setState({
|
159
|
+
value
|
160
|
+
});
|
161
|
+
}
|
162
|
+
}
|
163
|
+
calculatePercentOfInterval(percent) {
|
164
|
+
const intervalMs = this.state.value.to.diff(this.state.value.from, "milliseconds");
|
165
|
+
return Math.ceil(intervalMs / percent);
|
166
|
+
}
|
134
167
|
getTimeZone() {
|
135
168
|
if (this.state.timeZone) {
|
136
169
|
return this.state.timeZone;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { getTimeZone, setWeekStart, TimeRange } from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues } from './types';\nimport { getClosest } from './sceneGraph/utils';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { evaluateTimeRange } from '../utils/evaluateTimeRange';\nimport { config, RefreshEvent, getTemplateSrv } from '@grafana/runtime';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to', 'timezone'] });\n\n public constructor(state: Partial<SceneTimeRangeState> = {}) {\n const from = state.from ?? 'now-6h';\n const to = state.to ?? 'now';\n const timeZone = state.timeZone;\n const value = evaluateTimeRange(\n from,\n to,\n timeZone || getTimeZone(),\n state.fiscalYearStartMonth,\n state.UNSAFE_nowDelay\n );\n super({ from, to, timeZone, value, ...state });\n\n getTemplateSrv()?.updateTimeRange(value);\n\n this.addActivationHandler(this._onActivate.bind(this));\n }\n\n private _onActivate() {\n // When SceneTimeRange has no time zone provided, find closest source of time zone and subscribe to it\n if (!this.state.timeZone) {\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this) {\n this._subs.add(\n timeZoneSource.subscribeToState((n, p) => {\n if (n.timeZone !== undefined && n.timeZone !== p.timeZone) {\n const timeRange = evaluateTimeRange(\n this.state.from,\n this.state.to,\n timeZoneSource.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n )\n\n this.setState({\n value: timeRange,\n });\n\n getTemplateSrv()?.updateTimeRange(timeRange);\n }\n })\n );\n }\n }\n\n if (this.state.weekStart) {\n setWeekStart(this.state.weekStart);\n }\n\n // Deactivation handler that restore weekStart if it was changed\n return () => {\n if (this.state.weekStart) {\n setWeekStart(config.bootData.user.weekStart);\n }\n };\n }\n\n /**\n * Will traverse up the scene graph to find the closest SceneTimeRangeLike with time zone set\n */\n private getTimeZoneSource() {\n if (!this.parent || !this.parent.parent) {\n return this;\n }\n // Find the closest source of time zone\n const source = getClosest<SceneTimeRangeLike>(this.parent.parent, (o) => {\n if (o.state.$timeRange && o.state.$timeRange.state.timeZone) {\n return o.state.$timeRange;\n }\n return undefined;\n });\n\n if (!source) {\n return this;\n }\n\n return source;\n }\n\n public getTimeZone(): TimeZone {\n // Return local time zone if provided\n if (this.state.timeZone) {\n return this.state.timeZone;\n }\n\n // Resolve higher level time zone source\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this) {\n return timeZoneSource.state.timeZone!;\n }\n\n // Return default time zone\n return getTimeZone();\n }\n\n public onTimeRangeChange = (timeRange: TimeRange) => {\n const update: Partial<SceneTimeRangeState> = {};\n const updateToEval: Partial<SceneTimeRangeState> = {};\n\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n updateToEval.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n updateToEval.from = timeRange.raw.from.toISOString(true);\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n updateToEval.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n updateToEval.to = timeRange.raw.to.toISOString(true);\n }\n\n update.value = evaluateTimeRange(\n updateToEval.from,\n updateToEval.to,\n this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n );\n\n // Only update if time range actually changed\n if (update.from !== this.state.from || update.to !== this.state.to) {\n this.setState(update);\n }\n };\n\n public onTimeZoneChange = (timeZone: TimeZone) => {\n this.setState({ timeZone });\n };\n\n public onRefresh = () => {\n this.setState({\n value: evaluateTimeRange(\n this.state.from,\n this.state.to,\n this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n ),\n });\n\n this.publishEvent(new RefreshEvent());\n };\n\n public getUrlState() {\n const urlValues: SceneObjectUrlValues = { from: this.state.from, to: this.state.to };\n if (this.state.timeZone) {\n urlValues.timezone = this.state.timeZone;\n }\n\n return urlValues;\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n // ignore if both are missing\n if (!values.to && !values.from) {\n return;\n }\n\n const update: Partial<SceneTimeRangeState> = {};\n const from = parseUrlParam(values.from);\n\n if (from) {\n update.from = from;\n }\n\n const to = parseUrlParam(values.to);\n if (to) {\n update.to = to;\n }\n\n if (typeof values.timezone === 'string') {\n update.timeZone = values.timezone !== '' ? values.timezone : undefined;\n }\n\n update.value = evaluateTimeRange(\n update.from ?? this.state.from,\n update.to ?? this.state.to,\n update.timeZone ?? this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n );\n\n this.setState(update);\n }\n}\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { getTimeZone, rangeUtil, setWeekStart, TimeRange } from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues } from './types';\nimport { getClosest } from './sceneGraph/utils';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { evaluateTimeRange } from '../utils/evaluateTimeRange';\nimport { config, RefreshEvent } from '@grafana/runtime';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to', 'timezone'] });\n\n public constructor(state: Partial<SceneTimeRangeState> = {}) {\n const from = state.from ?? 'now-6h';\n const to = state.to ?? 'now';\n const timeZone = state.timeZone;\n const value = evaluateTimeRange(\n from,\n to,\n timeZone || getTimeZone(),\n state.fiscalYearStartMonth,\n state.UNSAFE_nowDelay\n\n );\n const refreshOnActivate = state.refreshOnActivate ?? {percent: 10}\n super({ from, to, timeZone, value, refreshOnActivate, ...state });\n\n this.addActivationHandler(this._onActivate.bind(this));\n }\n\n private _onActivate() {\n // When SceneTimeRange has no time zone provided, find closest source of time zone and subscribe to it\n if (!this.state.timeZone) {\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this) {\n this._subs.add(\n timeZoneSource.subscribeToState((n, p) => {\n if (n.timeZone !== undefined && n.timeZone !== p.timeZone) {\n this.setState({\n value: evaluateTimeRange(\n this.state.from,\n this.state.to,\n timeZoneSource.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n ),\n });\n }\n })\n );\n }\n }\n\n if (this.state.weekStart) {\n setWeekStart(this.state.weekStart);\n }\n\n if(rangeUtil.isRelativeTimeRange(this.state.value.raw)){\n this.refreshIfStale();\n }\n\n // Deactivation handler that restore weekStart if it was changed\n return () => {\n if (this.state.weekStart) {\n setWeekStart(config.bootData.user.weekStart);\n }\n };\n }\n\n private refreshIfStale() {\n let ms;\n if (this.state?.refreshOnActivate?.percent !== undefined) {\n ms = this.calculatePercentOfInterval(this.state.refreshOnActivate.percent);\n }\n if (this.state?.refreshOnActivate?.afterMs !== undefined) {\n ms = Math.min(this.state.refreshOnActivate.afterMs, ms ?? Infinity);\n }\n if (ms !== undefined) {\n this.refreshRange(ms);\n }\n }\n\n /**\n * Will traverse up the scene graph to find the closest SceneTimeRangeLike with time zone set\n */\n private getTimeZoneSource() {\n if (!this.parent || !this.parent.parent) {\n return this;\n }\n // Find the closest source of time zone\n const source = getClosest<SceneTimeRangeLike>(this.parent.parent, (o) => {\n if (o.state.$timeRange && o.state.$timeRange.state.timeZone) {\n return o.state.$timeRange;\n }\n return undefined;\n });\n\n if (!source) {\n return this;\n }\n\n return source;\n }\n\n /**\n * Refreshes time range if it is older than the invalidation interval\n * @param refreshAfterMs invalidation interval (milliseconds)\n * @private\n */\n private refreshRange(refreshAfterMs: number) {\n const value = evaluateTimeRange(\n this.state.from,\n this.state.to,\n this.state.timeZone ?? getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n );\n\n const diff = value.to.diff(this.state.value.to, 'milliseconds');\n if(diff >= refreshAfterMs){\n this.setState({\n value\n })\n }\n }\n\n private calculatePercentOfInterval(percent: number): number {\n const intervalMs = this.state.value.to.diff(this.state.value.from, 'milliseconds');\n return Math.ceil(intervalMs / percent)\n }\n\n public getTimeZone(): TimeZone {\n // Return local time zone if provided\n if (this.state.timeZone) {\n return this.state.timeZone;\n }\n\n // Resolve higher level time zone source\n const timeZoneSource = this.getTimeZoneSource();\n if (timeZoneSource !== this) {\n return timeZoneSource.state.timeZone!;\n }\n\n // Return default time zone\n return getTimeZone();\n }\n\n public onTimeRangeChange = (timeRange: TimeRange) => {\n const update: Partial<SceneTimeRangeState> = {};\n const updateToEval: Partial<SceneTimeRangeState> = {};\n\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n updateToEval.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n updateToEval.from = timeRange.raw.from.toISOString(true);\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n updateToEval.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n updateToEval.to = timeRange.raw.to.toISOString(true);\n }\n\n update.value = evaluateTimeRange(\n updateToEval.from,\n updateToEval.to,\n this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n );\n\n // Only update if time range actually changed\n if (update.from !== this.state.from || update.to !== this.state.to) {\n this.setState(update);\n }\n };\n\n public onTimeZoneChange = (timeZone: TimeZone) => {\n this.setState({ timeZone });\n };\n\n public onRefresh = () => {\n this.setState({\n value: evaluateTimeRange(\n this.state.from,\n this.state.to,\n this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n ),\n });\n\n this.publishEvent(new RefreshEvent());\n };\n\n public getUrlState() {\n const urlValues: SceneObjectUrlValues = { from: this.state.from, to: this.state.to };\n if (this.state.timeZone) {\n urlValues.timezone = this.state.timeZone;\n }\n\n return urlValues;\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n // ignore if both are missing\n if (!values.to && !values.from) {\n return;\n }\n\n const update: Partial<SceneTimeRangeState> = {};\n const from = parseUrlParam(values.from);\n\n if (from) {\n update.from = from;\n }\n\n const to = parseUrlParam(values.to);\n if (to) {\n update.to = to;\n }\n\n if (typeof values.timezone === 'string') {\n update.timeZone = values.timezone !== '' ? values.timezone : undefined;\n }\n\n update.value = evaluateTimeRange(\n update.from ?? this.state.from,\n update.to ?? this.state.to,\n update.timeZone ?? this.getTimeZone(),\n this.state.fiscalYearStartMonth,\n this.state.UNSAFE_nowDelay\n );\n\n this.setState(update);\n }\n}\n"],"names":[],"mappings":"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"}
|
@@ -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 DataSourceGetTagKeysOptions,\n DataSourceGetTagValuesOptions,\n DataTransformContext,\n PanelData,\n TimeRange,\n} from '@grafana/data';\nimport { DataQuery, DataTopic, 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 interface FiltersRequestEnricher {\n // Return partial getTagKeys or getTagValues query request that will be merged with the original request provided by ad hoc or group by variable\n enrichFiltersRequest(\n source: SceneObject\n ): Partial<DataSourceGetTagKeysOptions | DataSourceGetTagValuesOptions> | null;\n}\n\nexport function isDataRequestEnricher(obj: any): obj is DataRequestEnricher {\n return 'enrichDataRequest' in obj;\n}\n\nexport function isFiltersRequestEnricher(obj: any): obj is FiltersRequestEnricher {\n return 'enrichFiltersRequest' 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 CustomTransformerDefinition =\n | { operator: CustomTransformOperator; topic: DataTopic }\n | CustomTransformOperator;\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 SceneDataProviderResult {\n data: PanelData;\n origin: SceneDataProvider;\n}\n\nexport interface SceneDataProvider<T extends SceneObjectState = SceneDataState> extends SceneObject<T> {\n setContainerWidth?: (width: number) => void;\n isDataReadyToDisplay?: () => boolean;\n cancelQuery?: () => void;\n getResultsStream(): Observable<SceneDataProviderResult>;\n}\n\nexport interface SceneDataLayerProviderState extends SceneDataState {\n name: string;\n description?: string;\n isEnabled?: boolean;\n isHidden?: boolean;\n}\n\nexport interface SceneDataLayerProvider extends SceneDataProvider<SceneDataLayerProviderState> {\n isDataLayer: true;\n}\n\nexport function isDataLayer(obj: SceneObject): obj is SceneDataLayerProvider {\n return 'isDataLayer' in obj;\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\nexport interface UseStateHookOptions {\n /**\n * For some edge cases other scene objects want to subscribe to scene object state for objects\n * that are not active, or whose main React Component can be un-mounted. Set this to true\n * to keep the scene object active even if the React component is unmounted.\n *\n * Normally you would not need this but this can be useful in some edge cases.\n *\n * @experimental\n */\n shouldActivateOrKeepAlive?: boolean;\n}\n\nexport interface SceneDataQuery extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n"],"names":[],"mappings":"AAkKO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,KAAA,CAAA,CAAA;AAC1B,CAAA;AAyBO,SAAS,sBAAsB,GAAsC,EAAA;AAC1E,EAAA,OAAO,mBAAuB,IAAA,GAAA,CAAA;AAChC,CAAA;AAEO,SAAS,yBAAyB,GAAyC,EAAA;AAChF,EAAA,OAAO,sBAA0B,IAAA,GAAA,CAAA;AACnC,CAAA;AAsCO,SAAS,YAAY,GAAiD,EAAA;AAC3E,EAAA,OAAO,aAAiB,IAAA,GAAA,CAAA;AAC1B;;;;"}
|
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 DataSourceGetTagKeysOptions,\n DataSourceGetTagValuesOptions,\n DataTransformContext,\n PanelData,\n TimeRange,\n} from '@grafana/data';\nimport { DataQuery, DataTopic, 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 refreshOnActivate?: {\n /**\n * When set, the time range will invalidate relative ranges after the specified interval has elapsed\n */\n afterMs?: number\n /**\n * When set, the time range will invalidate relative ranges after the specified percentage of the current interval has elapsed.\n * If both invalidate values are set, the smaller value will be used for the given interval.\n */\n percent?: number\n }\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 interface FiltersRequestEnricher {\n // Return partial getTagKeys or getTagValues query request that will be merged with the original request provided by ad hoc or group by variable\n enrichFiltersRequest(\n source: SceneObject\n ): Partial<DataSourceGetTagKeysOptions | DataSourceGetTagValuesOptions> | null;\n}\n\nexport function isDataRequestEnricher(obj: any): obj is DataRequestEnricher {\n return 'enrichDataRequest' in obj;\n}\n\nexport function isFiltersRequestEnricher(obj: any): obj is FiltersRequestEnricher {\n return 'enrichFiltersRequest' 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 CustomTransformerDefinition =\n | { operator: CustomTransformOperator; topic: DataTopic }\n | CustomTransformOperator;\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 SceneDataProviderResult {\n data: PanelData;\n origin: SceneDataProvider;\n}\n\nexport interface SceneDataProvider<T extends SceneObjectState = SceneDataState> extends SceneObject<T> {\n setContainerWidth?: (width: number) => void;\n isDataReadyToDisplay?: () => boolean;\n cancelQuery?: () => void;\n getResultsStream(): Observable<SceneDataProviderResult>;\n}\n\nexport interface SceneDataLayerProviderState extends SceneDataState {\n name: string;\n description?: string;\n isEnabled?: boolean;\n isHidden?: boolean;\n}\n\nexport interface SceneDataLayerProvider extends SceneDataProvider<SceneDataLayerProviderState> {\n isDataLayer: true;\n}\n\nexport function isDataLayer(obj: SceneObject): obj is SceneDataLayerProvider {\n return 'isDataLayer' in obj;\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\nexport interface UseStateHookOptions {\n /**\n * For some edge cases other scene objects want to subscribe to scene object state for objects\n * that are not active, or whose main React Component can be un-mounted. Set this to true\n * to keep the scene object active even if the React component is unmounted.\n *\n * Normally you would not need this but this can be useful in some edge cases.\n *\n * @experimental\n */\n shouldActivateOrKeepAlive?: boolean;\n}\n\nexport interface SceneDataQuery extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n"],"names":[],"mappings":"AA8KO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,KAAA,CAAA,CAAA;AAC1B,CAAA;AAyBO,SAAS,sBAAsB,GAAsC,EAAA;AAC1E,EAAA,OAAO,mBAAuB,IAAA,GAAA,CAAA;AAChC,CAAA;AAEO,SAAS,yBAAyB,GAAyC,EAAA;AAChF,EAAA,OAAO,sBAA0B,IAAA,GAAA,CAAA;AACnC,CAAA;AAsCO,SAAS,YAAY,GAAiD,EAAA;AAC3E,EAAA,OAAO,aAAiB,IAAA,GAAA,CAAA;AAC1B;;;;"}
|
package/dist/index.d.ts
CHANGED
@@ -240,6 +240,17 @@ interface SceneTimeRangeState extends SceneObjectState {
|
|
240
240
|
* Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.
|
241
241
|
* */
|
242
242
|
UNSAFE_nowDelay?: string;
|
243
|
+
refreshOnActivate?: {
|
244
|
+
/**
|
245
|
+
* When set, the time range will invalidate relative ranges after the specified interval has elapsed
|
246
|
+
*/
|
247
|
+
afterMs?: number;
|
248
|
+
/**
|
249
|
+
* When set, the time range will invalidate relative ranges after the specified percentage of the current interval has elapsed.
|
250
|
+
* If both invalidate values are set, the smaller value will be used for the given interval.
|
251
|
+
*/
|
252
|
+
percent?: number;
|
253
|
+
};
|
243
254
|
}
|
244
255
|
interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {
|
245
256
|
onTimeZoneChange(timeZone: TimeZone): void;
|
@@ -1205,10 +1216,18 @@ declare class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implem
|
|
1205
1216
|
protected _urlSync: SceneObjectUrlSyncConfig;
|
1206
1217
|
constructor(state?: Partial<SceneTimeRangeState>);
|
1207
1218
|
private _onActivate;
|
1219
|
+
private refreshIfStale;
|
1208
1220
|
/**
|
1209
1221
|
* Will traverse up the scene graph to find the closest SceneTimeRangeLike with time zone set
|
1210
1222
|
*/
|
1211
1223
|
private getTimeZoneSource;
|
1224
|
+
/**
|
1225
|
+
* Refreshes time range if it is older than the invalidation interval
|
1226
|
+
* @param refreshAfterMs invalidation interval (milliseconds)
|
1227
|
+
* @private
|
1228
|
+
*/
|
1229
|
+
private refreshRange;
|
1230
|
+
private calculatePercentOfInterval;
|
1212
1231
|
getTimeZone(): TimeZone;
|
1213
1232
|
onTimeRangeChange: (timeRange: TimeRange) => void;
|
1214
1233
|
onTimeZoneChange: (timeZone: TimeZone) => void;
|
package/dist/index.js
CHANGED
@@ -732,7 +732,8 @@ class SceneTimeRange extends SceneObjectBase {
|
|
732
732
|
state.fiscalYearStartMonth,
|
733
733
|
state.UNSAFE_nowDelay
|
734
734
|
);
|
735
|
-
|
735
|
+
const refreshOnActivate = (_c = state.refreshOnActivate) != null ? _c : { percent: 10 };
|
736
|
+
super(__spreadValues$E({ from, to, timeZone, value, refreshOnActivate }, state));
|
736
737
|
this._urlSync = new SceneObjectUrlSyncConfig(this, { keys: ["from", "to", "timezone"] });
|
737
738
|
this.onTimeRangeChange = (timeRange) => {
|
738
739
|
const update = {};
|
@@ -777,7 +778,6 @@ class SceneTimeRange extends SceneObjectBase {
|
|
777
778
|
});
|
778
779
|
this.publishEvent(new runtime.RefreshEvent());
|
779
780
|
};
|
780
|
-
(_c = runtime.getTemplateSrv()) == null ? void 0 : _c.updateTimeRange(value);
|
781
781
|
this.addActivationHandler(this._onActivate.bind(this));
|
782
782
|
}
|
783
783
|
_onActivate() {
|
@@ -786,19 +786,16 @@ class SceneTimeRange extends SceneObjectBase {
|
|
786
786
|
if (timeZoneSource !== this) {
|
787
787
|
this._subs.add(
|
788
788
|
timeZoneSource.subscribeToState((n, p) => {
|
789
|
-
var _a;
|
790
789
|
if (n.timeZone !== void 0 && n.timeZone !== p.timeZone) {
|
791
|
-
const timeRange = evaluateTimeRange(
|
792
|
-
this.state.from,
|
793
|
-
this.state.to,
|
794
|
-
timeZoneSource.getTimeZone(),
|
795
|
-
this.state.fiscalYearStartMonth,
|
796
|
-
this.state.UNSAFE_nowDelay
|
797
|
-
);
|
798
790
|
this.setState({
|
799
|
-
value:
|
791
|
+
value: evaluateTimeRange(
|
792
|
+
this.state.from,
|
793
|
+
this.state.to,
|
794
|
+
timeZoneSource.getTimeZone(),
|
795
|
+
this.state.fiscalYearStartMonth,
|
796
|
+
this.state.UNSAFE_nowDelay
|
797
|
+
)
|
800
798
|
});
|
801
|
-
(_a = runtime.getTemplateSrv()) == null ? void 0 : _a.updateTimeRange(timeRange);
|
802
799
|
}
|
803
800
|
})
|
804
801
|
);
|
@@ -807,12 +804,28 @@ class SceneTimeRange extends SceneObjectBase {
|
|
807
804
|
if (this.state.weekStart) {
|
808
805
|
data.setWeekStart(this.state.weekStart);
|
809
806
|
}
|
807
|
+
if (data.rangeUtil.isRelativeTimeRange(this.state.value.raw)) {
|
808
|
+
this.refreshIfStale();
|
809
|
+
}
|
810
810
|
return () => {
|
811
811
|
if (this.state.weekStart) {
|
812
812
|
data.setWeekStart(runtime.config.bootData.user.weekStart);
|
813
813
|
}
|
814
814
|
};
|
815
815
|
}
|
816
|
+
refreshIfStale() {
|
817
|
+
var _a, _b, _c, _d;
|
818
|
+
let ms;
|
819
|
+
if (((_b = (_a = this.state) == null ? void 0 : _a.refreshOnActivate) == null ? void 0 : _b.percent) !== void 0) {
|
820
|
+
ms = this.calculatePercentOfInterval(this.state.refreshOnActivate.percent);
|
821
|
+
}
|
822
|
+
if (((_d = (_c = this.state) == null ? void 0 : _c.refreshOnActivate) == null ? void 0 : _d.afterMs) !== void 0) {
|
823
|
+
ms = Math.min(this.state.refreshOnActivate.afterMs, ms != null ? ms : Infinity);
|
824
|
+
}
|
825
|
+
if (ms !== void 0) {
|
826
|
+
this.refreshRange(ms);
|
827
|
+
}
|
828
|
+
}
|
816
829
|
getTimeZoneSource() {
|
817
830
|
if (!this.parent || !this.parent.parent) {
|
818
831
|
return this;
|
@@ -828,6 +841,26 @@ class SceneTimeRange extends SceneObjectBase {
|
|
828
841
|
}
|
829
842
|
return source;
|
830
843
|
}
|
844
|
+
refreshRange(refreshAfterMs) {
|
845
|
+
var _a;
|
846
|
+
const value = evaluateTimeRange(
|
847
|
+
this.state.from,
|
848
|
+
this.state.to,
|
849
|
+
(_a = this.state.timeZone) != null ? _a : data.getTimeZone(),
|
850
|
+
this.state.fiscalYearStartMonth,
|
851
|
+
this.state.UNSAFE_nowDelay
|
852
|
+
);
|
853
|
+
const diff = value.to.diff(this.state.value.to, "milliseconds");
|
854
|
+
if (diff >= refreshAfterMs) {
|
855
|
+
this.setState({
|
856
|
+
value
|
857
|
+
});
|
858
|
+
}
|
859
|
+
}
|
860
|
+
calculatePercentOfInterval(percent) {
|
861
|
+
const intervalMs = this.state.value.to.diff(this.state.value.from, "milliseconds");
|
862
|
+
return Math.ceil(intervalMs / percent);
|
863
|
+
}
|
831
864
|
getTimeZone() {
|
832
865
|
if (this.state.timeZone) {
|
833
866
|
return this.state.timeZone;
|