@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 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, toUtc, dateMath } from '@grafana/data';
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, evaluateTimeRange, parseUrlParam };
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 { evaluateTimeRange } from './SceneTimeRange';\nimport { SceneTimeRangeLike, SceneTimeRangeState } from './types';\nimport { SceneTimeRangeTransformerBase } from './SceneTimeRangeTransformerBase';\nimport { getDefaultTimeRange } from '@grafana/data';\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;;;;"}
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 }) {