@grafana/scenes 6.36.0--canary.1248.17797615374.0 → 6.36.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,20 @@
1
+ # v6.36.0 (Thu Sep 18 2025)
2
+
3
+ #### 🚀 Enhancement
4
+
5
+ - Variables: Remove the `showInControlsMenu?` prop [#1249](https://github.com/grafana/scenes/pull/1249) ([@leventebalogh](https://github.com/leventebalogh))
6
+
7
+ #### 🐛 Bug Fix
8
+
9
+ - GroupByVariable: Do not show default value in url [#1242](https://github.com/grafana/scenes/pull/1242) ([@mdvictor](https://github.com/mdvictor))
10
+
11
+ #### Authors: 2
12
+
13
+ - Levente Balogh ([@leventebalogh](https://github.com/leventebalogh))
14
+ - Victor Marin ([@mdvictor](https://github.com/mdvictor))
15
+
16
+ ---
17
+
1
18
  # v6.35.3 (Mon Sep 15 2025)
2
19
 
3
20
  #### 🐛 Bug Fix
@@ -1,11 +1,10 @@
1
1
  import React from 'react';
2
2
  import { useLocalStorage } from 'react-use';
3
3
  import { uniqBy } from 'lodash';
4
- import { intervalToAbbreviatedDurationString, rangeUtil, isDateTime, toUtc } from '@grafana/data';
4
+ import { rangeUtil, isDateTime, toUtc } from '@grafana/data';
5
5
  import { TimeRangePicker } from '@grafana/ui';
6
6
  import { SceneObjectBase } from '../core/SceneObjectBase.js';
7
7
  import { sceneGraph } from '../core/sceneGraph/index.js';
8
- import { t } from '@grafana/i18n';
9
8
 
10
9
  class SceneTimePicker extends SceneObjectBase {
11
10
  constructor() {
@@ -31,7 +30,7 @@ class SceneTimePicker extends SceneObjectBase {
31
30
  const {
32
31
  state: { value: range }
33
32
  } = timeRange;
34
- timeRange.onTimeRangeChange(getShiftedTimeRange(0 /* Backward */, range));
33
+ timeRange.onTimeRangeChange(getShiftedTimeRange(0 /* Backward */, range, Date.now()));
35
34
  };
36
35
  this.onMoveForward = () => {
37
36
  const timeRange = sceneGraph.getTimeRange(this);
@@ -57,13 +56,6 @@ function SceneTimePickerRenderer({ model }) {
57
56
  return null;
58
57
  }
59
58
  const rangesToUse = quickRanges || defaultQuickRanges;
60
- const halfSpanMs = (timeRangeState.value.to.valueOf() - timeRangeState.value.from.valueOf()) / 2;
61
- const moveBackwardDuration = intervalToAbbreviatedDurationString({
62
- start: new Date(timeRangeState.value.from.valueOf()),
63
- end: new Date(timeRangeState.value.from.valueOf() + halfSpanMs)
64
- });
65
- const canMoveForward = timeRangeState.value.to.valueOf() + halfSpanMs <= Date.now();
66
- const moveForwardDuration = canMoveForward ? moveBackwardDuration : void 0;
67
59
  return /* @__PURE__ */ React.createElement(
68
60
  TimeRangePicker,
69
61
  {
@@ -79,14 +71,6 @@ function SceneTimePickerRenderer({ model }) {
79
71
  fiscalYearStartMonth: timeRangeState.fiscalYearStartMonth,
80
72
  onMoveBackward: model.onMoveBackward,
81
73
  onMoveForward: model.onMoveForward,
82
- moveForwardTooltip: moveForwardDuration ? t("grafana-scenes.components.time-picker.move-forward-tooltip", "Move {{moveForwardDuration}} forward", {
83
- moveForwardDuration
84
- }) : void 0,
85
- moveBackwardTooltip: t(
86
- "grafana-scenes.components.time-picker.move-backward-tooltip",
87
- "Move {{moveBackwardDuration}} backward",
88
- { moveBackwardDuration }
89
- ),
90
74
  onZoom: model.onZoom,
91
75
  onChangeTimeZone: timeRange.onTimeZoneChange,
92
76
  onChangeFiscalYearStartMonth: model.onChangeFiscalYearStartMonth,
@@ -116,7 +100,7 @@ function getShiftedTimeRange(dir, timeRange, upperLimit) {
116
100
  } else {
117
101
  fromRaw = oldFrom + halfSpan;
118
102
  toRaw = oldTo + halfSpan;
119
- if (upperLimit !== void 0 && toRaw > upperLimit && oldTo < upperLimit) {
103
+ if (toRaw > upperLimit && oldTo < upperLimit) {
120
104
  toRaw = upperLimit;
121
105
  fromRaw = oldFrom;
122
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SceneTimePicker.js","sources":["../../../src/components/SceneTimePicker.tsx"],"sourcesContent":["import React from 'react';\nimport { useLocalStorage } from 'react-use';\nimport { uniqBy } from 'lodash';\n\nimport {\n TimeOption,\n TimeRange,\n intervalToAbbreviatedDurationString,\n isDateTime,\n rangeUtil,\n toUtc,\n} from '@grafana/data';\nimport { TimeRangePicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\nimport { t } from '@grafana/i18n';\n\nexport interface SceneTimePickerState extends SceneObjectState {\n hidePicker?: boolean;\n isOnCanvas?: boolean;\n quickRanges?: TimeOption[];\n defaultQuickRanges?: TimeOption[]; // Overrides default time ranges from server config, so not serialised back to JSON\n}\n\nexport class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {\n public static Component = SceneTimePickerRenderer;\n\n public onZoom = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const zoomedTimeRange = getZoomedTimeRange(timeRange.state.value, 2);\n timeRange.onTimeRangeChange(zoomedTimeRange);\n };\n\n public onChangeFiscalYearStartMonth = (month: number) => {\n const timeRange = sceneGraph.getTimeRange(this);\n timeRange.setState({ fiscalYearStartMonth: month });\n };\n\n public toAbsolute = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const timeRangeVal = timeRange.state.value;\n const from = toUtc(timeRangeVal.from);\n const to = toUtc(timeRangeVal.to);\n timeRange.onTimeRangeChange({ from, to, raw: { from, to } });\n };\n\n public onMoveBackward = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const {\n state: { value: range },\n } = timeRange;\n\n timeRange.onTimeRangeChange(getShiftedTimeRange(TimeRangeDirection.Backward, range));\n };\n\n public onMoveForward = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const {\n state: { value: range },\n } = timeRange;\n\n timeRange.onTimeRangeChange(getShiftedTimeRange(TimeRangeDirection.Forward, range, Date.now()));\n };\n}\n\nfunction SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>) {\n const { hidePicker, isOnCanvas, quickRanges, defaultQuickRanges } = model.useState();\n const timeRange = sceneGraph.getTimeRange(model);\n const timeZone = timeRange.getTimeZone();\n const timeRangeState = timeRange.useState();\n const [timeRangeHistory, setTimeRangeHistory] = useLocalStorage<TimeRange[]>(HISTORY_LOCAL_STORAGE_KEY, [], {\n raw: false,\n serializer: serializeHistory,\n deserializer: deserializeHistory,\n });\n\n if (hidePicker) {\n return null;\n }\n\n const rangesToUse = quickRanges || defaultQuickRanges;\n\n // Calculate half of the time range duration for forward/backward movement\n const halfSpanMs = (timeRangeState.value.to.valueOf() - timeRangeState.value.from.valueOf()) / 2;\n\n const moveBackwardDuration = intervalToAbbreviatedDurationString({\n start: new Date(timeRangeState.value.from.valueOf()),\n end: new Date(timeRangeState.value.from.valueOf() + halfSpanMs),\n });\n\n // Only show forward duration if moving forward wouldn't exceed current time\n const canMoveForward = timeRangeState.value.to.valueOf() + halfSpanMs <= Date.now();\n const moveForwardDuration = canMoveForward ? moveBackwardDuration : undefined;\n\n return (\n <TimeRangePicker\n isOnCanvas={isOnCanvas ?? true}\n value={timeRangeState.value}\n onChange={(range) => {\n if (isAbsolute(range)) {\n setTimeRangeHistory([range, ...(timeRangeHistory ?? [])]);\n }\n\n timeRange.onTimeRangeChange(range);\n }}\n timeZone={timeZone}\n fiscalYearStartMonth={timeRangeState.fiscalYearStartMonth}\n onMoveBackward={model.onMoveBackward}\n onMoveForward={model.onMoveForward}\n // @ts-expect-error (temporary till we update grafana/ui)\n moveForwardTooltip={\n moveForwardDuration\n ? t('grafana-scenes.components.time-picker.move-forward-tooltip', 'Move {{moveForwardDuration}} forward', {\n moveForwardDuration,\n })\n : undefined\n }\n moveBackwardTooltip={t(\n 'grafana-scenes.components.time-picker.move-backward-tooltip',\n 'Move {{moveBackwardDuration}} backward',\n { moveBackwardDuration }\n )}\n onZoom={model.onZoom}\n onChangeTimeZone={timeRange.onTimeZoneChange}\n onChangeFiscalYearStartMonth={model.onChangeFiscalYearStartMonth}\n weekStart={timeRangeState.weekStart}\n history={timeRangeHistory}\n quickRanges={rangesToUse}\n />\n );\n}\n\nexport function getZoomedTimeRange(timeRange: TimeRange, factor: number): TimeRange {\n const timespan = timeRange.to.valueOf() - timeRange.from.valueOf();\n const center = timeRange.to.valueOf() - timespan / 2;\n // If the timepsan is 0, zooming out would do nothing, so we force a zoom out to 30s\n const newTimespan = timespan === 0 ? 30000 : timespan * factor;\n\n const to = center + newTimespan / 2;\n const from = center - newTimespan / 2;\n\n return { from: toUtc(from), to: toUtc(to), raw: { from: toUtc(from), to: toUtc(to) } };\n}\n\nexport enum TimeRangeDirection {\n Backward,\n Forward,\n}\n\nexport function getShiftedTimeRange(dir: TimeRangeDirection, timeRange: TimeRange, upperLimit?: number): TimeRange {\n const oldTo = timeRange.to.valueOf();\n const oldFrom = timeRange.from.valueOf();\n const halfSpan = (oldTo - oldFrom) / 2;\n\n let fromRaw: number;\n let toRaw: number;\n if (dir === TimeRangeDirection.Backward) {\n fromRaw = oldFrom - halfSpan;\n toRaw = oldTo - halfSpan;\n } else {\n fromRaw = oldFrom + halfSpan;\n toRaw = oldTo + halfSpan;\n\n if (upperLimit !== undefined && toRaw > upperLimit && oldTo < upperLimit) {\n toRaw = upperLimit;\n fromRaw = oldFrom;\n }\n }\n\n const from = toUtc(fromRaw);\n const to = toUtc(toRaw);\n return {\n from,\n to,\n raw: { from, to },\n };\n}\n\nconst HISTORY_LOCAL_STORAGE_KEY = 'grafana.dashboard.timepicker.history';\n\n// Simplified object to store in local storage\ninterface TimePickerHistoryItem {\n from: string;\n to: string;\n}\n\nfunction deserializeHistory(value: string): TimeRange[] {\n const values: TimePickerHistoryItem[] = JSON.parse(value);\n // The history is saved in UTC and with the default date format, so we need to pass those values to the convertRawToRange\n return values.map((item) => rangeUtil.convertRawToRange(item, 'utc', undefined, 'YYYY-MM-DD HH:mm:ss'));\n}\n\nfunction serializeHistory(values: TimeRange[]) {\n return JSON.stringify(\n limit(\n values.map((v) => ({\n from: typeof v.raw.from === 'string' ? v.raw.from : v.raw.from.toISOString(),\n to: typeof v.raw.to === 'string' ? v.raw.to : v.raw.to.toISOString(),\n }))\n )\n );\n}\n\nfunction limit(value: TimePickerHistoryItem[]): TimePickerHistoryItem[] {\n return uniqBy(value, (v) => v.from + v.to).slice(0, 4);\n}\n\nfunction isAbsolute(value: TimeRange): boolean {\n return isDateTime(value.raw.from) || isDateTime(value.raw.to);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SceneTimePicker.js","sources":["../../../src/components/SceneTimePicker.tsx"],"sourcesContent":["import React from 'react';\nimport { useLocalStorage } from 'react-use';\nimport { uniqBy } from 'lodash';\n\nimport { TimeOption, TimeRange, isDateTime, rangeUtil, toUtc } from '@grafana/data';\nimport { TimeRangePicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\n\nexport interface SceneTimePickerState extends SceneObjectState {\n hidePicker?: boolean;\n isOnCanvas?: boolean;\n quickRanges?: TimeOption[];\n defaultQuickRanges?: TimeOption[]; // Overrides default time ranges from server config, so not serialised back to JSON\n}\n\nexport class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {\n public static Component = SceneTimePickerRenderer;\n\n public onZoom = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const zoomedTimeRange = getZoomedTimeRange(timeRange.state.value, 2);\n timeRange.onTimeRangeChange(zoomedTimeRange);\n };\n\n public onChangeFiscalYearStartMonth = (month: number) => {\n const timeRange = sceneGraph.getTimeRange(this);\n timeRange.setState({ fiscalYearStartMonth: month });\n };\n\n public toAbsolute = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const timeRangeVal = timeRange.state.value;\n const from = toUtc(timeRangeVal.from);\n const to = toUtc(timeRangeVal.to);\n timeRange.onTimeRangeChange({ from, to, raw: { from, to } });\n };\n\n public onMoveBackward = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const {\n state: { value: range },\n } = timeRange;\n\n timeRange.onTimeRangeChange(getShiftedTimeRange(TimeRangeDirection.Backward, range, Date.now()));\n };\n\n public onMoveForward = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const {\n state: { value: range },\n } = timeRange;\n\n timeRange.onTimeRangeChange(getShiftedTimeRange(TimeRangeDirection.Forward, range, Date.now()));\n };\n}\n\nfunction SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>) {\n const { hidePicker, isOnCanvas, quickRanges, defaultQuickRanges } = model.useState();\n const timeRange = sceneGraph.getTimeRange(model);\n const timeZone = timeRange.getTimeZone();\n const timeRangeState = timeRange.useState();\n const [timeRangeHistory, setTimeRangeHistory] = useLocalStorage<TimeRange[]>(HISTORY_LOCAL_STORAGE_KEY, [], {\n raw: false,\n serializer: serializeHistory,\n deserializer: deserializeHistory,\n });\n\n if (hidePicker) {\n return null;\n }\n\n const rangesToUse = quickRanges || defaultQuickRanges;\n\n return (\n <TimeRangePicker\n isOnCanvas={isOnCanvas ?? true}\n value={timeRangeState.value}\n onChange={(range) => {\n if (isAbsolute(range)) {\n setTimeRangeHistory([range, ...(timeRangeHistory ?? [])]);\n }\n\n timeRange.onTimeRangeChange(range);\n }}\n timeZone={timeZone}\n fiscalYearStartMonth={timeRangeState.fiscalYearStartMonth}\n onMoveBackward={model.onMoveBackward}\n onMoveForward={model.onMoveForward}\n onZoom={model.onZoom}\n onChangeTimeZone={timeRange.onTimeZoneChange}\n onChangeFiscalYearStartMonth={model.onChangeFiscalYearStartMonth}\n weekStart={timeRangeState.weekStart}\n history={timeRangeHistory}\n quickRanges={rangesToUse}\n />\n );\n}\n\nexport function getZoomedTimeRange(timeRange: TimeRange, factor: number): TimeRange {\n const timespan = timeRange.to.valueOf() - timeRange.from.valueOf();\n const center = timeRange.to.valueOf() - timespan / 2;\n // If the timepsan is 0, zooming out would do nothing, so we force a zoom out to 30s\n const newTimespan = timespan === 0 ? 30000 : timespan * factor;\n\n const to = center + newTimespan / 2;\n const from = center - newTimespan / 2;\n\n return { from: toUtc(from), to: toUtc(to), raw: { from: toUtc(from), to: toUtc(to) } };\n}\n\nexport enum TimeRangeDirection {\n Backward,\n Forward,\n}\n\nexport function getShiftedTimeRange(dir: TimeRangeDirection, timeRange: TimeRange, upperLimit: number): TimeRange {\n const oldTo = timeRange.to.valueOf();\n const oldFrom = timeRange.from.valueOf();\n const halfSpan = (oldTo - oldFrom) / 2;\n\n let fromRaw: number;\n let toRaw: number;\n if (dir === TimeRangeDirection.Backward) {\n fromRaw = oldFrom - halfSpan;\n toRaw = oldTo - halfSpan;\n } else {\n fromRaw = oldFrom + halfSpan;\n toRaw = oldTo + halfSpan;\n\n if (toRaw > upperLimit && oldTo < upperLimit) {\n toRaw = upperLimit;\n fromRaw = oldFrom;\n }\n }\n\n const from = toUtc(fromRaw);\n const to = toUtc(toRaw);\n return {\n from,\n to,\n raw: { from, to },\n };\n}\n\nconst HISTORY_LOCAL_STORAGE_KEY = 'grafana.dashboard.timepicker.history';\n\n// Simplified object to store in local storage\ninterface TimePickerHistoryItem {\n from: string;\n to: string;\n}\n\nfunction deserializeHistory(value: string): TimeRange[] {\n const values: TimePickerHistoryItem[] = JSON.parse(value);\n // The history is saved in UTC and with the default date format, so we need to pass those values to the convertRawToRange\n return values.map((item) => rangeUtil.convertRawToRange(item, 'utc', undefined, 'YYYY-MM-DD HH:mm:ss'));\n}\n\nfunction serializeHistory(values: TimeRange[]) {\n return JSON.stringify(\n limit(\n values.map((v) => ({\n from: typeof v.raw.from === 'string' ? v.raw.from : v.raw.from.toISOString(),\n to: typeof v.raw.to === 'string' ? v.raw.to : v.raw.to.toISOString(),\n }))\n )\n );\n}\n\nfunction limit(value: TimePickerHistoryItem[]): TimePickerHistoryItem[] {\n return uniqBy(value, (v) => v.from + v.to).slice(0, 4);\n}\n\nfunction isAbsolute(value: TimeRange): boolean {\n return isDateTime(value.raw.from) || isDateTime(value.raw.to);\n}\n"],"names":[],"mappings":";;;;;;;;AAkBO,MAAM,wBAAwB,eAAsC,CAAA;AAAA,EAApE,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAGL,IAAA,IAAA,CAAO,SAAS,MAAM;AACpB,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAA,MAAM,eAAkB,GAAA,kBAAA,CAAmB,SAAU,CAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AACnE,MAAA,SAAA,CAAU,kBAAkB,eAAe,CAAA;AAAA,KAC7C;AAEA,IAAO,IAAA,CAAA,4BAAA,GAA+B,CAAC,KAAkB,KAAA;AACvD,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAA,SAAA,CAAU,QAAS,CAAA,EAAE,oBAAsB,EAAA,KAAA,EAAO,CAAA;AAAA,KACpD;AAEA,IAAA,IAAA,CAAO,aAAa,MAAM;AACxB,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAM,MAAA,YAAA,GAAe,UAAU,KAAM,CAAA,KAAA;AACrC,MAAM,MAAA,IAAA,GAAO,KAAM,CAAA,YAAA,CAAa,IAAI,CAAA;AACpC,MAAM,MAAA,EAAA,GAAK,KAAM,CAAA,YAAA,CAAa,EAAE,CAAA;AAChC,MAAU,SAAA,CAAA,iBAAA,CAAkB,EAAE,IAAM,EAAA,EAAA,EAAI,KAAK,EAAE,IAAA,EAAM,EAAG,EAAA,EAAG,CAAA;AAAA,KAC7D;AAEA,IAAA,IAAA,CAAO,iBAAiB,MAAM;AAC5B,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAM,MAAA;AAAA,QACJ,KAAA,EAAO,EAAE,KAAA,EAAO,KAAM;AAAA,OACpB,GAAA,SAAA;AAEJ,MAAA,SAAA,CAAU,kBAAkB,mBAAoB,CAAA,CAAA,iBAA6B,OAAO,IAAK,CAAA,GAAA,EAAK,CAAC,CAAA;AAAA,KACjG;AAEA,IAAA,IAAA,CAAO,gBAAgB,MAAM;AAC3B,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAM,MAAA;AAAA,QACJ,KAAA,EAAO,EAAE,KAAA,EAAO,KAAM;AAAA,OACpB,GAAA,SAAA;AAEJ,MAAA,SAAA,CAAU,kBAAkB,mBAAoB,CAAA,CAAA,gBAA4B,OAAO,IAAK,CAAA,GAAA,EAAK,CAAC,CAAA;AAAA,KAChG;AAAA;AACF;AAvCa,eAAA,CACG,SAAY,GAAA,uBAAA;AAwC5B,SAAS,uBAAA,CAAwB,EAAE,KAAA,EAA+C,EAAA;AAChF,EAAA,MAAM,EAAE,UAAY,EAAA,UAAA,EAAY,aAAa,kBAAmB,EAAA,GAAI,MAAM,QAAS,EAAA;AACnF,EAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,KAAK,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAW,UAAU,WAAY,EAAA;AACvC,EAAM,MAAA,cAAA,GAAiB,UAAU,QAAS,EAAA;AAC1C,EAAA,MAAM,CAAC,gBAAkB,EAAA,mBAAmB,IAAI,eAA6B,CAAA,yBAAA,EAA2B,EAAI,EAAA;AAAA,IAC1G,GAAK,EAAA,KAAA;AAAA,IACL,UAAY,EAAA,gBAAA;AAAA,IACZ,YAAc,EAAA;AAAA,GACf,CAAA;AAED,EAAA,IAAI,UAAY,EAAA;AACd,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAM,cAAc,WAAe,IAAA,kBAAA;AAEnC,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,YAAY,UAAc,IAAA,IAAA,GAAA,UAAA,GAAA,IAAA;AAAA,MAC1B,OAAO,cAAe,CAAA,KAAA;AAAA,MACtB,QAAA,EAAU,CAAC,KAAU,KAAA;AACnB,QAAI,IAAA,UAAA,CAAW,KAAK,CAAG,EAAA;AACrB,UAAA,mBAAA,CAAoB,CAAC,KAAO,EAAA,GAAI,gBAAoB,IAAA,IAAA,GAAA,gBAAA,GAAA,EAAG,CAAC,CAAA;AAAA;AAG1D,QAAA,SAAA,CAAU,kBAAkB,KAAK,CAAA;AAAA,OACnC;AAAA,MACA,QAAA;AAAA,MACA,sBAAsB,cAAe,CAAA,oBAAA;AAAA,MACrC,gBAAgB,KAAM,CAAA,cAAA;AAAA,MACtB,eAAe,KAAM,CAAA,aAAA;AAAA,MACrB,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,kBAAkB,SAAU,CAAA,gBAAA;AAAA,MAC5B,8BAA8B,KAAM,CAAA,4BAAA;AAAA,MACpC,WAAW,cAAe,CAAA,SAAA;AAAA,MAC1B,OAAS,EAAA,gBAAA;AAAA,MACT,WAAa,EAAA;AAAA;AAAA,GACf;AAEJ;AAEgB,SAAA,kBAAA,CAAmB,WAAsB,MAA2B,EAAA;AAClF,EAAA,MAAM,WAAW,SAAU,CAAA,EAAA,CAAG,SAAY,GAAA,SAAA,CAAU,KAAK,OAAQ,EAAA;AACjE,EAAA,MAAM,MAAS,GAAA,SAAA,CAAU,EAAG,CAAA,OAAA,KAAY,QAAW,GAAA,CAAA;AAEnD,EAAA,MAAM,WAAc,GAAA,QAAA,KAAa,CAAI,GAAA,GAAA,GAAQ,QAAW,GAAA,MAAA;AAExD,EAAM,MAAA,EAAA,GAAK,SAAS,WAAc,GAAA,CAAA;AAClC,EAAM,MAAA,IAAA,GAAO,SAAS,WAAc,GAAA,CAAA;AAEpC,EAAA,OAAO,EAAE,IAAM,EAAA,KAAA,CAAM,IAAI,CAAG,EAAA,EAAA,EAAI,MAAM,EAAE,CAAA,EAAG,KAAK,EAAE,IAAA,EAAM,MAAM,IAAI,CAAA,EAAG,IAAI,KAAM,CAAA,EAAE,GAAI,EAAA;AACvF;AAOgB,SAAA,mBAAA,CAAoB,GAAyB,EAAA,SAAA,EAAsB,UAA+B,EAAA;AAChH,EAAM,MAAA,KAAA,GAAQ,SAAU,CAAA,EAAA,CAAG,OAAQ,EAAA;AACnC,EAAM,MAAA,OAAA,GAAU,SAAU,CAAA,IAAA,CAAK,OAAQ,EAAA;AACvC,EAAM,MAAA,QAAA,GAAA,CAAY,QAAQ,OAAW,IAAA,CAAA;AAErC,EAAI,IAAA,OAAA;AACJ,EAAI,IAAA,KAAA;AACJ,EAAA,IAAI,QAAQ,CAA6B,iBAAA;AACvC,IAAA,OAAA,GAAU,OAAU,GAAA,QAAA;AACpB,IAAA,KAAA,GAAQ,KAAQ,GAAA,QAAA;AAAA,GACX,MAAA;AACL,IAAA,OAAA,GAAU,OAAU,GAAA,QAAA;AACpB,IAAA,KAAA,GAAQ,KAAQ,GAAA,QAAA;AAEhB,IAAI,IAAA,KAAA,GAAQ,UAAc,IAAA,KAAA,GAAQ,UAAY,EAAA;AAC5C,MAAQ,KAAA,GAAA,UAAA;AACR,MAAU,OAAA,GAAA,OAAA;AAAA;AACZ;AAGF,EAAM,MAAA,IAAA,GAAO,MAAM,OAAO,CAAA;AAC1B,EAAM,MAAA,EAAA,GAAK,MAAM,KAAK,CAAA;AACtB,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAA,EAAK,EAAE,IAAA,EAAM,EAAG;AAAA,GAClB;AACF;AAEA,MAAM,yBAA4B,GAAA,sCAAA;AAQlC,SAAS,mBAAmB,KAA4B,EAAA;AACtD,EAAM,MAAA,MAAA,GAAkC,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA;AAExD,EAAO,OAAA,MAAA,CAAO,GAAI,CAAA,CAAC,IAAS,KAAA,SAAA,CAAU,kBAAkB,IAAM,EAAA,KAAA,EAAO,MAAW,EAAA,qBAAqB,CAAC,CAAA;AACxG;AAEA,SAAS,iBAAiB,MAAqB,EAAA;AAC7C,EAAA,OAAO,IAAK,CAAA,SAAA;AAAA,IACV,KAAA;AAAA,MACE,MAAA,CAAO,GAAI,CAAA,CAAC,CAAO,MAAA;AAAA,QACjB,IAAM,EAAA,OAAO,CAAE,CAAA,GAAA,CAAI,IAAS,KAAA,QAAA,GAAW,CAAE,CAAA,GAAA,CAAI,IAAO,GAAA,CAAA,CAAE,GAAI,CAAA,IAAA,CAAK,WAAY,EAAA;AAAA,QAC3E,EAAI,EAAA,OAAO,CAAE,CAAA,GAAA,CAAI,EAAO,KAAA,QAAA,GAAW,CAAE,CAAA,GAAA,CAAI,EAAK,GAAA,CAAA,CAAE,GAAI,CAAA,EAAA,CAAG,WAAY;AAAA,OACnE,CAAA;AAAA;AACJ,GACF;AACF;AAEA,SAAS,MAAM,KAAyD,EAAA;AACtE,EAAO,OAAA,MAAA,CAAO,KAAO,EAAA,CAAC,CAAM,KAAA,CAAA,CAAE,IAAO,GAAA,CAAA,CAAE,EAAE,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA;AACvD;AAEA,SAAS,WAAW,KAA2B,EAAA;AAC7C,EAAO,OAAA,UAAA,CAAW,MAAM,GAAI,CAAA,IAAI,KAAK,UAAW,CAAA,KAAA,CAAM,IAAI,EAAE,CAAA;AAC9D;;;;"}
@@ -40,10 +40,6 @@ var grafanaScenes = {
40
40
  splitter: {
41
41
  "aria-label-pane-resize-widget": "Pane resize widget"
42
42
  },
43
- "time-picker": {
44
- "move-backward-tooltip": "Move {{moveBackwardDuration}} backward",
45
- "move-forward-tooltip": "Move {{moveForwardDuration}} forward"
46
- },
47
43
  "viz-panel": {
48
44
  title: {
49
45
  title: "Title"
@@ -1 +1 @@
1
- {"version":3,"file":"grafana-scenes.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"grafana-scenes.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../src/variables/types.ts"],"sourcesContent":["import { Observable } from 'rxjs';\n\nimport { BusEventWithPayload } from '@grafana/data';\nimport { VariableType, VariableHide } from '@grafana/schema';\n\nimport { SceneObject, SceneObjectState } from '../core/types';\n\nexport interface SceneVariableState extends SceneObjectState {\n type: VariableType;\n name: string;\n label?: string;\n hide?: VariableHide;\n skipUrlSync?: boolean;\n loading?: boolean;\n error?: any | null;\n description?: string | null;\n showInControlsMenu?: boolean;\n}\n\nexport interface SceneVariable<TState extends SceneVariableState = SceneVariableState> extends SceneObject<TState> {\n /**\n * This function is called on activation or when a dependency changes.\n */\n validateAndUpdate?(): Observable<ValidateAndUpdateResult>;\n\n /**\n * Should return the value for the given field path\n */\n getValue(fieldPath?: string): VariableValue | undefined | null;\n\n /**\n * Should return the value display text, used by the \"text\" formatter\n * Example: ${podId:text}\n * Useful for variables that have non user friendly values but friendly display text names.\n */\n getValueText?(fieldPath?: string): string;\n\n /**\n * For special edge case senarios. For example local function that locally scoped variables can implement.\n **/\n isAncestorLoading?(): boolean;\n\n /**\n * Allows cancelling variable execution.\n */\n onCancel?(): void;\n\n /**\n * Edge case for variables that are hidden but wants to be render to access react contexts (ScopesVariable)\n */\n UNSAFE_renderAsHidden?: boolean;\n\n /**\n * @experimental\n * Indicates that a variable loads values lazily when user interacts with the variable dropdown.\n */\n isLazy?: boolean;\n}\n\nexport type VariableValue = VariableValueSingle | VariableValueSingle[];\n\nexport type VariableValueSingle = string | boolean | number | CustomVariableValue;\n\n/**\n * This is for edge case values like the custom \"allValue\" that should not be escaped/formatted like other values\n * The custom all value usually contain wildcards that should not be escaped.\n */\nexport interface CustomVariableValue {\n /**\n * The format name or function used in the expression\n */\n formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string;\n}\n\nexport interface ValidateAndUpdateResult {}\nexport interface VariableValueOption {\n label: string;\n value: VariableValueSingle;\n group?: string;\n}\n\nexport interface SceneVariableSetState extends SceneObjectState {\n variables: SceneVariable[];\n}\n\nexport interface SceneVariables extends SceneObject<SceneVariableSetState> {\n /**\n * Will look for and return variable matching name\n */\n getByName(name: string): SceneVariable | undefined;\n /**\n * Will return true if the variable is loading or waiting for an update to complete.\n */\n isVariableLoadingOrWaitingToUpdate(variable: SceneVariable): boolean;\n}\n\nexport class SceneVariableValueChangedEvent extends BusEventWithPayload<SceneVariable> {\n public static type = 'scene-variable-changed-value';\n}\n\nexport interface SceneVariableDependencyConfigLike {\n /** Return all variable names this object depend on */\n getNames(): Set<string>;\n\n /** Used to check for dependency on a specific variable */\n hasDependencyOn(name: string): boolean;\n\n /**\n * Will be called when the VariableSet have completed an update process or when a variable has changed value.\n **/\n variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean): void;\n}\n\n/**\n * Used in CustomFormatterFn\n */\nexport interface CustomFormatterVariable {\n name: string;\n type: VariableType;\n multi?: boolean;\n includeAll?: boolean;\n}\n\nexport type VariableCustomFormatterFn = (\n value: unknown,\n legacyVariableModel: Partial<CustomFormatterVariable>,\n legacyDefaultFormatter?: VariableCustomFormatterFn\n) => string;\n\nexport type InterpolationFormatParameter = string | VariableCustomFormatterFn | undefined;\n\nexport function isCustomVariableValue(value: VariableValue): value is CustomVariableValue {\n return typeof value === 'object' && 'formatter' in value;\n}\n"],"names":[],"mappings":";;AAgGO,MAAM,uCAAuC,mBAAmC,CAAA;AAEvF;AAFa,8BAAA,CACG,IAAO,GAAA,8BAAA;AAkChB,SAAS,sBAAsB,KAAoD,EAAA;AACxF,EAAO,OAAA,OAAO,KAAU,KAAA,QAAA,IAAY,WAAe,IAAA,KAAA;AACrD;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../src/variables/types.ts"],"sourcesContent":["import { Observable } from 'rxjs';\n\nimport { BusEventWithPayload } from '@grafana/data';\nimport { VariableType, VariableHide } from '@grafana/schema';\n\nimport { SceneObject, SceneObjectState } from '../core/types';\n\nexport interface SceneVariableState extends SceneObjectState {\n type: VariableType;\n name: string;\n label?: string;\n hide?: VariableHide;\n skipUrlSync?: boolean;\n loading?: boolean;\n error?: any | null;\n description?: string | null;\n}\n\nexport interface SceneVariable<TState extends SceneVariableState = SceneVariableState> extends SceneObject<TState> {\n /**\n * This function is called on activation or when a dependency changes.\n */\n validateAndUpdate?(): Observable<ValidateAndUpdateResult>;\n\n /**\n * Should return the value for the given field path\n */\n getValue(fieldPath?: string): VariableValue | undefined | null;\n\n /**\n * Should return the value display text, used by the \"text\" formatter\n * Example: ${podId:text}\n * Useful for variables that have non user friendly values but friendly display text names.\n */\n getValueText?(fieldPath?: string): string;\n\n /**\n * For special edge case senarios. For example local function that locally scoped variables can implement.\n **/\n isAncestorLoading?(): boolean;\n\n /**\n * Allows cancelling variable execution.\n */\n onCancel?(): void;\n\n /**\n * Edge case for variables that are hidden but wants to be render to access react contexts (ScopesVariable)\n */\n UNSAFE_renderAsHidden?: boolean;\n\n /**\n * @experimental\n * Indicates that a variable loads values lazily when user interacts with the variable dropdown.\n */\n isLazy?: boolean;\n}\n\nexport type VariableValue = VariableValueSingle | VariableValueSingle[];\n\nexport type VariableValueSingle = string | boolean | number | CustomVariableValue;\n\n/**\n * This is for edge case values like the custom \"allValue\" that should not be escaped/formatted like other values\n * The custom all value usually contain wildcards that should not be escaped.\n */\nexport interface CustomVariableValue {\n /**\n * The format name or function used in the expression\n */\n formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string;\n}\n\nexport interface ValidateAndUpdateResult {}\nexport interface VariableValueOption {\n label: string;\n value: VariableValueSingle;\n group?: string;\n}\n\nexport interface SceneVariableSetState extends SceneObjectState {\n variables: SceneVariable[];\n}\n\nexport interface SceneVariables extends SceneObject<SceneVariableSetState> {\n /**\n * Will look for and return variable matching name\n */\n getByName(name: string): SceneVariable | undefined;\n /**\n * Will return true if the variable is loading or waiting for an update to complete.\n */\n isVariableLoadingOrWaitingToUpdate(variable: SceneVariable): boolean;\n}\n\nexport class SceneVariableValueChangedEvent extends BusEventWithPayload<SceneVariable> {\n public static type = 'scene-variable-changed-value';\n}\n\nexport interface SceneVariableDependencyConfigLike {\n /** Return all variable names this object depend on */\n getNames(): Set<string>;\n\n /** Used to check for dependency on a specific variable */\n hasDependencyOn(name: string): boolean;\n\n /**\n * Will be called when the VariableSet have completed an update process or when a variable has changed value.\n **/\n variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean): void;\n}\n\n/**\n * Used in CustomFormatterFn\n */\nexport interface CustomFormatterVariable {\n name: string;\n type: VariableType;\n multi?: boolean;\n includeAll?: boolean;\n}\n\nexport type VariableCustomFormatterFn = (\n value: unknown,\n legacyVariableModel: Partial<CustomFormatterVariable>,\n legacyDefaultFormatter?: VariableCustomFormatterFn\n) => string;\n\nexport type InterpolationFormatParameter = string | VariableCustomFormatterFn | undefined;\n\nexport function isCustomVariableValue(value: VariableValue): value is CustomVariableValue {\n return typeof value === 'object' && 'formatter' in value;\n}\n"],"names":[],"mappings":";;AA+FO,MAAM,uCAAuC,mBAAmC,CAAA;AAEvF;AAFa,8BAAA,CACG,IAAO,GAAA,8BAAA;AAkChB,SAAS,sBAAsB,KAAoD,EAAA;AACxF,EAAO,OAAA,OAAO,KAAU,KAAA,QAAA,IAAY,WAAe,IAAA,KAAA;AACrD;;;;"}
@@ -42,10 +42,6 @@ var grafanaScenes = {
42
42
  splitter: {
43
43
  "aria-label-pane-resize-widget": "Pane resize widget"
44
44
  },
45
- "time-picker": {
46
- "move-backward-tooltip": "Move {{moveBackwardDuration}} backward",
47
- "move-forward-tooltip": "Move {{moveForwardDuration}} forward"
48
- },
49
45
  "viz-panel": {
50
46
  title: {
51
47
  title: "Title"
@@ -158,4 +154,4 @@ var grafanaScenes = {
158
154
  };
159
155
 
160
156
  exports.default = grafanaScenes;
161
- //# sourceMappingURL=grafana-scenes-Bnbq8XI2.js.map
157
+ //# sourceMappingURL=grafana-scenes-C_CT7peT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grafana-scenes-Bnbq8XI2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"grafana-scenes-C_CT7peT.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -40,7 +40,6 @@ interface SceneVariableState extends SceneObjectState {
40
40
  loading?: boolean;
41
41
  error?: any | null;
42
42
  description?: string | null;
43
- showInControlsMenu?: boolean;
44
43
  }
45
44
  interface SceneVariable<TState extends SceneVariableState = SceneVariableState> extends SceneObject<TState> {
46
45
  /**
package/dist/index.js CHANGED
@@ -12557,7 +12557,7 @@ class SceneTimePicker extends SceneObjectBase {
12557
12557
  const {
12558
12558
  state: { value: range }
12559
12559
  } = timeRange;
12560
- timeRange.onTimeRangeChange(getShiftedTimeRange(0 /* Backward */, range));
12560
+ timeRange.onTimeRangeChange(getShiftedTimeRange(0 /* Backward */, range, Date.now()));
12561
12561
  };
12562
12562
  this.onMoveForward = () => {
12563
12563
  const timeRange = sceneGraph.getTimeRange(this);
@@ -12583,13 +12583,6 @@ function SceneTimePickerRenderer({ model }) {
12583
12583
  return null;
12584
12584
  }
12585
12585
  const rangesToUse = quickRanges || defaultQuickRanges;
12586
- const halfSpanMs = (timeRangeState.value.to.valueOf() - timeRangeState.value.from.valueOf()) / 2;
12587
- const moveBackwardDuration = data.intervalToAbbreviatedDurationString({
12588
- start: new Date(timeRangeState.value.from.valueOf()),
12589
- end: new Date(timeRangeState.value.from.valueOf() + halfSpanMs)
12590
- });
12591
- const canMoveForward = timeRangeState.value.to.valueOf() + halfSpanMs <= Date.now();
12592
- const moveForwardDuration = canMoveForward ? moveBackwardDuration : void 0;
12593
12586
  return /* @__PURE__ */ React__default.default.createElement(
12594
12587
  ui.TimeRangePicker,
12595
12588
  {
@@ -12605,14 +12598,6 @@ function SceneTimePickerRenderer({ model }) {
12605
12598
  fiscalYearStartMonth: timeRangeState.fiscalYearStartMonth,
12606
12599
  onMoveBackward: model.onMoveBackward,
12607
12600
  onMoveForward: model.onMoveForward,
12608
- moveForwardTooltip: moveForwardDuration ? i18n.t("grafana-scenes.components.time-picker.move-forward-tooltip", "Move {{moveForwardDuration}} forward", {
12609
- moveForwardDuration
12610
- }) : void 0,
12611
- moveBackwardTooltip: i18n.t(
12612
- "grafana-scenes.components.time-picker.move-backward-tooltip",
12613
- "Move {{moveBackwardDuration}} backward",
12614
- { moveBackwardDuration }
12615
- ),
12616
12601
  onZoom: model.onZoom,
12617
12602
  onChangeTimeZone: timeRange.onTimeZoneChange,
12618
12603
  onChangeFiscalYearStartMonth: model.onChangeFiscalYearStartMonth,
@@ -12642,7 +12627,7 @@ function getShiftedTimeRange(dir, timeRange, upperLimit) {
12642
12627
  } else {
12643
12628
  fromRaw = oldFrom + halfSpan;
12644
12629
  toRaw = oldTo + halfSpan;
12645
- if (upperLimit !== void 0 && toRaw > upperLimit && oldTo < upperLimit) {
12630
+ if (toRaw > upperLimit && oldTo < upperLimit) {
12646
12631
  toRaw = upperLimit;
12647
12632
  fromRaw = oldFrom;
12648
12633
  }
@@ -15124,7 +15109,7 @@ function __variableDynamicImportRuntime0__(path) {
15124
15109
  switch (path) {
15125
15110
  case '../locales/cs-CZ/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BcDO8gk4.js'); });
15126
15111
  case '../locales/de-DE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CzZTvOrf.js'); });
15127
- case '../locales/en-US/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-Bnbq8XI2.js'); });
15112
+ case '../locales/en-US/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-C_CT7peT.js'); });
15128
15113
  case '../locales/es-ES/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-zGpJY4O3.js'); });
15129
15114
  case '../locales/fr-FR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CfoPR_PZ.js'); });
15130
15115
  case '../locales/hu-HU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CoXR5Z7T.js'); });