@grafana/scenes 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/esm/components/SceneTimeRangeCompare.js +26 -0
- package/dist/esm/components/SceneTimeRangeCompare.js.map +1 -1
- package/dist/esm/core/SceneTimeRange.js +4 -39
- package/dist/esm/core/SceneTimeRange.js.map +1 -1
- package/dist/esm/core/SceneTimeZoneOverride.js +1 -1
- package/dist/esm/core/SceneTimeZoneOverride.js.map +1 -1
- package/dist/esm/utils/evaluateTimeRange.js +15 -0
- package/dist/esm/utils/evaluateTimeRange.js.map +1 -0
- package/dist/esm/utils/parseUrlParam.js +36 -0
- package/dist/esm/utils/parseUrlParam.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +67 -37
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# v1.7.0 (Mon Sep 25 2023)
|
|
2
|
+
|
|
3
|
+
#### 🚀 Enhancement
|
|
4
|
+
|
|
5
|
+
- SceneTimeRangeCompare: Enable URL sync [#360](https://github.com/grafana/scenes/pull/360) ([@dprokop](https://github.com/dprokop))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Dominik Prokop ([@dprokop](https://github.com/dprokop))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
1
13
|
# v1.6.0 (Fri Sep 22 2023)
|
|
2
14
|
|
|
3
15
|
#### 🚀 Enhancement
|
|
@@ -3,6 +3,8 @@ import { rangeUtil, dateTime } from '@grafana/data';
|
|
|
3
3
|
import { ButtonGroup, ToolbarButton, Checkbox, ButtonSelect, Icon } from '@grafana/ui';
|
|
4
4
|
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
5
5
|
import { sceneGraph } from '../core/sceneGraph/index.js';
|
|
6
|
+
import { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig.js';
|
|
7
|
+
import { parseUrlParam } from '../utils/parseUrlParam.js';
|
|
6
8
|
|
|
7
9
|
var __defProp = Object.defineProperty;
|
|
8
10
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -38,6 +40,7 @@ const DEFAULT_COMPARE_OPTIONS = [
|
|
|
38
40
|
class SceneTimeRangeCompare extends SceneObjectBase {
|
|
39
41
|
constructor(state) {
|
|
40
42
|
super(__spreadValues({ compareOptions: DEFAULT_COMPARE_OPTIONS }, state));
|
|
43
|
+
this._urlSync = new SceneObjectUrlSyncConfig(this, { keys: ["compareWith"] });
|
|
41
44
|
this._onActivate = () => {
|
|
42
45
|
const sceneTimeRange = sceneGraph.getTimeRange(this);
|
|
43
46
|
this.setState({ compareOptions: this.getCompareOptions(sceneTimeRange.state.value) });
|
|
@@ -94,6 +97,29 @@ class SceneTimeRangeCompare extends SceneObjectBase {
|
|
|
94
97
|
}
|
|
95
98
|
return void 0;
|
|
96
99
|
}
|
|
100
|
+
getUrlState() {
|
|
101
|
+
return {
|
|
102
|
+
compareWith: this.state.compareWith
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
updateFromUrl(values) {
|
|
106
|
+
if (!values.compareWith) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const compareWith = parseUrlParam(values.compareWith);
|
|
110
|
+
if (compareWith) {
|
|
111
|
+
const compareOptions = this.getCompareOptions(sceneGraph.getTimeRange(this).state.value);
|
|
112
|
+
if (compareOptions.find(({ value }) => value === compareWith)) {
|
|
113
|
+
this.setState({
|
|
114
|
+
compareWith
|
|
115
|
+
});
|
|
116
|
+
} else {
|
|
117
|
+
this.setState({
|
|
118
|
+
compareWith: "__previousPeriod"
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
97
123
|
}
|
|
98
124
|
SceneTimeRangeCompare.Component = SceneTimeRangeCompareRenderer;
|
|
99
125
|
function SceneTimeRangeCompareRenderer({ model }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneTimeRangeCompare.js","sources":["../../../src/components/SceneTimeRangeCompare.tsx"],"sourcesContent":["import React from 'react';\nimport { DateTime, dateTime, rangeUtil, TimeRange } from '@grafana/data';\nimport { ButtonGroup, ButtonSelect, Checkbox, Icon, ToolbarButton } from '@grafana/ui';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\nimport { sceneGraph } from '../core/sceneGraph';\n\nexport interface TimeRangeCompareProvider {\n getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined;\n}\n\ninterface SceneTimeRangeCompareState extends SceneObjectState {\n compareWith?: string;\n compareOptions: Array<{ label: string; value: string }>;\n}\n\nconst PREVIOUS_PERIOD_VALUE = '__previousPeriod';\n\nexport const PREVIOUS_PERIOD_COMPARE_OPTION = {\n label: 'Previous period',\n value: PREVIOUS_PERIOD_VALUE,\n};\n\nexport const DEFAULT_COMPARE_OPTIONS = [\n { label: '1 day before', value: '24h' },\n { label: '3 days before', value: '3d' },\n { label: '1 week before', value: '1w' },\n { label: '2 weeks before', value: '2w' },\n { label: '1 month before', value: '1M' },\n { label: '3 months before', value: '3M' },\n { label: '6 months before', value: '6M' },\n { label: '1 year before', value: '1y' },\n];\n\nexport class SceneTimeRangeCompare\n extends SceneObjectBase<SceneTimeRangeCompareState>\n implements TimeRangeCompareProvider\n{\n static Component = SceneTimeRangeCompareRenderer;\n\n public constructor(state: Partial<SceneTimeRangeCompareState>) {\n super({ compareOptions: DEFAULT_COMPARE_OPTIONS, ...state });\n this.addActivationHandler(this._onActivate);\n }\n\n private _onActivate = () => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n this.setState({ compareOptions: this.getCompareOptions(sceneTimeRange.state.value) });\n\n this._subs.add(\n sceneTimeRange.subscribeToState((timeRange) => {\n const compareOptions = this.getCompareOptions(timeRange.value);\n const stateUpdate: Partial<SceneTimeRangeCompareState> = { compareOptions };\n\n // if current compareWith is not applicable to the new time range, set it to previous period comparison\n if (Boolean(this.state.compareWith) && !compareOptions.find(({ value }) => value === this.state.compareWith)) {\n stateUpdate.compareWith = PREVIOUS_PERIOD_VALUE;\n }\n\n this.setState(stateUpdate);\n })\n );\n };\n\n public getCompareOptions = (timeRange: TimeRange) => {\n const diffDays = Math.ceil(timeRange.to.diff(timeRange.from));\n\n const matchIndex = DEFAULT_COMPARE_OPTIONS.findIndex(({ value }) => {\n const intervalInMs = rangeUtil.intervalToMs(value);\n return intervalInMs >= diffDays;\n });\n\n return [\n PREVIOUS_PERIOD_COMPARE_OPTION,\n ...DEFAULT_COMPARE_OPTIONS.slice(matchIndex).map(({ label, value }) => ({ label, value })),\n ];\n };\n\n public onCompareWithChanged = (compareWith: string) => {\n this.setState({ compareWith });\n };\n\n public onClearCompare = () => {\n this.setState({ compareWith: undefined });\n };\n\n public getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined {\n let compareFrom: DateTime;\n let compareTo: DateTime;\n\n if (this.state.compareWith) {\n if (this.state.compareWith === PREVIOUS_PERIOD_VALUE) {\n const diffMs = timeRange.to.diff(timeRange.from);\n compareFrom = dateTime(timeRange.from!).subtract(diffMs);\n compareTo = dateTime(timeRange.to!).subtract(diffMs);\n } else {\n compareFrom = dateTime(timeRange.from!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n compareTo = dateTime(timeRange.to!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n }\n return {\n from: compareFrom,\n to: compareTo,\n raw: {\n from: compareFrom,\n to: compareTo,\n },\n };\n }\n\n return undefined;\n }\n}\n\nfunction SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>) {\n const { compareWith, compareOptions } = model.useState();\n const [enabled, setEnabled] = React.useState(false || Boolean(compareWith));\n const value = compareOptions.find((o) => o.value === compareWith);\n\n const onClick = () => {\n setEnabled(!enabled);\n if (enabled && Boolean(compareWith)) {\n model.onClearCompare();\n }\n };\n\n return (\n <ButtonGroup>\n <ToolbarButton\n variant=\"canvas\"\n tooltip=\"Enable time frame comparison\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onClick();\n }}\n >\n <Checkbox label=\" \" value={enabled} onClick={onClick} />\n Time frame comparison\n </ToolbarButton>\n\n {enabled ? (\n <ButtonSelect\n variant=\"canvas\"\n value={value}\n options={enabled ? compareOptions : []}\n onChange={(v) => {\n model.onCompareWithChanged(v.value!);\n }}\n />\n ) : (\n <ToolbarButton\n icon={<Icon name=\"angle-down\" size=\"md\" />}\n style={{ cursor: !enabled ? 'not-allowed' : 'pointer' }}\n variant=\"canvas\"\n />\n )}\n </ButtonGroup>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneTimeRangeCompare.js","sources":["../../../src/components/SceneTimeRangeCompare.tsx"],"sourcesContent":["import React from 'react';\nimport { DateTime, dateTime, rangeUtil, TimeRange } from '@grafana/data';\nimport { ButtonGroup, ButtonSelect, Checkbox, Icon, ToolbarButton } from '@grafana/ui';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { parseUrlParam } from '../utils/parseUrlParam';\n\nexport interface TimeRangeCompareProvider {\n getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined;\n}\n\ninterface SceneTimeRangeCompareState extends SceneObjectState {\n compareWith?: string;\n compareOptions: Array<{ label: string; value: string }>;\n}\n\nconst PREVIOUS_PERIOD_VALUE = '__previousPeriod';\n\nexport const PREVIOUS_PERIOD_COMPARE_OPTION = {\n label: 'Previous period',\n value: PREVIOUS_PERIOD_VALUE,\n};\n\nexport const DEFAULT_COMPARE_OPTIONS = [\n { label: '1 day before', value: '24h' },\n { label: '3 days before', value: '3d' },\n { label: '1 week before', value: '1w' },\n { label: '2 weeks before', value: '2w' },\n { label: '1 month before', value: '1M' },\n { label: '3 months before', value: '3M' },\n { label: '6 months before', value: '6M' },\n { label: '1 year before', value: '1y' },\n];\n\nexport class SceneTimeRangeCompare\n extends SceneObjectBase<SceneTimeRangeCompareState>\n implements TimeRangeCompareProvider\n{\n static Component = SceneTimeRangeCompareRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['compareWith'] });\n\n public constructor(state: Partial<SceneTimeRangeCompareState>) {\n super({ compareOptions: DEFAULT_COMPARE_OPTIONS, ...state });\n this.addActivationHandler(this._onActivate);\n }\n\n private _onActivate = () => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n this.setState({ compareOptions: this.getCompareOptions(sceneTimeRange.state.value) });\n\n this._subs.add(\n sceneTimeRange.subscribeToState((timeRange) => {\n const compareOptions = this.getCompareOptions(timeRange.value);\n const stateUpdate: Partial<SceneTimeRangeCompareState> = { compareOptions };\n\n // if current compareWith is not applicable to the new time range, set it to previous period comparison\n if (Boolean(this.state.compareWith) && !compareOptions.find(({ value }) => value === this.state.compareWith)) {\n stateUpdate.compareWith = PREVIOUS_PERIOD_VALUE;\n }\n\n this.setState(stateUpdate);\n })\n );\n };\n\n public getCompareOptions = (timeRange: TimeRange) => {\n const diffDays = Math.ceil(timeRange.to.diff(timeRange.from));\n\n const matchIndex = DEFAULT_COMPARE_OPTIONS.findIndex(({ value }) => {\n const intervalInMs = rangeUtil.intervalToMs(value);\n return intervalInMs >= diffDays;\n });\n\n return [\n PREVIOUS_PERIOD_COMPARE_OPTION,\n ...DEFAULT_COMPARE_OPTIONS.slice(matchIndex).map(({ label, value }) => ({ label, value })),\n ];\n };\n\n public onCompareWithChanged = (compareWith: string) => {\n this.setState({ compareWith });\n };\n\n public onClearCompare = () => {\n this.setState({ compareWith: undefined });\n };\n\n public getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined {\n let compareFrom: DateTime;\n let compareTo: DateTime;\n\n if (this.state.compareWith) {\n if (this.state.compareWith === PREVIOUS_PERIOD_VALUE) {\n const diffMs = timeRange.to.diff(timeRange.from);\n compareFrom = dateTime(timeRange.from!).subtract(diffMs);\n compareTo = dateTime(timeRange.to!).subtract(diffMs);\n } else {\n compareFrom = dateTime(timeRange.from!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n compareTo = dateTime(timeRange.to!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n }\n return {\n from: compareFrom,\n to: compareTo,\n raw: {\n from: compareFrom,\n to: compareTo,\n },\n };\n }\n\n return undefined;\n }\n\n public getUrlState(): SceneObjectUrlValues {\n return {\n compareWith: this.state.compareWith,\n };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n if (!values.compareWith) {\n return;\n }\n\n const compareWith = parseUrlParam(values.compareWith);\n\n if (compareWith) {\n const compareOptions = this.getCompareOptions(sceneGraph.getTimeRange(this).state.value);\n\n if (compareOptions.find(({ value }) => value === compareWith)) {\n this.setState({\n compareWith,\n });\n } else {\n this.setState({\n compareWith: '__previousPeriod',\n });\n }\n }\n }\n}\n\nfunction SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>) {\n const { compareWith, compareOptions } = model.useState();\n const [enabled, setEnabled] = React.useState(false || Boolean(compareWith));\n const value = compareOptions.find((o) => o.value === compareWith);\n\n const onClick = () => {\n setEnabled(!enabled);\n if (enabled && Boolean(compareWith)) {\n model.onClearCompare();\n }\n };\n\n return (\n <ButtonGroup>\n <ToolbarButton\n variant=\"canvas\"\n tooltip=\"Enable time frame comparison\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onClick();\n }}\n >\n <Checkbox label=\" \" value={enabled} onClick={onClick} />\n Time frame comparison\n </ToolbarButton>\n\n {enabled ? (\n <ButtonSelect\n variant=\"canvas\"\n value={value}\n options={enabled ? compareOptions : []}\n onChange={(v) => {\n model.onCompareWithChanged(v.value!);\n }}\n />\n ) : (\n <ToolbarButton\n icon={<Icon name=\"angle-down\" size=\"md\" />}\n style={{ cursor: !enabled ? 'not-allowed' : 'pointer' }}\n variant=\"canvas\"\n />\n )}\n </ButtonGroup>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { getTimeZone
|
|
1
|
+
import { getTimeZone } 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
|
+
import { parseUrlParam } from '../utils/parseUrlParam.js';
|
|
6
|
+
import { evaluateTimeRange } from '../utils/evaluateTimeRange.js';
|
|
5
7
|
|
|
6
8
|
var __defProp = Object.defineProperty;
|
|
7
9
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -115,43 +117,6 @@ class SceneTimeRange extends SceneObjectBase {
|
|
|
115
117
|
this.setState(update);
|
|
116
118
|
}
|
|
117
119
|
}
|
|
118
|
-
function parseUrlParam(value) {
|
|
119
|
-
if (typeof value !== "string") {
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
if (value.indexOf("now") !== -1) {
|
|
123
|
-
return value;
|
|
124
|
-
}
|
|
125
|
-
if (value.length === 8) {
|
|
126
|
-
const utcValue = toUtc(value, "YYYYMMDD");
|
|
127
|
-
if (utcValue.isValid()) {
|
|
128
|
-
return utcValue.toISOString();
|
|
129
|
-
}
|
|
130
|
-
} else if (value.length === 15) {
|
|
131
|
-
const utcValue = toUtc(value, "YYYYMMDDTHHmmss");
|
|
132
|
-
if (utcValue.isValid()) {
|
|
133
|
-
return utcValue.toISOString();
|
|
134
|
-
}
|
|
135
|
-
} else if (value.length === 24) {
|
|
136
|
-
const utcValue = toUtc(value);
|
|
137
|
-
return utcValue.toISOString();
|
|
138
|
-
}
|
|
139
|
-
const epoch = parseInt(value, 10);
|
|
140
|
-
if (!isNaN(epoch)) {
|
|
141
|
-
return toUtc(epoch).toISOString();
|
|
142
|
-
}
|
|
143
|
-
return null;
|
|
144
|
-
}
|
|
145
|
-
function evaluateTimeRange(from, to, timeZone, fiscalYearStartMonth) {
|
|
146
|
-
return {
|
|
147
|
-
from: dateMath.parse(from, false, timeZone, fiscalYearStartMonth),
|
|
148
|
-
to: dateMath.parse(to, true, timeZone, fiscalYearStartMonth),
|
|
149
|
-
raw: {
|
|
150
|
-
from,
|
|
151
|
-
to
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
120
|
|
|
156
|
-
export { SceneTimeRange
|
|
121
|
+
export { SceneTimeRange };
|
|
157
122
|
//# sourceMappingURL=SceneTimeRange.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { dateMath, getTimeZone, TimeRange, toUtc } from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues, SceneObjectUrlValue } from './types';\nimport { getClosest } from './sceneGraph/utils';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to'] });\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(from, to, timeZone || getTimeZone());\n super({ from, to, timeZone, value, ...state });\n\n this.addActivationHandler(this._onActivate);\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(this.state.from, this.state.to, timeZoneSource.getTimeZone()),\n });\n }\n })\n );\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\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n }\n\n update.value = evaluateTimeRange(update.from, update.to, this.getTimeZone());\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({ value: evaluateTimeRange(this.state.from, this.state.to, this.getTimeZone()) });\n };\n\n public getUrlState() {\n return { from: this.state.from, to: this.state.to };\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 update.value = evaluateTimeRange(update.from ?? this.state.from, update.to ?? this.state.to, this.getTimeZone());\n this.setState(update);\n }\n}\n\nexport function parseUrlParam(value: SceneObjectUrlValue): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n if (value.indexOf('now') !== -1) {\n return value;\n }\n\n if (value.length === 8) {\n const utcValue = toUtc(value, 'YYYYMMDD');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 15) {\n const utcValue = toUtc(value, 'YYYYMMDDTHHmmss');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 24) {\n const utcValue = toUtc(value);\n return utcValue.toISOString();\n }\n\n const epoch = parseInt(value, 10);\n if (!isNaN(epoch)) {\n return toUtc(epoch).toISOString();\n }\n\n return null;\n}\n\nexport function evaluateTimeRange(\n from: string,\n to: string,\n timeZone: TimeZone,\n fiscalYearStartMonth?: number\n): TimeRange {\n return {\n from: dateMath.parse(from, false, timeZone, fiscalYearStartMonth)!,\n to: dateMath.parse(to, true, timeZone, fiscalYearStartMonth)!,\n raw: {\n from: from,\n to: to,\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { getTimeZone, 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';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to'] });\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(from, to, timeZone || getTimeZone());\n super({ from, to, timeZone, value, ...state });\n\n this.addActivationHandler(this._onActivate);\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(this.state.from, this.state.to, timeZoneSource.getTimeZone()),\n });\n }\n })\n );\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\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n }\n\n update.value = evaluateTimeRange(update.from, update.to, this.getTimeZone());\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({ value: evaluateTimeRange(this.state.from, this.state.to, this.getTimeZone()) });\n };\n\n public getUrlState() {\n return { from: this.state.from, to: this.state.to };\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 update.value = evaluateTimeRange(update.from ?? this.state.from, update.to ?? this.state.to, this.getTimeZone());\n this.setState(update);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { evaluateTimeRange } from './SceneTimeRange.js';
|
|
2
1
|
import { SceneTimeRangeTransformerBase } from './SceneTimeRangeTransformerBase.js';
|
|
3
2
|
import { getDefaultTimeRange } from '@grafana/data';
|
|
3
|
+
import { evaluateTimeRange } from '../utils/evaluateTimeRange.js';
|
|
4
4
|
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __defProps = Object.defineProperties;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneTimeZoneOverride.js","sources":["../../../src/core/SceneTimeZoneOverride.tsx"],"sourcesContent":["import { TimeZone } from '@grafana/schema';\nimport {
|
|
1
|
+
{"version":3,"file":"SceneTimeZoneOverride.js","sources":["../../../src/core/SceneTimeZoneOverride.tsx"],"sourcesContent":["import { TimeZone } from '@grafana/schema';\nimport { SceneTimeRangeLike, SceneTimeRangeState } from './types';\nimport { SceneTimeRangeTransformerBase } from './SceneTimeRangeTransformerBase';\nimport { getDefaultTimeRange } from '@grafana/data';\nimport { evaluateTimeRange } from '../utils/evaluateTimeRange';\n\ninterface SceneTimeZoneOverrideState extends SceneTimeRangeState {\n timeZone: TimeZone;\n}\n\nexport class SceneTimeZoneOverride\n extends SceneTimeRangeTransformerBase<SceneTimeZoneOverrideState>\n implements SceneTimeRangeLike\n{\n public constructor(state: Omit<SceneTimeZoneOverrideState, 'from' | 'to' | 'value'>) {\n super({\n ...state,\n timeZone: state.timeZone,\n // We set a default time range here. It will be overwritten on activation based on ancestor time range.\n from: 'now-6h',\n to: 'now',\n value: getDefaultTimeRange(),\n });\n }\n\n protected ancestorTimeRangeChanged(timeRange: SceneTimeRangeState): void {\n this.setState({\n ...timeRange,\n timeZone: this.state.timeZone,\n value: evaluateTimeRange(timeRange.from, timeRange.to, this.state.timeZone),\n });\n }\n\n public getTimeZone(): TimeZone {\n return this.state.timeZone;\n }\n\n public onTimeZoneChange(timeZone: string): void {\n this.setState({ timeZone, value: evaluateTimeRange(this.state.from, this.state.to, this.state.timeZone) });\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAUO,MAAM,8BACH,6BAEV,CAAA;AAAA,EACS,YAAY,KAAkE,EAAA;AACnF,IAAA,KAAA,CAAM,iCACD,KADC,CAAA,EAAA;AAAA,MAEJ,UAAU,KAAM,CAAA,QAAA;AAAA,MAEhB,IAAM,EAAA,QAAA;AAAA,MACN,EAAI,EAAA,KAAA;AAAA,MACJ,OAAO,mBAAoB,EAAA;AAAA,KAC5B,CAAA,CAAA,CAAA;AAAA,GACH;AAAA,EAEU,yBAAyB,SAAsC,EAAA;AACvE,IAAK,IAAA,CAAA,QAAA,CAAS,iCACT,SADS,CAAA,EAAA;AAAA,MAEZ,QAAA,EAAU,KAAK,KAAM,CAAA,QAAA;AAAA,MACrB,KAAA,EAAO,kBAAkB,SAAU,CAAA,IAAA,EAAM,UAAU,EAAI,EAAA,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,KAC3E,CAAA,CAAA,CAAA;AAAA,GACH;AAAA,EAEO,WAAwB,GAAA;AAC7B,IAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAAA,GACpB;AAAA,EAEO,iBAAiB,QAAwB,EAAA;AAC9C,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,QAAU,EAAA,KAAA,EAAO,kBAAkB,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA,IAAA,CAAK,MAAM,EAAI,EAAA,IAAA,CAAK,KAAM,CAAA,QAAQ,GAAG,CAAA,CAAA;AAAA,GAC3G;AACF;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { dateMath } from '@grafana/data';
|
|
2
|
+
|
|
3
|
+
function evaluateTimeRange(from, to, timeZone, fiscalYearStartMonth) {
|
|
4
|
+
return {
|
|
5
|
+
from: dateMath.parse(from, false, timeZone, fiscalYearStartMonth),
|
|
6
|
+
to: dateMath.parse(to, true, timeZone, fiscalYearStartMonth),
|
|
7
|
+
raw: {
|
|
8
|
+
from,
|
|
9
|
+
to
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { evaluateTimeRange };
|
|
15
|
+
//# sourceMappingURL=evaluateTimeRange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluateTimeRange.js","sources":["../../../src/utils/evaluateTimeRange.ts"],"sourcesContent":["import { dateMath, TimeRange } from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\n\nexport function evaluateTimeRange(\n from: string,\n to: string,\n timeZone: TimeZone,\n fiscalYearStartMonth?: number\n): TimeRange {\n return {\n from: dateMath.parse(from, false, timeZone, fiscalYearStartMonth)!,\n to: dateMath.parse(to, true, timeZone, fiscalYearStartMonth)!,\n raw: {\n from: from,\n to: to,\n },\n };\n}\n"],"names":[],"mappings":";;AAGO,SAAS,iBACd,CAAA,IAAA,EACA,EACA,EAAA,QAAA,EACA,oBACW,EAAA;AACX,EAAO,OAAA;AAAA,IACL,MAAM,QAAS,CAAA,KAAA,CAAM,IAAM,EAAA,KAAA,EAAO,UAAU,oBAAoB,CAAA;AAAA,IAChE,IAAI,QAAS,CAAA,KAAA,CAAM,EAAI,EAAA,IAAA,EAAM,UAAU,oBAAoB,CAAA;AAAA,IAC3D,GAAK,EAAA;AAAA,MACH,IAAA;AAAA,MACA,EAAA;AAAA,KACF;AAAA,GACF,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { toUtc } from '@grafana/data';
|
|
2
|
+
|
|
3
|
+
const INTERVAL_STRING_REGEX = /^\d+[yYmMsSwWhHdD]$/;
|
|
4
|
+
function parseUrlParam(value) {
|
|
5
|
+
if (typeof value !== "string") {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
if (value.indexOf("now") !== -1) {
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
if (INTERVAL_STRING_REGEX.test(value)) {
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
if (value.length === 8) {
|
|
15
|
+
const utcValue = toUtc(value, "YYYYMMDD");
|
|
16
|
+
if (utcValue.isValid()) {
|
|
17
|
+
return utcValue.toISOString();
|
|
18
|
+
}
|
|
19
|
+
} else if (value.length === 15) {
|
|
20
|
+
const utcValue = toUtc(value, "YYYYMMDDTHHmmss");
|
|
21
|
+
if (utcValue.isValid()) {
|
|
22
|
+
return utcValue.toISOString();
|
|
23
|
+
}
|
|
24
|
+
} else if (value.length === 24) {
|
|
25
|
+
const utcValue = toUtc(value);
|
|
26
|
+
return utcValue.toISOString();
|
|
27
|
+
}
|
|
28
|
+
const epoch = parseInt(value, 10);
|
|
29
|
+
if (!isNaN(epoch)) {
|
|
30
|
+
return toUtc(epoch).toISOString();
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { parseUrlParam };
|
|
36
|
+
//# sourceMappingURL=parseUrlParam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseUrlParam.js","sources":["../../../src/utils/parseUrlParam.ts"],"sourcesContent":["import { toUtc } from '@grafana/data';\nimport { SceneObjectUrlValue } from '../core/types';\n\nconst INTERVAL_STRING_REGEX = /^\\d+[yYmMsSwWhHdD]$/;\n\nexport function parseUrlParam(value: SceneObjectUrlValue): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n if (value.indexOf('now') !== -1) {\n return value;\n }\n\n if (INTERVAL_STRING_REGEX.test(value)) {\n return value;\n }\n\n if (value.length === 8) {\n const utcValue = toUtc(value, 'YYYYMMDD');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 15) {\n const utcValue = toUtc(value, 'YYYYMMDDTHHmmss');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 24) {\n const utcValue = toUtc(value);\n return utcValue.toISOString();\n }\n\n const epoch = parseInt(value, 10);\n if (!isNaN(epoch)) {\n return toUtc(epoch).toISOString();\n }\n\n return null;\n}\n"],"names":[],"mappings":";;AAGA,MAAM,qBAAwB,GAAA,qBAAA,CAAA;AAEvB,SAAS,cAAc,KAA2C,EAAA;AACvE,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAA,KAAM,CAAI,CAAA,EAAA;AAC/B,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,qBAAA,CAAsB,IAAK,CAAA,KAAK,CAAG,EAAA;AACrC,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,EAAO,UAAU,CAAA,CAAA;AACxC,IAAI,IAAA,QAAA,CAAS,SAAW,EAAA;AACtB,MAAA,OAAO,SAAS,WAAY,EAAA,CAAA;AAAA,KAC9B;AAAA,GACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,EAAI,EAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,EAAO,iBAAiB,CAAA,CAAA;AAC/C,IAAI,IAAA,QAAA,CAAS,SAAW,EAAA;AACtB,MAAA,OAAO,SAAS,WAAY,EAAA,CAAA;AAAA,KAC9B;AAAA,GACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,EAAI,EAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,MAAM,KAAK,CAAA,CAAA;AAC5B,IAAA,OAAO,SAAS,WAAY,EAAA,CAAA;AAAA,GAC9B;AAEA,EAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AAChC,EAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,IAAO,OAAA,KAAA,CAAM,KAAK,CAAA,CAAE,WAAY,EAAA,CAAA;AAAA,GAClC;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1243,6 +1243,7 @@ interface SceneTimeRangeCompareState extends SceneObjectState {
|
|
|
1243
1243
|
}
|
|
1244
1244
|
declare class SceneTimeRangeCompare extends SceneObjectBase<SceneTimeRangeCompareState> implements TimeRangeCompareProvider {
|
|
1245
1245
|
static Component: typeof SceneTimeRangeCompareRenderer;
|
|
1246
|
+
protected _urlSync: SceneObjectUrlSyncConfig;
|
|
1246
1247
|
constructor(state: Partial<SceneTimeRangeCompareState>);
|
|
1247
1248
|
private _onActivate;
|
|
1248
1249
|
getCompareOptions: (timeRange: TimeRange) => {
|
|
@@ -1252,6 +1253,8 @@ declare class SceneTimeRangeCompare extends SceneObjectBase<SceneTimeRangeCompar
|
|
|
1252
1253
|
onCompareWithChanged: (compareWith: string) => void;
|
|
1253
1254
|
onClearCompare: () => void;
|
|
1254
1255
|
getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined;
|
|
1256
|
+
getUrlState(): SceneObjectUrlValues;
|
|
1257
|
+
updateFromUrl(values: SceneObjectUrlValues): void;
|
|
1255
1258
|
}
|
|
1256
1259
|
declare function SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>): JSX.Element;
|
|
1257
1260
|
|
package/dist/index.js
CHANGED
|
@@ -616,6 +616,49 @@ class SceneObjectUrlSyncConfig {
|
|
|
616
616
|
}
|
|
617
617
|
}
|
|
618
618
|
|
|
619
|
+
const INTERVAL_STRING_REGEX = /^\d+[yYmMsSwWhHdD]$/;
|
|
620
|
+
function parseUrlParam(value) {
|
|
621
|
+
if (typeof value !== "string") {
|
|
622
|
+
return null;
|
|
623
|
+
}
|
|
624
|
+
if (value.indexOf("now") !== -1) {
|
|
625
|
+
return value;
|
|
626
|
+
}
|
|
627
|
+
if (INTERVAL_STRING_REGEX.test(value)) {
|
|
628
|
+
return value;
|
|
629
|
+
}
|
|
630
|
+
if (value.length === 8) {
|
|
631
|
+
const utcValue = data.toUtc(value, "YYYYMMDD");
|
|
632
|
+
if (utcValue.isValid()) {
|
|
633
|
+
return utcValue.toISOString();
|
|
634
|
+
}
|
|
635
|
+
} else if (value.length === 15) {
|
|
636
|
+
const utcValue = data.toUtc(value, "YYYYMMDDTHHmmss");
|
|
637
|
+
if (utcValue.isValid()) {
|
|
638
|
+
return utcValue.toISOString();
|
|
639
|
+
}
|
|
640
|
+
} else if (value.length === 24) {
|
|
641
|
+
const utcValue = data.toUtc(value);
|
|
642
|
+
return utcValue.toISOString();
|
|
643
|
+
}
|
|
644
|
+
const epoch = parseInt(value, 10);
|
|
645
|
+
if (!isNaN(epoch)) {
|
|
646
|
+
return data.toUtc(epoch).toISOString();
|
|
647
|
+
}
|
|
648
|
+
return null;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
function evaluateTimeRange(from, to, timeZone, fiscalYearStartMonth) {
|
|
652
|
+
return {
|
|
653
|
+
from: data.dateMath.parse(from, false, timeZone, fiscalYearStartMonth),
|
|
654
|
+
to: data.dateMath.parse(to, true, timeZone, fiscalYearStartMonth),
|
|
655
|
+
raw: {
|
|
656
|
+
from,
|
|
657
|
+
to
|
|
658
|
+
}
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
|
|
619
662
|
var __defProp$w = Object.defineProperty;
|
|
620
663
|
var __getOwnPropSymbols$w = Object.getOwnPropertySymbols;
|
|
621
664
|
var __hasOwnProp$w = Object.prototype.hasOwnProperty;
|
|
@@ -728,43 +771,6 @@ class SceneTimeRange extends SceneObjectBase {
|
|
|
728
771
|
this.setState(update);
|
|
729
772
|
}
|
|
730
773
|
}
|
|
731
|
-
function parseUrlParam(value) {
|
|
732
|
-
if (typeof value !== "string") {
|
|
733
|
-
return null;
|
|
734
|
-
}
|
|
735
|
-
if (value.indexOf("now") !== -1) {
|
|
736
|
-
return value;
|
|
737
|
-
}
|
|
738
|
-
if (value.length === 8) {
|
|
739
|
-
const utcValue = data.toUtc(value, "YYYYMMDD");
|
|
740
|
-
if (utcValue.isValid()) {
|
|
741
|
-
return utcValue.toISOString();
|
|
742
|
-
}
|
|
743
|
-
} else if (value.length === 15) {
|
|
744
|
-
const utcValue = data.toUtc(value, "YYYYMMDDTHHmmss");
|
|
745
|
-
if (utcValue.isValid()) {
|
|
746
|
-
return utcValue.toISOString();
|
|
747
|
-
}
|
|
748
|
-
} else if (value.length === 24) {
|
|
749
|
-
const utcValue = data.toUtc(value);
|
|
750
|
-
return utcValue.toISOString();
|
|
751
|
-
}
|
|
752
|
-
const epoch = parseInt(value, 10);
|
|
753
|
-
if (!isNaN(epoch)) {
|
|
754
|
-
return data.toUtc(epoch).toISOString();
|
|
755
|
-
}
|
|
756
|
-
return null;
|
|
757
|
-
}
|
|
758
|
-
function evaluateTimeRange(from, to, timeZone, fiscalYearStartMonth) {
|
|
759
|
-
return {
|
|
760
|
-
from: data.dateMath.parse(from, false, timeZone, fiscalYearStartMonth),
|
|
761
|
-
to: data.dateMath.parse(to, true, timeZone, fiscalYearStartMonth),
|
|
762
|
-
raw: {
|
|
763
|
-
from,
|
|
764
|
-
to
|
|
765
|
-
}
|
|
766
|
-
};
|
|
767
|
-
}
|
|
768
774
|
|
|
769
775
|
const EmptyDataNode = new SceneDataNode();
|
|
770
776
|
const DefaultTimeRange = new SceneTimeRange();
|
|
@@ -2659,6 +2665,7 @@ const DEFAULT_COMPARE_OPTIONS = [
|
|
|
2659
2665
|
class SceneTimeRangeCompare extends SceneObjectBase {
|
|
2660
2666
|
constructor(state) {
|
|
2661
2667
|
super(__spreadValues$n({ compareOptions: DEFAULT_COMPARE_OPTIONS }, state));
|
|
2668
|
+
this._urlSync = new SceneObjectUrlSyncConfig(this, { keys: ["compareWith"] });
|
|
2662
2669
|
this._onActivate = () => {
|
|
2663
2670
|
const sceneTimeRange = sceneGraph.getTimeRange(this);
|
|
2664
2671
|
this.setState({ compareOptions: this.getCompareOptions(sceneTimeRange.state.value) });
|
|
@@ -2715,6 +2722,29 @@ class SceneTimeRangeCompare extends SceneObjectBase {
|
|
|
2715
2722
|
}
|
|
2716
2723
|
return void 0;
|
|
2717
2724
|
}
|
|
2725
|
+
getUrlState() {
|
|
2726
|
+
return {
|
|
2727
|
+
compareWith: this.state.compareWith
|
|
2728
|
+
};
|
|
2729
|
+
}
|
|
2730
|
+
updateFromUrl(values) {
|
|
2731
|
+
if (!values.compareWith) {
|
|
2732
|
+
return;
|
|
2733
|
+
}
|
|
2734
|
+
const compareWith = parseUrlParam(values.compareWith);
|
|
2735
|
+
if (compareWith) {
|
|
2736
|
+
const compareOptions = this.getCompareOptions(sceneGraph.getTimeRange(this).state.value);
|
|
2737
|
+
if (compareOptions.find(({ value }) => value === compareWith)) {
|
|
2738
|
+
this.setState({
|
|
2739
|
+
compareWith
|
|
2740
|
+
});
|
|
2741
|
+
} else {
|
|
2742
|
+
this.setState({
|
|
2743
|
+
compareWith: "__previousPeriod"
|
|
2744
|
+
});
|
|
2745
|
+
}
|
|
2746
|
+
}
|
|
2747
|
+
}
|
|
2718
2748
|
}
|
|
2719
2749
|
SceneTimeRangeCompare.Component = SceneTimeRangeCompareRenderer;
|
|
2720
2750
|
function SceneTimeRangeCompareRenderer({ model }) {
|