@grafana/scenes 6.6.0--canary.1081.13995169903.0 → 6.6.1

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 +36 -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 -30
  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 +52 -26
  274. package/dist/index.js +2035 -2820
  275. package/dist/index.js.map +1 -1
  276. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"metricTree.js","sources":["../../../src/utils/metricTree.ts"],"sourcesContent":["export interface TreeNode {\n name: string;\n children: TreeNode[];\n}\n\n/*\n * Builds a nested tree like\n * [\n * {\n * name: 'A',\n * children: [\n * { name: 'AA', children: [] },\n * { name: 'AB', children: [] },\n * ]\n * }\n * ]\n */\nfunction buildMetricTree(parent: string, depth: number): TreeNode[] {\n const chars = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];\n const children: TreeNode[] = [];\n\n if (depth > 5) {\n return [];\n }\n\n for (const letter of chars) {\n const nodeName = `${parent}${letter}`;\n children.push({\n name: nodeName,\n children: buildMetricTree(nodeName, depth + 1),\n });\n }\n\n return children;\n}\n\nfunction queryTree(children: TreeNode[], query: string[], queryIndex: number): TreeNode[] {\n if (queryIndex >= query.length) {\n return children;\n }\n\n if (query[queryIndex] === '*') {\n return children;\n }\n\n const nodeQuery = query[queryIndex];\n let result: TreeNode[] = [];\n let namesToMatch = [nodeQuery];\n\n // handle glob queries\n if (nodeQuery.startsWith('{')) {\n namesToMatch = nodeQuery.replace(/\\{|\\}/g, '').split(',');\n }\n\n for (const node of children) {\n for (const nameToMatch of namesToMatch) {\n if (nameToMatch.indexOf('*') !== -1) {\n const pattern = nameToMatch.replace('*', '');\n const regex = new RegExp(`^${pattern}.*`, 'gi');\n if (regex.test(node.name)) {\n result = result.concat(queryTree([node], query, queryIndex + 1));\n }\n } else if (node.name === nameToMatch) {\n result = result.concat(queryTree(node.children, query, queryIndex + 1));\n }\n }\n }\n\n return result;\n}\n\nexport function queryMetricTree(query: string): TreeNode[] {\n if (query.indexOf('value') === 0) {\n return [{ name: query, children: [] }];\n }\n\n const children = buildMetricTree('', 0);\n return queryTree(children, query.split('.'), 0);\n}\n"],"names":[],"mappings":"AAiBA,SAAS,eAAA,CAAgB,QAAgB,KAA2B,EAAA;AAClE,EAAM,MAAA,KAAA,GAAQ,CAAC,GAAK,EAAA,GAAA,EAAK,KAAK,GAAK,EAAA,GAAA,EAAK,GAAK,EAAA,GAAA,EAAK,GAAG,CAAA,CAAA;AACrD,EAAA,MAAM,WAAuB,EAAC,CAAA;AAE9B,EAAA,IAAI,QAAQ,CAAG,EAAA;AACb,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAA,KAAA,MAAW,UAAU,KAAO,EAAA;AAC1B,IAAM,MAAA,QAAA,GAAW,GAAG,MAAS,CAAA,EAAA,MAAA,CAAA,CAAA,CAAA;AAC7B,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACZ,IAAM,EAAA,QAAA;AAAA,MACN,QAAU,EAAA,eAAA,CAAgB,QAAU,EAAA,KAAA,GAAQ,CAAC,CAAA;AAAA,KAC9C,CAAA,CAAA;AAAA,GACH;AAEA,EAAO,OAAA,QAAA,CAAA;AACT,CAAA;AAEA,SAAS,SAAA,CAAU,QAAsB,EAAA,KAAA,EAAiB,UAAgC,EAAA;AACxF,EAAI,IAAA,UAAA,IAAc,MAAM,MAAQ,EAAA;AAC9B,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,KAAA,CAAM,gBAAgB,GAAK,EAAA;AAC7B,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,YAAY,KAAM,CAAA,UAAA,CAAA,CAAA;AACxB,EAAA,IAAI,SAAqB,EAAC,CAAA;AAC1B,EAAI,IAAA,YAAA,GAAe,CAAC,SAAS,CAAA,CAAA;AAG7B,EAAI,IAAA,SAAA,CAAU,UAAW,CAAA,GAAG,CAAG,EAAA;AAC7B,IAAA,YAAA,GAAe,UAAU,OAAQ,CAAA,QAAA,EAAU,EAAE,CAAA,CAAE,MAAM,GAAG,CAAA,CAAA;AAAA,GAC1D;AAEA,EAAA,KAAA,MAAW,QAAQ,QAAU,EAAA;AAC3B,IAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,MAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,CAAI,CAAA,EAAA;AACnC,QAAA,MAAM,OAAU,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAA,CAAA;AAC3C,QAAA,MAAM,KAAQ,GAAA,IAAI,MAAO,CAAA,CAAA,CAAA,EAAI,aAAa,IAAI,CAAA,CAAA;AAC9C,QAAA,IAAI,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,IAAI,CAAG,EAAA;AACzB,UAAS,MAAA,GAAA,MAAA,CAAO,OAAO,SAAU,CAAA,CAAC,IAAI,CAAG,EAAA,KAAA,EAAO,UAAa,GAAA,CAAC,CAAC,CAAA,CAAA;AAAA,SACjE;AAAA,OACF,MAAA,IAAW,IAAK,CAAA,IAAA,KAAS,WAAa,EAAA;AACpC,QAAS,MAAA,GAAA,MAAA,CAAO,OAAO,SAAU,CAAA,IAAA,CAAK,UAAU,KAAO,EAAA,UAAA,GAAa,CAAC,CAAC,CAAA,CAAA;AAAA,OACxE;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEO,SAAS,gBAAgB,KAA2B,EAAA;AACzD,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA,KAAM,CAAG,EAAA;AAChC,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,OAAO,QAAU,EAAA,IAAI,CAAA,CAAA;AAAA,GACvC;AAEA,EAAM,MAAA,QAAA,GAAW,eAAgB,CAAA,EAAA,EAAI,CAAC,CAAA,CAAA;AACtC,EAAA,OAAO,UAAU,QAAU,EAAA,KAAA,CAAM,KAAM,CAAA,GAAG,GAAG,CAAC,CAAA,CAAA;AAChD;;;;"}
1
+ {"version":3,"file":"metricTree.js","sources":["../../../src/utils/metricTree.ts"],"sourcesContent":["export interface TreeNode {\n name: string;\n children: TreeNode[];\n}\n\n/*\n * Builds a nested tree like\n * [\n * {\n * name: 'A',\n * children: [\n * { name: 'AA', children: [] },\n * { name: 'AB', children: [] },\n * ]\n * }\n * ]\n */\nfunction buildMetricTree(parent: string, depth: number): TreeNode[] {\n const chars = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];\n const children: TreeNode[] = [];\n\n if (depth > 5) {\n return [];\n }\n\n for (const letter of chars) {\n const nodeName = `${parent}${letter}`;\n children.push({\n name: nodeName,\n children: buildMetricTree(nodeName, depth + 1),\n });\n }\n\n return children;\n}\n\nfunction queryTree(children: TreeNode[], query: string[], queryIndex: number): TreeNode[] {\n if (queryIndex >= query.length) {\n return children;\n }\n\n if (query[queryIndex] === '*') {\n return children;\n }\n\n const nodeQuery = query[queryIndex];\n let result: TreeNode[] = [];\n let namesToMatch = [nodeQuery];\n\n // handle glob queries\n if (nodeQuery.startsWith('{')) {\n namesToMatch = nodeQuery.replace(/\\{|\\}/g, '').split(',');\n }\n\n for (const node of children) {\n for (const nameToMatch of namesToMatch) {\n if (nameToMatch.indexOf('*') !== -1) {\n const pattern = nameToMatch.replace('*', '');\n const regex = new RegExp(`^${pattern}.*`, 'gi');\n if (regex.test(node.name)) {\n result = result.concat(queryTree([node], query, queryIndex + 1));\n }\n } else if (node.name === nameToMatch) {\n result = result.concat(queryTree(node.children, query, queryIndex + 1));\n }\n }\n }\n\n return result;\n}\n\nexport function queryMetricTree(query: string): TreeNode[] {\n if (query.indexOf('value') === 0) {\n return [{ name: query, children: [] }];\n }\n\n const children = buildMetricTree('', 0);\n return queryTree(children, query.split('.'), 0);\n}\n"],"names":[],"mappings":"AAiBA,SAAS,eAAA,CAAgB,QAAgB,KAA2B,EAAA;AAClE,EAAM,MAAA,KAAA,GAAQ,CAAC,GAAK,EAAA,GAAA,EAAK,KAAK,GAAK,EAAA,GAAA,EAAK,GAAK,EAAA,GAAA,EAAK,GAAG,CAAA;AACrD,EAAA,MAAM,WAAuB,EAAC;AAE9B,EAAA,IAAI,QAAQ,CAAG,EAAA;AACb,IAAA,OAAO,EAAC;AAAA;AAGV,EAAA,KAAA,MAAW,UAAU,KAAO,EAAA;AAC1B,IAAA,MAAM,QAAW,GAAA,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA;AACnC,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACZ,IAAM,EAAA,QAAA;AAAA,MACN,QAAU,EAAA,eAAA,CAAgB,QAAU,EAAA,KAAA,GAAQ,CAAC;AAAA,KAC9C,CAAA;AAAA;AAGH,EAAO,OAAA,QAAA;AACT;AAEA,SAAS,SAAA,CAAU,QAAsB,EAAA,KAAA,EAAiB,UAAgC,EAAA;AACxF,EAAI,IAAA,UAAA,IAAc,MAAM,MAAQ,EAAA;AAC9B,IAAO,OAAA,QAAA;AAAA;AAGT,EAAI,IAAA,KAAA,CAAM,UAAU,CAAA,KAAM,GAAK,EAAA;AAC7B,IAAO,OAAA,QAAA;AAAA;AAGT,EAAM,MAAA,SAAA,GAAY,MAAM,UAAU,CAAA;AAClC,EAAA,IAAI,SAAqB,EAAC;AAC1B,EAAI,IAAA,YAAA,GAAe,CAAC,SAAS,CAAA;AAG7B,EAAI,IAAA,SAAA,CAAU,UAAW,CAAA,GAAG,CAAG,EAAA;AAC7B,IAAA,YAAA,GAAe,UAAU,OAAQ,CAAA,QAAA,EAAU,EAAE,CAAA,CAAE,MAAM,GAAG,CAAA;AAAA;AAG1D,EAAA,KAAA,MAAW,QAAQ,QAAU,EAAA;AAC3B,IAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,MAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,EAAI,EAAA;AACnC,QAAA,MAAM,OAAU,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAA;AAC3C,QAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,CAAI,CAAA,EAAA,OAAO,MAAM,IAAI,CAAA;AAC9C,QAAA,IAAI,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,IAAI,CAAG,EAAA;AACzB,UAAS,MAAA,GAAA,MAAA,CAAO,OAAO,SAAU,CAAA,CAAC,IAAI,CAAG,EAAA,KAAA,EAAO,UAAa,GAAA,CAAC,CAAC,CAAA;AAAA;AACjE,OACF,MAAA,IAAW,IAAK,CAAA,IAAA,KAAS,WAAa,EAAA;AACpC,QAAS,MAAA,GAAA,MAAA,CAAO,OAAO,SAAU,CAAA,IAAA,CAAK,UAAU,KAAO,EAAA,UAAA,GAAa,CAAC,CAAC,CAAA;AAAA;AACxE;AACF;AAGF,EAAO,OAAA,MAAA;AACT;AAEO,SAAS,gBAAgB,KAA2B,EAAA;AACzD,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA,KAAM,CAAG,EAAA;AAChC,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,OAAO,QAAU,EAAA,IAAI,CAAA;AAAA;AAGvC,EAAM,MAAA,QAAA,GAAW,eAAgB,CAAA,EAAA,EAAI,CAAC,CAAA;AACtC,EAAA,OAAO,UAAU,QAAU,EAAA,KAAA,CAAM,KAAM,CAAA,GAAG,GAAG,CAAC,CAAA;AAChD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"parseUrlParam.js","sources":["../../../src/utils/parseUrlParam.ts"],"sourcesContent":["import { toUtc } from '@grafana/data';\nimport { SceneObjectUrlValue } from '../core/types';\n\nconst INTERVAL_STRING_REGEX = /^\\d+[yYmMsSwWhHdD]$/;\n\nexport function parseUrlParam(value: SceneObjectUrlValue): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n if (value.indexOf('now') !== -1) {\n return value;\n }\n\n if (INTERVAL_STRING_REGEX.test(value)) {\n return value;\n }\n\n if (value.length === 8) {\n const utcValue = toUtc(value, 'YYYYMMDD');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 15) {\n const utcValue = toUtc(value, 'YYYYMMDDTHHmmss');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 19) {\n const utcValue = toUtc(value, 'YYYY-MM-DD HH:mm:ss');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 24) {\n const utcValue = toUtc(value);\n return utcValue.toISOString();\n }\n\n const epoch = parseInt(value, 10);\n if (!isNaN(epoch)) {\n return toUtc(epoch).toISOString();\n }\n\n return null;\n}\n"],"names":[],"mappings":";;AAGA,MAAM,qBAAwB,GAAA,qBAAA,CAAA;AAEvB,SAAS,cAAc,KAA2C,EAAA;AACvE,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAA,KAAM,CAAI,CAAA,EAAA;AAC/B,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,qBAAA,CAAsB,IAAK,CAAA,KAAK,CAAG,EAAA;AACrC,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,EAAO,UAAU,CAAA,CAAA;AACxC,IAAI,IAAA,QAAA,CAAS,SAAW,EAAA;AACtB,MAAA,OAAO,SAAS,WAAY,EAAA,CAAA;AAAA,KAC9B;AAAA,GACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,EAAI,EAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,EAAO,iBAAiB,CAAA,CAAA;AAC/C,IAAI,IAAA,QAAA,CAAS,SAAW,EAAA;AACtB,MAAA,OAAO,SAAS,WAAY,EAAA,CAAA;AAAA,KAC9B;AAAA,GACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,EAAI,EAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,EAAO,qBAAqB,CAAA,CAAA;AACnD,IAAI,IAAA,QAAA,CAAS,SAAW,EAAA;AACtB,MAAA,OAAO,SAAS,WAAY,EAAA,CAAA;AAAA,KAC9B;AAAA,GACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,EAAI,EAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,MAAM,KAAK,CAAA,CAAA;AAC5B,IAAA,OAAO,SAAS,WAAY,EAAA,CAAA;AAAA,GAC9B;AAEA,EAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AAChC,EAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,IAAO,OAAA,KAAA,CAAM,KAAK,CAAA,CAAE,WAAY,EAAA,CAAA;AAAA,GAClC;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"parseUrlParam.js","sources":["../../../src/utils/parseUrlParam.ts"],"sourcesContent":["import { toUtc } from '@grafana/data';\nimport { SceneObjectUrlValue } from '../core/types';\n\nconst INTERVAL_STRING_REGEX = /^\\d+[yYmMsSwWhHdD]$/;\n\nexport function parseUrlParam(value: SceneObjectUrlValue): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n if (value.indexOf('now') !== -1) {\n return value;\n }\n\n if (INTERVAL_STRING_REGEX.test(value)) {\n return value;\n }\n\n if (value.length === 8) {\n const utcValue = toUtc(value, 'YYYYMMDD');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 15) {\n const utcValue = toUtc(value, 'YYYYMMDDTHHmmss');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 19) {\n const utcValue = toUtc(value, 'YYYY-MM-DD HH:mm:ss');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 24) {\n const utcValue = toUtc(value);\n return utcValue.toISOString();\n }\n\n const epoch = parseInt(value, 10);\n if (!isNaN(epoch)) {\n return toUtc(epoch).toISOString();\n }\n\n return null;\n}\n"],"names":[],"mappings":";;AAGA,MAAM,qBAAwB,GAAA,qBAAA;AAEvB,SAAS,cAAc,KAA2C,EAAA;AACvE,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAA,KAAM,EAAI,EAAA;AAC/B,IAAO,OAAA,KAAA;AAAA;AAGT,EAAI,IAAA,qBAAA,CAAsB,IAAK,CAAA,KAAK,CAAG,EAAA;AACrC,IAAO,OAAA,KAAA;AAAA;AAGT,EAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,EAAO,UAAU,CAAA;AACxC,IAAI,IAAA,QAAA,CAAS,SAAW,EAAA;AACtB,MAAA,OAAO,SAAS,WAAY,EAAA;AAAA;AAC9B,GACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,EAAI,EAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,EAAO,iBAAiB,CAAA;AAC/C,IAAI,IAAA,QAAA,CAAS,SAAW,EAAA;AACtB,MAAA,OAAO,SAAS,WAAY,EAAA;AAAA;AAC9B,GACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,EAAI,EAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,EAAO,qBAAqB,CAAA;AACnD,IAAI,IAAA,QAAA,CAAS,SAAW,EAAA;AACtB,MAAA,OAAO,SAAS,WAAY,EAAA;AAAA;AAC9B,GACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,EAAI,EAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,MAAM,KAAK,CAAA;AAC5B,IAAA,OAAO,SAAS,WAAY,EAAA;AAAA;AAG9B,EAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA;AAChC,EAAI,IAAA,CAAC,KAAM,CAAA,KAAK,CAAG,EAAA;AACjB,IAAO,OAAA,KAAA,CAAM,KAAK,CAAA,CAAE,WAAY,EAAA;AAAA;AAGlC,EAAO,OAAA,IAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/utils/utils.ts"],"sourcesContent":["import { SceneObject, SceneObjectState } from '../core/types';\nimport { locationService as locationServiceRuntime, useLocationService } from '@grafana/runtime';\n\n/**\n * This function works around the problem of Contravariance of the SceneObject.setState function\n * Contravariance is not enforce by interfaces and here we use the SceneObject interface to access the setState function\n */\nexport function setBaseClassState<T extends SceneObjectState>(sceneObject: SceneObject<T>, newState: Partial<T>) {\n sceneObject.setState(newState);\n}\n\n/**\n * Safe way to get location service that fallbacks to singleton for older runtime versions where useLocationService is\n * not available.\n */\nexport function useLocationServiceSafe() {\n // This is basically a version/feature check for grafana/runtime so this 'if' should be stable (ie for one instance\n // of grafana this will always be true or false) so it should be safe to ignore the hook rule here\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useLocationService ? useLocationService() : locationServiceRuntime;\n}\n"],"names":["locationServiceRuntime"],"mappings":";;AAOgB,SAAA,iBAAA,CAA8C,aAA6B,QAAsB,EAAA;AAC/G,EAAA,WAAA,CAAY,SAAS,QAAQ,CAAA,CAAA;AAC/B,CAAA;AAMO,SAAS,sBAAyB,GAAA;AAIvC,EAAO,OAAA,kBAAA,GAAqB,oBAAuB,GAAAA,eAAA,CAAA;AACrD;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/utils/utils.ts"],"sourcesContent":["import { SceneObject, SceneObjectState } from '../core/types';\nimport { locationService as locationServiceRuntime, useLocationService } from '@grafana/runtime';\n\n/**\n * This function works around the problem of Contravariance of the SceneObject.setState function\n * Contravariance is not enforce by interfaces and here we use the SceneObject interface to access the setState function\n */\nexport function setBaseClassState<T extends SceneObjectState>(sceneObject: SceneObject<T>, newState: Partial<T>) {\n sceneObject.setState(newState);\n}\n\n/**\n * Safe way to get location service that fallbacks to singleton for older runtime versions where useLocationService is\n * not available.\n */\nexport function useLocationServiceSafe() {\n // This is basically a version/feature check for grafana/runtime so this 'if' should be stable (ie for one instance\n // of grafana this will always be true or false) so it should be safe to ignore the hook rule here\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useLocationService ? useLocationService() : locationServiceRuntime;\n}\n"],"names":["locationServiceRuntime"],"mappings":";;AAOgB,SAAA,iBAAA,CAA8C,aAA6B,QAAsB,EAAA;AAC/G,EAAA,WAAA,CAAY,SAAS,QAAQ,CAAA;AAC/B;AAMO,SAAS,sBAAyB,GAAA;AAIvC,EAAO,OAAA,kBAAA,GAAqB,oBAAuB,GAAAA,eAAA;AACrD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"wrapInSafeSerializableSceneObject.js","sources":["../../../src/utils/wrapInSafeSerializableSceneObject.ts"],"sourcesContent":["import { config } from '@grafana/runtime';\nimport { SceneObject } from '../core/types';\nimport { SafeSerializableSceneObject } from './SafeSerializableSceneObject';\nimport { ScopedVar } from '@grafana/data';\n\nexport function shouldWrapInSafeSerializableSceneObject(grafanaVersion: string): boolean {\n const pattern = /^(\\d+)\\.(\\d+)\\.(\\d+)/;\n const match = grafanaVersion.match(pattern);\n\n if (!match) {\n return false;\n }\n\n const major = parseInt(match[1], 10);\n const minor = parseInt(match[2], 10);\n const patch = parseInt(match[3], 10);\n\n if (major === 11) {\n return (minor === 0 && patch >= 4) || (minor === 1 && patch >= 2) || minor > 1;\n }\n\n if (major === 10) {\n return (minor === 4 && patch >= 8) || minor >= 5;\n }\n\n return major > 11; // Assuming versions greater than 11 are also supported.\n}\n\nexport function wrapInSafeSerializableSceneObject(sceneObject: SceneObject): ScopedVar {\n const version = config.buildInfo.version;\n\n if (shouldWrapInSafeSerializableSceneObject(version)) {\n return new SafeSerializableSceneObject(sceneObject);\n }\n\n return { value: sceneObject, text: '__sceneObject' };\n}\n"],"names":[],"mappings":";;;AAKO,SAAS,wCAAwC,cAAiC,EAAA;AACvF,EAAA,MAAM,OAAU,GAAA,sBAAA,CAAA;AAChB,EAAM,MAAA,KAAA,GAAQ,cAAe,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAE1C,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,KAAM,CAAA,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AACnC,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,KAAM,CAAA,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AACnC,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,KAAM,CAAA,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAEnC,EAAA,IAAI,UAAU,EAAI,EAAA;AAChB,IAAQ,OAAA,KAAA,KAAU,KAAK,KAAS,IAAA,CAAA,IAAO,UAAU,CAAK,IAAA,KAAA,IAAS,KAAM,KAAQ,GAAA,CAAA,CAAA;AAAA,GAC/E;AAEA,EAAA,IAAI,UAAU,EAAI,EAAA;AAChB,IAAA,OAAQ,KAAU,KAAA,CAAA,IAAK,KAAS,IAAA,CAAA,IAAM,KAAS,IAAA,CAAA,CAAA;AAAA,GACjD;AAEA,EAAA,OAAO,KAAQ,GAAA,EAAA,CAAA;AACjB,CAAA;AAEO,SAAS,kCAAkC,WAAqC,EAAA;AACrF,EAAM,MAAA,OAAA,GAAU,OAAO,SAAU,CAAA,OAAA,CAAA;AAEjC,EAAI,IAAA,uCAAA,CAAwC,OAAO,CAAG,EAAA;AACpD,IAAO,OAAA,IAAI,4BAA4B,WAAW,CAAA,CAAA;AAAA,GACpD;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,WAAa,EAAA,IAAA,EAAM,eAAgB,EAAA,CAAA;AACrD;;;;"}
1
+ {"version":3,"file":"wrapInSafeSerializableSceneObject.js","sources":["../../../src/utils/wrapInSafeSerializableSceneObject.ts"],"sourcesContent":["import { config } from '@grafana/runtime';\nimport { SceneObject } from '../core/types';\nimport { SafeSerializableSceneObject } from './SafeSerializableSceneObject';\nimport { ScopedVar } from '@grafana/data';\n\nexport function shouldWrapInSafeSerializableSceneObject(grafanaVersion: string): boolean {\n const pattern = /^(\\d+)\\.(\\d+)\\.(\\d+)/;\n const match = grafanaVersion.match(pattern);\n\n if (!match) {\n return false;\n }\n\n const major = parseInt(match[1], 10);\n const minor = parseInt(match[2], 10);\n const patch = parseInt(match[3], 10);\n\n if (major === 11) {\n return (minor === 0 && patch >= 4) || (minor === 1 && patch >= 2) || minor > 1;\n }\n\n if (major === 10) {\n return (minor === 4 && patch >= 8) || minor >= 5;\n }\n\n return major > 11; // Assuming versions greater than 11 are also supported.\n}\n\nexport function wrapInSafeSerializableSceneObject(sceneObject: SceneObject): ScopedVar {\n const version = config.buildInfo.version;\n\n if (shouldWrapInSafeSerializableSceneObject(version)) {\n return new SafeSerializableSceneObject(sceneObject);\n }\n\n return { value: sceneObject, text: '__sceneObject' };\n}\n"],"names":[],"mappings":";;;AAKO,SAAS,wCAAwC,cAAiC,EAAA;AACvF,EAAA,MAAM,OAAU,GAAA,sBAAA;AAChB,EAAM,MAAA,KAAA,GAAQ,cAAe,CAAA,KAAA,CAAM,OAAO,CAAA;AAE1C,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,GAAG,EAAE,CAAA;AACnC,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,GAAG,EAAE,CAAA;AACnC,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,GAAG,EAAE,CAAA;AAEnC,EAAA,IAAI,UAAU,EAAI,EAAA;AAChB,IAAQ,OAAA,KAAA,KAAU,KAAK,KAAS,IAAA,CAAA,IAAO,UAAU,CAAK,IAAA,KAAA,IAAS,KAAM,KAAQ,GAAA,CAAA;AAAA;AAG/E,EAAA,IAAI,UAAU,EAAI,EAAA;AAChB,IAAA,OAAQ,KAAU,KAAA,CAAA,IAAK,KAAS,IAAA,CAAA,IAAM,KAAS,IAAA,CAAA;AAAA;AAGjD,EAAA,OAAO,KAAQ,GAAA,EAAA;AACjB;AAEO,SAAS,kCAAkC,WAAqC,EAAA;AACrF,EAAM,MAAA,OAAA,GAAU,OAAO,SAAU,CAAA,OAAA;AAEjC,EAAI,IAAA,uCAAA,CAAwC,OAAO,CAAG,EAAA;AACpD,IAAO,OAAA,IAAI,4BAA4B,WAAW,CAAA;AAAA;AAGpD,EAAA,OAAO,EAAE,KAAA,EAAO,WAAa,EAAA,IAAA,EAAM,eAAgB,EAAA;AACrD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"writeSceneLog.js","sources":["../../../src/utils/writeSceneLog.ts"],"sourcesContent":["export function writeSceneLog(logger: string, message: string, ...rest: unknown[]) {\n let loggingEnabled = false;\n\n if (typeof window !== 'undefined') {\n loggingEnabled = localStorage.getItem('grafana.debug.scenes') === 'true';\n }\n\n if (loggingEnabled) {\n console.log(`${logger}: `, message, ...rest);\n }\n}\n"],"names":[],"mappings":"AAAgB,SAAA,aAAA,CAAc,MAAgB,EAAA,OAAA,EAAA,GAAoB,IAAiB,EAAA;AACjF,EAAA,IAAI,cAAiB,GAAA,KAAA,CAAA;AAErB,EAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AACjC,IAAiB,cAAA,GAAA,YAAA,CAAa,OAAQ,CAAA,sBAAsB,CAAM,KAAA,MAAA,CAAA;AAAA,GACpE;AAEA,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,EAAG,MAAY,CAAA,EAAA,CAAA,EAAA,OAAA,EAAS,GAAG,IAAI,CAAA,CAAA;AAAA,GAC7C;AACF;;;;"}
1
+ {"version":3,"file":"writeSceneLog.js","sources":["../../../src/utils/writeSceneLog.ts"],"sourcesContent":["export function writeSceneLog(logger: string, message: string, ...rest: unknown[]) {\n let loggingEnabled = false;\n\n if (typeof window !== 'undefined') {\n loggingEnabled = localStorage.getItem('grafana.debug.scenes') === 'true';\n }\n\n if (loggingEnabled) {\n console.log(`${logger}: `, message, ...rest);\n }\n}\n"],"names":[],"mappings":"AAAgB,SAAA,aAAA,CAAc,MAAgB,EAAA,OAAA,EAAA,GAAoB,IAAiB,EAAA;AACjF,EAAA,IAAI,cAAiB,GAAA,KAAA;AAErB,EAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AACjC,IAAiB,cAAA,GAAA,YAAA,CAAa,OAAQ,CAAA,sBAAsB,CAAM,KAAA,MAAA;AAAA;AAGpE,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAA,OAAA,CAAQ,IAAI,CAAG,EAAA,MAAM,CAAM,EAAA,CAAA,EAAA,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA;AAE/C;;;;"}
@@ -17,9 +17,15 @@ class VariableDependencyConfig {
17
17
  this.handleTimeMacros();
18
18
  }
19
19
  }
20
+ /**
21
+ * Used to check for dependency on a specific variable
22
+ */
20
23
  hasDependencyOn(name) {
21
24
  return this.getNames().has(name);
22
25
  }
26
+ /**
27
+ * This is called whenever any set of variables have new values. It is up to this implementation to check if it's relevant given the current dependencies.
28
+ */
23
29
  variableUpdateCompleted(variable, hasChanged) {
24
30
  const deps = this.getNames();
25
31
  let dependencyChanged = false;
@@ -77,6 +83,9 @@ class VariableDependencyConfig {
77
83
  }
78
84
  return this._dependencies;
79
85
  }
86
+ /**
87
+ * Update variableNames
88
+ */
80
89
  setVariableNames(varNames) {
81
90
  this._options.variableNames = varNames;
82
91
  this.scanStateForDependencies(this._state);
@@ -1 +1 @@
1
- {"version":3,"file":"VariableDependencyConfig.js","sources":["../../../src/variables/VariableDependencyConfig.ts"],"sourcesContent":["import { DataLinkBuiltInVars } from '@grafana/data';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject, SceneObjectState } from '../core/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VARIABLE_REGEX } from './constants';\n\nimport { SceneVariable, SceneVariableDependencyConfigLike } from './types';\nimport { safeStringifyValue } from './utils';\nimport { ConstantVariable } from './variants/ConstantVariable';\n\ninterface VariableDependencyConfigOptions<TState extends SceneObjectState> {\n /**\n * State paths to scan / extract variable dependencies from. Leave empty to scan all paths.\n */\n statePaths?: Array<keyof TState | '*'>;\n\n /**\n * Explicit list of variable names to depend on. Leave empty to scan state for dependencies.\n */\n variableNames?: string[];\n\n /**\n * Optional way to customize how to handle when a dependent variable changes\n * If not specified the default behavior is to trigger a re-render\n */\n onReferencedVariableValueChanged?: (variable: SceneVariable) => void;\n\n /**\n * Two scenarios trigger this callback to be called.\n * 1. When any direct dependency changed value\n * 2. In case hasDependencyInLoadingState was called and returned true we really care about any variable update. So in this scenario this callback is called\n * after any variable update completes. This is to cover scenarios where an object is waiting for indirect dependencies to complete.\n */\n onVariableUpdateCompleted?: () => void;\n\n /**\n * Optional way to subscribe to all variable value changes, even to variables that are not dependencies.\n */\n onAnyVariableChanged?: (variable: SceneVariable) => void;\n\n /**\n * Handle time macros.\n */\n handleTimeMacros?: boolean;\n}\n\nexport class VariableDependencyConfig<TState extends SceneObjectState> implements SceneVariableDependencyConfigLike {\n private _state: TState | undefined;\n private _dependencies = new Set<string>();\n private _statePaths?: Array<keyof TState | '*'>;\n private _isWaitingForVariables = false;\n\n public scanCount = 0;\n\n public constructor(\n private _sceneObject: SceneObject<TState>,\n private _options: VariableDependencyConfigOptions<TState>\n ) {\n this._statePaths = _options.statePaths;\n\n if (this._options.handleTimeMacros) {\n this.handleTimeMacros();\n }\n }\n\n /**\n * Used to check for dependency on a specific variable\n */\n public hasDependencyOn(name: string): boolean {\n return this.getNames().has(name);\n }\n\n /**\n * This is called whenever any set of variables have new values. It is up to this implementation to check if it's relevant given the current dependencies.\n */\n public variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean) {\n const deps = this.getNames();\n let dependencyChanged = false;\n\n if ((deps.has(variable.state.name) || deps.has(DataLinkBuiltInVars.includeVars)) && hasChanged) {\n dependencyChanged = true;\n }\n\n writeSceneLog(\n 'VariableDependencyConfig',\n 'variableUpdateCompleted',\n variable.state.name,\n dependencyChanged,\n this._isWaitingForVariables\n );\n\n if (this._options.onAnyVariableChanged) {\n this._options.onAnyVariableChanged(variable);\n }\n\n // If custom handler called when dependency is changed or when we are waiting for variables\n if (this._options.onVariableUpdateCompleted && (this._isWaitingForVariables || dependencyChanged)) {\n this._options.onVariableUpdateCompleted();\n }\n\n if (dependencyChanged) {\n if (this._options.onReferencedVariableValueChanged) {\n this._options.onReferencedVariableValueChanged(variable);\n }\n\n // if no callbacks are specified then just do a forceRender\n if (!this._options.onReferencedVariableValueChanged && !this._options.onVariableUpdateCompleted) {\n this._sceneObject.forceRender();\n }\n }\n }\n\n public hasDependencyInLoadingState() {\n if (sceneGraph.hasVariableDependencyInLoadingState(this._sceneObject)) {\n this._isWaitingForVariables = true;\n return true;\n }\n\n this._isWaitingForVariables = false;\n return false;\n }\n\n public getNames(): Set<string> {\n const prevState = this._state;\n const newState = (this._state = this._sceneObject.state);\n\n if (!prevState) {\n // First time we always scan for dependencies\n this.scanStateForDependencies(this._state);\n return this._dependencies;\n }\n\n // Second time we only scan if state is a different and if any specific state path has changed\n if (newState !== prevState) {\n if (this._statePaths) {\n for (const path of this._statePaths) {\n if (path === '*' || newState[path] !== prevState[path]) {\n this.scanStateForDependencies(newState);\n break;\n }\n }\n } else {\n this.scanStateForDependencies(newState);\n }\n }\n\n return this._dependencies;\n }\n\n /**\n * Update variableNames\n */\n public setVariableNames(varNames: string[]) {\n this._options.variableNames = varNames;\n this.scanStateForDependencies(this._state!);\n }\n\n public setPaths(paths: Array<keyof TState | '*'>) {\n this._statePaths = paths;\n }\n\n private scanStateForDependencies(state: TState) {\n this._dependencies.clear();\n this.scanCount += 1;\n\n if (this._options.variableNames) {\n for (const name of this._options.variableNames) {\n this._dependencies.add(name);\n }\n }\n\n if (this._statePaths) {\n for (const path of this._statePaths) {\n if (path === '*') {\n this.extractVariablesFrom(state);\n break;\n } else {\n const value = state[path];\n if (value) {\n this.extractVariablesFrom(value);\n }\n }\n }\n }\n }\n\n private extractVariablesFrom(value: unknown) {\n VARIABLE_REGEX.lastIndex = 0;\n\n const stringToCheck = typeof value !== 'string' ? safeStringifyValue(value) : value;\n\n const matches = stringToCheck.matchAll(VARIABLE_REGEX);\n if (!matches) {\n return;\n }\n\n for (const match of matches) {\n const [, var1, var2, , var3] = match;\n const variableName = var1 || var2 || var3;\n this._dependencies.add(variableName);\n }\n }\n\n private handleTimeMacros() {\n this._sceneObject.addActivationHandler(() => {\n const timeRange = sceneGraph.getTimeRange(this._sceneObject);\n\n const sub = timeRange.subscribeToState((newState, oldState) => {\n const deps = this.getNames();\n const hasFromDep = deps.has('__from');\n const hasToDep = deps.has('__to');\n const hasTimeZone = deps.has('__timezone');\n\n if (newState.value !== oldState.value) {\n // If you have both __from & __to as dependencies you only get notified that from changed and vice versa\n if (hasFromDep) {\n const variable = new ConstantVariable({ name: '__from', value: newState.from });\n this.variableUpdateCompleted(variable, true);\n } else if (hasToDep) {\n const variable = new ConstantVariable({ name: '__to', value: newState.to });\n this.variableUpdateCompleted(variable, true);\n }\n }\n\n if (newState.timeZone !== oldState.timeZone && hasTimeZone) {\n const variable = new ConstantVariable({ name: '__timezone', value: newState.timeZone });\n this.variableUpdateCompleted(variable, true);\n }\n });\n\n return () => sub.unsubscribe();\n });\n }\n}\n"],"names":[],"mappings":";;;;;;;AA8CO,MAAM,wBAAuG,CAAA;AAAA,EAQ3G,WAAA,CACG,cACA,QACR,EAAA;AAFQ,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA,CAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AARV,IAAQ,IAAA,CAAA,aAAA,uBAAoB,GAAY,EAAA,CAAA;AAExC,IAAA,IAAA,CAAQ,sBAAyB,GAAA,KAAA,CAAA;AAEjC,IAAA,IAAA,CAAO,SAAY,GAAA,CAAA,CAAA;AAMjB,IAAA,IAAA,CAAK,cAAc,QAAS,CAAA,UAAA,CAAA;AAE5B,IAAI,IAAA,IAAA,CAAK,SAAS,gBAAkB,EAAA;AAClC,MAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,KACxB;AAAA,GACF;AAAA,EAKO,gBAAgB,IAAuB,EAAA;AAC5C,IAAA,OAAO,IAAK,CAAA,QAAA,EAAW,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,GACjC;AAAA,EAKO,uBAAA,CAAwB,UAAyB,UAAqB,EAAA;AAC3E,IAAM,MAAA,IAAA,GAAO,KAAK,QAAS,EAAA,CAAA;AAC3B,IAAA,IAAI,iBAAoB,GAAA,KAAA,CAAA;AAExB,IAAK,IAAA,CAAA,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,KAAM,CAAA,IAAI,CAAK,IAAA,IAAA,CAAK,GAAI,CAAA,mBAAA,CAAoB,WAAW,CAAA,KAAM,UAAY,EAAA;AAC9F,MAAoB,iBAAA,GAAA,IAAA,CAAA;AAAA,KACtB;AAEA,IAAA,aAAA;AAAA,MACE,0BAAA;AAAA,MACA,yBAAA;AAAA,MACA,SAAS,KAAM,CAAA,IAAA;AAAA,MACf,iBAAA;AAAA,MACA,IAAK,CAAA,sBAAA;AAAA,KACP,CAAA;AAEA,IAAI,IAAA,IAAA,CAAK,SAAS,oBAAsB,EAAA;AACtC,MAAK,IAAA,CAAA,QAAA,CAAS,qBAAqB,QAAQ,CAAA,CAAA;AAAA,KAC7C;AAGA,IAAA,IAAI,IAAK,CAAA,QAAA,CAAS,yBAA8B,KAAA,IAAA,CAAK,0BAA0B,iBAAoB,CAAA,EAAA;AACjG,MAAA,IAAA,CAAK,SAAS,yBAA0B,EAAA,CAAA;AAAA,KAC1C;AAEA,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAI,IAAA,IAAA,CAAK,SAAS,gCAAkC,EAAA;AAClD,QAAK,IAAA,CAAA,QAAA,CAAS,iCAAiC,QAAQ,CAAA,CAAA;AAAA,OACzD;AAGA,MAAA,IAAI,CAAC,IAAK,CAAA,QAAA,CAAS,oCAAoC,CAAC,IAAA,CAAK,SAAS,yBAA2B,EAAA;AAC/F,QAAA,IAAA,CAAK,aAAa,WAAY,EAAA,CAAA;AAAA,OAChC;AAAA,KACF;AAAA,GACF;AAAA,EAEO,2BAA8B,GAAA;AACnC,IAAA,IAAI,UAAW,CAAA,mCAAA,CAAoC,IAAK,CAAA,YAAY,CAAG,EAAA;AACrE,MAAA,IAAA,CAAK,sBAAyB,GAAA,IAAA,CAAA;AAC9B,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,IAAA,CAAK,sBAAyB,GAAA,KAAA,CAAA;AAC9B,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEO,QAAwB,GAAA;AAC7B,IAAA,MAAM,YAAY,IAAK,CAAA,MAAA,CAAA;AACvB,IAAA,MAAM,QAAY,GAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAK,YAAa,CAAA,KAAA,CAAA;AAElD,IAAA,IAAI,CAAC,SAAW,EAAA;AAEd,MAAK,IAAA,CAAA,wBAAA,CAAyB,KAAK,MAAM,CAAA,CAAA;AACzC,MAAA,OAAO,IAAK,CAAA,aAAA,CAAA;AAAA,KACd;AAGA,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAI,KAAK,WAAa,EAAA;AACpB,QAAW,KAAA,MAAA,IAAA,IAAQ,KAAK,WAAa,EAAA;AACnC,UAAA,IAAI,IAAS,KAAA,GAAA,IAAO,QAAS,CAAA,IAAA,CAAA,KAAU,UAAU,IAAO,CAAA,EAAA;AACtD,YAAA,IAAA,CAAK,yBAAyB,QAAQ,CAAA,CAAA;AACtC,YAAA,MAAA;AAAA,WACF;AAAA,SACF;AAAA,OACK,MAAA;AACL,QAAA,IAAA,CAAK,yBAAyB,QAAQ,CAAA,CAAA;AAAA,OACxC;AAAA,KACF;AAEA,IAAA,OAAO,IAAK,CAAA,aAAA,CAAA;AAAA,GACd;AAAA,EAKO,iBAAiB,QAAoB,EAAA;AAC1C,IAAA,IAAA,CAAK,SAAS,aAAgB,GAAA,QAAA,CAAA;AAC9B,IAAK,IAAA,CAAA,wBAAA,CAAyB,KAAK,MAAO,CAAA,CAAA;AAAA,GAC5C;AAAA,EAEO,SAAS,KAAkC,EAAA;AAChD,IAAA,IAAA,CAAK,WAAc,GAAA,KAAA,CAAA;AAAA,GACrB;AAAA,EAEQ,yBAAyB,KAAe,EAAA;AAC9C,IAAA,IAAA,CAAK,cAAc,KAAM,EAAA,CAAA;AACzB,IAAA,IAAA,CAAK,SAAa,IAAA,CAAA,CAAA;AAElB,IAAI,IAAA,IAAA,CAAK,SAAS,aAAe,EAAA;AAC/B,MAAW,KAAA,MAAA,IAAA,IAAQ,IAAK,CAAA,QAAA,CAAS,aAAe,EAAA;AAC9C,QAAK,IAAA,CAAA,aAAA,CAAc,IAAI,IAAI,CAAA,CAAA;AAAA,OAC7B;AAAA,KACF;AAEA,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAW,KAAA,MAAA,IAAA,IAAQ,KAAK,WAAa,EAAA;AACnC,QAAA,IAAI,SAAS,GAAK,EAAA;AAChB,UAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA,CAAA;AAC/B,UAAA,MAAA;AAAA,SACK,MAAA;AACL,UAAA,MAAM,QAAQ,KAAM,CAAA,IAAA,CAAA,CAAA;AACpB,UAAA,IAAI,KAAO,EAAA;AACT,YAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA,CAAA;AAAA,WACjC;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA,EAEQ,qBAAqB,KAAgB,EAAA;AAC3C,IAAA,cAAA,CAAe,SAAY,GAAA,CAAA,CAAA;AAE3B,IAAA,MAAM,gBAAgB,OAAO,KAAA,KAAU,QAAW,GAAA,kBAAA,CAAmB,KAAK,CAAI,GAAA,KAAA,CAAA;AAE9E,IAAM,MAAA,OAAA,GAAU,aAAc,CAAA,QAAA,CAAS,cAAc,CAAA,CAAA;AACrD,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,MAAA,MAAM,GAAG,IAAA,EAAM,IAAM,IAAE,IAAI,CAAI,GAAA,KAAA,CAAA;AAC/B,MAAM,MAAA,YAAA,GAAe,QAAQ,IAAQ,IAAA,IAAA,CAAA;AACrC,MAAK,IAAA,CAAA,aAAA,CAAc,IAAI,YAAY,CAAA,CAAA;AAAA,KACrC;AAAA,GACF;AAAA,EAEQ,gBAAmB,GAAA;AACzB,IAAK,IAAA,CAAA,YAAA,CAAa,qBAAqB,MAAM;AAC3C,MAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AAE3D,MAAA,MAAM,GAAM,GAAA,SAAA,CAAU,gBAAiB,CAAA,CAAC,UAAU,QAAa,KAAA;AAC7D,QAAM,MAAA,IAAA,GAAO,KAAK,QAAS,EAAA,CAAA;AAC3B,QAAM,MAAA,UAAA,GAAa,IAAK,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AACpC,QAAM,MAAA,QAAA,GAAW,IAAK,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAChC,QAAM,MAAA,WAAA,GAAc,IAAK,CAAA,GAAA,CAAI,YAAY,CAAA,CAAA;AAEzC,QAAI,IAAA,QAAA,CAAS,KAAU,KAAA,QAAA,CAAS,KAAO,EAAA;AAErC,UAAA,IAAI,UAAY,EAAA;AACd,YAAM,MAAA,QAAA,GAAW,IAAI,gBAAiB,CAAA,EAAE,MAAM,QAAU,EAAA,KAAA,EAAO,QAAS,CAAA,IAAA,EAAM,CAAA,CAAA;AAC9E,YAAK,IAAA,CAAA,uBAAA,CAAwB,UAAU,IAAI,CAAA,CAAA;AAAA,qBAClC,QAAU,EAAA;AACnB,YAAM,MAAA,QAAA,GAAW,IAAI,gBAAiB,CAAA,EAAE,MAAM,MAAQ,EAAA,KAAA,EAAO,QAAS,CAAA,EAAA,EAAI,CAAA,CAAA;AAC1E,YAAK,IAAA,CAAA,uBAAA,CAAwB,UAAU,IAAI,CAAA,CAAA;AAAA,WAC7C;AAAA,SACF;AAEA,QAAA,IAAI,QAAS,CAAA,QAAA,KAAa,QAAS,CAAA,QAAA,IAAY,WAAa,EAAA;AAC1D,UAAM,MAAA,QAAA,GAAW,IAAI,gBAAiB,CAAA,EAAE,MAAM,YAAc,EAAA,KAAA,EAAO,QAAS,CAAA,QAAA,EAAU,CAAA,CAAA;AACtF,UAAK,IAAA,CAAA,uBAAA,CAAwB,UAAU,IAAI,CAAA,CAAA;AAAA,SAC7C;AAAA,OACD,CAAA,CAAA;AAED,MAAO,OAAA,MAAM,IAAI,WAAY,EAAA,CAAA;AAAA,KAC9B,CAAA,CAAA;AAAA,GACH;AACF;;;;"}
1
+ {"version":3,"file":"VariableDependencyConfig.js","sources":["../../../src/variables/VariableDependencyConfig.ts"],"sourcesContent":["import { DataLinkBuiltInVars } from '@grafana/data';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject, SceneObjectState } from '../core/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VARIABLE_REGEX } from './constants';\n\nimport { SceneVariable, SceneVariableDependencyConfigLike } from './types';\nimport { safeStringifyValue } from './utils';\nimport { ConstantVariable } from './variants/ConstantVariable';\n\ninterface VariableDependencyConfigOptions<TState extends SceneObjectState> {\n /**\n * State paths to scan / extract variable dependencies from. Leave empty to scan all paths.\n */\n statePaths?: Array<keyof TState | '*'>;\n\n /**\n * Explicit list of variable names to depend on. Leave empty to scan state for dependencies.\n */\n variableNames?: string[];\n\n /**\n * Optional way to customize how to handle when a dependent variable changes\n * If not specified the default behavior is to trigger a re-render\n */\n onReferencedVariableValueChanged?: (variable: SceneVariable) => void;\n\n /**\n * Two scenarios trigger this callback to be called.\n * 1. When any direct dependency changed value\n * 2. In case hasDependencyInLoadingState was called and returned true we really care about any variable update. So in this scenario this callback is called\n * after any variable update completes. This is to cover scenarios where an object is waiting for indirect dependencies to complete.\n */\n onVariableUpdateCompleted?: () => void;\n\n /**\n * Optional way to subscribe to all variable value changes, even to variables that are not dependencies.\n */\n onAnyVariableChanged?: (variable: SceneVariable) => void;\n\n /**\n * Handle time macros.\n */\n handleTimeMacros?: boolean;\n}\n\nexport class VariableDependencyConfig<TState extends SceneObjectState> implements SceneVariableDependencyConfigLike {\n private _state: TState | undefined;\n private _dependencies = new Set<string>();\n private _statePaths?: Array<keyof TState | '*'>;\n private _isWaitingForVariables = false;\n\n public scanCount = 0;\n\n public constructor(\n private _sceneObject: SceneObject<TState>,\n private _options: VariableDependencyConfigOptions<TState>\n ) {\n this._statePaths = _options.statePaths;\n\n if (this._options.handleTimeMacros) {\n this.handleTimeMacros();\n }\n }\n\n /**\n * Used to check for dependency on a specific variable\n */\n public hasDependencyOn(name: string): boolean {\n return this.getNames().has(name);\n }\n\n /**\n * This is called whenever any set of variables have new values. It is up to this implementation to check if it's relevant given the current dependencies.\n */\n public variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean) {\n const deps = this.getNames();\n let dependencyChanged = false;\n\n if ((deps.has(variable.state.name) || deps.has(DataLinkBuiltInVars.includeVars)) && hasChanged) {\n dependencyChanged = true;\n }\n\n writeSceneLog(\n 'VariableDependencyConfig',\n 'variableUpdateCompleted',\n variable.state.name,\n dependencyChanged,\n this._isWaitingForVariables\n );\n\n if (this._options.onAnyVariableChanged) {\n this._options.onAnyVariableChanged(variable);\n }\n\n // If custom handler called when dependency is changed or when we are waiting for variables\n if (this._options.onVariableUpdateCompleted && (this._isWaitingForVariables || dependencyChanged)) {\n this._options.onVariableUpdateCompleted();\n }\n\n if (dependencyChanged) {\n if (this._options.onReferencedVariableValueChanged) {\n this._options.onReferencedVariableValueChanged(variable);\n }\n\n // if no callbacks are specified then just do a forceRender\n if (!this._options.onReferencedVariableValueChanged && !this._options.onVariableUpdateCompleted) {\n this._sceneObject.forceRender();\n }\n }\n }\n\n public hasDependencyInLoadingState() {\n if (sceneGraph.hasVariableDependencyInLoadingState(this._sceneObject)) {\n this._isWaitingForVariables = true;\n return true;\n }\n\n this._isWaitingForVariables = false;\n return false;\n }\n\n public getNames(): Set<string> {\n const prevState = this._state;\n const newState = (this._state = this._sceneObject.state);\n\n if (!prevState) {\n // First time we always scan for dependencies\n this.scanStateForDependencies(this._state);\n return this._dependencies;\n }\n\n // Second time we only scan if state is a different and if any specific state path has changed\n if (newState !== prevState) {\n if (this._statePaths) {\n for (const path of this._statePaths) {\n if (path === '*' || newState[path] !== prevState[path]) {\n this.scanStateForDependencies(newState);\n break;\n }\n }\n } else {\n this.scanStateForDependencies(newState);\n }\n }\n\n return this._dependencies;\n }\n\n /**\n * Update variableNames\n */\n public setVariableNames(varNames: string[]) {\n this._options.variableNames = varNames;\n this.scanStateForDependencies(this._state!);\n }\n\n public setPaths(paths: Array<keyof TState | '*'>) {\n this._statePaths = paths;\n }\n\n private scanStateForDependencies(state: TState) {\n this._dependencies.clear();\n this.scanCount += 1;\n\n if (this._options.variableNames) {\n for (const name of this._options.variableNames) {\n this._dependencies.add(name);\n }\n }\n\n if (this._statePaths) {\n for (const path of this._statePaths) {\n if (path === '*') {\n this.extractVariablesFrom(state);\n break;\n } else {\n const value = state[path];\n if (value) {\n this.extractVariablesFrom(value);\n }\n }\n }\n }\n }\n\n private extractVariablesFrom(value: unknown) {\n VARIABLE_REGEX.lastIndex = 0;\n\n const stringToCheck = typeof value !== 'string' ? safeStringifyValue(value) : value;\n\n const matches = stringToCheck.matchAll(VARIABLE_REGEX);\n if (!matches) {\n return;\n }\n\n for (const match of matches) {\n const [, var1, var2, , var3] = match;\n const variableName = var1 || var2 || var3;\n this._dependencies.add(variableName);\n }\n }\n\n private handleTimeMacros() {\n this._sceneObject.addActivationHandler(() => {\n const timeRange = sceneGraph.getTimeRange(this._sceneObject);\n\n const sub = timeRange.subscribeToState((newState, oldState) => {\n const deps = this.getNames();\n const hasFromDep = deps.has('__from');\n const hasToDep = deps.has('__to');\n const hasTimeZone = deps.has('__timezone');\n\n if (newState.value !== oldState.value) {\n // If you have both __from & __to as dependencies you only get notified that from changed and vice versa\n if (hasFromDep) {\n const variable = new ConstantVariable({ name: '__from', value: newState.from });\n this.variableUpdateCompleted(variable, true);\n } else if (hasToDep) {\n const variable = new ConstantVariable({ name: '__to', value: newState.to });\n this.variableUpdateCompleted(variable, true);\n }\n }\n\n if (newState.timeZone !== oldState.timeZone && hasTimeZone) {\n const variable = new ConstantVariable({ name: '__timezone', value: newState.timeZone });\n this.variableUpdateCompleted(variable, true);\n }\n });\n\n return () => sub.unsubscribe();\n });\n }\n}\n"],"names":[],"mappings":";;;;;;;AA8CO,MAAM,wBAAuG,CAAA;AAAA,EAQ3G,WAAA,CACG,cACA,QACR,EAAA;AAFQ,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AARV,IAAQ,IAAA,CAAA,aAAA,uBAAoB,GAAY,EAAA;AAExC,IAAA,IAAA,CAAQ,sBAAyB,GAAA,KAAA;AAEjC,IAAA,IAAA,CAAO,SAAY,GAAA,CAAA;AAMjB,IAAA,IAAA,CAAK,cAAc,QAAS,CAAA,UAAA;AAE5B,IAAI,IAAA,IAAA,CAAK,SAAS,gBAAkB,EAAA;AAClC,MAAA,IAAA,CAAK,gBAAiB,EAAA;AAAA;AACxB;AACF;AAAA;AAAA;AAAA,EAKO,gBAAgB,IAAuB,EAAA;AAC5C,IAAA,OAAO,IAAK,CAAA,QAAA,EAAW,CAAA,GAAA,CAAI,IAAI,CAAA;AAAA;AACjC;AAAA;AAAA;AAAA,EAKO,uBAAA,CAAwB,UAAyB,UAAqB,EAAA;AAC3E,IAAM,MAAA,IAAA,GAAO,KAAK,QAAS,EAAA;AAC3B,IAAA,IAAI,iBAAoB,GAAA,KAAA;AAExB,IAAK,IAAA,CAAA,IAAA,CAAK,GAAI,CAAA,QAAA,CAAS,KAAM,CAAA,IAAI,CAAK,IAAA,IAAA,CAAK,GAAI,CAAA,mBAAA,CAAoB,WAAW,CAAA,KAAM,UAAY,EAAA;AAC9F,MAAoB,iBAAA,GAAA,IAAA;AAAA;AAGtB,IAAA,aAAA;AAAA,MACE,0BAAA;AAAA,MACA,yBAAA;AAAA,MACA,SAAS,KAAM,CAAA,IAAA;AAAA,MACf,iBAAA;AAAA,MACA,IAAK,CAAA;AAAA,KACP;AAEA,IAAI,IAAA,IAAA,CAAK,SAAS,oBAAsB,EAAA;AACtC,MAAK,IAAA,CAAA,QAAA,CAAS,qBAAqB,QAAQ,CAAA;AAAA;AAI7C,IAAA,IAAI,IAAK,CAAA,QAAA,CAAS,yBAA8B,KAAA,IAAA,CAAK,0BAA0B,iBAAoB,CAAA,EAAA;AACjG,MAAA,IAAA,CAAK,SAAS,yBAA0B,EAAA;AAAA;AAG1C,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAI,IAAA,IAAA,CAAK,SAAS,gCAAkC,EAAA;AAClD,QAAK,IAAA,CAAA,QAAA,CAAS,iCAAiC,QAAQ,CAAA;AAAA;AAIzD,MAAA,IAAI,CAAC,IAAK,CAAA,QAAA,CAAS,oCAAoC,CAAC,IAAA,CAAK,SAAS,yBAA2B,EAAA;AAC/F,QAAA,IAAA,CAAK,aAAa,WAAY,EAAA;AAAA;AAChC;AACF;AACF,EAEO,2BAA8B,GAAA;AACnC,IAAA,IAAI,UAAW,CAAA,mCAAA,CAAoC,IAAK,CAAA,YAAY,CAAG,EAAA;AACrE,MAAA,IAAA,CAAK,sBAAyB,GAAA,IAAA;AAC9B,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,IAAA,CAAK,sBAAyB,GAAA,KAAA;AAC9B,IAAO,OAAA,KAAA;AAAA;AACT,EAEO,QAAwB,GAAA;AAC7B,IAAA,MAAM,YAAY,IAAK,CAAA,MAAA;AACvB,IAAA,MAAM,QAAY,GAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAK,YAAa,CAAA,KAAA;AAElD,IAAA,IAAI,CAAC,SAAW,EAAA;AAEd,MAAK,IAAA,CAAA,wBAAA,CAAyB,KAAK,MAAM,CAAA;AACzC,MAAA,OAAO,IAAK,CAAA,aAAA;AAAA;AAId,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAI,KAAK,WAAa,EAAA;AACpB,QAAW,KAAA,MAAA,IAAA,IAAQ,KAAK,WAAa,EAAA;AACnC,UAAA,IAAI,SAAS,GAAO,IAAA,QAAA,CAAS,IAAI,CAAM,KAAA,SAAA,CAAU,IAAI,CAAG,EAAA;AACtD,YAAA,IAAA,CAAK,yBAAyB,QAAQ,CAAA;AACtC,YAAA;AAAA;AACF;AACF,OACK,MAAA;AACL,QAAA,IAAA,CAAK,yBAAyB,QAAQ,CAAA;AAAA;AACxC;AAGF,IAAA,OAAO,IAAK,CAAA,aAAA;AAAA;AACd;AAAA;AAAA;AAAA,EAKO,iBAAiB,QAAoB,EAAA;AAC1C,IAAA,IAAA,CAAK,SAAS,aAAgB,GAAA,QAAA;AAC9B,IAAK,IAAA,CAAA,wBAAA,CAAyB,KAAK,MAAO,CAAA;AAAA;AAC5C,EAEO,SAAS,KAAkC,EAAA;AAChD,IAAA,IAAA,CAAK,WAAc,GAAA,KAAA;AAAA;AACrB,EAEQ,yBAAyB,KAAe,EAAA;AAC9C,IAAA,IAAA,CAAK,cAAc,KAAM,EAAA;AACzB,IAAA,IAAA,CAAK,SAAa,IAAA,CAAA;AAElB,IAAI,IAAA,IAAA,CAAK,SAAS,aAAe,EAAA;AAC/B,MAAW,KAAA,MAAA,IAAA,IAAQ,IAAK,CAAA,QAAA,CAAS,aAAe,EAAA;AAC9C,QAAK,IAAA,CAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA;AAC7B;AAGF,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAW,KAAA,MAAA,IAAA,IAAQ,KAAK,WAAa,EAAA;AACnC,QAAA,IAAI,SAAS,GAAK,EAAA;AAChB,UAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAC/B,UAAA;AAAA,SACK,MAAA;AACL,UAAM,MAAA,KAAA,GAAQ,MAAM,IAAI,CAAA;AACxB,UAAA,IAAI,KAAO,EAAA;AACT,YAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAAA;AACjC;AACF;AACF;AACF;AACF,EAEQ,qBAAqB,KAAgB,EAAA;AAC3C,IAAA,cAAA,CAAe,SAAY,GAAA,CAAA;AAE3B,IAAA,MAAM,gBAAgB,OAAO,KAAA,KAAU,QAAW,GAAA,kBAAA,CAAmB,KAAK,CAAI,GAAA,KAAA;AAE9E,IAAM,MAAA,OAAA,GAAU,aAAc,CAAA,QAAA,CAAS,cAAc,CAAA;AACrD,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA;AAAA;AAGF,IAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,MAAA,MAAM,GAAG,IAAA,EAAM,IAAM,IAAE,IAAI,CAAI,GAAA,KAAA;AAC/B,MAAM,MAAA,YAAA,GAAe,QAAQ,IAAQ,IAAA,IAAA;AACrC,MAAK,IAAA,CAAA,aAAA,CAAc,IAAI,YAAY,CAAA;AAAA;AACrC;AACF,EAEQ,gBAAmB,GAAA;AACzB,IAAK,IAAA,CAAA,YAAA,CAAa,qBAAqB,MAAM;AAC3C,MAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,IAAA,CAAK,YAAY,CAAA;AAE3D,MAAA,MAAM,GAAM,GAAA,SAAA,CAAU,gBAAiB,CAAA,CAAC,UAAU,QAAa,KAAA;AAC7D,QAAM,MAAA,IAAA,GAAO,KAAK,QAAS,EAAA;AAC3B,QAAM,MAAA,UAAA,GAAa,IAAK,CAAA,GAAA,CAAI,QAAQ,CAAA;AACpC,QAAM,MAAA,QAAA,GAAW,IAAK,CAAA,GAAA,CAAI,MAAM,CAAA;AAChC,QAAM,MAAA,WAAA,GAAc,IAAK,CAAA,GAAA,CAAI,YAAY,CAAA;AAEzC,QAAI,IAAA,QAAA,CAAS,KAAU,KAAA,QAAA,CAAS,KAAO,EAAA;AAErC,UAAA,IAAI,UAAY,EAAA;AACd,YAAM,MAAA,QAAA,GAAW,IAAI,gBAAiB,CAAA,EAAE,MAAM,QAAU,EAAA,KAAA,EAAO,QAAS,CAAA,IAAA,EAAM,CAAA;AAC9E,YAAK,IAAA,CAAA,uBAAA,CAAwB,UAAU,IAAI,CAAA;AAAA,qBAClC,QAAU,EAAA;AACnB,YAAM,MAAA,QAAA,GAAW,IAAI,gBAAiB,CAAA,EAAE,MAAM,MAAQ,EAAA,KAAA,EAAO,QAAS,CAAA,EAAA,EAAI,CAAA;AAC1E,YAAK,IAAA,CAAA,uBAAA,CAAwB,UAAU,IAAI,CAAA;AAAA;AAC7C;AAGF,QAAA,IAAI,QAAS,CAAA,QAAA,KAAa,QAAS,CAAA,QAAA,IAAY,WAAa,EAAA;AAC1D,UAAM,MAAA,QAAA,GAAW,IAAI,gBAAiB,CAAA,EAAE,MAAM,YAAc,EAAA,KAAA,EAAO,QAAS,CAAA,QAAA,EAAU,CAAA;AACtF,UAAK,IAAA,CAAA,uBAAA,CAAwB,UAAU,IAAI,CAAA;AAAA;AAC7C,OACD,CAAA;AAED,MAAO,OAAA,MAAM,IAAI,WAAY,EAAA;AAAA,KAC9B,CAAA;AAAA;AAEL;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"VariableValueRecorder.js","sources":["../../../src/variables/VariableValueRecorder.ts"],"sourcesContent":["import { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject } from '../core/types';\nimport { SceneVariable, VariableValue } from './types';\nimport { isVariableValueEqual } from './utils';\n\n/**\n * Useful for remembering variable values to know if they have changed\n **/\nexport class VariableValueRecorder {\n private _values = new Map<string, VariableValue | undefined | null>();\n\n public recordCurrentDependencyValuesForSceneObject(sceneObject: SceneObject) {\n this.clearValues();\n\n if (!sceneObject.variableDependency) {\n return;\n }\n\n for (const variableName of sceneObject.variableDependency.getNames()) {\n const variable = sceneGraph.lookupVariable(variableName, sceneObject);\n if (variable) {\n this._values.set(variable.state.name, variable.getValue());\n }\n }\n }\n\n public cloneAndRecordCurrentValuesForSceneObject(sceneObject: SceneObject) {\n const clone = new VariableValueRecorder();\n clone.recordCurrentDependencyValuesForSceneObject(sceneObject);\n return clone;\n }\n\n public clearValues() {\n this._values.clear();\n }\n\n public hasValues(): boolean {\n return !!this._values;\n }\n\n public recordCurrentValue(variable: SceneVariable) {\n this._values.set(variable.state.name, variable.getValue());\n }\n\n public hasRecordedValue(variable: SceneVariable): boolean {\n return this._values.has(variable.state.name);\n }\n\n public hasValueChanged(variable: SceneVariable): boolean {\n if (this._values.has(variable.state.name)) {\n const value = this._values.get(variable.state.name);\n if (!isVariableValueEqual(value, variable.getValue())) {\n return true;\n }\n }\n\n return false;\n }\n\n public hasDependenciesChanged(sceneObject: SceneObject): boolean {\n if (!this._values) {\n return false;\n }\n\n if (!sceneObject.variableDependency) {\n return false;\n }\n\n for (const variableName of sceneObject.variableDependency.getNames()) {\n const variable = sceneGraph.lookupVariable(variableName, sceneObject);\n if (!variable) {\n continue;\n }\n\n const name = variable.state.name;\n\n if (variable && this._values.has(name)) {\n const value = this._values.get(name);\n if (!isVariableValueEqual(value, variable.getValue())) {\n return true;\n }\n }\n }\n\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VariableValueRecorder.js","sources":["../../../src/variables/VariableValueRecorder.ts"],"sourcesContent":["import { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject } from '../core/types';\nimport { SceneVariable, VariableValue } from './types';\nimport { isVariableValueEqual } from './utils';\n\n/**\n * Useful for remembering variable values to know if they have changed\n **/\nexport class VariableValueRecorder {\n private _values = new Map<string, VariableValue | undefined | null>();\n\n public recordCurrentDependencyValuesForSceneObject(sceneObject: SceneObject) {\n this.clearValues();\n\n if (!sceneObject.variableDependency) {\n return;\n }\n\n for (const variableName of sceneObject.variableDependency.getNames()) {\n const variable = sceneGraph.lookupVariable(variableName, sceneObject);\n if (variable) {\n this._values.set(variable.state.name, variable.getValue());\n }\n }\n }\n\n public cloneAndRecordCurrentValuesForSceneObject(sceneObject: SceneObject) {\n const clone = new VariableValueRecorder();\n clone.recordCurrentDependencyValuesForSceneObject(sceneObject);\n return clone;\n }\n\n public clearValues() {\n this._values.clear();\n }\n\n public hasValues(): boolean {\n return !!this._values;\n }\n\n public recordCurrentValue(variable: SceneVariable) {\n this._values.set(variable.state.name, variable.getValue());\n }\n\n public hasRecordedValue(variable: SceneVariable): boolean {\n return this._values.has(variable.state.name);\n }\n\n public hasValueChanged(variable: SceneVariable): boolean {\n if (this._values.has(variable.state.name)) {\n const value = this._values.get(variable.state.name);\n if (!isVariableValueEqual(value, variable.getValue())) {\n return true;\n }\n }\n\n return false;\n }\n\n public hasDependenciesChanged(sceneObject: SceneObject): boolean {\n if (!this._values) {\n return false;\n }\n\n if (!sceneObject.variableDependency) {\n return false;\n }\n\n for (const variableName of sceneObject.variableDependency.getNames()) {\n const variable = sceneGraph.lookupVariable(variableName, sceneObject);\n if (!variable) {\n continue;\n }\n\n const name = variable.state.name;\n\n if (variable && this._values.has(name)) {\n const value = this._values.get(name);\n if (!isVariableValueEqual(value, variable.getValue())) {\n return true;\n }\n }\n }\n\n return false;\n }\n}\n"],"names":[],"mappings":";;;AAQO,MAAM,qBAAsB,CAAA;AAAA,EAA5B,WAAA,GAAA;AACL,IAAQ,IAAA,CAAA,OAAA,uBAAc,GAA8C,EAAA;AAAA;AAAA,EAE7D,4CAA4C,WAA0B,EAAA;AAC3E,IAAA,IAAA,CAAK,WAAY,EAAA;AAEjB,IAAI,IAAA,CAAC,YAAY,kBAAoB,EAAA;AACnC,MAAA;AAAA;AAGF,IAAA,KAAA,MAAW,YAAgB,IAAA,WAAA,CAAY,kBAAmB,CAAA,QAAA,EAAY,EAAA;AACpE,MAAA,MAAM,QAAW,GAAA,UAAA,CAAW,cAAe,CAAA,YAAA,EAAc,WAAW,CAAA;AACpE,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,IAAA,CAAK,QAAQ,GAAI,CAAA,QAAA,CAAS,MAAM,IAAM,EAAA,QAAA,CAAS,UAAU,CAAA;AAAA;AAC3D;AACF;AACF,EAEO,0CAA0C,WAA0B,EAAA;AACzE,IAAM,MAAA,KAAA,GAAQ,IAAI,qBAAsB,EAAA;AACxC,IAAA,KAAA,CAAM,4CAA4C,WAAW,CAAA;AAC7D,IAAO,OAAA,KAAA;AAAA;AACT,EAEO,WAAc,GAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,KAAM,EAAA;AAAA;AACrB,EAEO,SAAqB,GAAA;AAC1B,IAAO,OAAA,CAAC,CAAC,IAAK,CAAA,OAAA;AAAA;AAChB,EAEO,mBAAmB,QAAyB,EAAA;AACjD,IAAA,IAAA,CAAK,QAAQ,GAAI,CAAA,QAAA,CAAS,MAAM,IAAM,EAAA,QAAA,CAAS,UAAU,CAAA;AAAA;AAC3D,EAEO,iBAAiB,QAAkC,EAAA;AACxD,IAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,CAAS,MAAM,IAAI,CAAA;AAAA;AAC7C,EAEO,gBAAgB,QAAkC,EAAA;AACvD,IAAA,IAAI,KAAK,OAAQ,CAAA,GAAA,CAAI,QAAS,CAAA,KAAA,CAAM,IAAI,CAAG,EAAA;AACzC,MAAA,MAAM,QAAQ,IAAK,CAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,CAAS,MAAM,IAAI,CAAA;AAClD,MAAA,IAAI,CAAC,oBAAqB,CAAA,KAAA,EAAO,QAAS,CAAA,QAAA,EAAU,CAAG,EAAA;AACrD,QAAO,OAAA,IAAA;AAAA;AACT;AAGF,IAAO,OAAA,KAAA;AAAA;AACT,EAEO,uBAAuB,WAAmC,EAAA;AAC/D,IAAI,IAAA,CAAC,KAAK,OAAS,EAAA;AACjB,MAAO,OAAA,KAAA;AAAA;AAGT,IAAI,IAAA,CAAC,YAAY,kBAAoB,EAAA;AACnC,MAAO,OAAA,KAAA;AAAA;AAGT,IAAA,KAAA,MAAW,YAAgB,IAAA,WAAA,CAAY,kBAAmB,CAAA,QAAA,EAAY,EAAA;AACpE,MAAA,MAAM,QAAW,GAAA,UAAA,CAAW,cAAe,CAAA,YAAA,EAAc,WAAW,CAAA;AACpE,MAAA,IAAI,CAAC,QAAU,EAAA;AACb,QAAA;AAAA;AAGF,MAAM,MAAA,IAAA,GAAO,SAAS,KAAM,CAAA,IAAA;AAE5B,MAAA,IAAI,QAAY,IAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,IAAI,CAAG,EAAA;AACtC,QAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,oBAAqB,CAAA,KAAA,EAAO,QAAS,CAAA,QAAA,EAAU,CAAG,EAAA;AACrD,UAAO,OAAA,IAAA;AAAA;AACT;AACF;AAGF,IAAO,OAAA,KAAA;AAAA;AAEX;;;;"}
@@ -5,19 +5,20 @@ import { Button } from '@grafana/ui';
5
5
  function AdHocFilterBuilder({ model, addFilterButtonText }) {
6
6
  const { _wip } = model.useState();
7
7
  if (!_wip) {
8
- return /* @__PURE__ */ React.createElement(Button, {
9
- variant: "secondary",
10
- icon: "plus",
11
- title: "Add filter",
12
- "aria-label": "Add filter",
13
- "data-testid": `AdHocFilter-add`,
14
- onClick: () => model._addWip()
15
- }, addFilterButtonText);
8
+ return /* @__PURE__ */ React.createElement(
9
+ Button,
10
+ {
11
+ variant: "secondary",
12
+ icon: "plus",
13
+ title: "Add filter",
14
+ "aria-label": "Add filter",
15
+ "data-testid": `AdHocFilter-add`,
16
+ onClick: () => model._addWip()
17
+ },
18
+ addFilterButtonText
19
+ );
16
20
  }
17
- return /* @__PURE__ */ React.createElement(AdHocFilterRenderer, {
18
- filter: _wip,
19
- model
20
- });
21
+ return /* @__PURE__ */ React.createElement(AdHocFilterRenderer, { filter: _wip, model });
21
22
  }
22
23
 
23
24
  export { AdHocFilterBuilder };
@@ -1 +1 @@
1
- {"version":3,"file":"AdHocFilterBuilder.js","sources":["../../../../src/variables/adhoc/AdHocFilterBuilder.tsx"],"sourcesContent":["import React from 'react';\n\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { AdHocFiltersVariable } from './AdHocFiltersVariable';\nimport { Button } from '@grafana/ui';\n\ninterface Props {\n model: AdHocFiltersVariable;\n addFilterButtonText?: string;\n}\n\nexport function AdHocFilterBuilder({ model, addFilterButtonText }: Props) {\n const { _wip } = model.useState();\n\n if (!_wip) {\n return (\n <Button\n variant=\"secondary\"\n icon=\"plus\"\n title={'Add filter'}\n aria-label=\"Add filter\"\n data-testid={`AdHocFilter-add`}\n onClick={() => model._addWip()}\n >\n {addFilterButtonText}\n </Button>\n );\n }\n\n return <AdHocFilterRenderer filter={_wip} model={model} />;\n}\n"],"names":[],"mappings":";;;;AAWO,SAAS,kBAAmB,CAAA,EAAE,KAAO,EAAA,mBAAA,EAA8B,EAAA;AACxE,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AAEhC,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,uBACG,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,IAAK,EAAA,MAAA;AAAA,MACL,KAAO,EAAA,YAAA;AAAA,MACP,YAAW,EAAA,YAAA;AAAA,MACX,aAAa,EAAA,CAAA,eAAA,CAAA;AAAA,MACb,OAAA,EAAS,MAAM,KAAA,CAAM,OAAQ,EAAA;AAAA,KAAA,EAE5B,mBACH,CAAA,CAAA;AAAA,GAEJ;AAEA,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,mBAAA,EAAA;AAAA,IAAoB,MAAQ,EAAA,IAAA;AAAA,IAAM,KAAA;AAAA,GAAc,CAAA,CAAA;AAC1D;;;;"}
1
+ {"version":3,"file":"AdHocFilterBuilder.js","sources":["../../../../src/variables/adhoc/AdHocFilterBuilder.tsx"],"sourcesContent":["import React from 'react';\n\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { AdHocFiltersVariable } from './AdHocFiltersVariable';\nimport { Button } from '@grafana/ui';\n\ninterface Props {\n model: AdHocFiltersVariable;\n addFilterButtonText?: string;\n}\n\nexport function AdHocFilterBuilder({ model, addFilterButtonText }: Props) {\n const { _wip } = model.useState();\n\n if (!_wip) {\n return (\n <Button\n variant=\"secondary\"\n icon=\"plus\"\n title={'Add filter'}\n aria-label=\"Add filter\"\n data-testid={`AdHocFilter-add`}\n onClick={() => model._addWip()}\n >\n {addFilterButtonText}\n </Button>\n );\n }\n\n return <AdHocFilterRenderer filter={_wip} model={model} />;\n}\n"],"names":[],"mappings":";;;;AAWO,SAAS,kBAAmB,CAAA,EAAE,KAAO,EAAA,mBAAA,EAA8B,EAAA;AACxE,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,KAAA,CAAM,QAAS,EAAA;AAEhC,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,WAAA;AAAA,QACR,IAAK,EAAA,MAAA;AAAA,QACL,KAAO,EAAA,YAAA;AAAA,QACP,YAAW,EAAA,YAAA;AAAA,QACX,aAAa,EAAA,CAAA,eAAA,CAAA;AAAA,QACb,OAAA,EAAS,MAAM,KAAA,CAAM,OAAQ;AAAA,OAAA;AAAA,MAE5B;AAAA,KACH;AAAA;AAIJ,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,mBAAA,EAAA,EAAoB,MAAQ,EAAA,IAAA,EAAM,KAAc,EAAA,CAAA;AAC1D;;;;"}
@@ -1,28 +1,12 @@
1
1
  import React, { useState, useMemo } from 'react';
2
2
  import { isMultiValueOperator } from './AdHocFiltersVariable.js';
3
3
  import { useStyles2, Select, Field, Button } from '@grafana/ui';
4
- import { cx, css } from '@emotion/css';
4
+ import { css, cx } from '@emotion/css';
5
5
  import { ControlsLabel } from '../../utils/ControlsLabel.js';
6
6
  import { getAdhocOptionSearcher } from './getAdhocOptionSearcher.js';
7
7
  import { handleOptionGroups } from '../utils.js';
8
8
  import { OptionWithCheckbox } from '../components/VariableValueSelect.js';
9
9
 
10
- var __defProp = Object.defineProperty;
11
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
12
- var __hasOwnProp = Object.prototype.hasOwnProperty;
13
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
14
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
- var __spreadValues = (a, b) => {
16
- for (var prop in b || (b = {}))
17
- if (__hasOwnProp.call(b, prop))
18
- __defNormalProp(a, prop, b[prop]);
19
- if (__getOwnPropSymbols)
20
- for (var prop of __getOwnPropSymbols(b)) {
21
- if (__propIsEnum.call(b, prop))
22
- __defNormalProp(a, prop, b[prop]);
23
- }
24
- return a;
25
- };
26
10
  function keyLabelToOption(key, label) {
27
11
  return key !== "" ? {
28
12
  value: key,
@@ -103,146 +87,144 @@ function AdHocFilterRenderer({ filter, model }) {
103
87
  var _a2, _b2;
104
88
  model._updateFilter(filter, {
105
89
  value: (_b2 = (_a2 = uncommittedValue[0]) == null ? void 0 : _a2.value) != null ? _b2 : "",
90
+ // TODO remove expect-error when we're on the latest version of @grafana/data
106
91
  values: uncommittedValue.map((option) => option.value),
107
92
  valueLabels: uncommittedValue.map((option) => option.label)
108
93
  });
109
94
  }
110
95
  };
111
- const valueSelect = /* @__PURE__ */ React.createElement(Select, __spreadValues({
112
- virtualized: true,
113
- allowCustomValue: (_b = model.state.allowCustomValue) != null ? _b : true,
114
- isValidNewOption: (inputValue) => inputValue.trim().length > 0,
115
- allowCreateWhileLoading: true,
116
- formatCreateLabel: (inputValue) => `Use custom value: ${inputValue}`,
117
- disabled: model.state.readOnly,
118
- className: cx(styles.value, isValuesOpen ? styles.widthWhenOpen : void 0),
119
- width: "auto",
120
- value: valueValue,
121
- filterOption: filterNoOp,
122
- placeholder: "Select value",
123
- options: filteredValueOptions,
124
- inputValue: valueInputValue,
125
- onInputChange: onValueInputChange,
126
- onChange: (v) => {
127
- if (onAddCustomValue && v.__isNew__) {
128
- model._updateFilter(filter, onAddCustomValue(v, filter));
129
- } else {
96
+ const valueSelect = /* @__PURE__ */ React.createElement(
97
+ Select,
98
+ {
99
+ virtualized: true,
100
+ allowCustomValue: (_b = model.state.allowCustomValue) != null ? _b : true,
101
+ isValidNewOption: (inputValue) => inputValue.trim().length > 0,
102
+ allowCreateWhileLoading: true,
103
+ formatCreateLabel: (inputValue) => `Use custom value: ${inputValue}`,
104
+ disabled: model.state.readOnly,
105
+ className: cx(styles.value, isValuesOpen ? styles.widthWhenOpen : void 0),
106
+ width: "auto",
107
+ value: valueValue,
108
+ filterOption: filterNoOp,
109
+ placeholder: "Select value",
110
+ options: filteredValueOptions,
111
+ inputValue: valueInputValue,
112
+ onInputChange: onValueInputChange,
113
+ onChange: (v) => {
114
+ if (onAddCustomValue && v.__isNew__) {
115
+ model._updateFilter(filter, onAddCustomValue(v, filter));
116
+ } else {
117
+ model._updateFilter(filter, {
118
+ value: v.value,
119
+ valueLabels: v.label ? [v.label] : [v.value]
120
+ });
121
+ }
122
+ if (valueHasCustomValue !== v.__isNew__) {
123
+ setValueHasCustomValue(v.__isNew__);
124
+ }
125
+ },
126
+ isOpen: isValuesOpen && !isValuesLoading,
127
+ isLoading: isValuesLoading,
128
+ openMenuOnFocus: true,
129
+ onOpenMenu: async () => {
130
+ var _a2;
131
+ setIsValuesLoading(true);
132
+ setIsValuesOpen(true);
133
+ const values2 = await model._getValuesFor(filter);
134
+ setIsValuesLoading(false);
135
+ setValues(values2);
136
+ if (valueHasCustomValue) {
137
+ setValueInputValue((_a2 = valueValue == null ? void 0 : valueValue.label) != null ? _a2 : "");
138
+ }
139
+ },
140
+ onCloseMenu: () => {
141
+ setIsValuesOpen(false);
142
+ setValueInputValue("");
143
+ },
144
+ ...isMultiValue && multiValueProps
145
+ }
146
+ );
147
+ const keySelect = /* @__PURE__ */ React.createElement(
148
+ Select,
149
+ {
150
+ key: `${isValuesLoading ? "loading" : "loaded"}`,
151
+ disabled: model.state.readOnly,
152
+ className: cx(styles.key, isKeysOpen ? styles.widthWhenOpen : void 0),
153
+ width: "auto",
154
+ allowCustomValue: (_c = model.state.allowCustomValue) != null ? _c : true,
155
+ value: keyValue,
156
+ placeholder: "Select label",
157
+ options: handleOptionGroups(keys),
158
+ onChange: (v) => {
130
159
  model._updateFilter(filter, {
131
- value: v.value,
132
- valueLabels: v.label ? [v.label] : [v.value]
160
+ key: v.value,
161
+ keyLabel: v.label,
162
+ // clear value if key has changed
163
+ value: "",
164
+ valueLabels: [""],
165
+ values: void 0
133
166
  });
134
- }
135
- if (valueHasCustomValue !== v.__isNew__) {
136
- setValueHasCustomValue(v.__isNew__);
137
- }
138
- },
139
- isOpen: isValuesOpen && !isValuesLoading,
140
- isLoading: isValuesLoading,
141
- openMenuOnFocus: true,
142
- onOpenMenu: async () => {
143
- var _a2;
144
- setIsValuesLoading(true);
145
- setIsValuesOpen(true);
146
- const values2 = await model._getValuesFor(filter);
147
- setIsValuesLoading(false);
148
- setValues(values2);
149
- if (valueHasCustomValue) {
150
- setValueInputValue((_a2 = valueValue == null ? void 0 : valueValue.label) != null ? _a2 : "");
151
- }
152
- },
153
- onCloseMenu: () => {
154
- setIsValuesOpen(false);
155
- setValueInputValue("");
167
+ setUncommittedValue([]);
168
+ },
169
+ autoFocus: filter.key === "",
170
+ isOpen: isKeysOpen && !isKeysLoading,
171
+ isLoading: isKeysLoading,
172
+ onOpenMenu: async () => {
173
+ setIsKeysOpen(true);
174
+ setIsKeysLoading(true);
175
+ const keys2 = await model._getKeys(filter.key);
176
+ setIsKeysLoading(false);
177
+ setKeys(keys2);
178
+ },
179
+ onCloseMenu: () => {
180
+ setIsKeysOpen(false);
181
+ },
182
+ onBlur: () => {
183
+ if (filter.key === "") {
184
+ model._removeFilter(filter);
185
+ }
186
+ },
187
+ openMenuOnFocus: true
156
188
  }
157
- }, isMultiValue && multiValueProps));
158
- const keySelect = /* @__PURE__ */ React.createElement(Select, {
159
- key: `${isValuesLoading ? "loading" : "loaded"}`,
160
- disabled: model.state.readOnly,
161
- className: cx(styles.key, isKeysOpen ? styles.widthWhenOpen : void 0),
162
- width: "auto",
163
- allowCustomValue: (_c = model.state.allowCustomValue) != null ? _c : true,
164
- value: keyValue,
165
- placeholder: "Select label",
166
- options: handleOptionGroups(keys),
167
- onChange: (v) => {
168
- model._updateFilter(filter, {
169
- key: v.value,
170
- keyLabel: v.label,
171
- value: "",
172
- valueLabels: [""],
173
- values: void 0
174
- });
175
- setUncommittedValue([]);
176
- },
177
- autoFocus: filter.key === "",
178
- isOpen: isKeysOpen && !isKeysLoading,
179
- isLoading: isKeysLoading,
180
- onOpenMenu: async () => {
181
- setIsKeysOpen(true);
182
- setIsKeysLoading(true);
183
- const keys2 = await model._getKeys(filter.key);
184
- setIsKeysLoading(false);
185
- setKeys(keys2);
186
- },
187
- onCloseMenu: () => {
188
- setIsKeysOpen(false);
189
- },
190
- onBlur: () => {
191
- if (filter.key === "") {
192
- model._removeFilter(filter);
189
+ );
190
+ const operatorSelect = /* @__PURE__ */ React.createElement(
191
+ Select,
192
+ {
193
+ className: cx(styles.operator, {
194
+ [styles.widthWhenOpen]: isOperatorOpen
195
+ }),
196
+ value: filter.operator,
197
+ disabled: model.state.readOnly,
198
+ options: model._getOperators(),
199
+ onChange: onOperatorChange,
200
+ onOpenMenu: () => {
201
+ setIsOperatorOpen(true);
202
+ },
203
+ onCloseMenu: () => {
204
+ setIsOperatorOpen(false);
193
205
  }
194
- },
195
- openMenuOnFocus: true
196
- });
197
- const operatorSelect = /* @__PURE__ */ React.createElement(Select, {
198
- className: cx(styles.operator, {
199
- [styles.widthWhenOpen]: isOperatorOpen
200
- }),
201
- value: filter.operator,
202
- disabled: model.state.readOnly,
203
- options: model._getOperators(),
204
- onChange: onOperatorChange,
205
- onOpenMenu: () => {
206
- setIsOperatorOpen(true);
207
- },
208
- onCloseMenu: () => {
209
- setIsOperatorOpen(false);
210
206
  }
211
- });
207
+ );
212
208
  if (model.state.layout === "vertical") {
213
209
  if (filter.key) {
214
- const label = /* @__PURE__ */ React.createElement(ControlsLabel, {
215
- layout: "vertical",
216
- label: (_d = filter.key) != null ? _d : "",
217
- onRemove: () => model._removeFilter(filter)
218
- });
219
- return /* @__PURE__ */ React.createElement(Field, {
220
- label,
221
- "data-testid": `AdHocFilter-${filter.key}`,
222
- className: styles.field
223
- }, /* @__PURE__ */ React.createElement("div", {
224
- className: styles.wrapper
225
- }, operatorSelect, valueSelect));
210
+ const label = /* @__PURE__ */ React.createElement(ControlsLabel, { layout: "vertical", label: (_d = filter.key) != null ? _d : "", onRemove: () => model._removeFilter(filter) });
211
+ return /* @__PURE__ */ React.createElement(Field, { label, "data-testid": `AdHocFilter-${filter.key}`, className: styles.field }, /* @__PURE__ */ React.createElement("div", { className: styles.wrapper }, operatorSelect, valueSelect));
226
212
  } else {
227
- return /* @__PURE__ */ React.createElement(Field, {
228
- label: "Select label",
229
- "data-testid": `AdHocFilter-${filter.key}`,
230
- className: styles.field
231
- }, keySelect);
213
+ return /* @__PURE__ */ React.createElement(Field, { label: "Select label", "data-testid": `AdHocFilter-${filter.key}`, className: styles.field }, keySelect);
232
214
  }
233
215
  }
234
- return /* @__PURE__ */ React.createElement("div", {
235
- className: styles.wrapper,
236
- "data-testid": `AdHocFilter-${filter.key}`
237
- }, keySelect, operatorSelect, valueSelect, /* @__PURE__ */ React.createElement(Button, {
238
- variant: "secondary",
239
- "aria-label": "Remove filter",
240
- title: "Remove filter",
241
- className: styles.removeButton,
242
- icon: "times",
243
- "data-testid": `AdHocFilter-remove-${(_e = filter.key) != null ? _e : ""}`,
244
- onClick: () => model._removeFilter(filter)
245
- }));
216
+ return /* @__PURE__ */ React.createElement("div", { className: styles.wrapper, "data-testid": `AdHocFilter-${filter.key}` }, keySelect, operatorSelect, valueSelect, /* @__PURE__ */ React.createElement(
217
+ Button,
218
+ {
219
+ variant: "secondary",
220
+ "aria-label": "Remove filter",
221
+ title: "Remove filter",
222
+ className: styles.removeButton,
223
+ icon: "times",
224
+ "data-testid": `AdHocFilter-remove-${(_e = filter.key) != null ? _e : ""}`,
225
+ onClick: () => model._removeFilter(filter)
226
+ }
227
+ ));
246
228
  }
247
229
  const getStyles = (theme) => ({
248
230
  field: css({
@@ -252,6 +234,7 @@ const getStyles = (theme) => ({
252
234
  display: "flex",
253
235
  "> *": {
254
236
  "&:not(:first-child)": {
237
+ // Negative margin hides the double-border on adjacent selects
255
238
  marginLeft: -1
256
239
  },
257
240
  "&:first-child": {
@@ -265,8 +248,11 @@ const getStyles = (theme) => ({
265
248
  "&:not(:first-child):not(:last-child)": {
266
249
  borderRadius: 0
267
250
  },
251
+ // Fix focus state zIndex issues
268
252
  position: "relative",
269
253
  zIndex: 0,
254
+ // Adjacent borders are overlapping, so raise children up when hovering etc
255
+ // so all that child's borders are visible.
270
256
  "&:hover": {
271
257
  zIndex: 1
272
258
  },
@@ -299,6 +285,7 @@ const getStyles = (theme) => ({
299
285
  width: theme.spacing(3),
300
286
  marginRight: theme.spacing(1),
301
287
  boxSizing: "border-box",
288
+ // To not have button background and last select border intersect
302
289
  position: "relative",
303
290
  left: "1px"
304
291
  })