@grafana/scenes 6.5.0--canary.1062.13950672491.0 → 6.5.1--canary.1077.13964702348.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.
Files changed (276) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/esm/behaviors/ActWhenVariableChanged.js.map +1 -1
  3. package/dist/esm/behaviors/CursorSync.js +3 -21
  4. package/dist/esm/behaviors/CursorSync.js.map +1 -1
  5. package/dist/esm/behaviors/LiveNowTimer.js +3 -2
  6. package/dist/esm/behaviors/LiveNowTimer.js.map +1 -1
  7. package/dist/esm/behaviors/SceneQueryController.js +7 -37
  8. package/dist/esm/behaviors/SceneQueryController.js.map +1 -1
  9. package/dist/esm/behaviors/SceneRenderProfiler.js +10 -17
  10. package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
  11. package/dist/esm/components/EmbeddedScene.js +1 -12
  12. package/dist/esm/components/EmbeddedScene.js.map +1 -1
  13. package/dist/esm/components/NestedScene.js +23 -30
  14. package/dist/esm/components/NestedScene.js.map +1 -1
  15. package/dist/esm/components/SceneApp/SceneApp.js +1 -11
  16. package/dist/esm/components/SceneApp/SceneApp.js.map +1 -1
  17. package/dist/esm/components/SceneApp/SceneAppPage.js +28 -47
  18. package/dist/esm/components/SceneApp/SceneAppPage.js.map +1 -1
  19. package/dist/esm/components/SceneApp/SceneAppPageView.js +14 -20
  20. package/dist/esm/components/SceneApp/SceneAppPageView.js.map +1 -1
  21. package/dist/esm/components/SceneApp/utils.js +2 -18
  22. package/dist/esm/components/SceneApp/utils.js.map +1 -1
  23. package/dist/esm/components/SceneByFrameRepeater.js +1 -3
  24. package/dist/esm/components/SceneByFrameRepeater.js.map +1 -1
  25. package/dist/esm/components/SceneByVariableRepeater.js +1 -3
  26. package/dist/esm/components/SceneByVariableRepeater.js.map +1 -1
  27. package/dist/esm/components/SceneCanvasText.js +1 -4
  28. package/dist/esm/components/SceneCanvasText.js.map +1 -1
  29. package/dist/esm/components/SceneControlsSpacer.js +1 -3
  30. package/dist/esm/components/SceneControlsSpacer.js.map +1 -1
  31. package/dist/esm/components/SceneDebugger/DebugDetails.js +11 -24
  32. package/dist/esm/components/SceneDebugger/DebugDetails.js.map +1 -1
  33. package/dist/esm/components/SceneDebugger/DebugTreeNode.js +2 -14
  34. package/dist/esm/components/SceneDebugger/DebugTreeNode.js.map +1 -1
  35. package/dist/esm/components/SceneDebugger/SceneDebugger.js +1 -29
  36. package/dist/esm/components/SceneDebugger/SceneDebugger.js.map +1 -1
  37. package/dist/esm/components/SceneReactObject.js +1 -17
  38. package/dist/esm/components/SceneReactObject.js.map +1 -1
  39. package/dist/esm/components/SceneRefreshPicker.js +23 -38
  40. package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
  41. package/dist/esm/components/SceneTimePicker.js +27 -29
  42. package/dist/esm/components/SceneTimePicker.js.map +1 -1
  43. package/dist/esm/components/SceneTimeRangeCompare.js +36 -50
  44. package/dist/esm/components/SceneTimeRangeCompare.js.map +1 -1
  45. package/dist/esm/components/SceneToolbarButton.js +10 -14
  46. package/dist/esm/components/SceneToolbarButton.js.map +1 -1
  47. package/dist/esm/components/VizPanel/VizPanel.js +20 -29
  48. package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
  49. package/dist/esm/components/VizPanel/VizPanelExploreButton.js +17 -13
  50. package/dist/esm/components/VizPanel/VizPanelExploreButton.js.map +1 -1
  51. package/dist/esm/components/VizPanel/VizPanelMenu.js +18 -20
  52. package/dist/esm/components/VizPanel/VizPanelMenu.js.map +1 -1
  53. package/dist/esm/components/VizPanel/VizPanelRenderer.js +92 -122
  54. package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
  55. package/dist/esm/components/VizPanel/VizPanelSeriesLimit.js +7 -15
  56. package/dist/esm/components/VizPanel/VizPanelSeriesLimit.js.map +1 -1
  57. package/dist/esm/components/VizPanel/colorSeriesConfigFactory.js +15 -29
  58. package/dist/esm/components/VizPanel/colorSeriesConfigFactory.js.map +1 -1
  59. package/dist/esm/components/VizPanel/registerRuntimePanelPlugin.js +3 -21
  60. package/dist/esm/components/VizPanel/registerRuntimePanelPlugin.js.map +1 -1
  61. package/dist/esm/components/VizPanel/seriesVisibilityConfigFactory.js +22 -34
  62. package/dist/esm/components/VizPanel/seriesVisibilityConfigFactory.js.map +1 -1
  63. package/dist/esm/components/layout/CSSGrid/SceneCSSGridLayout.js +8 -40
  64. package/dist/esm/components/layout/CSSGrid/SceneCSSGridLayout.js.map +1 -1
  65. package/dist/esm/components/layout/LazyLoader.js +2 -35
  66. package/dist/esm/components/layout/LazyLoader.js.map +1 -1
  67. package/dist/esm/components/layout/SceneFlexLayout.js +3 -13
  68. package/dist/esm/components/layout/SceneFlexLayout.js.map +1 -1
  69. package/dist/esm/components/layout/grid/SceneGridItem.js +1 -3
  70. package/dist/esm/components/layout/grid/SceneGridItem.js.map +1 -1
  71. package/dist/esm/components/layout/grid/SceneGridLayout.js +26 -26
  72. package/dist/esm/components/layout/grid/SceneGridLayout.js.map +1 -1
  73. package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js +88 -104
  74. package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js.map +1 -1
  75. package/dist/esm/components/layout/grid/SceneGridRow.js +15 -48
  76. package/dist/esm/components/layout/grid/SceneGridRow.js.map +1 -1
  77. package/dist/esm/components/layout/grid/constants.js.map +1 -1
  78. package/dist/esm/components/layout/grid/types.js.map +1 -1
  79. package/dist/esm/components/layout/grid/utils.js +3 -21
  80. package/dist/esm/components/layout/grid/utils.js.map +1 -1
  81. package/dist/esm/components/layout/split/SplitLayout.js.map +1 -1
  82. package/dist/esm/components/layout/split/SplitLayoutRenderer.js +11 -14
  83. package/dist/esm/components/layout/split/SplitLayoutRenderer.js.map +1 -1
  84. package/dist/esm/components/layout/split/Splitter.js +60 -58
  85. package/dist/esm/components/layout/split/Splitter.js.map +1 -1
  86. package/dist/esm/core/PanelBuilders/FieldConfigBuilder.js +46 -23
  87. package/dist/esm/core/PanelBuilders/FieldConfigBuilder.js.map +1 -1
  88. package/dist/esm/core/PanelBuilders/FieldConfigBuilders.js +8 -8
  89. package/dist/esm/core/PanelBuilders/FieldConfigBuilders.js.map +1 -1
  90. package/dist/esm/core/PanelBuilders/FieldConfigOverridesBuilder.js.map +1 -1
  91. package/dist/esm/core/PanelBuilders/PanelOptionsBuilder.js +3 -0
  92. package/dist/esm/core/PanelBuilders/PanelOptionsBuilder.js.map +1 -1
  93. package/dist/esm/core/PanelBuilders/PanelOptionsBuilders.js +28 -28
  94. package/dist/esm/core/PanelBuilders/PanelOptionsBuilders.js.map +1 -1
  95. package/dist/esm/core/PanelBuilders/StandardFieldConfigBuilders.js.map +1 -1
  96. package/dist/esm/core/PanelBuilders/VizConfigBuilder.js +39 -0
  97. package/dist/esm/core/PanelBuilders/VizConfigBuilder.js.map +1 -1
  98. package/dist/esm/core/PanelBuilders/VizConfigBuilders.js +32 -32
  99. package/dist/esm/core/PanelBuilders/VizConfigBuilders.js.map +1 -1
  100. package/dist/esm/core/PanelBuilders/VizPanelBuilder.js +82 -21
  101. package/dist/esm/core/PanelBuilders/VizPanelBuilder.js.map +1 -1
  102. package/dist/esm/core/PanelBuilders/index.js +32 -32
  103. package/dist/esm/core/PanelBuilders/index.js.map +1 -1
  104. package/dist/esm/core/SceneComponentWrapper.js +4 -38
  105. package/dist/esm/core/SceneComponentWrapper.js.map +1 -1
  106. package/dist/esm/core/SceneDataNode.js +4 -19
  107. package/dist/esm/core/SceneDataNode.js.map +1 -1
  108. package/dist/esm/core/SceneObjectBase.js +55 -17
  109. package/dist/esm/core/SceneObjectBase.js.map +1 -1
  110. package/dist/esm/core/SceneObjectRef.js +7 -18
  111. package/dist/esm/core/SceneObjectRef.js.map +1 -1
  112. package/dist/esm/core/SceneScopesBridge.js +15 -0
  113. package/dist/esm/core/SceneScopesBridge.js.map +1 -1
  114. package/dist/esm/core/SceneTimeRange.js +9 -17
  115. package/dist/esm/core/SceneTimeRange.js.map +1 -1
  116. package/dist/esm/core/SceneTimeRangeTransformerBase.js.map +1 -1
  117. package/dist/esm/core/SceneTimeZoneOverride.js +7 -23
  118. package/dist/esm/core/SceneTimeZoneOverride.js.map +1 -1
  119. package/dist/esm/core/events.js.map +1 -1
  120. package/dist/esm/core/sceneGraph/getQueryController.js.map +1 -1
  121. package/dist/esm/core/sceneGraph/getTimeRange.js.map +1 -1
  122. package/dist/esm/core/sceneGraph/index.js +1 -1
  123. package/dist/esm/core/sceneGraph/index.js.map +1 -1
  124. package/dist/esm/core/sceneGraph/sceneGraph.js.map +1 -1
  125. package/dist/esm/core/sceneGraph/utils.js +1 -17
  126. package/dist/esm/core/sceneGraph/utils.js.map +1 -1
  127. package/dist/esm/core/types.js.map +1 -1
  128. package/dist/esm/index.js +6 -5
  129. package/dist/esm/index.js.map +1 -1
  130. package/dist/esm/querying/DataLayersMerger.js.map +1 -1
  131. package/dist/esm/querying/DataProviderProxy.js.map +1 -1
  132. package/dist/esm/querying/ExtraQueryProvider.js.map +1 -1
  133. package/dist/esm/querying/RuntimeDataSource.js.map +1 -1
  134. package/dist/esm/querying/SceneDataLayerSet.js +9 -24
  135. package/dist/esm/querying/SceneDataLayerSet.js.map +1 -1
  136. package/dist/esm/querying/SceneDataTransformer.js +11 -24
  137. package/dist/esm/querying/SceneDataTransformer.js.map +1 -1
  138. package/dist/esm/querying/SceneQueryRunner.js +44 -33
  139. package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
  140. package/dist/esm/querying/extraQueryProcessingOperator.js +3 -21
  141. package/dist/esm/querying/extraQueryProcessingOperator.js.map +1 -1
  142. package/dist/esm/querying/getEnrichedDataRequest.js.map +1 -1
  143. package/dist/esm/querying/layers/SceneDataLayerBase.js +16 -19
  144. package/dist/esm/querying/layers/SceneDataLayerBase.js.map +1 -1
  145. package/dist/esm/querying/layers/SceneDataLayerControls.js +15 -21
  146. package/dist/esm/querying/layers/SceneDataLayerControls.js.map +1 -1
  147. package/dist/esm/querying/layers/annotations/AnnotationsDataLayer.js +12 -30
  148. package/dist/esm/querying/layers/annotations/AnnotationsDataLayer.js.map +1 -1
  149. package/dist/esm/querying/layers/annotations/filterAnnotations.js +6 -23
  150. package/dist/esm/querying/layers/annotations/filterAnnotations.js.map +1 -1
  151. package/dist/esm/querying/layers/annotations/standardAnnotationQuery.js +19 -29
  152. package/dist/esm/querying/layers/annotations/standardAnnotationQuery.js.map +1 -1
  153. package/dist/esm/querying/layers/annotations/standardAnnotationsSupport.js +14 -34
  154. package/dist/esm/querying/layers/annotations/standardAnnotationsSupport.js.map +1 -1
  155. package/dist/esm/querying/layers/annotations/utils.js +1 -17
  156. package/dist/esm/querying/layers/annotations/utils.js.map +1 -1
  157. package/dist/esm/querying/registerQueryWithController.js.map +1 -1
  158. package/dist/esm/services/SceneObjectUrlSyncConfig.js.map +1 -1
  159. package/dist/esm/services/UniqueUrlKeyMapper.js.map +1 -1
  160. package/dist/esm/services/UrlSyncContextProvider.js.map +1 -1
  161. package/dist/esm/services/UrlSyncManager.js +11 -19
  162. package/dist/esm/services/UrlSyncManager.js.map +1 -1
  163. package/dist/esm/services/useUrlSync.js.map +1 -1
  164. package/dist/esm/services/utils.js.map +1 -1
  165. package/dist/esm/utils/ControlsLabel.js +23 -47
  166. package/dist/esm/utils/ControlsLabel.js.map +1 -1
  167. package/dist/esm/utils/LoadingIndicator.js +11 -10
  168. package/dist/esm/utils/LoadingIndicator.js.map +1 -1
  169. package/dist/esm/utils/SafeSerializableSceneObject.js +7 -18
  170. package/dist/esm/utils/SafeSerializableSceneObject.js.map +1 -1
  171. package/dist/esm/utils/compatibility/setWindowGrafanaSceneContext.js.map +1 -1
  172. package/dist/esm/utils/date.js.map +1 -1
  173. package/dist/esm/utils/evaluateTimeRange.js.map +1 -1
  174. package/dist/esm/utils/explore.js.map +1 -1
  175. package/dist/esm/utils/getCompareSeriesRefId.js.map +1 -1
  176. package/dist/esm/utils/getDataSource.js.map +1 -1
  177. package/dist/esm/utils/getMessageFromError.js.map +1 -1
  178. package/dist/esm/utils/metricTree.js.map +1 -1
  179. package/dist/esm/utils/parseUrlParam.js.map +1 -1
  180. package/dist/esm/utils/utils.js.map +1 -1
  181. package/dist/esm/utils/wrapInSafeSerializableSceneObject.js.map +1 -1
  182. package/dist/esm/utils/writeSceneLog.js.map +1 -1
  183. package/dist/esm/variables/VariableDependencyConfig.js +9 -0
  184. package/dist/esm/variables/VariableDependencyConfig.js.map +1 -1
  185. package/dist/esm/variables/VariableValueRecorder.js.map +1 -1
  186. package/dist/esm/variables/adhoc/AdHocFilterBuilder.js +13 -12
  187. package/dist/esm/variables/adhoc/AdHocFilterBuilder.js.map +1 -1
  188. package/dist/esm/variables/adhoc/AdHocFilterRenderer.js +129 -142
  189. package/dist/esm/variables/adhoc/AdHocFilterRenderer.js.map +1 -1
  190. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js +84 -91
  191. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js.map +1 -1
  192. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js +1 -6
  193. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js.map +1 -1
  194. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +195 -194
  195. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
  196. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +34 -28
  197. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js.map +1 -1
  198. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/DropdownItem.js +28 -65
  199. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/DropdownItem.js.map +1 -1
  200. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/MultiValuePill.js +29 -43
  201. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/MultiValuePill.js.map +1 -1
  202. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/useFloatingInteractions.js +2 -1
  203. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/useFloatingInteractions.js.map +1 -1
  204. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/utils.js.map +1 -1
  205. package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +43 -55
  206. package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
  207. package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
  208. package/dist/esm/variables/adhoc/getAdHocFiltersFromScopes.js +1 -0
  209. package/dist/esm/variables/adhoc/getAdHocFiltersFromScopes.js.map +1 -1
  210. package/dist/esm/variables/adhoc/getAdhocOptionSearcher.js.map +1 -1
  211. package/dist/esm/variables/adhoc/patchGetAdhocFilters.js.map +1 -1
  212. package/dist/esm/variables/components/VariableValueControl.js +9 -6
  213. package/dist/esm/variables/components/VariableValueControl.js.map +1 -1
  214. package/dist/esm/variables/components/VariableValueInput.js +13 -10
  215. package/dist/esm/variables/components/VariableValueInput.js.map +1 -1
  216. package/dist/esm/variables/components/VariableValueSelect.js +90 -115
  217. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
  218. package/dist/esm/variables/components/VariableValueSelectors.js +20 -37
  219. package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -1
  220. package/dist/esm/variables/components/getOptionSearcher.js +1 -1
  221. package/dist/esm/variables/components/getOptionSearcher.js.map +1 -1
  222. package/dist/esm/variables/constants.js.map +1 -1
  223. package/dist/esm/variables/filter.js +6 -1
  224. package/dist/esm/variables/filter.js.map +1 -1
  225. package/dist/esm/variables/getEnrichedFiltersRequest.js.map +1 -1
  226. package/dist/esm/variables/groupby/GroupByVariable.js +106 -112
  227. package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
  228. package/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.js.map +1 -1
  229. package/dist/esm/variables/groupby/findActiveGroupByVariablesByUid.js.map +1 -1
  230. package/dist/esm/variables/interpolation/ScopedVarsVariable.js.map +1 -1
  231. package/dist/esm/variables/interpolation/defaults.js.map +1 -1
  232. package/dist/esm/variables/interpolation/fieldAccessorCache.js.map +1 -1
  233. package/dist/esm/variables/interpolation/formatRegistry.js.map +1 -1
  234. package/dist/esm/variables/interpolation/sceneInterpolator.js.map +1 -1
  235. package/dist/esm/variables/lookupVariable.js.map +1 -1
  236. package/dist/esm/variables/macros/AllVariablesMacro.js.map +1 -1
  237. package/dist/esm/variables/macros/contextMacros.js.map +1 -1
  238. package/dist/esm/variables/macros/dataMacros.js.map +1 -1
  239. package/dist/esm/variables/macros/index.js.map +1 -1
  240. package/dist/esm/variables/macros/templateProxies.js +4 -21
  241. package/dist/esm/variables/macros/templateProxies.js.map +1 -1
  242. package/dist/esm/variables/macros/timeMacros.js.map +1 -1
  243. package/dist/esm/variables/macros/types.js.map +1 -1
  244. package/dist/esm/variables/macros/urlMacros.js.map +1 -1
  245. package/dist/esm/variables/sets/SceneVariableSet.js +44 -0
  246. package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -1
  247. package/dist/esm/variables/types.js.map +1 -1
  248. package/dist/esm/variables/utils.js.map +1 -1
  249. package/dist/esm/variables/variants/ConstantVariable.js +4 -23
  250. package/dist/esm/variables/variants/ConstantVariable.js.map +1 -1
  251. package/dist/esm/variables/variants/CustomVariable.js +4 -19
  252. package/dist/esm/variables/variants/CustomVariable.js.map +1 -1
  253. package/dist/esm/variables/variants/DataSourceVariable.js +4 -19
  254. package/dist/esm/variables/variants/DataSourceVariable.js.map +1 -1
  255. package/dist/esm/variables/variants/IntervalVariable.js +17 -29
  256. package/dist/esm/variables/variants/IntervalVariable.js.map +1 -1
  257. package/dist/esm/variables/variants/LocalValueVariable.js +8 -23
  258. package/dist/esm/variables/variants/LocalValueVariable.js.map +1 -1
  259. package/dist/esm/variables/variants/MultiValueVariable.js +16 -0
  260. package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -1
  261. package/dist/esm/variables/variants/TestVariable.js +5 -19
  262. package/dist/esm/variables/variants/TestVariable.js.map +1 -1
  263. package/dist/esm/variables/variants/TextBoxVariable.js +5 -22
  264. package/dist/esm/variables/variants/TextBoxVariable.js.map +1 -1
  265. package/dist/esm/variables/variants/guards.js.map +1 -1
  266. package/dist/esm/variables/variants/query/QueryVariable.js +8 -20
  267. package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -1
  268. package/dist/esm/variables/variants/query/createQueryVariableRunner.js +6 -23
  269. package/dist/esm/variables/variants/query/createQueryVariableRunner.js.map +1 -1
  270. package/dist/esm/variables/variants/query/guards.js.map +1 -1
  271. package/dist/esm/variables/variants/query/toMetricFindValues.js.map +1 -1
  272. package/dist/esm/variables/variants/query/utils.js.map +1 -1
  273. package/dist/index.d.ts +36 -6
  274. package/dist/index.js +2035 -2791
  275. package/dist/index.js.map +1 -1
  276. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"SceneDebugger.js","sources":["../../../../src/components/SceneDebugger/SceneDebugger.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { CustomScrollbar, Drawer, ToolbarButton, useStyles2 } from '@grafana/ui';\nimport React, { useState } from 'react';\n\nimport { SceneObject } from '../../core/types';\nimport { DebugDetails } from './DebugDetails';\nimport { DebugTreeNode } from './DebugTreeNode';\n\nexport interface Props {\n scene: SceneObject;\n}\n\n/**\n * @internal\n * Please don't use from plugins directly.\n * This is already exposed via SceneAppPage and the ?scene-debugger query parameter.\n *\n * This is only exported so that core dashboards can use it.\n */\nexport function SceneDebugger({ scene }: Props) {\n const styles = useStyles2(getStyles);\n const [isOpen, setIsOpen] = useState(false);\n const [selectedObject, setSelectedObject] = useState<SceneObject>();\n\n return (\n <>\n <ToolbarButton variant=\"canvas\" icon=\"bug\" onClick={() => setIsOpen(true)} />\n {isOpen && (\n <Drawer title=\"Scene debugger\" onClose={() => setIsOpen(false)} size=\"lg\">\n <div className={styles.panes}>\n <div className={styles.pane1}>\n <div className={styles.paneHeading}>Scene graph</div>\n <CustomScrollbar autoHeightMin={'100%'}>\n <div className={styles.treeWrapper}>\n <DebugTreeNode node={scene} selectedObject={selectedObject} onSelect={setSelectedObject} />\n </div>\n </CustomScrollbar>\n </div>\n <div className={styles.pane2}>\n <div className={styles.paneHeading}>Object details</div>\n {selectedObject && <DebugDetails node={selectedObject} />}\n </div>\n </div>\n </Drawer>\n )}\n </>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n panes: css({\n flexGrow: 1,\n display: 'flex',\n height: '100%',\n flexDirection: 'row',\n marginTop: theme.spacing(-2),\n }),\n pane1: css({\n flexGrow: 0,\n display: 'flex',\n height: '100%',\n flexDirection: 'column',\n borderRight: `1px solid ${theme.colors.border.weak}`,\n }),\n pane2: css({\n flexGrow: 1,\n display: 'flex',\n minHeight: '100%',\n flexDirection: 'column',\n paddingLeft: theme.spacing(2),\n }),\n treeWrapper: css({\n paddingRight: theme.spacing(2),\n height: '100%',\n marginLeft: theme.spacing(-1),\n }),\n paneHeading: css({\n padding: theme.spacing(1, 0),\n fontWeight: theme.typography.fontWeightMedium,\n }),\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SceneDebugger.js","sources":["../../../../src/components/SceneDebugger/SceneDebugger.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { CustomScrollbar, Drawer, ToolbarButton, useStyles2 } from '@grafana/ui';\nimport React, { useState } from 'react';\n\nimport { SceneObject } from '../../core/types';\nimport { DebugDetails } from './DebugDetails';\nimport { DebugTreeNode } from './DebugTreeNode';\n\nexport interface Props {\n scene: SceneObject;\n}\n\n/**\n * @internal\n * Please don't use from plugins directly.\n * This is already exposed via SceneAppPage and the ?scene-debugger query parameter.\n *\n * This is only exported so that core dashboards can use it.\n */\nexport function SceneDebugger({ scene }: Props) {\n const styles = useStyles2(getStyles);\n const [isOpen, setIsOpen] = useState(false);\n const [selectedObject, setSelectedObject] = useState<SceneObject>();\n\n return (\n <>\n <ToolbarButton variant=\"canvas\" icon=\"bug\" onClick={() => setIsOpen(true)} />\n {isOpen && (\n <Drawer title=\"Scene debugger\" onClose={() => setIsOpen(false)} size=\"lg\">\n <div className={styles.panes}>\n <div className={styles.pane1}>\n <div className={styles.paneHeading}>Scene graph</div>\n <CustomScrollbar autoHeightMin={'100%'}>\n <div className={styles.treeWrapper}>\n <DebugTreeNode node={scene} selectedObject={selectedObject} onSelect={setSelectedObject} />\n </div>\n </CustomScrollbar>\n </div>\n <div className={styles.pane2}>\n <div className={styles.paneHeading}>Object details</div>\n {selectedObject && <DebugDetails node={selectedObject} />}\n </div>\n </div>\n </Drawer>\n )}\n </>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n panes: css({\n flexGrow: 1,\n display: 'flex',\n height: '100%',\n flexDirection: 'row',\n marginTop: theme.spacing(-2),\n }),\n pane1: css({\n flexGrow: 0,\n display: 'flex',\n height: '100%',\n flexDirection: 'column',\n borderRight: `1px solid ${theme.colors.border.weak}`,\n }),\n pane2: css({\n flexGrow: 1,\n display: 'flex',\n minHeight: '100%',\n flexDirection: 'column',\n paddingLeft: theme.spacing(2),\n }),\n treeWrapper: css({\n paddingRight: theme.spacing(2),\n height: '100%',\n marginLeft: theme.spacing(-1),\n }),\n paneHeading: css({\n padding: theme.spacing(1, 0),\n fontWeight: theme.typography.fontWeightMedium,\n }),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,28 +1,12 @@
1
1
  import React from 'react';
2
2
  import { SceneObjectBase } from '../core/SceneObjectBase.js';
3
3
 
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
- var __spreadValues = (a, b) => {
10
- for (var prop in b || (b = {}))
11
- if (__hasOwnProp.call(b, prop))
12
- __defNormalProp(a, prop, b[prop]);
13
- if (__getOwnPropSymbols)
14
- for (var prop of __getOwnPropSymbols(b)) {
15
- if (__propIsEnum.call(b, prop))
16
- __defNormalProp(a, prop, b[prop]);
17
- }
18
- return a;
19
- };
20
4
  class SceneReactObject extends SceneObjectBase {
21
5
  }
22
6
  SceneReactObject.Component = ({ model }) => {
23
7
  const { component: Component, props, reactNode } = model.useState();
24
8
  if (Component) {
25
- return /* @__PURE__ */ React.createElement(Component, __spreadValues({}, props));
9
+ return /* @__PURE__ */ React.createElement(Component, { ...props });
26
10
  }
27
11
  if (reactNode) {
28
12
  return reactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"SceneReactObject.js","sources":["../../../src/components/SceneReactObject.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\n\nexport interface SceneReactObjectState<TProps = {}> extends SceneObjectState {\n /**\n * React component to render\n */\n component?: React.ComponentType<TProps>;\n /**\n * Props to pass to the component\n */\n props?: TProps;\n /**\n * Alternative to component and props is just to pass a React node\n */\n reactNode?: React.ReactNode;\n}\n\n/**\n * A utility object that can be used to render any React component or ReactNode\n */\nexport class SceneReactObject<TProps = {}> extends SceneObjectBase<SceneReactObjectState<TProps>> {\n public static Component = ({ model }: SceneComponentProps<SceneReactObject>) => {\n const { component: Component, props, reactNode } = model.useState();\n\n if (Component) {\n return <Component {...props} />;\n }\n\n if (reactNode) {\n return reactNode;\n }\n\n return null;\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAuBO,MAAM,yBAAsC,eAA+C,CAAA;AAclG,CAAA;AAda,gBAAA,CACG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAmD,KAAA;AAC9E,EAAA,MAAM,EAAE,SAAW,EAAA,SAAA,EAAW,OAAO,SAAU,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAElE,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,8BAAc,KAAO,CAAA,CAAA,CAAA;AAAA,GAC/B;AAEA,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;;;;"}
1
+ {"version":3,"file":"SceneReactObject.js","sources":["../../../src/components/SceneReactObject.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\n\nexport interface SceneReactObjectState<TProps = {}> extends SceneObjectState {\n /**\n * React component to render\n */\n component?: React.ComponentType<TProps>;\n /**\n * Props to pass to the component\n */\n props?: TProps;\n /**\n * Alternative to component and props is just to pass a React node\n */\n reactNode?: React.ReactNode;\n}\n\n/**\n * A utility object that can be used to render any React component or ReactNode\n */\nexport class SceneReactObject<TProps = {}> extends SceneObjectBase<SceneReactObjectState<TProps>> {\n public static Component = ({ model }: SceneComponentProps<SceneReactObject>) => {\n const { component: Component, props, reactNode } = model.useState();\n\n if (Component) {\n return <Component {...props} />;\n }\n\n if (reactNode) {\n return reactNode;\n }\n\n return null;\n };\n}\n"],"names":[],"mappings":";;;AAuBO,MAAM,yBAAsC,eAA+C,CAAA;AAclG;AAda,gBAAA,CACG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAmD,KAAA;AAC9E,EAAA,MAAM,EAAE,SAAW,EAAA,SAAA,EAAW,OAAO,SAAU,EAAA,GAAI,MAAM,QAAS,EAAA;AAElE,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,SAAW,EAAA,EAAA,GAAG,KAAO,EAAA,CAAA;AAAA;AAG/B,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA;AAGT,EAAO,OAAA,IAAA;AACT,CAAA;;;;"}
@@ -6,25 +6,6 @@ import { SceneObjectBase } from '../core/SceneObjectBase.js';
6
6
  import { sceneGraph } from '../core/sceneGraph/index.js';
7
7
  import { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig.js';
8
8
 
9
- var __defProp = Object.defineProperty;
10
- var __defProps = Object.defineProperties;
11
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
12
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
13
- var __hasOwnProp = Object.prototype.hasOwnProperty;
14
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
15
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
16
- var __spreadValues = (a, b) => {
17
- for (var prop in b || (b = {}))
18
- if (__hasOwnProp.call(b, prop))
19
- __defNormalProp(a, prop, b[prop]);
20
- if (__getOwnPropSymbols)
21
- for (var prop of __getOwnPropSymbols(b)) {
22
- if (__propIsEnum.call(b, prop))
23
- __defNormalProp(a, prop, b[prop]);
24
- }
25
- return a;
26
- };
27
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
28
9
  const DEFAULT_INTERVALS = ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"];
29
10
  class SceneRefreshPicker extends SceneObjectBase {
30
11
  constructor(state) {
@@ -38,14 +19,14 @@ class SceneRefreshPicker extends SceneObjectBase {
38
19
  return false;
39
20
  }
40
21
  };
41
- super(__spreadProps(__spreadValues({
42
- refresh: ""
43
- }, state), {
22
+ super({
23
+ refresh: "",
24
+ ...state,
44
25
  autoValue: void 0,
45
26
  autoEnabled: (_a = state.autoEnabled) != null ? _a : true,
46
27
  autoMinInterval: (_b = state.autoMinInterval) != null ? _b : config.minRefreshInterval,
47
28
  intervals: ((_c = state.intervals) != null ? _c : DEFAULT_INTERVALS).filter(filterDissalowedIntervals)
48
- }));
29
+ });
49
30
  this._urlSync = new SceneObjectUrlSyncConfig(this, { keys: ["refresh"] });
50
31
  this._autoRefreshBlocked = false;
51
32
  this.onRefresh = () => {
@@ -148,6 +129,7 @@ class SceneRefreshPicker extends SceneObjectBase {
148
129
  this.setState({ refresh });
149
130
  } else {
150
131
  this.setState({
132
+ // Default to the first refresh interval if the interval from the URL is not allowed, just like in the old architecture.
151
133
  refresh: intervals ? intervals[0] : void 0
152
134
  });
153
135
  }
@@ -174,21 +156,24 @@ function SceneRefreshPickerRenderer({ model }) {
174
156
  if (withText) {
175
157
  width = "96px";
176
158
  }
177
- return /* @__PURE__ */ React.createElement(RefreshPicker, {
178
- showAutoInterval: autoEnabled,
179
- value: refresh,
180
- intervals,
181
- tooltip,
182
- width,
183
- text,
184
- onRefresh: () => {
185
- model.onRefresh();
186
- },
187
- primary,
188
- onIntervalChanged: model.onIntervalChanged,
189
- isLoading: isRunning,
190
- isOnCanvas: isOnCanvas != null ? isOnCanvas : true
191
- });
159
+ return /* @__PURE__ */ React.createElement(
160
+ RefreshPicker,
161
+ {
162
+ showAutoInterval: autoEnabled,
163
+ value: refresh,
164
+ intervals,
165
+ tooltip,
166
+ width,
167
+ text,
168
+ onRefresh: () => {
169
+ model.onRefresh();
170
+ },
171
+ primary,
172
+ onIntervalChanged: model.onIntervalChanged,
173
+ isLoading: isRunning,
174
+ isOnCanvas: isOnCanvas != null ? isOnCanvas : true
175
+ }
176
+ );
192
177
  }
193
178
  function useQueryControllerState(model) {
194
179
  const queryController = sceneGraph.getQueryController(model);
@@ -1 +1 @@
1
- {"version":3,"file":"SceneRefreshPicker.js","sources":["../../../src/components/SceneRefreshPicker.tsx"],"sourcesContent":["import React from 'react';\nimport { Unsubscribable } from 'rxjs';\nimport { rangeUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObject, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nexport const DEFAULT_INTERVALS = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\n\nexport interface SceneRefreshPickerState extends SceneObjectState {\n /**\n * Refresh interval, e.g. 5s, 1m, 2h\n */\n refresh: string;\n autoEnabled?: boolean;\n autoMinInterval?: string;\n autoValue?: string;\n /**\n * List of allowed refresh intervals, e.g. ['5s', '1m']\n */\n intervals?: string[];\n isOnCanvas?: boolean;\n primary?: boolean;\n withText?: boolean;\n /**\n * Overrides the default minRefreshInterval from the grafana config. Can be set to \"0s\" to remove the minimum refresh interval.\n */\n minRefreshInterval?: string;\n}\n\nexport class SceneRefreshPicker extends SceneObjectBase<SceneRefreshPickerState> {\n public static Component = SceneRefreshPickerRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['refresh'] });\n private _intervalTimer: ReturnType<typeof setInterval> | undefined;\n private _autoTimeRangeListener: Unsubscribable | undefined;\n private _autoRefreshBlocked: boolean = false;\n\n public constructor(state: Partial<SceneRefreshPickerState>) {\n const filterDissalowedIntervals = (i: string) => {\n const minInterval = state.minRefreshInterval ?? config.minRefreshInterval;\n try {\n return minInterval ? rangeUtil.intervalToMs(i) >= rangeUtil.intervalToMs(minInterval) : true;\n } catch (e) {\n // Unable to parse interval\n return false;\n }\n };\n\n super({\n refresh: '',\n ...state,\n autoValue: undefined,\n autoEnabled: state.autoEnabled ?? true,\n autoMinInterval: state.autoMinInterval ?? config.minRefreshInterval,\n intervals: (state.intervals ?? DEFAULT_INTERVALS).filter(filterDissalowedIntervals),\n });\n\n this.addActivationHandler(() => {\n this.setupIntervalTimer();\n\n const onVisibilityChange = () => {\n if (this._autoRefreshBlocked && document.visibilityState === 'visible') {\n this._autoRefreshBlocked = false;\n this.onRefresh();\n }\n };\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n return () => {\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n document.removeEventListener('visibilitychange', onVisibilityChange);\n this._autoTimeRangeListener?.unsubscribe();\n };\n });\n }\n\n public onRefresh = () => {\n const queryController = sceneGraph.getQueryController(this);\n\n queryController?.startProfile('SceneRefreshPicker');\n\n if (queryController?.state.isRunning) {\n queryController.cancelAll();\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n timeRange.onRefresh();\n this.setupIntervalTimer();\n };\n\n public onIntervalChanged = (interval: string) => {\n this.setState({ refresh: interval });\n this.setupIntervalTimer();\n };\n\n public getUrlState() {\n let refresh: string | undefined = this.state.refresh;\n\n if (typeof refresh !== 'string' || refresh.length === 0) {\n refresh = undefined;\n }\n\n return { refresh };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const { intervals } = this.state;\n let refresh = values.refresh;\n\n if (typeof refresh === 'string' && isIntervalString(refresh)) {\n if (intervals?.includes(refresh)) {\n this.setState({ refresh });\n } else {\n this.setState({\n // Default to the first refresh interval if the interval from the URL is not allowed, just like in the old architecture.\n refresh: intervals ? intervals[0] : undefined,\n });\n }\n }\n }\n\n private setupAutoTimeRangeListener = () => {\n // If the time range has changed, we need to recalculate the auto interval but prevent unnecessary processing\n return sceneGraph.getTimeRange(this).subscribeToState((newState, prevState) => {\n if (newState.from !== prevState.from || newState.to !== prevState.to) {\n this.setupIntervalTimer();\n }\n });\n };\n\n private calculateAutoRefreshInterval = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const resolution = window?.innerWidth ?? 2000;\n return rangeUtil.calculateInterval(timeRange.state.value, resolution, this.state.autoMinInterval);\n };\n\n private isTabVisible() {\n return document.visibilityState === undefined || document.visibilityState === 'visible';\n }\n\n private setupIntervalTimer = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const { refresh, intervals } = this.state;\n\n if (this._intervalTimer || refresh === '') {\n clearInterval(this._intervalTimer);\n }\n\n if (refresh === '') {\n return;\n }\n\n // If the provided interval is not allowed\n if (refresh !== RefreshPicker.autoOption.value && intervals && !intervals.includes(refresh)) {\n return;\n }\n\n let intervalMs: number;\n\n // Unsubscribe from previous listener no matter what\n this._autoTimeRangeListener?.unsubscribe();\n\n if (refresh === RefreshPicker.autoOption.value) {\n const autoRefreshInterval = this.calculateAutoRefreshInterval();\n\n intervalMs = autoRefreshInterval.intervalMs;\n\n this._autoTimeRangeListener = this.setupAutoTimeRangeListener();\n\n if (autoRefreshInterval.interval !== this.state.autoValue) {\n this.setState({ autoValue: autoRefreshInterval.interval });\n }\n } else {\n intervalMs = rangeUtil.intervalToMs(refresh);\n }\n\n this._intervalTimer = setInterval(() => {\n if (this.isTabVisible()) {\n const queryController = sceneGraph.getQueryController(this);\n queryController?.startProfile('SceneRefreshPicker');\n timeRange.onRefresh();\n } else {\n this._autoRefreshBlocked = true;\n }\n }, intervalMs);\n };\n}\n\nexport function SceneRefreshPickerRenderer({ model }: SceneComponentProps<SceneRefreshPicker>) {\n const { refresh, intervals, autoEnabled, autoValue, isOnCanvas, primary, withText } = model.useState();\n const isRunning = useQueryControllerState(model);\n\n let text = refresh === RefreshPicker.autoOption?.value ? autoValue : withText ? 'Refresh' : undefined;\n let tooltip: string | undefined;\n let width: string | undefined;\n\n if (isRunning) {\n tooltip = 'Cancel all queries';\n\n if (withText) {\n text = 'Cancel';\n }\n }\n\n if (withText) {\n width = '96px';\n }\n\n return (\n <RefreshPicker\n showAutoInterval={autoEnabled}\n value={refresh}\n intervals={intervals}\n tooltip={tooltip}\n width={width}\n text={text}\n onRefresh={() => {\n model.onRefresh();\n }}\n primary={primary}\n onIntervalChanged={model.onIntervalChanged}\n isLoading={isRunning}\n isOnCanvas={isOnCanvas ?? true}\n />\n );\n}\n\nfunction useQueryControllerState(model: SceneObject): boolean {\n const queryController = sceneGraph.getQueryController(model);\n if (!queryController) {\n return false;\n }\n\n return queryController.useState().isRunning;\n}\n\nfunction isIntervalString(str: string): boolean {\n try {\n const res = rangeUtil.describeInterval(str);\n return res.count > 0;\n } catch {\n return false;\n }\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"SceneRefreshPicker.js","sources":["../../../src/components/SceneRefreshPicker.tsx"],"sourcesContent":["import React from 'react';\nimport { Unsubscribable } from 'rxjs';\nimport { rangeUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObject, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nexport const DEFAULT_INTERVALS = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\n\nexport interface SceneRefreshPickerState extends SceneObjectState {\n /**\n * Refresh interval, e.g. 5s, 1m, 2h\n */\n refresh: string;\n autoEnabled?: boolean;\n autoMinInterval?: string;\n autoValue?: string;\n /**\n * List of allowed refresh intervals, e.g. ['5s', '1m']\n */\n intervals?: string[];\n isOnCanvas?: boolean;\n primary?: boolean;\n withText?: boolean;\n /**\n * Overrides the default minRefreshInterval from the grafana config. Can be set to \"0s\" to remove the minimum refresh interval.\n */\n minRefreshInterval?: string;\n}\n\nexport class SceneRefreshPicker extends SceneObjectBase<SceneRefreshPickerState> {\n public static Component = SceneRefreshPickerRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['refresh'] });\n private _intervalTimer: ReturnType<typeof setInterval> | undefined;\n private _autoTimeRangeListener: Unsubscribable | undefined;\n private _autoRefreshBlocked: boolean = false;\n\n public constructor(state: Partial<SceneRefreshPickerState>) {\n const filterDissalowedIntervals = (i: string) => {\n const minInterval = state.minRefreshInterval ?? config.minRefreshInterval;\n try {\n return minInterval ? rangeUtil.intervalToMs(i) >= rangeUtil.intervalToMs(minInterval) : true;\n } catch (e) {\n // Unable to parse interval\n return false;\n }\n };\n\n super({\n refresh: '',\n ...state,\n autoValue: undefined,\n autoEnabled: state.autoEnabled ?? true,\n autoMinInterval: state.autoMinInterval ?? config.minRefreshInterval,\n intervals: (state.intervals ?? DEFAULT_INTERVALS).filter(filterDissalowedIntervals),\n });\n\n this.addActivationHandler(() => {\n this.setupIntervalTimer();\n\n const onVisibilityChange = () => {\n if (this._autoRefreshBlocked && document.visibilityState === 'visible') {\n this._autoRefreshBlocked = false;\n this.onRefresh();\n }\n };\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n return () => {\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n document.removeEventListener('visibilitychange', onVisibilityChange);\n this._autoTimeRangeListener?.unsubscribe();\n };\n });\n }\n\n public onRefresh = () => {\n const queryController = sceneGraph.getQueryController(this);\n\n queryController?.startProfile('SceneRefreshPicker');\n\n if (queryController?.state.isRunning) {\n queryController.cancelAll();\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n timeRange.onRefresh();\n this.setupIntervalTimer();\n };\n\n public onIntervalChanged = (interval: string) => {\n this.setState({ refresh: interval });\n this.setupIntervalTimer();\n };\n\n public getUrlState() {\n let refresh: string | undefined = this.state.refresh;\n\n if (typeof refresh !== 'string' || refresh.length === 0) {\n refresh = undefined;\n }\n\n return { refresh };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const { intervals } = this.state;\n let refresh = values.refresh;\n\n if (typeof refresh === 'string' && isIntervalString(refresh)) {\n if (intervals?.includes(refresh)) {\n this.setState({ refresh });\n } else {\n this.setState({\n // Default to the first refresh interval if the interval from the URL is not allowed, just like in the old architecture.\n refresh: intervals ? intervals[0] : undefined,\n });\n }\n }\n }\n\n private setupAutoTimeRangeListener = () => {\n // If the time range has changed, we need to recalculate the auto interval but prevent unnecessary processing\n return sceneGraph.getTimeRange(this).subscribeToState((newState, prevState) => {\n if (newState.from !== prevState.from || newState.to !== prevState.to) {\n this.setupIntervalTimer();\n }\n });\n };\n\n private calculateAutoRefreshInterval = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const resolution = window?.innerWidth ?? 2000;\n return rangeUtil.calculateInterval(timeRange.state.value, resolution, this.state.autoMinInterval);\n };\n\n private isTabVisible() {\n return document.visibilityState === undefined || document.visibilityState === 'visible';\n }\n\n private setupIntervalTimer = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const { refresh, intervals } = this.state;\n\n if (this._intervalTimer || refresh === '') {\n clearInterval(this._intervalTimer);\n }\n\n if (refresh === '') {\n return;\n }\n\n // If the provided interval is not allowed\n if (refresh !== RefreshPicker.autoOption.value && intervals && !intervals.includes(refresh)) {\n return;\n }\n\n let intervalMs: number;\n\n // Unsubscribe from previous listener no matter what\n this._autoTimeRangeListener?.unsubscribe();\n\n if (refresh === RefreshPicker.autoOption.value) {\n const autoRefreshInterval = this.calculateAutoRefreshInterval();\n\n intervalMs = autoRefreshInterval.intervalMs;\n\n this._autoTimeRangeListener = this.setupAutoTimeRangeListener();\n\n if (autoRefreshInterval.interval !== this.state.autoValue) {\n this.setState({ autoValue: autoRefreshInterval.interval });\n }\n } else {\n intervalMs = rangeUtil.intervalToMs(refresh);\n }\n\n this._intervalTimer = setInterval(() => {\n if (this.isTabVisible()) {\n const queryController = sceneGraph.getQueryController(this);\n queryController?.startProfile('SceneRefreshPicker');\n timeRange.onRefresh();\n } else {\n this._autoRefreshBlocked = true;\n }\n }, intervalMs);\n };\n}\n\nexport function SceneRefreshPickerRenderer({ model }: SceneComponentProps<SceneRefreshPicker>) {\n const { refresh, intervals, autoEnabled, autoValue, isOnCanvas, primary, withText } = model.useState();\n const isRunning = useQueryControllerState(model);\n\n let text = refresh === RefreshPicker.autoOption?.value ? autoValue : withText ? 'Refresh' : undefined;\n let tooltip: string | undefined;\n let width: string | undefined;\n\n if (isRunning) {\n tooltip = 'Cancel all queries';\n\n if (withText) {\n text = 'Cancel';\n }\n }\n\n if (withText) {\n width = '96px';\n }\n\n return (\n <RefreshPicker\n showAutoInterval={autoEnabled}\n value={refresh}\n intervals={intervals}\n tooltip={tooltip}\n width={width}\n text={text}\n onRefresh={() => {\n model.onRefresh();\n }}\n primary={primary}\n onIntervalChanged={model.onIntervalChanged}\n isLoading={isRunning}\n isOnCanvas={isOnCanvas ?? true}\n />\n );\n}\n\nfunction useQueryControllerState(model: SceneObject): boolean {\n const queryController = sceneGraph.getQueryController(model);\n if (!queryController) {\n return false;\n }\n\n return queryController.useState().isRunning;\n}\n\nfunction isIntervalString(str: string): boolean {\n try {\n const res = rangeUtil.describeInterval(str);\n return res.count > 0;\n } catch {\n return false;\n }\n}\n"],"names":["_a"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { useLocalStorage } from 'react-use';
3
3
  import { uniqBy } from 'lodash';
4
- import { toUtc, rangeUtil, isDateTime } 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';
@@ -30,14 +30,14 @@ class SceneTimePicker extends SceneObjectBase {
30
30
  const {
31
31
  state: { value: range }
32
32
  } = timeRange;
33
- timeRange.onTimeRangeChange(getShiftedTimeRange(TimeRangeDirection.Backward, range, Date.now()));
33
+ timeRange.onTimeRangeChange(getShiftedTimeRange(0 /* Backward */, range, Date.now()));
34
34
  };
35
35
  this.onMoveForward = () => {
36
36
  const timeRange = sceneGraph.getTimeRange(this);
37
37
  const {
38
38
  state: { value: range }
39
39
  } = timeRange;
40
- timeRange.onTimeRangeChange(getShiftedTimeRange(TimeRangeDirection.Forward, range, Date.now()));
40
+ timeRange.onTimeRangeChange(getShiftedTimeRange(1 /* Forward */, range, Date.now()));
41
41
  };
42
42
  }
43
43
  }
@@ -55,26 +55,29 @@ function SceneTimePickerRenderer({ model }) {
55
55
  if (hidePicker) {
56
56
  return null;
57
57
  }
58
- return /* @__PURE__ */ React.createElement(TimeRangePicker, {
59
- isOnCanvas: isOnCanvas != null ? isOnCanvas : true,
60
- value: timeRangeState.value,
61
- onChange: (range) => {
62
- if (isAbsolute(range)) {
63
- setTimeRangeHistory([range, ...timeRangeHistory != null ? timeRangeHistory : []]);
64
- }
65
- timeRange.onTimeRangeChange(range);
66
- },
67
- timeZone,
68
- fiscalYearStartMonth: timeRangeState.fiscalYearStartMonth,
69
- onMoveBackward: model.onMoveBackward,
70
- onMoveForward: model.onMoveForward,
71
- onZoom: model.onZoom,
72
- onChangeTimeZone: timeRange.onTimeZoneChange,
73
- onChangeFiscalYearStartMonth: model.onChangeFiscalYearStartMonth,
74
- weekStart: timeRangeState.weekStart,
75
- history: timeRangeHistory,
76
- quickRanges
77
- });
58
+ return /* @__PURE__ */ React.createElement(
59
+ TimeRangePicker,
60
+ {
61
+ isOnCanvas: isOnCanvas != null ? isOnCanvas : true,
62
+ value: timeRangeState.value,
63
+ onChange: (range) => {
64
+ if (isAbsolute(range)) {
65
+ setTimeRangeHistory([range, ...timeRangeHistory != null ? timeRangeHistory : []]);
66
+ }
67
+ timeRange.onTimeRangeChange(range);
68
+ },
69
+ timeZone,
70
+ fiscalYearStartMonth: timeRangeState.fiscalYearStartMonth,
71
+ onMoveBackward: model.onMoveBackward,
72
+ onMoveForward: model.onMoveForward,
73
+ onZoom: model.onZoom,
74
+ onChangeTimeZone: timeRange.onTimeZoneChange,
75
+ onChangeFiscalYearStartMonth: model.onChangeFiscalYearStartMonth,
76
+ weekStart: timeRangeState.weekStart,
77
+ history: timeRangeHistory,
78
+ quickRanges
79
+ }
80
+ );
78
81
  }
79
82
  function getZoomedTimeRange(timeRange, factor) {
80
83
  const timespan = timeRange.to.valueOf() - timeRange.from.valueOf();
@@ -84,11 +87,6 @@ function getZoomedTimeRange(timeRange, factor) {
84
87
  const from = center - newTimespan / 2;
85
88
  return { from: toUtc(from), to: toUtc(to), raw: { from: toUtc(from), to: toUtc(to) } };
86
89
  }
87
- var TimeRangeDirection = /* @__PURE__ */ ((TimeRangeDirection2) => {
88
- TimeRangeDirection2[TimeRangeDirection2["Backward"] = 0] = "Backward";
89
- TimeRangeDirection2[TimeRangeDirection2["Forward"] = 1] = "Forward";
90
- return TimeRangeDirection2;
91
- })(TimeRangeDirection || {});
92
90
  function getShiftedTimeRange(dir, timeRange, upperLimit) {
93
91
  const oldTo = timeRange.to.valueOf();
94
92
  const oldFrom = timeRange.from.valueOf();
@@ -136,5 +134,5 @@ function isAbsolute(value) {
136
134
  return isDateTime(value.raw.from) || isDateTime(value.raw.to);
137
135
  }
138
136
 
139
- export { SceneTimePicker, TimeRangeDirection, getShiftedTimeRange, getZoomedTimeRange };
137
+ export { SceneTimePicker, getShiftedTimeRange, getZoomedTimeRange };
140
138
  //# sourceMappingURL=SceneTimePicker.js.map
@@ -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 { 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}\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 } = 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 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 //TODO: remove once grafana/grafana updated to 11.6\n //@ts-expect-error\n quickRanges={quickRanges}\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":["TimeRangeDirection"],"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}\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 } = 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 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 //TODO: remove once grafana/grafana updated to 11.6\n //@ts-expect-error\n quickRanges={quickRanges}\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":"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"}
@@ -10,25 +10,6 @@ import { parseUrlParam } from '../utils/parseUrlParam.js';
10
10
  import { css } from '@emotion/css';
11
11
  import { of } from 'rxjs';
12
12
 
13
- var __defProp = Object.defineProperty;
14
- var __defProps = Object.defineProperties;
15
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
16
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
17
- var __hasOwnProp = Object.prototype.hasOwnProperty;
18
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
19
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
20
- var __spreadValues = (a, b) => {
21
- for (var prop in b || (b = {}))
22
- if (__hasOwnProp.call(b, prop))
23
- __defNormalProp(a, prop, b[prop]);
24
- if (__getOwnPropSymbols)
25
- for (var prop of __getOwnPropSymbols(b)) {
26
- if (__propIsEnum.call(b, prop))
27
- __defNormalProp(a, prop, b[prop]);
28
- }
29
- return a;
30
- };
31
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
32
13
  const PREVIOUS_PERIOD_VALUE = "__previousPeriod";
33
14
  const NO_PERIOD_VALUE = "__noPeriod";
34
15
  const PREVIOUS_PERIOD_COMPARE_OPTION = {
@@ -46,7 +27,7 @@ const DEFAULT_COMPARE_OPTIONS = [
46
27
  ];
47
28
  class SceneTimeRangeCompare extends SceneObjectBase {
48
29
  constructor(state) {
49
- super(__spreadValues({ compareOptions: DEFAULT_COMPARE_OPTIONS }, state));
30
+ super({ compareOptions: DEFAULT_COMPARE_OPTIONS, ...state });
50
31
  this._urlSync = new SceneObjectUrlSyncConfig(this, { keys: ["compareWith"] });
51
32
  this._onActivate = () => {
52
33
  const sceneTimeRange = sceneGraph.getTimeRange(this);
@@ -86,6 +67,7 @@ class SceneTimeRangeCompare extends SceneObjectBase {
86
67
  };
87
68
  this.addActivationHandler(this._onActivate);
88
69
  }
70
+ // Get a time shifted request to compare with the primary request.
89
71
  getExtraQueries(request) {
90
72
  const extraQueries = [];
91
73
  const compareRange = this.getCompareTimeRange(request.range);
@@ -95,15 +77,17 @@ class SceneTimeRangeCompare extends SceneObjectBase {
95
77
  const targets = request.targets.filter((query) => query.timeRangeCompare !== false);
96
78
  if (targets.length) {
97
79
  extraQueries.push({
98
- req: __spreadProps(__spreadValues({}, request), {
80
+ req: {
81
+ ...request,
99
82
  targets,
100
83
  range: compareRange
101
- }),
84
+ },
102
85
  processor: timeShiftAlignmentProcessor
103
86
  });
104
87
  }
105
88
  return extraQueries;
106
89
  }
90
+ // The query runner should rerun the comparison query if the compareWith value has changed and there are queries that haven't opted out of TWC
107
91
  shouldRerun(prev, next, queries) {
108
92
  return prev.compareWith !== next.compareWith && queries.find((query) => query.timeRangeCompare !== false) !== void 0;
109
93
  }
@@ -159,24 +143,27 @@ const timeShiftAlignmentProcessor = (primary, secondary) => {
159
143
  const diff = secondary.timeRange.from.diff(primary.timeRange.from);
160
144
  secondary.series.forEach((series) => {
161
145
  series.refId = getCompareSeriesRefId(series.refId || "");
162
- series.meta = __spreadProps(__spreadValues({}, series.meta), {
146
+ series.meta = {
147
+ ...series.meta,
148
+ // @ts-ignore Remove when https://github.com/grafana/grafana/pull/71129 is released
163
149
  timeCompare: {
164
150
  diffMs: diff,
165
151
  isTimeShiftQuery: true
166
152
  }
167
- });
153
+ };
168
154
  series.fields.forEach((field) => {
169
155
  if (field.type === FieldType.time) {
170
156
  field.values = field.values.map((v) => {
171
157
  return diff < 0 ? v - diff : v + diff;
172
158
  });
173
159
  }
174
- field.config = __spreadProps(__spreadValues({}, field.config), {
160
+ field.config = {
161
+ ...field.config,
175
162
  color: {
176
163
  mode: "fixed",
177
164
  fixedColor: config.theme.palette.gray60
178
165
  }
179
- });
166
+ };
180
167
  return field;
181
168
  });
182
169
  });
@@ -198,31 +185,30 @@ function SceneTimeRangeCompareRenderer({ model }) {
198
185
  model.onCompareWithChanged(previousValue.value);
199
186
  }
200
187
  };
201
- return /* @__PURE__ */ React.createElement(ButtonGroup, null, /* @__PURE__ */ React.createElement(ToolbarButton, {
202
- variant: "canvas",
203
- tooltip: "Enable time frame comparison",
204
- onClick: (e) => {
205
- e.stopPropagation();
206
- e.preventDefault();
207
- onClick();
208
- }
209
- }, /* @__PURE__ */ React.createElement(Checkbox, {
210
- label: " ",
211
- value: enabled,
212
- onClick
213
- }), "Comparison"), enabled ? /* @__PURE__ */ React.createElement(ButtonSelect, {
214
- variant: "canvas",
215
- value,
216
- options: compareOptions,
217
- onChange: (v) => {
218
- model.onCompareWithChanged(v.value);
188
+ return /* @__PURE__ */ React.createElement(ButtonGroup, null, /* @__PURE__ */ React.createElement(
189
+ ToolbarButton,
190
+ {
191
+ variant: "canvas",
192
+ tooltip: "Enable time frame comparison",
193
+ onClick: (e) => {
194
+ e.stopPropagation();
195
+ e.preventDefault();
196
+ onClick();
197
+ }
198
+ },
199
+ /* @__PURE__ */ React.createElement(Checkbox, { label: " ", value: enabled, onClick }),
200
+ "Comparison"
201
+ ), enabled ? /* @__PURE__ */ React.createElement(
202
+ ButtonSelect,
203
+ {
204
+ variant: "canvas",
205
+ value,
206
+ options: compareOptions,
207
+ onChange: (v) => {
208
+ model.onCompareWithChanged(v.value);
209
+ }
219
210
  }
220
- }) : /* @__PURE__ */ React.createElement(ToolbarButton, {
221
- className: styles.previewButton,
222
- disabled: true,
223
- variant: "canvas",
224
- isOpen: false
225
- }, previousValue.label));
211
+ ) : /* @__PURE__ */ React.createElement(ToolbarButton, { className: styles.previewButton, disabled: true, variant: "canvas", isOpen: false }, previousValue.label));
226
212
  }
227
213
  function getStyles(theme) {
228
214
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"SceneTimeRangeCompare.js","sources":["../../../src/components/SceneTimeRangeCompare.tsx"],"sourcesContent":["import { DataQueryRequest, DateTime, dateTime, FieldType, GrafanaTheme2, rangeUtil, TimeRange } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { ButtonGroup, ButtonSelect, Checkbox, ToolbarButton, useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneDataQuery, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { DataQueryExtended } from '../querying/SceneQueryRunner';\nimport { ExtraQueryDescriptor, ExtraQueryDataProcessor, ExtraQueryProvider } from '../querying/ExtraQueryProvider';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { getCompareSeriesRefId } from '../utils/getCompareSeriesRefId';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { css } from '@emotion/css';\nimport { of } from 'rxjs';\n\ninterface SceneTimeRangeCompareState extends SceneObjectState {\n compareWith?: string;\n compareOptions: Array<{ label: string; value: string }>;\n}\n\nconst PREVIOUS_PERIOD_VALUE = '__previousPeriod';\nconst NO_PERIOD_VALUE = '__noPeriod';\n\nexport const PREVIOUS_PERIOD_COMPARE_OPTION = {\n label: 'Previous period',\n value: PREVIOUS_PERIOD_VALUE,\n};\n\nexport const NO_COMPARE_OPTION = {\n label: 'No comparison',\n value: NO_PERIOD_VALUE,\n};\n\nexport const DEFAULT_COMPARE_OPTIONS = [\n { label: 'Day before', value: '24h' },\n { label: 'Week before', value: '1w' },\n { label: 'Month before', value: '1M' },\n];\n\nexport class SceneTimeRangeCompare\n extends SceneObjectBase<SceneTimeRangeCompareState>\n implements ExtraQueryProvider<SceneTimeRangeCompareState>\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 NO_COMPARE_OPTION,\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 if (compareWith === NO_PERIOD_VALUE) {\n this.onClearCompare();\n } else {\n this.setState({ compareWith });\n }\n };\n\n public onClearCompare = () => {\n this.setState({ compareWith: undefined });\n };\n\n // Get a time shifted request to compare with the primary request.\n public getExtraQueries(request: DataQueryRequest): ExtraQueryDescriptor[] {\n const extraQueries: ExtraQueryDescriptor[] = [];\n const compareRange = this.getCompareTimeRange(request.range);\n if (!compareRange) {\n return extraQueries;\n }\n\n const targets = request.targets.filter((query: DataQueryExtended) => query.timeRangeCompare !== false);\n if (targets.length) {\n extraQueries.push({\n req: {\n ...request,\n targets,\n range: compareRange,\n },\n processor: timeShiftAlignmentProcessor,\n });\n }\n return extraQueries;\n }\n\n // The query runner should rerun the comparison query if the compareWith value has changed and there are queries that haven't opted out of TWC\n public shouldRerun(\n prev: SceneTimeRangeCompareState,\n next: SceneTimeRangeCompareState,\n queries: SceneDataQuery[]\n ): boolean {\n return (\n prev.compareWith !== next.compareWith && queries.find((query) => query.timeRangeCompare !== false) !== undefined\n );\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\n// Processor function for use with time shifted comparison series.\n// This aligns the secondary series with the primary and adds custom\n// metadata and config to the secondary series' fields so that it is\n// rendered appropriately.\nconst timeShiftAlignmentProcessor: ExtraQueryDataProcessor = (primary, secondary) => {\n const diff = secondary.timeRange.from.diff(primary.timeRange.from);\n secondary.series.forEach((series) => {\n series.refId = getCompareSeriesRefId(series.refId || '');\n series.meta = {\n ...series.meta,\n // @ts-ignore Remove when https://github.com/grafana/grafana/pull/71129 is released\n timeCompare: {\n diffMs: diff,\n isTimeShiftQuery: true,\n },\n };\n series.fields.forEach((field) => {\n // Align compare series time stamps with reference series\n if (field.type === FieldType.time) {\n field.values = field.values.map((v) => {\n return diff < 0 ? v - diff : v + diff;\n });\n }\n\n field.config = {\n ...field.config,\n color: {\n mode: 'fixed',\n fixedColor: config.theme.palette.gray60,\n },\n };\n return field;\n });\n });\n return of(secondary);\n};\n\nfunction SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>) {\n const styles = useStyles2(getStyles);\n const { compareWith, compareOptions } = model.useState();\n\n const [previousCompare, setPreviousCompare] = React.useState(compareWith);\n const previousValue = compareOptions.find(({ value }) => value === previousCompare) ?? PREVIOUS_PERIOD_COMPARE_OPTION;\n\n const value = compareOptions.find(({ value }) => value === compareWith);\n const enabled = Boolean(value);\n\n const onClick = () => {\n if (enabled) {\n setPreviousCompare(compareWith);\n model.onClearCompare();\n } else if (!enabled) {\n model.onCompareWithChanged(previousValue.value);\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 Comparison\n </ToolbarButton>\n\n {enabled ? (\n <ButtonSelect\n variant=\"canvas\"\n value={value}\n options={compareOptions}\n onChange={(v) => {\n model.onCompareWithChanged(v.value!);\n }}\n />\n ) : (\n <ToolbarButton className={styles.previewButton} disabled variant=\"canvas\" isOpen={false}>\n {previousValue.label}\n </ToolbarButton>\n )}\n </ButtonGroup>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n previewButton: css({\n '&:disabled': {\n border: `1px solid ${theme.colors.secondary.border}`,\n color: theme.colors.text.disabled,\n opacity: 1,\n },\n }),\n };\n}\n"],"names":["value"],"mappings":"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"}
1
+ {"version":3,"file":"SceneTimeRangeCompare.js","sources":["../../../src/components/SceneTimeRangeCompare.tsx"],"sourcesContent":["import { DataQueryRequest, DateTime, dateTime, FieldType, GrafanaTheme2, rangeUtil, TimeRange } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { ButtonGroup, ButtonSelect, Checkbox, ToolbarButton, useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneDataQuery, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { DataQueryExtended } from '../querying/SceneQueryRunner';\nimport { ExtraQueryDescriptor, ExtraQueryDataProcessor, ExtraQueryProvider } from '../querying/ExtraQueryProvider';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { getCompareSeriesRefId } from '../utils/getCompareSeriesRefId';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { css } from '@emotion/css';\nimport { of } from 'rxjs';\n\ninterface SceneTimeRangeCompareState extends SceneObjectState {\n compareWith?: string;\n compareOptions: Array<{ label: string; value: string }>;\n}\n\nconst PREVIOUS_PERIOD_VALUE = '__previousPeriod';\nconst NO_PERIOD_VALUE = '__noPeriod';\n\nexport const PREVIOUS_PERIOD_COMPARE_OPTION = {\n label: 'Previous period',\n value: PREVIOUS_PERIOD_VALUE,\n};\n\nexport const NO_COMPARE_OPTION = {\n label: 'No comparison',\n value: NO_PERIOD_VALUE,\n};\n\nexport const DEFAULT_COMPARE_OPTIONS = [\n { label: 'Day before', value: '24h' },\n { label: 'Week before', value: '1w' },\n { label: 'Month before', value: '1M' },\n];\n\nexport class SceneTimeRangeCompare\n extends SceneObjectBase<SceneTimeRangeCompareState>\n implements ExtraQueryProvider<SceneTimeRangeCompareState>\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 NO_COMPARE_OPTION,\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 if (compareWith === NO_PERIOD_VALUE) {\n this.onClearCompare();\n } else {\n this.setState({ compareWith });\n }\n };\n\n public onClearCompare = () => {\n this.setState({ compareWith: undefined });\n };\n\n // Get a time shifted request to compare with the primary request.\n public getExtraQueries(request: DataQueryRequest): ExtraQueryDescriptor[] {\n const extraQueries: ExtraQueryDescriptor[] = [];\n const compareRange = this.getCompareTimeRange(request.range);\n if (!compareRange) {\n return extraQueries;\n }\n\n const targets = request.targets.filter((query: DataQueryExtended) => query.timeRangeCompare !== false);\n if (targets.length) {\n extraQueries.push({\n req: {\n ...request,\n targets,\n range: compareRange,\n },\n processor: timeShiftAlignmentProcessor,\n });\n }\n return extraQueries;\n }\n\n // The query runner should rerun the comparison query if the compareWith value has changed and there are queries that haven't opted out of TWC\n public shouldRerun(\n prev: SceneTimeRangeCompareState,\n next: SceneTimeRangeCompareState,\n queries: SceneDataQuery[]\n ): boolean {\n return (\n prev.compareWith !== next.compareWith && queries.find((query) => query.timeRangeCompare !== false) !== undefined\n );\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\n// Processor function for use with time shifted comparison series.\n// This aligns the secondary series with the primary and adds custom\n// metadata and config to the secondary series' fields so that it is\n// rendered appropriately.\nconst timeShiftAlignmentProcessor: ExtraQueryDataProcessor = (primary, secondary) => {\n const diff = secondary.timeRange.from.diff(primary.timeRange.from);\n secondary.series.forEach((series) => {\n series.refId = getCompareSeriesRefId(series.refId || '');\n series.meta = {\n ...series.meta,\n // @ts-ignore Remove when https://github.com/grafana/grafana/pull/71129 is released\n timeCompare: {\n diffMs: diff,\n isTimeShiftQuery: true,\n },\n };\n series.fields.forEach((field) => {\n // Align compare series time stamps with reference series\n if (field.type === FieldType.time) {\n field.values = field.values.map((v) => {\n return diff < 0 ? v - diff : v + diff;\n });\n }\n\n field.config = {\n ...field.config,\n color: {\n mode: 'fixed',\n fixedColor: config.theme.palette.gray60,\n },\n };\n return field;\n });\n });\n return of(secondary);\n};\n\nfunction SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>) {\n const styles = useStyles2(getStyles);\n const { compareWith, compareOptions } = model.useState();\n\n const [previousCompare, setPreviousCompare] = React.useState(compareWith);\n const previousValue = compareOptions.find(({ value }) => value === previousCompare) ?? PREVIOUS_PERIOD_COMPARE_OPTION;\n\n const value = compareOptions.find(({ value }) => value === compareWith);\n const enabled = Boolean(value);\n\n const onClick = () => {\n if (enabled) {\n setPreviousCompare(compareWith);\n model.onClearCompare();\n } else if (!enabled) {\n model.onCompareWithChanged(previousValue.value);\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 Comparison\n </ToolbarButton>\n\n {enabled ? (\n <ButtonSelect\n variant=\"canvas\"\n value={value}\n options={compareOptions}\n onChange={(v) => {\n model.onCompareWithChanged(v.value!);\n }}\n />\n ) : (\n <ToolbarButton className={styles.previewButton} disabled variant=\"canvas\" isOpen={false}>\n {previousValue.label}\n </ToolbarButton>\n )}\n </ButtonGroup>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n previewButton: css({\n '&:disabled': {\n border: `1px solid ${theme.colors.secondary.border}`,\n color: theme.colors.text.disabled,\n opacity: 1,\n },\n }),\n };\n}\n"],"names":["value"],"mappings":"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"}