@grafana/scenes 3.13.4--canary.648.8346644660.0 → 4.0.0--canary.640.8344205533.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 (32) hide show
  1. package/dist/esm/components/VizPanel/VizPanelMenu.js +1 -3
  2. package/dist/esm/components/VizPanel/VizPanelMenu.js.map +1 -1
  3. package/dist/esm/components/layout/grid/SceneGridRow.js +1 -3
  4. package/dist/esm/components/layout/grid/SceneGridRow.js.map +1 -1
  5. package/dist/esm/core/sceneGraph/sceneGraph.js +16 -16
  6. package/dist/esm/core/sceneGraph/sceneGraph.js.map +1 -1
  7. package/dist/esm/core/types.js +4 -1
  8. package/dist/esm/core/types.js.map +1 -1
  9. package/dist/esm/index.js +2 -2
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/querying/SceneDataLayerSet.js +99 -0
  12. package/dist/esm/querying/SceneDataLayerSet.js.map +1 -0
  13. package/dist/esm/querying/SceneDataTransformer.js +3 -3
  14. package/dist/esm/querying/SceneDataTransformer.js.map +1 -1
  15. package/dist/esm/querying/SceneQueryRunner.js +15 -30
  16. package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
  17. package/dist/esm/querying/layers/SceneDataLayerBase.js +7 -18
  18. package/dist/esm/querying/layers/SceneDataLayerBase.js.map +1 -1
  19. package/dist/esm/querying/layers/SceneDataLayerControls.js +9 -46
  20. package/dist/esm/querying/layers/SceneDataLayerControls.js.map +1 -1
  21. package/dist/esm/querying/layers/annotations/AnnotationsDataLayer.js +23 -15
  22. package/dist/esm/querying/layers/annotations/AnnotationsDataLayer.js.map +1 -1
  23. package/dist/esm/querying/mergeMultipleDataLayers.js +23 -0
  24. package/dist/esm/querying/mergeMultipleDataLayers.js.map +1 -0
  25. package/dist/esm/variables/components/VariableValueSelect.js +0 -3
  26. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
  27. package/dist/index.d.ts +41 -29
  28. package/dist/index.js +305 -270
  29. package/dist/index.js.map +1 -1
  30. package/package.json +2 -2
  31. package/dist/esm/querying/SceneDataLayers.js +0 -21
  32. package/dist/esm/querying/SceneDataLayers.js.map +0 -1
package/dist/index.js CHANGED
@@ -13,8 +13,8 @@ var schema = require('@grafana/schema');
13
13
  var reactUse = require('react-use');
14
14
  var ui = require('@grafana/ui');
15
15
  var css = require('@emotion/css');
16
- var operators = require('rxjs/operators');
17
16
  var e2eSelectors = require('@grafana/e2e-selectors');
17
+ var operators = require('rxjs/operators');
18
18
  var ReactGridLayout = require('react-grid-layout');
19
19
  var AutoSizer = require('react-virtualized-auto-sizer');
20
20
  var BarChartPanelCfg_types_gen = require('@grafana/schema/dist/esm/raw/composable/barchart/panelcfg/x/BarChartPanelCfg_types.gen');
@@ -1357,21 +1357,14 @@ function formatValue(variable, value, formatNameOrFn) {
1357
1357
  return formatter.formatter(value, args, variable);
1358
1358
  }
1359
1359
 
1360
- class SceneDataLayers extends SceneObjectBase {
1361
- constructor(state) {
1362
- super(state);
1363
- this.addActivationHandler(() => this._onActivate());
1364
- }
1365
- _onActivate() {
1366
- const { layers } = this.state;
1367
- const deactivationHandlers = [];
1368
- for (const layer of layers) {
1369
- deactivationHandlers.push(layer.activate());
1370
- }
1371
- return () => {
1372
- deactivationHandlers.forEach((handler) => handler());
1373
- };
1374
- }
1360
+ function isSceneObject(obj) {
1361
+ return obj.useState !== void 0;
1362
+ }
1363
+ function isDataRequestEnricher(obj) {
1364
+ return "enrichDataRequest" in obj;
1365
+ }
1366
+ function isDataLayer(obj) {
1367
+ return "isDataLayer" in obj;
1375
1368
  }
1376
1369
 
1377
1370
  var __accessCheck = (obj, member, msg) => {
@@ -1506,25 +1499,25 @@ function findAllObjects(scene, check) {
1506
1499
  return found;
1507
1500
  }
1508
1501
  function getDataLayers(sceneObject, localOnly = false) {
1509
- let parent = sceneObject;
1502
+ let currentLevel = sceneObject;
1510
1503
  let collected = [];
1511
- let source;
1512
- while (parent) {
1513
- if (parent.state.$data && !(parent.state.$data instanceof SceneDataLayers)) {
1514
- if (parent.state.$data.state.$data instanceof SceneDataLayers) {
1515
- source = parent.state.$data.state.$data;
1516
- }
1517
- }
1518
- if (parent.state.$data && parent.state.$data instanceof SceneDataLayers) {
1519
- source = parent.state.$data;
1504
+ while (currentLevel) {
1505
+ const dataProvider = currentLevel.state.$data;
1506
+ if (!dataProvider) {
1507
+ currentLevel = currentLevel.parent;
1508
+ continue;
1520
1509
  }
1521
- if (source) {
1522
- collected = collected.concat(source.state.layers);
1523
- if (localOnly) {
1524
- break;
1510
+ if (isDataLayer(dataProvider)) {
1511
+ collected = collected.concat(dataProvider);
1512
+ } else {
1513
+ if (dataProvider.state.$data && isDataLayer(dataProvider.state.$data)) {
1514
+ collected = collected.concat(dataProvider.state.$data);
1525
1515
  }
1526
1516
  }
1527
- parent = parent.parent;
1517
+ if (localOnly && collected.length > 0) {
1518
+ break;
1519
+ }
1520
+ currentLevel = currentLevel.parent;
1528
1521
  }
1529
1522
  return collected;
1530
1523
  }
@@ -2047,13 +2040,6 @@ function isGroupByVariable(variable) {
2047
2040
  return variable.state.type === "groupby";
2048
2041
  }
2049
2042
 
2050
- function isSceneObject(obj) {
2051
- return obj.useState !== void 0;
2052
- }
2053
- function isDataRequestEnricher(obj) {
2054
- return "enrichDataRequest" in obj;
2055
- }
2056
-
2057
2043
  const sceneGraph = {
2058
2044
  getVariables,
2059
2045
  getData,
@@ -3242,6 +3228,7 @@ class SceneDataLayerBase extends SceneObjectBase {
3242
3228
  isEnabled: true
3243
3229
  }, initialState));
3244
3230
  this._results = new rxjs.ReplaySubject();
3231
+ this.isDataLayer = true;
3245
3232
  this._variableValueRecorder = new VariableValueRecorder();
3246
3233
  this._variableDependency = new VariableDependencyConfig(this, {
3247
3234
  onVariableUpdateCompleted: this.onVariableUpdateCompleted.bind(this)
@@ -3261,14 +3248,8 @@ class SceneDataLayerBase extends SceneObjectBase {
3261
3248
  this.querySub.unsubscribe();
3262
3249
  this.querySub = void 0;
3263
3250
  this.onDisable();
3264
- this._results.next({
3265
- origin: this,
3266
- data: emptyPanelData,
3267
- topic: this.topic
3268
- });
3269
- this.setStateHelper({
3270
- data: emptyPanelData
3271
- });
3251
+ this._results.next({ origin: this, data: emptyPanelData });
3252
+ this.setStateHelper({ data: emptyPanelData });
3272
3253
  }
3273
3254
  if (n.isEnabled && !p.isEnabled) {
3274
3255
  this.onEnable();
@@ -3294,19 +3275,13 @@ class SceneDataLayerBase extends SceneObjectBase {
3294
3275
  if (this.querySub) {
3295
3276
  this.querySub.unsubscribe();
3296
3277
  this.querySub = void 0;
3297
- this.publishResults(emptyPanelData, this.topic);
3278
+ this.publishResults(emptyPanelData);
3298
3279
  }
3299
3280
  }
3300
- publishResults(data, topic) {
3281
+ publishResults(data) {
3301
3282
  if (this.state.isEnabled) {
3302
- this._results.next({
3303
- origin: this,
3304
- data,
3305
- topic
3306
- });
3307
- this.setStateHelper({
3308
- data
3309
- });
3283
+ this._results.next({ origin: this, data });
3284
+ this.setStateHelper({ data });
3310
3285
  }
3311
3286
  }
3312
3287
  getResultsStream() {
@@ -3333,6 +3308,156 @@ class SceneDataLayerBase extends SceneObjectBase {
3333
3308
  }
3334
3309
  }
3335
3310
 
3311
+ function LoadingIndicator(props) {
3312
+ return /* @__PURE__ */ React__default["default"].createElement(ui.Tooltip, {
3313
+ content: "Cancel query"
3314
+ }, /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
3315
+ className: "spin-clockwise",
3316
+ name: "sync",
3317
+ size: "xs",
3318
+ role: "button",
3319
+ onMouseDown: (e) => {
3320
+ props.onCancel(e);
3321
+ }
3322
+ }));
3323
+ }
3324
+
3325
+ function ControlsLabel(props) {
3326
+ const styles = ui.useStyles2(getStyles$9);
3327
+ const theme = ui.useTheme2();
3328
+ const isVertical = props.layout === "vertical";
3329
+ const loadingIndicator = Boolean(props.isLoading) ? /* @__PURE__ */ React__default["default"].createElement("div", {
3330
+ style: { marginLeft: theme.spacing(1), marginTop: "-1px" },
3331
+ "aria-label": e2eSelectors.selectors.components.LoadingIndicator.icon
3332
+ }, /* @__PURE__ */ React__default["default"].createElement(LoadingIndicator, {
3333
+ onCancel: (e) => {
3334
+ var _a;
3335
+ e.preventDefault();
3336
+ e.stopPropagation();
3337
+ (_a = props.onCancel) == null ? void 0 : _a.call(props);
3338
+ }
3339
+ })) : null;
3340
+ let errorIndicator = null;
3341
+ if (props.error) {
3342
+ errorIndicator = /* @__PURE__ */ React__default["default"].createElement(ui.Tooltip, {
3343
+ content: props.error,
3344
+ placement: "bottom"
3345
+ }, /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
3346
+ className: styles.errorIcon,
3347
+ name: "exclamation-triangle"
3348
+ }));
3349
+ }
3350
+ const testId = typeof props.label === "string" ? e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemLabels(props.label) : "";
3351
+ let labelElement;
3352
+ if (isVertical) {
3353
+ labelElement = /* @__PURE__ */ React__default["default"].createElement("label", {
3354
+ className: styles.verticalLabel,
3355
+ "data-testid": testId,
3356
+ htmlFor: props.htmlFor
3357
+ }, props.label, errorIndicator, props.icon && /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
3358
+ name: props.icon,
3359
+ className: styles.normalIcon
3360
+ }), loadingIndicator, props.onRemove && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
3361
+ variant: "secondary",
3362
+ size: "xs",
3363
+ name: "times",
3364
+ onClick: props.onRemove,
3365
+ tooltip: "Remove"
3366
+ }));
3367
+ } else {
3368
+ labelElement = /* @__PURE__ */ React__default["default"].createElement("label", {
3369
+ className: styles.horizontalLabel,
3370
+ "data-testid": testId,
3371
+ htmlFor: props.htmlFor
3372
+ }, errorIndicator, props.icon && /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
3373
+ name: props.icon,
3374
+ className: styles.normalIcon
3375
+ }), props.label, loadingIndicator);
3376
+ }
3377
+ if (props.description) {
3378
+ return /* @__PURE__ */ React__default["default"].createElement(ui.Tooltip, {
3379
+ content: props.description,
3380
+ placement: isVertical ? "top" : "bottom"
3381
+ }, labelElement);
3382
+ }
3383
+ return labelElement;
3384
+ }
3385
+ const getStyles$9 = (theme) => ({
3386
+ horizontalLabel: css.css({
3387
+ background: theme.isDark ? theme.colors.background.primary : theme.colors.background.secondary,
3388
+ display: `flex`,
3389
+ alignItems: "center",
3390
+ padding: theme.spacing(0, 1),
3391
+ fontWeight: theme.typography.fontWeightMedium,
3392
+ fontSize: theme.typography.bodySmall.fontSize,
3393
+ height: theme.spacing(theme.components.height.md),
3394
+ lineHeight: theme.spacing(theme.components.height.md),
3395
+ borderRadius: theme.shape.borderRadius(1),
3396
+ border: `1px solid ${theme.components.input.borderColor}`,
3397
+ position: "relative",
3398
+ right: -1,
3399
+ whiteSpace: "nowrap",
3400
+ gap: theme.spacing(0.5)
3401
+ }),
3402
+ verticalLabel: css.css({
3403
+ display: `flex`,
3404
+ alignItems: "center",
3405
+ fontWeight: theme.typography.fontWeightMedium,
3406
+ fontSize: theme.typography.bodySmall.fontSize,
3407
+ lineHeight: theme.typography.bodySmall.lineHeight,
3408
+ whiteSpace: "nowrap",
3409
+ marginBottom: theme.spacing(0.5),
3410
+ gap: theme.spacing(1)
3411
+ }),
3412
+ errorIcon: css.css({
3413
+ color: theme.colors.error.text
3414
+ }),
3415
+ normalIcon: css.css({
3416
+ color: theme.colors.text.secondary
3417
+ })
3418
+ });
3419
+
3420
+ class SceneDataLayerControls extends SceneObjectBase {
3421
+ constructor() {
3422
+ super({});
3423
+ }
3424
+ }
3425
+ SceneDataLayerControls.Component = SceneDataLayerControlsRenderer;
3426
+ function SceneDataLayerControlsRenderer({ model }) {
3427
+ const layers = sceneGraph.getDataLayers(model, true);
3428
+ if (layers.length === 0) {
3429
+ return null;
3430
+ }
3431
+ return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, layers.map((layer) => /* @__PURE__ */ React__default["default"].createElement(layer.Component, {
3432
+ model: layer,
3433
+ key: layer.state.key
3434
+ })));
3435
+ }
3436
+ function DataLayerControlSwitch({ layer }) {
3437
+ var _a, _b;
3438
+ const elementId = `data-layer-${layer.state.key}`;
3439
+ const { data, isEnabled } = layer.useState();
3440
+ const showLoading = Boolean(data && data.state === schema.LoadingState.Loading);
3441
+ return /* @__PURE__ */ React__default["default"].createElement("div", {
3442
+ className: containerStyle$1
3443
+ }, /* @__PURE__ */ React__default["default"].createElement(ControlsLabel, {
3444
+ htmlFor: elementId,
3445
+ isLoading: showLoading,
3446
+ onCancel: () => {
3447
+ var _a2;
3448
+ return (_a2 = layer.cancelQuery) == null ? void 0 : _a2.call(layer);
3449
+ },
3450
+ label: layer.state.name,
3451
+ description: layer.state.description,
3452
+ error: (_b = (_a = layer.state.data) == null ? void 0 : _a.errors) == null ? void 0 : _b[0].message
3453
+ }), /* @__PURE__ */ React__default["default"].createElement(ui.InlineSwitch, {
3454
+ id: elementId,
3455
+ value: isEnabled,
3456
+ onChange: () => layer.setState({ isEnabled: !isEnabled })
3457
+ }));
3458
+ }
3459
+ const containerStyle$1 = css.css({ display: "flex" });
3460
+
3336
3461
  var __defProp$w = Object.defineProperty;
3337
3462
  var __defProps$k = Object.defineProperties;
3338
3463
  var __getOwnPropDescs$k = Object.getOwnPropertyDescriptors;
@@ -3752,7 +3877,6 @@ class AnnotationsDataLayer extends SceneDataLayerBase {
3752
3877
  ["query"]
3753
3878
  );
3754
3879
  this._scopedVars = { __sceneObject: { value: this, text: "__sceneObject" } };
3755
- this.topic = data.DataTopic.Annotations;
3756
3880
  }
3757
3881
  onEnable() {
3758
3882
  const timeRange = sceneGraph.getTimeRange(this);
@@ -3792,20 +3916,17 @@ class AnnotationsDataLayer extends SceneDataLayerBase {
3792
3916
  })
3793
3917
  );
3794
3918
  this.querySub = stream.subscribe((stateUpdate) => {
3795
- this.publishResults(stateUpdate, data.DataTopic.Annotations);
3919
+ this.publishResults(stateUpdate);
3796
3920
  });
3797
3921
  } catch (e) {
3798
- this.publishResults(
3799
- __spreadProps$i(__spreadValues$t({}, emptyPanelData), {
3800
- state: schema.LoadingState.Error,
3801
- errors: [
3802
- {
3803
- message: getMessageFromError(e)
3804
- }
3805
- ]
3806
- }),
3807
- data.DataTopic.Annotations
3808
- );
3922
+ this.publishResults(__spreadProps$i(__spreadValues$t({}, emptyPanelData), {
3923
+ state: schema.LoadingState.Error,
3924
+ errors: [
3925
+ {
3926
+ message: getMessageFromError(e)
3927
+ }
3928
+ ]
3929
+ }));
3809
3930
  console.error("AnnotationsDataLayer error", e);
3810
3931
  }
3811
3932
  }
@@ -3820,10 +3941,20 @@ class AnnotationsDataLayer extends SceneDataLayerBase {
3820
3941
  df.meta = __spreadProps$i(__spreadValues$t({}, df.meta), {
3821
3942
  dataTopic: data.DataTopic.Annotations
3822
3943
  });
3823
- stateUpdate.annotations = [df];
3944
+ stateUpdate.series = [df];
3824
3945
  return stateUpdate;
3825
3946
  }
3826
3947
  }
3948
+ AnnotationsDataLayer.Component = AnnotationsDataLayerRenderer;
3949
+ function AnnotationsDataLayerRenderer({ model }) {
3950
+ const { isHidden } = model.useState();
3951
+ if (isHidden) {
3952
+ return null;
3953
+ }
3954
+ return /* @__PURE__ */ React__default["default"].createElement(DataLayerControlSwitch, {
3955
+ layer: model
3956
+ });
3957
+ }
3827
3958
 
3828
3959
  var index = /*#__PURE__*/Object.freeze({
3829
3960
  __proto__: null,
@@ -4040,7 +4171,7 @@ class SceneTimeRangeCompare extends SceneObjectBase {
4040
4171
  SceneTimeRangeCompare.Component = SceneTimeRangeCompareRenderer;
4041
4172
  function SceneTimeRangeCompareRenderer({ model }) {
4042
4173
  var _a;
4043
- const styles = ui.useStyles2(getStyles$9);
4174
+ const styles = ui.useStyles2(getStyles$8);
4044
4175
  const { compareWith, compareOptions } = model.useState();
4045
4176
  const [previousCompare, setPreviousCompare] = React__default["default"].useState(compareWith);
4046
4177
  const previousValue = (_a = compareOptions.find(({ value: value2 }) => value2 === previousCompare)) != null ? _a : PREVIOUS_PERIOD_COMPARE_OPTION;
@@ -4080,7 +4211,7 @@ function SceneTimeRangeCompareRenderer({ model }) {
4080
4211
  isOpen: false
4081
4212
  }, previousValue.label));
4082
4213
  }
4083
- function getStyles$9(theme) {
4214
+ function getStyles$8(theme) {
4084
4215
  return {
4085
4216
  previewButton: css.css({
4086
4217
  "&:disabled": {
@@ -4539,7 +4670,6 @@ function VariableValueSelect({ model }) {
4539
4670
  tabSelectsValue: false,
4540
4671
  onInputChange,
4541
4672
  options: model.getOptionsForSelect(),
4542
- "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`),
4543
4673
  onChange: (newValue) => {
4544
4674
  model.changeValueTo(newValue.value, newValue.label);
4545
4675
  }
@@ -4576,7 +4706,6 @@ function VariableValueSelectMulti({ model }) {
4576
4706
  onBlur: () => {
4577
4707
  model.changeValueTo(uncommittedValue);
4578
4708
  },
4579
- "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`),
4580
4709
  onChange: (newValue, action) => {
4581
4710
  if (action.action === "clear" && noValueOnClear) {
4582
4711
  model.changeValueTo([]);
@@ -4737,115 +4866,6 @@ function GroupByVariableRenderer({ model }) {
4737
4866
  return renderSelectForVariable(model);
4738
4867
  }
4739
4868
 
4740
- function LoadingIndicator(props) {
4741
- return /* @__PURE__ */ React__default["default"].createElement(ui.Tooltip, {
4742
- content: "Cancel query"
4743
- }, /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
4744
- className: "spin-clockwise",
4745
- name: "sync",
4746
- size: "xs",
4747
- role: "button",
4748
- onMouseDown: (e) => {
4749
- props.onCancel(e);
4750
- }
4751
- }));
4752
- }
4753
-
4754
- function ControlsLabel(props) {
4755
- const styles = ui.useStyles2(getStyles$8);
4756
- const theme = ui.useTheme2();
4757
- const isVertical = props.layout === "vertical";
4758
- const loadingIndicator = Boolean(props.isLoading) ? /* @__PURE__ */ React__default["default"].createElement("div", {
4759
- style: { marginLeft: theme.spacing(1), marginTop: "-1px" },
4760
- "aria-label": e2eSelectors.selectors.components.LoadingIndicator.icon
4761
- }, /* @__PURE__ */ React__default["default"].createElement(LoadingIndicator, {
4762
- onCancel: (e) => {
4763
- var _a;
4764
- e.preventDefault();
4765
- e.stopPropagation();
4766
- (_a = props.onCancel) == null ? void 0 : _a.call(props);
4767
- }
4768
- })) : null;
4769
- let errorIndicator = null;
4770
- if (props.error) {
4771
- errorIndicator = /* @__PURE__ */ React__default["default"].createElement(ui.Tooltip, {
4772
- content: props.error,
4773
- placement: "bottom"
4774
- }, /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
4775
- className: styles.errorIcon,
4776
- name: "exclamation-triangle"
4777
- }));
4778
- }
4779
- const testId = typeof props.label === "string" ? e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemLabels(props.label) : "";
4780
- let labelElement;
4781
- if (isVertical) {
4782
- labelElement = /* @__PURE__ */ React__default["default"].createElement("label", {
4783
- className: styles.verticalLabel,
4784
- "data-testid": testId,
4785
- htmlFor: props.htmlFor
4786
- }, props.label, errorIndicator, props.icon && /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
4787
- name: props.icon,
4788
- className: styles.normalIcon
4789
- }), loadingIndicator, props.onRemove && /* @__PURE__ */ React__default["default"].createElement(ui.IconButton, {
4790
- variant: "secondary",
4791
- size: "xs",
4792
- name: "times",
4793
- onClick: props.onRemove,
4794
- tooltip: "Remove"
4795
- }));
4796
- } else {
4797
- labelElement = /* @__PURE__ */ React__default["default"].createElement("label", {
4798
- className: styles.horizontalLabel,
4799
- "data-testid": testId,
4800
- htmlFor: props.htmlFor
4801
- }, errorIndicator, props.icon && /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
4802
- name: props.icon,
4803
- className: styles.normalIcon
4804
- }), props.label, loadingIndicator);
4805
- }
4806
- if (props.description) {
4807
- return /* @__PURE__ */ React__default["default"].createElement(ui.Tooltip, {
4808
- content: props.description,
4809
- placement: isVertical ? "top" : "bottom"
4810
- }, labelElement);
4811
- }
4812
- return labelElement;
4813
- }
4814
- const getStyles$8 = (theme) => ({
4815
- horizontalLabel: css.css({
4816
- background: theme.isDark ? theme.colors.background.primary : theme.colors.background.secondary,
4817
- display: `flex`,
4818
- alignItems: "center",
4819
- padding: theme.spacing(0, 1),
4820
- fontWeight: theme.typography.fontWeightMedium,
4821
- fontSize: theme.typography.bodySmall.fontSize,
4822
- height: theme.spacing(theme.components.height.md),
4823
- lineHeight: theme.spacing(theme.components.height.md),
4824
- borderRadius: theme.shape.borderRadius(1),
4825
- border: `1px solid ${theme.components.input.borderColor}`,
4826
- position: "relative",
4827
- right: -1,
4828
- whiteSpace: "nowrap",
4829
- gap: theme.spacing(0.5)
4830
- }),
4831
- verticalLabel: css.css({
4832
- display: `flex`,
4833
- alignItems: "center",
4834
- fontWeight: theme.typography.fontWeightMedium,
4835
- fontSize: theme.typography.bodySmall.fontSize,
4836
- lineHeight: theme.typography.bodySmall.lineHeight,
4837
- whiteSpace: "nowrap",
4838
- marginBottom: theme.spacing(0.5),
4839
- gap: theme.spacing(1)
4840
- }),
4841
- errorIcon: css.css({
4842
- color: theme.colors.error.text
4843
- }),
4844
- normalIcon: css.css({
4845
- color: theme.colors.text.secondary
4846
- })
4847
- });
4848
-
4849
4869
  var __defProp$n = Object.defineProperty;
4850
4870
  var __defProps$d = Object.defineProperties;
4851
4871
  var __getOwnPropDescs$d = Object.getOwnPropertyDescriptors;
@@ -5295,6 +5315,25 @@ function toSelectableValue({ text, value }) {
5295
5315
  };
5296
5316
  }
5297
5317
 
5318
+ function mergeMultipleDataLayers(layers) {
5319
+ const resultStreams = layers.map((l) => l.getResultsStream());
5320
+ const resultsMap = /* @__PURE__ */ new Map();
5321
+ const deactivationHandlers = [];
5322
+ for (const layer of layers) {
5323
+ deactivationHandlers.push(layer.activate());
5324
+ }
5325
+ return rxjs.merge(resultStreams).pipe(
5326
+ rxjs.mergeAll(),
5327
+ rxjs.map((v) => {
5328
+ resultsMap.set(v.origin.state.key, v);
5329
+ return resultsMap.values();
5330
+ }),
5331
+ rxjs.finalize(() => {
5332
+ deactivationHandlers.forEach((handler) => handler());
5333
+ })
5334
+ );
5335
+ }
5336
+
5298
5337
  var __defProp$l = Object.defineProperty;
5299
5338
  var __defProps$b = Object.defineProperties;
5300
5339
  var __getOwnPropDescs$b = Object.getOwnPropertyDescriptors;
@@ -5431,44 +5470,28 @@ class SceneQueryRunner extends SceneObjectBase {
5431
5470
  }
5432
5471
  _handleDataLayers() {
5433
5472
  const dataLayers = sceneGraph.getDataLayers(this);
5434
- const observables = [];
5435
- const resultsMap = /* @__PURE__ */ new Map();
5436
- if (dataLayers.length > 0) {
5437
- dataLayers.forEach((layer) => {
5438
- observables.push(layer.getResultsStream());
5439
- });
5440
- this._dataLayersSub = rxjs.merge(observables).pipe(
5441
- rxjs.mergeAll(),
5442
- rxjs.map((v) => {
5443
- resultsMap.set(v.origin.state.key, v.data);
5444
- return resultsMap;
5445
- })
5446
- ).subscribe((result) => {
5447
- this._onLayersReceived(result);
5448
- });
5473
+ if (dataLayers.length === 0) {
5474
+ return;
5449
5475
  }
5476
+ this._dataLayersSub = mergeMultipleDataLayers(dataLayers).subscribe(this._onLayersReceived.bind(this));
5450
5477
  }
5451
5478
  _onLayersReceived(results) {
5452
- var _a, _b;
5479
+ var _a, _b, _c, _d;
5453
5480
  const timeRange = sceneGraph.getTimeRange(this);
5454
- const dataLayers = sceneGraph.getDataLayers(this);
5455
5481
  const { dataLayerFilter } = this.state;
5456
5482
  let annotations = [];
5457
5483
  let alertStates = [];
5458
5484
  let alertState;
5459
- const layerKeys = Array.from(results.keys());
5460
- Array.from(results.values()).forEach((result, i) => {
5461
- const layerKey = layerKeys[i];
5462
- const layer = dataLayers.find((l) => l.state.key === layerKey);
5463
- if (layer) {
5464
- if (layer.topic === data.DataTopic.Annotations && result[data.DataTopic.Annotations]) {
5465
- annotations = annotations.concat(result[data.DataTopic.Annotations]);
5485
+ for (const result of results) {
5486
+ for (let frame of result.data.series) {
5487
+ if (((_a = frame.meta) == null ? void 0 : _a.dataTopic) === data.DataTopic.Annotations) {
5488
+ annotations = annotations.concat(frame);
5466
5489
  }
5467
- if (layer.topic === "alertStates") {
5468
- alertStates = alertStates.concat(result.series);
5490
+ if (((_b = frame.meta) == null ? void 0 : _b.dataTopic) === data.DataTopic.AlertStates) {
5491
+ alertStates = alertStates.concat(frame);
5469
5492
  }
5470
5493
  }
5471
- });
5494
+ }
5472
5495
  if (dataLayerFilter == null ? void 0 : dataLayerFilter.panelId) {
5473
5496
  if (annotations.length > 0) {
5474
5497
  annotations = filterAnnotations(annotations, dataLayerFilter);
@@ -5489,8 +5512,8 @@ class SceneQueryRunner extends SceneObjectBase {
5489
5512
  this._layerAnnotations = annotations;
5490
5513
  this.setState({
5491
5514
  data: __spreadProps$b(__spreadValues$l({}, baseStateUpdate), {
5492
- annotations: [...(_a = this._resultAnnotations) != null ? _a : [], ...annotations],
5493
- alertState: alertState != null ? alertState : (_b = this.state.data) == null ? void 0 : _b.alertState
5515
+ annotations: [...(_c = this._resultAnnotations) != null ? _c : [], ...annotations],
5516
+ alertState: alertState != null ? alertState : (_d = this.state.data) == null ? void 0 : _d.alertState
5494
5517
  })
5495
5518
  });
5496
5519
  }
@@ -5718,64 +5741,76 @@ var __spreadValues$k = (a, b) => {
5718
5741
  return a;
5719
5742
  };
5720
5743
  var __spreadProps$a = (a, b) => __defProps$a(a, __getOwnPropDescs$a(b));
5721
- class SceneDataLayerControls extends SceneObjectBase {
5744
+ class SceneDataLayerSetBase extends SceneObjectBase {
5722
5745
  constructor() {
5723
- super({ layersMap: {} });
5724
- this.addActivationHandler(() => this._onActivate());
5746
+ super(...arguments);
5747
+ this.isDataLayer = true;
5748
+ this._results = new rxjs.ReplaySubject();
5725
5749
  }
5726
- _onActivate() {
5727
- const layers = sceneGraph.getDataLayers(this, true);
5728
- this.setState({ layersMap: layers.reduce((acc, l) => __spreadProps$a(__spreadValues$k({}, acc), { [l.state.key]: l.state.isEnabled }), {}) });
5750
+ subscribeToAllLayers(layers) {
5751
+ if (layers.length > 0) {
5752
+ this.querySub = mergeMultipleDataLayers(layers).subscribe(this._onLayerUpdateReceived.bind(this));
5753
+ } else {
5754
+ this._results.next({ origin: this, data: emptyPanelData });
5755
+ this.setStateHelper({ data: emptyPanelData });
5756
+ }
5729
5757
  }
5730
- toggleLayer(l) {
5731
- this.setState({ layersMap: __spreadProps$a(__spreadValues$k({}, this.state.layersMap), { [l.state.key]: !l.state.isEnabled }) });
5732
- l.setState({ isEnabled: !l.state.isEnabled });
5758
+ _onLayerUpdateReceived(results) {
5759
+ var _a;
5760
+ let series = [];
5761
+ for (const result of results) {
5762
+ if ((_a = result.data) == null ? void 0 : _a.series) {
5763
+ series = series.concat(result.data.series);
5764
+ }
5765
+ }
5766
+ const combinedData = __spreadProps$a(__spreadValues$k({}, emptyPanelData), { series });
5767
+ this._results.next({ origin: this, data: combinedData });
5768
+ this.setStateHelper({ data: combinedData });
5733
5769
  }
5734
- }
5735
- SceneDataLayerControls.Component = SceneDataLayerControlsRenderer;
5736
- function SceneDataLayerControlsRenderer({ model }) {
5737
- const { layersMap } = model.useState();
5738
- const layers = sceneGraph.getDataLayers(model, true);
5739
- if (layers.length === 0) {
5740
- return null;
5770
+ getResultsStream() {
5771
+ return this._results;
5772
+ }
5773
+ cancelQuery() {
5774
+ var _a;
5775
+ (_a = this.querySub) == null ? void 0 : _a.unsubscribe();
5776
+ }
5777
+ setStateHelper(state) {
5778
+ setBaseClassState(this, state);
5741
5779
  }
5742
- return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, layers.map((l) => {
5743
- const elementId = `data-layer-${l.state.key}`;
5744
- if (l.state.isHidden) {
5745
- return null;
5746
- }
5747
- return /* @__PURE__ */ React__default["default"].createElement(SceneDataLayerControl, {
5748
- key: elementId,
5749
- layer: l,
5750
- onToggleLayer: () => model.toggleLayer(l),
5751
- isEnabled: layersMap[l.state.key]
5752
- });
5753
- }));
5754
5780
  }
5755
- function SceneDataLayerControl({ layer, isEnabled, onToggleLayer }) {
5756
- var _a, _b;
5757
- const elementId = `data-layer-${layer.state.key}`;
5758
- const { data } = layer.useState();
5759
- const showLoading = Boolean(data && data.state === schema.LoadingState.Loading);
5760
- return /* @__PURE__ */ React__default["default"].createElement("div", {
5761
- className: containerStyle$1
5762
- }, /* @__PURE__ */ React__default["default"].createElement(ControlsLabel, {
5763
- htmlFor: elementId,
5764
- isLoading: showLoading,
5765
- onCancel: () => {
5766
- var _a2;
5767
- return (_a2 = layer.cancelQuery) == null ? void 0 : _a2.call(layer);
5768
- },
5769
- label: layer.state.name,
5770
- description: layer.state.description,
5771
- error: (_b = (_a = layer.state.data) == null ? void 0 : _a.errors) == null ? void 0 : _b[0].message
5772
- }), /* @__PURE__ */ React__default["default"].createElement(ui.InlineSwitch, {
5773
- id: elementId,
5774
- value: isEnabled,
5775
- onChange: onToggleLayer
5776
- }));
5781
+ class SceneDataLayerSet extends SceneDataLayerSetBase {
5782
+ constructor(state) {
5783
+ var _a, _b;
5784
+ super({
5785
+ name: (_a = state.name) != null ? _a : "Data layers",
5786
+ layers: (_b = state.layers) != null ? _b : []
5787
+ });
5788
+ this.addActivationHandler(() => this._onActivate());
5789
+ }
5790
+ _onActivate() {
5791
+ this._subs.add(
5792
+ this.subscribeToState((newState, oldState) => {
5793
+ var _a;
5794
+ if (newState.layers !== oldState.layers) {
5795
+ (_a = this.querySub) == null ? void 0 : _a.unsubscribe();
5796
+ this.subscribeToAllLayers(newState.layers);
5797
+ }
5798
+ })
5799
+ );
5800
+ this.subscribeToAllLayers(this.state.layers);
5801
+ return () => {
5802
+ var _a;
5803
+ (_a = this.querySub) == null ? void 0 : _a.unsubscribe();
5804
+ };
5805
+ }
5777
5806
  }
5778
- const containerStyle$1 = css.css({ display: "flex" });
5807
+ SceneDataLayerSet.Component = ({ model }) => {
5808
+ const { layers } = model.useState();
5809
+ return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, layers.map((layer) => /* @__PURE__ */ React__default["default"].createElement(layer.Component, {
5810
+ model: layer,
5811
+ key: layer.state.key
5812
+ })));
5813
+ };
5779
5814
 
5780
5815
  var __defProp$j = Object.defineProperty;
5781
5816
  var __defProps$9 = Object.defineProperties;
@@ -5823,8 +5858,8 @@ class SceneDataTransformer extends SceneObjectBase {
5823
5858
  }
5824
5859
  getSourceData() {
5825
5860
  if (this.state.$data) {
5826
- if (this.state.$data instanceof SceneDataLayers) {
5827
- throw new Error("SceneDataLayers can not be used as data provider for SceneDataTransformer.");
5861
+ if (this.state.$data instanceof SceneDataLayerSet) {
5862
+ throw new Error("SceneDataLayerSet can not be used as data provider for SceneDataTransformer.");
5828
5863
  }
5829
5864
  return this.state.$data;
5830
5865
  }
@@ -7420,8 +7455,7 @@ function VizPanelMenuRenderer({ model }) {
7420
7455
  childItems: item.subMenu ? renderItems(item.subMenu) : void 0,
7421
7456
  url: item.href,
7422
7457
  onClick: item.onClick,
7423
- shortcut: item.shortcut,
7424
- testId: e2eSelectors.selectors.components.Panels.Panel.menuItems(item.text)
7458
+ shortcut: item.shortcut
7425
7459
  })
7426
7460
  );
7427
7461
  };
@@ -8011,8 +8045,7 @@ function SceneGridRowRenderer({ model }) {
8011
8045
  }, /* @__PURE__ */ React__default["default"].createElement("button", {
8012
8046
  onClick: model.onCollapseToggle,
8013
8047
  className: styles.rowTitleButton,
8014
- "aria-label": isCollapsed ? "Expand row" : "Collapse row",
8015
- "data-testid": e2eSelectors.selectors.components.DashboardRow.title(sceneGraph.interpolate(model, title, void 0, "text"))
8048
+ "aria-label": isCollapsed ? "Expand row" : "Collapse row"
8016
8049
  }, isCollapsible && /* @__PURE__ */ React__default["default"].createElement(ui.Icon, {
8017
8050
  name: isCollapsed ? "angle-right" : "angle-down"
8018
8051
  }), /* @__PURE__ */ React__default["default"].createElement("span", {
@@ -10351,7 +10384,8 @@ exports.SceneCanvasText = SceneCanvasText;
10351
10384
  exports.SceneControlsSpacer = SceneControlsSpacer;
10352
10385
  exports.SceneDataLayerBase = SceneDataLayerBase;
10353
10386
  exports.SceneDataLayerControls = SceneDataLayerControls;
10354
- exports.SceneDataLayers = SceneDataLayers;
10387
+ exports.SceneDataLayerSet = SceneDataLayerSet;
10388
+ exports.SceneDataLayerSetBase = SceneDataLayerSetBase;
10355
10389
  exports.SceneDataNode = SceneDataNode;
10356
10390
  exports.SceneDataTransformer = SceneDataTransformer;
10357
10391
  exports.SceneDebugger = SceneDebugger;
@@ -10392,6 +10426,7 @@ exports.dataLayers = index;
10392
10426
  exports.formatRegistry = formatRegistry;
10393
10427
  exports.getUrlSyncManager = getUrlSyncManager;
10394
10428
  exports.isCustomVariableValue = isCustomVariableValue;
10429
+ exports.isDataLayer = isDataLayer;
10395
10430
  exports.isDataRequestEnricher = isDataRequestEnricher;
10396
10431
  exports.isSceneObject = isSceneObject;
10397
10432
  exports.registerQueryWithController = registerQueryWithController;