@grafana/scenes 6.35.0--canary.1240.17499066940.0 → 6.35.1--canary.1235.17607489973.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 (115) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/esm/behaviors/LongFrameDetector.js +185 -0
  3. package/dist/esm/behaviors/LongFrameDetector.js.map +1 -0
  4. package/dist/esm/behaviors/SceneRenderProfiler.js +103 -19
  5. package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
  6. package/dist/esm/behaviors/index.js +0 -1
  7. package/dist/esm/behaviors/index.js.map +1 -1
  8. package/dist/esm/components/layout/grid/SceneGridLayout.js +14 -0
  9. package/dist/esm/components/layout/grid/SceneGridLayout.js.map +1 -1
  10. package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js +8 -9
  11. package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js.map +1 -1
  12. package/dist/esm/core/sceneGraph/index.js +0 -2
  13. package/dist/esm/core/sceneGraph/index.js.map +1 -1
  14. package/dist/esm/index.js +1 -0
  15. package/dist/esm/index.js.map +1 -1
  16. package/dist/esm/locales/cs-CZ/grafana-scenes.json.js +4 -0
  17. package/dist/esm/locales/cs-CZ/grafana-scenes.json.js.map +1 -1
  18. package/dist/esm/locales/de-DE/grafana-scenes.json.js +4 -0
  19. package/dist/esm/locales/de-DE/grafana-scenes.json.js.map +1 -1
  20. package/dist/esm/locales/es-ES/grafana-scenes.json.js +4 -0
  21. package/dist/esm/locales/es-ES/grafana-scenes.json.js.map +1 -1
  22. package/dist/esm/locales/fr-FR/grafana-scenes.json.js +4 -0
  23. package/dist/esm/locales/fr-FR/grafana-scenes.json.js.map +1 -1
  24. package/dist/esm/locales/hu-HU/grafana-scenes.json.js +4 -0
  25. package/dist/esm/locales/hu-HU/grafana-scenes.json.js.map +1 -1
  26. package/dist/esm/locales/id-ID/grafana-scenes.json.js +4 -0
  27. package/dist/esm/locales/id-ID/grafana-scenes.json.js.map +1 -1
  28. package/dist/esm/locales/it-IT/grafana-scenes.json.js +4 -0
  29. package/dist/esm/locales/it-IT/grafana-scenes.json.js.map +1 -1
  30. package/dist/esm/locales/ja-JP/grafana-scenes.json.js +4 -0
  31. package/dist/esm/locales/ja-JP/grafana-scenes.json.js.map +1 -1
  32. package/dist/esm/locales/ko-KR/grafana-scenes.json.js +4 -0
  33. package/dist/esm/locales/ko-KR/grafana-scenes.json.js.map +1 -1
  34. package/dist/esm/locales/nl-NL/grafana-scenes.json.js +4 -0
  35. package/dist/esm/locales/nl-NL/grafana-scenes.json.js.map +1 -1
  36. package/dist/esm/locales/pl-PL/grafana-scenes.json.js +4 -0
  37. package/dist/esm/locales/pl-PL/grafana-scenes.json.js.map +1 -1
  38. package/dist/esm/locales/pt-BR/grafana-scenes.json.js +4 -0
  39. package/dist/esm/locales/pt-BR/grafana-scenes.json.js.map +1 -1
  40. package/dist/esm/locales/pt-PT/grafana-scenes.json.js +4 -0
  41. package/dist/esm/locales/pt-PT/grafana-scenes.json.js.map +1 -1
  42. package/dist/esm/locales/ru-RU/grafana-scenes.json.js +4 -0
  43. package/dist/esm/locales/ru-RU/grafana-scenes.json.js.map +1 -1
  44. package/dist/esm/locales/sv-SE/grafana-scenes.json.js +4 -0
  45. package/dist/esm/locales/sv-SE/grafana-scenes.json.js.map +1 -1
  46. package/dist/esm/locales/tr-TR/grafana-scenes.json.js +4 -0
  47. package/dist/esm/locales/tr-TR/grafana-scenes.json.js.map +1 -1
  48. package/dist/esm/locales/zh-Hans/grafana-scenes.json.js +4 -0
  49. package/dist/esm/locales/zh-Hans/grafana-scenes.json.js.map +1 -1
  50. package/dist/esm/locales/zh-Hant/grafana-scenes.json.js +4 -0
  51. package/dist/esm/locales/zh-Hant/grafana-scenes.json.js.map +1 -1
  52. package/dist/esm/utils/writeSceneLog.js +10 -1
  53. package/dist/esm/utils/writeSceneLog.js.map +1 -1
  54. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +0 -9
  55. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
  56. package/dist/esm/variables/groupby/GroupByVariable.js +0 -8
  57. package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
  58. package/dist/{grafana-scenes-CgIzGE5F.js → grafana-scenes-BbJq3cEa.js} +5 -1
  59. package/dist/{grafana-scenes-B0JDDOYY.js.map → grafana-scenes-BbJq3cEa.js.map} +1 -1
  60. package/dist/{grafana-scenes-B3ypGD5T.js → grafana-scenes-BbRDYrqK.js} +5 -1
  61. package/dist/{grafana-scenes-B3ypGD5T.js.map → grafana-scenes-BbRDYrqK.js.map} +1 -1
  62. package/dist/{grafana-scenes-CY85TD5F.js → grafana-scenes-BcDO8gk4.js} +5 -1
  63. package/dist/{grafana-scenes-BGCbMCFm.js.map → grafana-scenes-BcDO8gk4.js.map} +1 -1
  64. package/dist/{grafana-scenes-CqRf9pRc.js → grafana-scenes-BtGEpoZT.js} +5 -1
  65. package/dist/{grafana-scenes-Br6NPcwR.js.map → grafana-scenes-BtGEpoZT.js.map} +1 -1
  66. package/dist/{grafana-scenes-Br6NPcwR.js → grafana-scenes-BwQ_A3lk.js} +5 -1
  67. package/dist/grafana-scenes-BwQ_A3lk.js.map +1 -0
  68. package/dist/{grafana-scenes-B0JDDOYY.js → grafana-scenes-C-CibbsO.js} +5 -1
  69. package/dist/grafana-scenes-C-CibbsO.js.map +1 -0
  70. package/dist/{grafana-scenes-Dy2CLUY9.js → grafana-scenes-CMtHJ23j.js} +5 -1
  71. package/dist/grafana-scenes-CMtHJ23j.js.map +1 -0
  72. package/dist/{grafana-scenes-DObtL2WT.js → grafana-scenes-CS09sc_L.js} +5 -1
  73. package/dist/grafana-scenes-CS09sc_L.js.map +1 -0
  74. package/dist/{grafana-scenes-DXM1LI4B.js → grafana-scenes-CfoPR_PZ.js} +5 -1
  75. package/dist/grafana-scenes-CfoPR_PZ.js.map +1 -0
  76. package/dist/{grafana-scenes-Cub9Gl0n.js → grafana-scenes-CixWq8rH.js} +5 -1
  77. package/dist/grafana-scenes-CixWq8rH.js.map +1 -0
  78. package/dist/{grafana-scenes-DlUSL8jI.js → grafana-scenes-CoXR5Z7T.js} +5 -1
  79. package/dist/grafana-scenes-CoXR5Z7T.js.map +1 -0
  80. package/dist/{grafana-scenes-CeVkPanY.js → grafana-scenes-CqMfWT-f.js} +5 -1
  81. package/dist/grafana-scenes-CqMfWT-f.js.map +1 -0
  82. package/dist/{grafana-scenes-n10eQkNF.js → grafana-scenes-CzZTvOrf.js} +5 -1
  83. package/dist/grafana-scenes-CzZTvOrf.js.map +1 -0
  84. package/dist/{grafana-scenes-BGCbMCFm.js → grafana-scenes-VOzZRdKp.js} +5 -1
  85. package/dist/grafana-scenes-VOzZRdKp.js.map +1 -0
  86. package/dist/{grafana-scenes-CBRfJ-2H.js → grafana-scenes-cTJt4LR7.js} +5 -1
  87. package/dist/grafana-scenes-cTJt4LR7.js.map +1 -0
  88. package/dist/{grafana-scenes-D5qs_fc9.js → grafana-scenes-kfW02M-K.js} +5 -1
  89. package/dist/grafana-scenes-kfW02M-K.js.map +1 -0
  90. package/dist/{grafana-scenes-COr0P0oM.js → grafana-scenes-naZktXG6.js} +5 -1
  91. package/dist/grafana-scenes-naZktXG6.js.map +1 -0
  92. package/dist/{grafana-scenes-YMli37Xh.js → grafana-scenes-zGpJY4O3.js} +5 -1
  93. package/dist/grafana-scenes-zGpJY4O3.js.map +1 -0
  94. package/dist/index.d.ts +32 -31
  95. package/dist/index.js +720 -545
  96. package/dist/index.js.map +1 -1
  97. package/package.json +2 -2
  98. package/dist/esm/behaviors/SceneInteractionProfiler.js +0 -88
  99. package/dist/esm/behaviors/SceneInteractionProfiler.js.map +0 -1
  100. package/dist/esm/core/sceneGraph/getInteractionProfiler.js +0 -19
  101. package/dist/esm/core/sceneGraph/getInteractionProfiler.js.map +0 -1
  102. package/dist/grafana-scenes-CBRfJ-2H.js.map +0 -1
  103. package/dist/grafana-scenes-COr0P0oM.js.map +0 -1
  104. package/dist/grafana-scenes-CY85TD5F.js.map +0 -1
  105. package/dist/grafana-scenes-CeVkPanY.js.map +0 -1
  106. package/dist/grafana-scenes-CgIzGE5F.js.map +0 -1
  107. package/dist/grafana-scenes-CqRf9pRc.js.map +0 -1
  108. package/dist/grafana-scenes-Cub9Gl0n.js.map +0 -1
  109. package/dist/grafana-scenes-D5qs_fc9.js.map +0 -1
  110. package/dist/grafana-scenes-DObtL2WT.js.map +0 -1
  111. package/dist/grafana-scenes-DXM1LI4B.js.map +0 -1
  112. package/dist/grafana-scenes-DlUSL8jI.js.map +0 -1
  113. package/dist/grafana-scenes-Dy2CLUY9.js.map +0 -1
  114. package/dist/grafana-scenes-YMli37Xh.js.map +0 -1
  115. package/dist/grafana-scenes-n10eQkNF.js.map +0 -1
package/dist/index.js CHANGED
@@ -599,6 +599,15 @@ function writeSceneLog(logger, message, ...rest) {
599
599
  console.log(`${logger}: `, message, ...rest);
600
600
  }
601
601
  }
602
+ function writeSceneLogStyled(logger, message, style, ...rest) {
603
+ let loggingEnabled = false;
604
+ if (typeof window !== "undefined") {
605
+ loggingEnabled = localStorage.getItem("grafana.debug.scenes") === "true";
606
+ }
607
+ if (loggingEnabled) {
608
+ console.log(`%c${logger}: ${message}`, style, ...rest);
609
+ }
610
+ }
602
611
 
603
612
  var __typeError$4 = (msg) => {
604
613
  throw TypeError(msg);
@@ -607,352 +616,6 @@ var __accessCheck$4 = (obj, member, msg) => member.has(obj) || __typeError$4("Ca
607
616
  var __privateGet$4 = (obj, member, getter) => (__accessCheck$4(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
608
617
  var __privateAdd$4 = (obj, member, value) => member.has(obj) ? __typeError$4("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
609
618
  var __privateSet$4 = (obj, member, value, setter) => (__accessCheck$4(obj, member, "write to private field"), member.set(obj, value), value);
610
- var _profileInProgress$1, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans, _visibilityChangeHandler;
611
- const POST_STORM_WINDOW = 2e3;
612
- const SPAN_THRESHOLD = 30;
613
- const TAB_INACTIVE_THRESHOLD = 1e3;
614
- class SceneRenderProfiler {
615
- constructor(queryController) {
616
- this.queryController = queryController;
617
- __privateAdd$4(this, _profileInProgress$1, null);
618
- __privateAdd$4(this, _profileStartTs, null);
619
- __privateAdd$4(this, _trailAnimationFrameId, null);
620
- // Will keep measured lengths trailing frames
621
- __privateAdd$4(this, _recordedTrailingSpans, []);
622
- __privateAdd$4(this, _visibilityChangeHandler, null);
623
- this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
624
- var _a;
625
- const currentFrameTime = performance.now();
626
- const frameLength = currentFrameTime - lastFrameTime;
627
- if (frameLength > TAB_INACTIVE_THRESHOLD) {
628
- writeSceneLog("SceneRenderProfiler", "Tab was inactive, cancelling profile measurement");
629
- this.cancelProfile();
630
- return;
631
- }
632
- __privateGet$4(this, _recordedTrailingSpans).push(frameLength);
633
- if (currentFrameTime - measurementStartTs < POST_STORM_WINDOW) {
634
- if (__privateGet$4(this, _profileInProgress$1)) {
635
- __privateSet$4(this, _trailAnimationFrameId, requestAnimationFrame(
636
- () => this.measureTrailingFrames(measurementStartTs, currentFrameTime, profileStartTs)
637
- ));
638
- }
639
- } else {
640
- const slowFrames = processRecordedSpans(__privateGet$4(this, _recordedTrailingSpans));
641
- const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);
642
- writeSceneLog(
643
- this.constructor.name,
644
- "Profile tail recorded, slow frames duration:",
645
- slowFramesTime,
646
- slowFrames,
647
- __privateGet$4(this, _profileInProgress$1)
648
- );
649
- __privateSet$4(this, _recordedTrailingSpans, []);
650
- const profileDuration = measurementStartTs - profileStartTs;
651
- writeSceneLog(
652
- this.constructor.name,
653
- "Stoped recording, total measured time (network included):",
654
- profileDuration + slowFramesTime
655
- );
656
- __privateSet$4(this, _trailAnimationFrameId, null);
657
- const profileEndTs = profileStartTs + profileDuration + slowFramesTime;
658
- if (!__privateGet$4(this, _profileInProgress$1)) {
659
- return;
660
- }
661
- performance.measure(`DashboardInteraction ${__privateGet$4(this, _profileInProgress$1).origin}`, {
662
- start: profileStartTs,
663
- end: profileEndTs
664
- });
665
- const networkDuration = captureNetwork(profileStartTs, profileEndTs);
666
- if (((_a = this.queryController) == null ? void 0 : _a.state.onProfileComplete) && __privateGet$4(this, _profileInProgress$1)) {
667
- this.queryController.state.onProfileComplete({
668
- origin: __privateGet$4(this, _profileInProgress$1).origin,
669
- crumbs: __privateGet$4(this, _profileInProgress$1).crumbs,
670
- duration: profileDuration + slowFramesTime,
671
- networkDuration,
672
- startTs: profileStartTs,
673
- endTs: profileEndTs,
674
- // @ts-ignore
675
- jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,
676
- // @ts-ignore
677
- usedJSHeapSize: performance.memory ? performance.memory.usedJSHeapSize : 0,
678
- // @ts-ignore
679
- totalJSHeapSize: performance.memory ? performance.memory.totalJSHeapSize : 0
680
- });
681
- __privateSet$4(this, _profileInProgress$1, null);
682
- __privateSet$4(this, _trailAnimationFrameId, null);
683
- }
684
- if (window.__runs) {
685
- window.__runs += `${Date.now()}, ${profileDuration + slowFramesTime}
686
- `;
687
- } else {
688
- window.__runs = `${Date.now()}, ${profileDuration + slowFramesTime}
689
- `;
690
- }
691
- }
692
- };
693
- this.setupVisibilityChangeHandler();
694
- }
695
- setQueryController(queryController) {
696
- this.queryController = queryController;
697
- }
698
- setupVisibilityChangeHandler() {
699
- if (__privateGet$4(this, _visibilityChangeHandler)) {
700
- return;
701
- }
702
- __privateSet$4(this, _visibilityChangeHandler, () => {
703
- if (document.hidden && __privateGet$4(this, _profileInProgress$1)) {
704
- writeSceneLog("SceneRenderProfiler", "Tab became inactive, cancelling profile");
705
- this.cancelProfile();
706
- }
707
- });
708
- if (typeof document !== "undefined") {
709
- document.addEventListener("visibilitychange", __privateGet$4(this, _visibilityChangeHandler));
710
- }
711
- }
712
- cleanup() {
713
- if (__privateGet$4(this, _visibilityChangeHandler) && typeof document !== "undefined") {
714
- document.removeEventListener("visibilitychange", __privateGet$4(this, _visibilityChangeHandler));
715
- __privateSet$4(this, _visibilityChangeHandler, null);
716
- }
717
- this.cancelProfile();
718
- }
719
- startProfile(name) {
720
- if (document.hidden) {
721
- writeSceneLog("SceneRenderProfiler", "Tab is inactive, skipping profile", name);
722
- return;
723
- }
724
- if (__privateGet$4(this, _profileInProgress$1)) {
725
- if (__privateGet$4(this, _trailAnimationFrameId)) {
726
- this.cancelProfile();
727
- this._startNewProfile(name, true);
728
- } else {
729
- this.addCrumb(name);
730
- }
731
- } else {
732
- this._startNewProfile(name);
733
- }
734
- }
735
- /**
736
- * Starts a new profile for performance measurement.
737
- *
738
- * @param name - The origin/trigger of the profile (e.g., 'time_range_change', 'variable_value_changed')
739
- * @param force - Whether this is a "forced" profile (true) or "clean" profile (false)
740
- * - "forced": Started by canceling an existing profile that was recording trailing frames
741
- * This happens when a new user interaction occurs before the previous one
742
- * finished measuring its performance impact
743
- * - "clean": Started when no profile is currently active
744
- */
745
- _startNewProfile(name, force = false) {
746
- __privateSet$4(this, _profileInProgress$1, { origin: name, crumbs: [] });
747
- __privateSet$4(this, _profileStartTs, performance.now());
748
- writeSceneLog(
749
- "SceneRenderProfiler",
750
- `Profile started[${force ? "forced" : "clean"}]`,
751
- __privateGet$4(this, _profileInProgress$1),
752
- __privateGet$4(this, _profileStartTs)
753
- );
754
- }
755
- recordProfileTail(measurementStartTime, profileStartTs) {
756
- __privateSet$4(this, _trailAnimationFrameId, requestAnimationFrame(
757
- () => this.measureTrailingFrames(measurementStartTime, measurementStartTime, profileStartTs)
758
- ));
759
- }
760
- tryCompletingProfile() {
761
- var _a;
762
- writeSceneLog("SceneRenderProfiler", "Trying to complete profile", __privateGet$4(this, _profileInProgress$1));
763
- if (((_a = this.queryController) == null ? void 0 : _a.runningQueriesCount()) === 0 && __privateGet$4(this, _profileInProgress$1)) {
764
- writeSceneLog("SceneRenderProfiler", "All queries completed, stopping profile");
765
- this.recordProfileTail(performance.now(), __privateGet$4(this, _profileStartTs));
766
- }
767
- }
768
- isTailRecording() {
769
- return Boolean(__privateGet$4(this, _trailAnimationFrameId));
770
- }
771
- cancelTailRecording() {
772
- if (__privateGet$4(this, _trailAnimationFrameId)) {
773
- cancelAnimationFrame(__privateGet$4(this, _trailAnimationFrameId));
774
- __privateSet$4(this, _trailAnimationFrameId, null);
775
- writeSceneLog("SceneRenderProfiler", "Cancelled recording frames, new profile started");
776
- }
777
- }
778
- // cancel profile
779
- cancelProfile() {
780
- if (__privateGet$4(this, _profileInProgress$1)) {
781
- writeSceneLog("SceneRenderProfiler", "Cancelling profile", __privateGet$4(this, _profileInProgress$1));
782
- __privateSet$4(this, _profileInProgress$1, null);
783
- if (__privateGet$4(this, _trailAnimationFrameId)) {
784
- cancelAnimationFrame(__privateGet$4(this, _trailAnimationFrameId));
785
- __privateSet$4(this, _trailAnimationFrameId, null);
786
- }
787
- __privateSet$4(this, _recordedTrailingSpans, []);
788
- }
789
- }
790
- addCrumb(crumb) {
791
- if (__privateGet$4(this, _profileInProgress$1)) {
792
- writeSceneLog("SceneRenderProfiler", "Adding crumb:", crumb);
793
- __privateGet$4(this, _profileInProgress$1).crumbs.push(crumb);
794
- }
795
- }
796
- }
797
- _profileInProgress$1 = new WeakMap();
798
- _profileStartTs = new WeakMap();
799
- _trailAnimationFrameId = new WeakMap();
800
- _recordedTrailingSpans = new WeakMap();
801
- _visibilityChangeHandler = new WeakMap();
802
- function processRecordedSpans(spans) {
803
- for (let i = spans.length - 1; i >= 0; i--) {
804
- if (spans[i] > SPAN_THRESHOLD) {
805
- return spans.slice(0, i + 1);
806
- }
807
- }
808
- return [spans[0]];
809
- }
810
- function captureNetwork(startTs, endTs) {
811
- const entries = performance.getEntriesByType("resource");
812
- performance.clearResourceTimings();
813
- const networkEntries = entries.filter(
814
- (entry) => entry.startTime >= startTs && entry.startTime <= endTs && entry.responseEnd >= startTs && entry.responseEnd <= endTs
815
- );
816
- for (const entry of networkEntries) {
817
- performance.measure("Network entry " + entry.name, {
818
- start: entry.startTime,
819
- end: entry.responseEnd
820
- });
821
- }
822
- return calculateNetworkTime(networkEntries);
823
- }
824
- function calculateNetworkTime(requests) {
825
- if (requests.length === 0) {
826
- return 0;
827
- }
828
- requests.sort((a, b) => a.startTime - b.startTime);
829
- let totalNetworkTime = 0;
830
- let currentStart = requests[0].startTime;
831
- let currentEnd = requests[0].responseEnd;
832
- for (let i = 1; i < requests.length; i++) {
833
- if (requests[i].startTime <= currentEnd) {
834
- currentEnd = Math.max(currentEnd, requests[i].responseEnd);
835
- } else {
836
- totalNetworkTime += currentEnd - currentStart;
837
- currentStart = requests[i].startTime;
838
- currentEnd = requests[i].responseEnd;
839
- }
840
- }
841
- totalNetworkTime += currentEnd - currentStart;
842
- return totalNetworkTime;
843
- }
844
- const REFRESH_INTERACTION = "refresh";
845
- const TIME_RANGE_CHANGE_INTERACTION = "time_range_change";
846
- const FILTER_REMOVED_INTERACTION = "filter_removed";
847
- const FILTER_CHANGED_INTERACTION = "filter_changed";
848
- const FILTER_RESTORED_INTERACTION = "filter_restored";
849
- const VARIABLE_VALUE_CHANGED_INTERACTION = "variable_value_changed";
850
- const SCOPES_CHANGED_INTERACTION = "scopes_changed";
851
-
852
- var __typeError$3 = (msg) => {
853
- throw TypeError(msg);
854
- };
855
- var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$3("Cannot " + msg);
856
- var __privateGet$3 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), member.get(obj));
857
- var __privateAdd$3 = (obj, member, value) => member.has(obj) ? __typeError$3("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
858
- var __privateSet$3 = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), member.set(obj, value), value);
859
- var _profileInProgress;
860
- function isInteractionProfiler(obj) {
861
- return obj && typeof obj === "object" && "isInteractionProfiler" in obj;
862
- }
863
- class SceneInteractionProfiler extends SceneObjectBase {
864
- constructor() {
865
- super(...arguments);
866
- this.isInteractionProfiler = true;
867
- __privateAdd$3(this, _profileInProgress, null);
868
- }
869
- startProfile(interaction) {
870
- if (!this.state.enableProfiling) {
871
- return;
872
- }
873
- if (__privateGet$3(this, _profileInProgress)) {
874
- this.cancelProfile();
875
- }
876
- __privateSet$3(this, _profileInProgress, {
877
- interaction,
878
- startTs: performance.now()
879
- });
880
- writeSceneLog("SceneInteractionProfiler", "Started profiling interaction:", interaction);
881
- }
882
- stopProfile() {
883
- if (!__privateGet$3(this, _profileInProgress)) {
884
- return;
885
- }
886
- const endTs = performance.now();
887
- const interactionDuration = endTs - __privateGet$3(this, _profileInProgress).startTs;
888
- const networkDuration = captureNetwork(__privateGet$3(this, _profileInProgress).startTs, endTs);
889
- const result = {
890
- interaction: __privateGet$3(this, _profileInProgress).interaction,
891
- interactionDuration,
892
- networkDuration,
893
- startTs: __privateGet$3(this, _profileInProgress).startTs,
894
- endTs
895
- };
896
- writeSceneLog("SceneInteractionProfiler", "Completed profile:", result);
897
- if (this.state.onProfileComplete) {
898
- this.state.onProfileComplete(result);
899
- }
900
- performance.mark(`${__privateGet$3(this, _profileInProgress).interaction}_start`, {
901
- startTime: __privateGet$3(this, _profileInProgress).startTs
902
- });
903
- performance.mark(`${__privateGet$3(this, _profileInProgress).interaction}_end`, {
904
- startTime: endTs
905
- });
906
- performance.measure(
907
- `Interaction_${__privateGet$3(this, _profileInProgress).interaction}`,
908
- `${__privateGet$3(this, _profileInProgress).interaction}_start`,
909
- `${__privateGet$3(this, _profileInProgress).interaction}_end`
910
- );
911
- __privateSet$3(this, _profileInProgress, null);
912
- }
913
- cancelProfile() {
914
- if (__privateGet$3(this, _profileInProgress)) {
915
- writeSceneLog("SceneInteractionProfiler", "Cancelled profile:", __privateGet$3(this, _profileInProgress).interaction);
916
- __privateSet$3(this, _profileInProgress, null);
917
- }
918
- }
919
- isProfileActive() {
920
- return __privateGet$3(this, _profileInProgress) !== null;
921
- }
922
- getCurrentInteraction() {
923
- var _a, _b;
924
- return (_b = (_a = __privateGet$3(this, _profileInProgress)) == null ? void 0 : _a.interaction) != null ? _b : null;
925
- }
926
- }
927
- _profileInProgress = new WeakMap();
928
- const USER_INTERACTIONS = {
929
- ADHOC_KEYS_DROPDOWN: "adhoc_keys_dropdown",
930
- ADHOC_VALUES_DROPDOWN: "adhoc_values_dropdown",
931
- GROUPBY_DROPDOWN: "groupby_dropdown"
932
- };
933
-
934
- function getInteractionProfiler(sceneObject) {
935
- let parent = sceneObject;
936
- while (parent) {
937
- if (parent.state.$behaviors) {
938
- for (const behavior of parent.state.$behaviors) {
939
- if (isInteractionProfiler(behavior)) {
940
- return behavior;
941
- }
942
- }
943
- }
944
- parent = parent.parent;
945
- }
946
- return void 0;
947
- }
948
-
949
- var __typeError$2 = (msg) => {
950
- throw TypeError(msg);
951
- };
952
- var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Cannot " + msg);
953
- var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
954
- var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
955
- var __privateSet$2 = (obj, member, value, setter) => (__accessCheck$2(obj, member, "write to private field"), member.set(obj, value), value);
956
619
  var _running, _tryCompleteProfileFrameId;
957
620
  function isQueryController(s) {
958
621
  return "isQueryController" in s;
@@ -962,10 +625,10 @@ class SceneQueryController extends SceneObjectBase {
962
625
  super({ ...state, isRunning: false });
963
626
  this.profiler = profiler;
964
627
  this.isQueryController = true;
965
- __privateAdd$2(this, _running, /* @__PURE__ */ new Set());
966
- __privateAdd$2(this, _tryCompleteProfileFrameId, null);
628
+ __privateAdd$4(this, _running, /* @__PURE__ */ new Set());
629
+ __privateAdd$4(this, _tryCompleteProfileFrameId, null);
967
630
  this.runningQueriesCount = () => {
968
- return __privateGet$2(this, _running).size;
631
+ return __privateGet$4(this, _running).size;
969
632
  };
970
633
  if (profiler) {
971
634
  this.profiler = profiler;
@@ -974,7 +637,7 @@ class SceneQueryController extends SceneObjectBase {
974
637
  this.addActivationHandler(() => {
975
638
  var _a;
976
639
  (_a = this.profiler) == null ? void 0 : _a.setQueryController(this);
977
- return () => __privateGet$2(this, _running).clear();
640
+ return () => __privateGet$4(this, _running).clear();
978
641
  });
979
642
  }
980
643
  startProfile(name) {
@@ -989,19 +652,19 @@ class SceneQueryController extends SceneObjectBase {
989
652
  (_a = this.profiler) == null ? void 0 : _a.cancelProfile();
990
653
  }
991
654
  queryStarted(entry) {
992
- __privateGet$2(this, _running).add(entry);
655
+ __privateGet$4(this, _running).add(entry);
993
656
  this.changeRunningQueryCount(1, entry);
994
657
  if (!this.state.isRunning) {
995
658
  this.setState({ isRunning: true });
996
659
  }
997
660
  }
998
661
  queryCompleted(entry) {
999
- if (!__privateGet$2(this, _running).has(entry)) {
662
+ if (!__privateGet$4(this, _running).has(entry)) {
1000
663
  return;
1001
664
  }
1002
- __privateGet$2(this, _running).delete(entry);
665
+ __privateGet$4(this, _running).delete(entry);
1003
666
  this.changeRunningQueryCount(-1);
1004
- if (__privateGet$2(this, _running).size === 0) {
667
+ if (__privateGet$4(this, _running).size === 0) {
1005
668
  this.setState({ isRunning: false });
1006
669
  }
1007
670
  }
@@ -1018,186 +681,699 @@ class SceneQueryController extends SceneObjectBase {
1018
681
  }
1019
682
  }
1020
683
  if (this.state.enableProfiling) {
1021
- if (__privateGet$2(this, _tryCompleteProfileFrameId)) {
1022
- cancelAnimationFrame(__privateGet$2(this, _tryCompleteProfileFrameId));
684
+ if (__privateGet$4(this, _tryCompleteProfileFrameId)) {
685
+ cancelAnimationFrame(__privateGet$4(this, _tryCompleteProfileFrameId));
1023
686
  }
1024
- __privateSet$2(this, _tryCompleteProfileFrameId, requestAnimationFrame(() => {
687
+ __privateSet$4(this, _tryCompleteProfileFrameId, requestAnimationFrame(() => {
1025
688
  var _a2;
1026
689
  (_a2 = this.profiler) == null ? void 0 : _a2.tryCompletingProfile();
1027
690
  }));
1028
691
  }
1029
692
  }
1030
- cancelAll() {
1031
- var _a;
1032
- for (const entry of __privateGet$2(this, _running).values()) {
1033
- (_a = entry.cancel) == null ? void 0 : _a.call(entry);
693
+ cancelAll() {
694
+ var _a;
695
+ for (const entry of __privateGet$4(this, _running).values()) {
696
+ (_a = entry.cancel) == null ? void 0 : _a.call(entry);
697
+ }
698
+ }
699
+ }
700
+ _running = new WeakMap();
701
+ _tryCompleteProfileFrameId = new WeakMap();
702
+
703
+ function getQueryController(sceneObject) {
704
+ let parent = sceneObject;
705
+ while (parent) {
706
+ if (parent.state.$behaviors) {
707
+ for (const behavior of parent.state.$behaviors) {
708
+ if (isQueryController(behavior)) {
709
+ return behavior;
710
+ }
711
+ }
712
+ }
713
+ parent = parent.parent;
714
+ }
715
+ return void 0;
716
+ }
717
+
718
+ class SceneDataNode extends SceneObjectBase {
719
+ constructor(state) {
720
+ super({
721
+ data: emptyPanelData,
722
+ ...state
723
+ });
724
+ }
725
+ getResultsStream() {
726
+ const result = {
727
+ origin: this,
728
+ data: this.state.data
729
+ };
730
+ return rxjs.of(result);
731
+ }
732
+ }
733
+ const emptyPanelData = {
734
+ state: schema.LoadingState.Done,
735
+ series: [],
736
+ timeRange: data.getDefaultTimeRange()
737
+ };
738
+
739
+ class SceneObjectUrlSyncConfig {
740
+ constructor(_sceneObject, _options) {
741
+ this._sceneObject = _sceneObject;
742
+ this._nextChangeShouldAddHistoryStep = false;
743
+ this._keys = _options.keys;
744
+ }
745
+ getKeys() {
746
+ if (typeof this._keys === "function") {
747
+ return this._keys();
748
+ }
749
+ return this._keys;
750
+ }
751
+ getUrlState() {
752
+ return this._sceneObject.getUrlState();
753
+ }
754
+ updateFromUrl(values) {
755
+ this._sceneObject.updateFromUrl(values);
756
+ }
757
+ shouldCreateHistoryStep(values) {
758
+ return this._nextChangeShouldAddHistoryStep;
759
+ }
760
+ performBrowserHistoryAction(callback) {
761
+ this._nextChangeShouldAddHistoryStep = true;
762
+ callback();
763
+ this._nextChangeShouldAddHistoryStep = false;
764
+ }
765
+ }
766
+
767
+ function getClosest(sceneObject, extract) {
768
+ let curSceneObject = sceneObject;
769
+ let extracted = void 0;
770
+ while (curSceneObject && !extracted) {
771
+ extracted = extract(curSceneObject);
772
+ curSceneObject = curSceneObject.parent;
773
+ }
774
+ return extracted;
775
+ }
776
+
777
+ const INTERVAL_STRING_REGEX = /^\d+[yYmMsSwWhHdD]$/;
778
+ function parseUrlParam(value) {
779
+ if (typeof value !== "string") {
780
+ return null;
781
+ }
782
+ if (value.indexOf("now") !== -1) {
783
+ return value;
784
+ }
785
+ if (INTERVAL_STRING_REGEX.test(value)) {
786
+ return value;
787
+ }
788
+ if (value.length === 8) {
789
+ const utcValue = data.toUtc(value, "YYYYMMDD");
790
+ if (utcValue.isValid()) {
791
+ return utcValue.toISOString();
792
+ }
793
+ } else if (value.length === 15) {
794
+ const utcValue = data.toUtc(value, "YYYYMMDDTHHmmss");
795
+ if (utcValue.isValid()) {
796
+ return utcValue.toISOString();
797
+ }
798
+ } else if (value.length === 19) {
799
+ const utcValue = data.toUtc(value, "YYYY-MM-DD HH:mm:ss");
800
+ if (utcValue.isValid()) {
801
+ return utcValue.toISOString();
802
+ }
803
+ } else if (value.length === 24) {
804
+ const utcValue = data.toUtc(value);
805
+ return utcValue.toISOString();
806
+ }
807
+ const epoch = parseInt(value, 10);
808
+ if (!isNaN(epoch)) {
809
+ return data.toUtc(epoch).toISOString();
810
+ }
811
+ return null;
812
+ }
813
+
814
+ function evaluateTimeRange(from, to, timeZone, fiscalYearStartMonth, delay, weekStart) {
815
+ const hasDelay = delay && to === "now";
816
+ const now = Date.now();
817
+ if (weekStart) {
818
+ setWeekStartIfDifferent(weekStart);
819
+ }
820
+ const parseOrToDateTime = (val, options) => {
821
+ if (data.dateMath.toDateTime) {
822
+ return data.dateMath.toDateTime(val, options);
823
+ } else {
824
+ return data.dateMath.parse(val, options.roundUp, options.timezone, options.fiscalYearStartMonth);
825
+ }
826
+ };
827
+ return {
828
+ to: parseOrToDateTime(hasDelay ? "now-" + delay : to, {
829
+ roundUp: true,
830
+ timezone: timeZone,
831
+ fiscalYearStartMonth,
832
+ now
833
+ }),
834
+ from: parseOrToDateTime(from, {
835
+ roundUp: false,
836
+ timezone: timeZone,
837
+ fiscalYearStartMonth,
838
+ now
839
+ }),
840
+ raw: {
841
+ from,
842
+ to
843
+ }
844
+ };
845
+ }
846
+ let prevWeekStart;
847
+ function setWeekStartIfDifferent(weekStart) {
848
+ if (weekStart !== prevWeekStart) {
849
+ prevWeekStart = weekStart;
850
+ data.setWeekStart(weekStart);
851
+ }
852
+ }
853
+
854
+ function isValid$1(value, roundUp, timeZone) {
855
+ if (data.isDateTime(value)) {
856
+ return value.isValid();
857
+ }
858
+ if (data.dateMath.isMathString(value)) {
859
+ return data.dateMath.isValid(value);
860
+ }
861
+ const parsed = data.dateTimeParse(value, { roundUp, timeZone });
862
+ return parsed.isValid();
863
+ }
864
+
865
+ var __typeError$3 = (msg) => {
866
+ throw TypeError(msg);
867
+ };
868
+ var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$3("Cannot " + msg);
869
+ var __privateGet$3 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
870
+ var __privateAdd$3 = (obj, member, value) => member.has(obj) ? __typeError$3("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
871
+ var __privateSet$3 = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), member.set(obj, value), value);
872
+ var _isTracking, _callback, _frameTrackingId, _lastFrameTime, _loafObserver;
873
+ const LONG_FRAME_THRESHOLD = 50;
874
+ class LongFrameDetector {
875
+ constructor() {
876
+ __privateAdd$3(this, _isTracking, false);
877
+ __privateAdd$3(this, _callback, null);
878
+ // Manual tracking state
879
+ __privateAdd$3(this, _frameTrackingId, null);
880
+ __privateAdd$3(this, _lastFrameTime, 0);
881
+ // LoAF tracking state
882
+ __privateAdd$3(this, _loafObserver, null);
883
+ /**
884
+ * Measure frame durations using requestAnimationFrame
885
+ */
886
+ this.measureFrames = () => {
887
+ if (!__privateGet$3(this, _isTracking)) {
888
+ return;
889
+ }
890
+ const currentFrameTime = performance.now();
891
+ const frameLength = currentFrameTime - __privateGet$3(this, _lastFrameTime);
892
+ if (frameLength > LONG_FRAME_THRESHOLD) {
893
+ const event = {
894
+ duration: frameLength,
895
+ timestamp: currentFrameTime,
896
+ method: "manual"
897
+ };
898
+ if (__privateGet$3(this, _callback)) {
899
+ __privateGet$3(this, _callback).call(this, event);
900
+ }
901
+ if (typeof performance !== "undefined" && performance.mark && performance.measure) {
902
+ const frameId = `long-frame-manual-${currentFrameTime.toFixed(0)}`;
903
+ const startMarkName = `${frameId}-start`;
904
+ const endMarkName = `${frameId}-end`;
905
+ const measureName = `Long Frame (Manual): ${frameLength.toFixed(1)}ms`;
906
+ try {
907
+ performance.mark(startMarkName, { startTime: currentFrameTime - frameLength });
908
+ performance.mark(endMarkName, { startTime: currentFrameTime });
909
+ performance.measure(measureName, startMarkName, endMarkName);
910
+ } catch (e) {
911
+ performance.mark(measureName);
912
+ }
913
+ }
914
+ writeSceneLog(
915
+ "LongFrameDetector",
916
+ `Long frame detected (manual): ${frameLength}ms (threshold: ${LONG_FRAME_THRESHOLD}ms)`
917
+ );
918
+ }
919
+ __privateSet$3(this, _lastFrameTime, currentFrameTime);
920
+ if (__privateGet$3(this, _isTracking)) {
921
+ __privateSet$3(this, _frameTrackingId, requestAnimationFrame(this.measureFrames));
922
+ }
923
+ };
924
+ }
925
+ /**
926
+ * Check if LoAF API is available in the browser
927
+ */
928
+ isLoAFAvailable() {
929
+ return typeof PerformanceObserver !== "undefined" && PerformanceObserver.supportedEntryTypes && PerformanceObserver.supportedEntryTypes.includes("long-animation-frame");
930
+ }
931
+ /**
932
+ * Start detecting long frames and call the provided callback when they occur
933
+ */
934
+ start(callback) {
935
+ if (__privateGet$3(this, _isTracking)) {
936
+ writeSceneLog("LongFrameDetector", "Already tracking frames, stopping previous session");
937
+ this.stop();
938
+ }
939
+ __privateSet$3(this, _callback, callback);
940
+ __privateSet$3(this, _isTracking, true);
941
+ if (this.isLoAFAvailable()) {
942
+ this.startLoAFTracking();
943
+ } else {
944
+ this.startManualFrameTracking();
945
+ }
946
+ writeSceneLog(
947
+ "LongFrameDetector",
948
+ `Started tracking with ${this.isLoAFAvailable() ? "LoAF API" : "manual"} method, threshold: ${LONG_FRAME_THRESHOLD}ms`
949
+ );
950
+ }
951
+ /**
952
+ * Stop detecting long frames
953
+ */
954
+ stop() {
955
+ if (!__privateGet$3(this, _isTracking)) {
956
+ return;
957
+ }
958
+ __privateSet$3(this, _isTracking, false);
959
+ __privateSet$3(this, _callback, null);
960
+ this.stopLoAFTracking();
961
+ this.stopManualFrameTracking();
962
+ }
963
+ /**
964
+ * Check if currently tracking frames
965
+ */
966
+ isTracking() {
967
+ return __privateGet$3(this, _isTracking);
968
+ }
969
+ /**
970
+ * Start tracking using the Long Animation Frame API
971
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongAnimationFrameTiming
972
+ */
973
+ startLoAFTracking() {
974
+ if (!this.isLoAFAvailable()) {
975
+ writeSceneLog("LongFrameDetector", "LoAF API not available, falling back to manual tracking");
976
+ this.startManualFrameTracking();
977
+ return;
978
+ }
979
+ try {
980
+ __privateSet$3(this, _loafObserver, new PerformanceObserver((list) => {
981
+ for (const entry of list.getEntries()) {
982
+ const event = {
983
+ duration: entry.duration,
984
+ timestamp: entry.startTime,
985
+ method: "loaf"
986
+ };
987
+ if (__privateGet$3(this, _callback)) {
988
+ __privateGet$3(this, _callback).call(this, event);
989
+ }
990
+ if (typeof performance !== "undefined" && performance.mark && performance.measure) {
991
+ const frameId = `long-frame-${entry.startTime.toFixed(0)}`;
992
+ const startMarkName = `${frameId}-start`;
993
+ const endMarkName = `${frameId}-end`;
994
+ const measureName = `Long Frame (LoAF): ${entry.duration.toFixed(1)}ms`;
995
+ try {
996
+ performance.mark(startMarkName, { startTime: entry.startTime });
997
+ performance.mark(endMarkName, { startTime: entry.startTime + entry.duration });
998
+ performance.measure(measureName, startMarkName, endMarkName);
999
+ } catch (e) {
1000
+ performance.mark(measureName);
1001
+ }
1002
+ }
1003
+ writeSceneLog("LongFrameDetector", `Long frame detected (LoAF): ${entry.duration}ms at ${entry.startTime}ms`);
1004
+ }
1005
+ }));
1006
+ __privateGet$3(this, _loafObserver).observe({ type: "long-animation-frame", buffered: false });
1007
+ } catch (error) {
1008
+ writeSceneLog("LongFrameDetector", "Failed to start LoAF tracking, falling back to manual:", error);
1009
+ this.startManualFrameTracking();
1010
+ }
1011
+ }
1012
+ /**
1013
+ * Stop LoAF tracking
1014
+ */
1015
+ stopLoAFTracking() {
1016
+ if (__privateGet$3(this, _loafObserver)) {
1017
+ __privateGet$3(this, _loafObserver).disconnect();
1018
+ __privateSet$3(this, _loafObserver, null);
1019
+ writeSceneLog("LongFrameDetector", "Stopped LoAF tracking");
1020
+ }
1021
+ }
1022
+ /**
1023
+ * Start manual frame tracking using requestAnimationFrame
1024
+ */
1025
+ startManualFrameTracking() {
1026
+ __privateSet$3(this, _lastFrameTime, performance.now());
1027
+ __privateSet$3(this, _frameTrackingId, requestAnimationFrame(() => this.measureFrames()));
1028
+ }
1029
+ /**
1030
+ * Stop manual frame tracking
1031
+ */
1032
+ stopManualFrameTracking() {
1033
+ if (__privateGet$3(this, _frameTrackingId)) {
1034
+ cancelAnimationFrame(__privateGet$3(this, _frameTrackingId));
1035
+ __privateSet$3(this, _frameTrackingId, null);
1036
+ writeSceneLog("LongFrameDetector", "Stopped manual frame tracking");
1037
+ }
1038
+ }
1039
+ }
1040
+ _isTracking = new WeakMap();
1041
+ _callback = new WeakMap();
1042
+ _frameTrackingId = new WeakMap();
1043
+ _lastFrameTime = new WeakMap();
1044
+ _loafObserver = new WeakMap();
1045
+
1046
+ var __typeError$2 = (msg) => {
1047
+ throw TypeError(msg);
1048
+ };
1049
+ var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Cannot " + msg);
1050
+ var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
1051
+ var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
1052
+ var __privateSet$2 = (obj, member, value, setter) => (__accessCheck$2(obj, member, "write to private field"), member.set(obj, value), value);
1053
+ var __privateWrapper = (obj, member, setter, getter) => ({
1054
+ set _(value) {
1055
+ __privateSet$2(obj, member, value);
1056
+ },
1057
+ get _() {
1058
+ return __privateGet$2(obj, member, getter);
1059
+ }
1060
+ });
1061
+ var _profileInProgress, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans, _longFrameDetector, _longFramesCount, _longFramesTotalTime, _visibilityChangeHandler;
1062
+ const POST_STORM_WINDOW = 2e3;
1063
+ const DEFAULT_LONG_FRAME_THRESHOLD = 30;
1064
+ const TAB_INACTIVE_THRESHOLD = 1e3;
1065
+ class SceneRenderProfiler {
1066
+ constructor(queryController) {
1067
+ this.queryController = queryController;
1068
+ __privateAdd$2(this, _profileInProgress, null);
1069
+ __privateAdd$2(this, _profileStartTs, null);
1070
+ __privateAdd$2(this, _trailAnimationFrameId, null);
1071
+ // Will keep measured lengths trailing frames
1072
+ __privateAdd$2(this, _recordedTrailingSpans, []);
1073
+ // Long frame tracking
1074
+ __privateAdd$2(this, _longFrameDetector);
1075
+ __privateAdd$2(this, _longFramesCount, 0);
1076
+ __privateAdd$2(this, _longFramesTotalTime, 0);
1077
+ __privateAdd$2(this, _visibilityChangeHandler, null);
1078
+ this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
1079
+ var _a, _b, _c, _d;
1080
+ const currentFrameTime = performance.now();
1081
+ const frameLength = currentFrameTime - lastFrameTime;
1082
+ if (frameLength > TAB_INACTIVE_THRESHOLD) {
1083
+ writeSceneLog("SceneRenderProfiler", "Tab was inactive, cancelling profile measurement");
1084
+ this.cancelProfile();
1085
+ return;
1086
+ }
1087
+ __privateGet$2(this, _recordedTrailingSpans).push(frameLength);
1088
+ if (currentFrameTime - measurementStartTs < POST_STORM_WINDOW) {
1089
+ if (__privateGet$2(this, _profileInProgress)) {
1090
+ __privateSet$2(this, _trailAnimationFrameId, requestAnimationFrame(
1091
+ () => this.measureTrailingFrames(measurementStartTs, currentFrameTime, profileStartTs)
1092
+ ));
1093
+ }
1094
+ } else {
1095
+ const slowFrames = processRecordedSpans(__privateGet$2(this, _recordedTrailingSpans));
1096
+ const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);
1097
+ writeSceneLog(
1098
+ "SceneRenderProfiler",
1099
+ `Profile tail recorded - Slow frames: ${slowFramesTime.toFixed(1)}ms (${slowFrames.length} frames)`
1100
+ );
1101
+ writeSceneLog("", ` \u251C\u2500 Origin: ${((_a = __privateGet$2(this, _profileInProgress)) == null ? void 0 : _a.origin) || "unknown"}`);
1102
+ writeSceneLog("", ` \u2514\u2500 Crumbs:`, ((_b = __privateGet$2(this, _profileInProgress)) == null ? void 0 : _b.crumbs) || []);
1103
+ __privateSet$2(this, _recordedTrailingSpans, []);
1104
+ const profileDuration = measurementStartTs - profileStartTs;
1105
+ if (typeof performance !== "undefined" && performance.mark) {
1106
+ const profileName = ((_c = __privateGet$2(this, _profileInProgress)) == null ? void 0 : _c.origin) || "unknown";
1107
+ const totalTime = profileDuration + slowFramesTime;
1108
+ performance.mark(`Dashboard Profile End: ${profileName}`);
1109
+ const startMarkName = `Dashboard Profile Start: ${profileName}`;
1110
+ try {
1111
+ performance.measure(
1112
+ `Dashboard Profile: ${profileName} (${totalTime.toFixed(1)}ms)`,
1113
+ startMarkName,
1114
+ `Dashboard Profile End: ${profileName}`
1115
+ );
1116
+ } catch (e) {
1117
+ performance.mark(`Dashboard Profile Complete: ${profileName} (${totalTime.toFixed(1)}ms)`);
1118
+ }
1119
+ if (slowFrames.length > 0) {
1120
+ const slowFramesMarkName = `Slow Frames Summary: ${slowFrames.length} frames (${slowFramesTime.toFixed(
1121
+ 1
1122
+ )}ms)`;
1123
+ performance.mark(slowFramesMarkName);
1124
+ slowFrames.forEach((frameTime, index) => {
1125
+ if (frameTime > 16) {
1126
+ try {
1127
+ const frameStartTime = __privateGet$2(this, _profileStartTs) + profileDuration + (index > 0 ? slowFrames.slice(0, index).reduce((sum, t) => sum + t, 0) : 0);
1128
+ const frameId = `slow-frame-${index}`;
1129
+ const frameStartMark = `${frameId}-start`;
1130
+ const frameEndMark = `${frameId}-end`;
1131
+ performance.mark(frameStartMark, { startTime: frameStartTime });
1132
+ performance.mark(frameEndMark, { startTime: frameStartTime + frameTime });
1133
+ performance.measure(`Slow Frame ${index + 1}: ${frameTime.toFixed(1)}ms`, frameStartMark, frameEndMark);
1134
+ } catch (e) {
1135
+ performance.mark(`Slow Frame ${index + 1}: ${frameTime.toFixed(1)}ms`);
1136
+ }
1137
+ }
1138
+ });
1139
+ }
1140
+ }
1141
+ const completionTimestamp = performance.now();
1142
+ writeSceneLog("SceneRenderProfiler", "Profile completed");
1143
+ writeSceneLog("", ` \u251C\u2500 Timestamp: ${completionTimestamp.toFixed(1)}ms`);
1144
+ writeSceneLog("", ` \u251C\u2500 Total time: ${(profileDuration + slowFramesTime).toFixed(1)}ms`);
1145
+ writeSceneLog("", ` \u251C\u2500 Slow frames: ${slowFramesTime}ms (${slowFrames.length} frames)`);
1146
+ writeSceneLog("", ` \u2514\u2500 Long frames: ${__privateGet$2(this, _longFramesTotalTime)}ms (${__privateGet$2(this, _longFramesCount)} frames)`);
1147
+ __privateGet$2(this, _longFrameDetector).stop();
1148
+ writeSceneLogStyled(
1149
+ "SceneRenderProfiler",
1150
+ `Stopped long frame detection - profile complete at ${completionTimestamp.toFixed(1)}ms`,
1151
+ "color: #00CC00; font-weight: bold;"
1152
+ );
1153
+ __privateSet$2(this, _trailAnimationFrameId, null);
1154
+ const profileEndTs = profileStartTs + profileDuration + slowFramesTime;
1155
+ if (!__privateGet$2(this, _profileInProgress)) {
1156
+ return;
1157
+ }
1158
+ performance.measure(`DashboardInteraction ${__privateGet$2(this, _profileInProgress).origin}`, {
1159
+ start: profileStartTs,
1160
+ end: profileEndTs
1161
+ });
1162
+ const networkDuration = captureNetwork(profileStartTs, profileEndTs);
1163
+ if (((_d = this.queryController) == null ? void 0 : _d.state.onProfileComplete) && __privateGet$2(this, _profileInProgress)) {
1164
+ this.queryController.state.onProfileComplete({
1165
+ origin: __privateGet$2(this, _profileInProgress).origin,
1166
+ crumbs: __privateGet$2(this, _profileInProgress).crumbs,
1167
+ duration: profileDuration + slowFramesTime,
1168
+ networkDuration,
1169
+ startTs: profileStartTs,
1170
+ endTs: profileEndTs,
1171
+ longFramesCount: __privateGet$2(this, _longFramesCount),
1172
+ longFramesTotalTime: __privateGet$2(this, _longFramesTotalTime),
1173
+ // @ts-ignore
1174
+ jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,
1175
+ // @ts-ignore
1176
+ usedJSHeapSize: performance.memory ? performance.memory.usedJSHeapSize : 0,
1177
+ // @ts-ignore
1178
+ totalJSHeapSize: performance.memory ? performance.memory.totalJSHeapSize : 0
1179
+ });
1180
+ __privateSet$2(this, _profileInProgress, null);
1181
+ __privateSet$2(this, _trailAnimationFrameId, null);
1182
+ }
1183
+ if (window.__runs) {
1184
+ window.__runs += `${Date.now()}, ${profileDuration + slowFramesTime}
1185
+ `;
1186
+ } else {
1187
+ window.__runs = `${Date.now()}, ${profileDuration + slowFramesTime}
1188
+ `;
1189
+ }
1190
+ }
1191
+ };
1192
+ __privateSet$2(this, _longFrameDetector, new LongFrameDetector());
1193
+ this.setupVisibilityChangeHandler();
1194
+ }
1195
+ setQueryController(queryController) {
1196
+ this.queryController = queryController;
1197
+ }
1198
+ setupVisibilityChangeHandler() {
1199
+ if (__privateGet$2(this, _visibilityChangeHandler)) {
1200
+ return;
1201
+ }
1202
+ __privateSet$2(this, _visibilityChangeHandler, () => {
1203
+ if (document.hidden && __privateGet$2(this, _profileInProgress)) {
1204
+ writeSceneLog("SceneRenderProfiler", "Tab became inactive, cancelling profile");
1205
+ this.cancelProfile();
1206
+ }
1207
+ });
1208
+ if (typeof document !== "undefined") {
1209
+ document.addEventListener("visibilitychange", __privateGet$2(this, _visibilityChangeHandler));
1210
+ }
1211
+ }
1212
+ cleanup() {
1213
+ if (__privateGet$2(this, _visibilityChangeHandler) && typeof document !== "undefined") {
1214
+ document.removeEventListener("visibilitychange", __privateGet$2(this, _visibilityChangeHandler));
1215
+ __privateSet$2(this, _visibilityChangeHandler, null);
1034
1216
  }
1217
+ __privateGet$2(this, _longFrameDetector).stop();
1218
+ this.cancelProfile();
1035
1219
  }
1036
- }
1037
- _running = new WeakMap();
1038
- _tryCompleteProfileFrameId = new WeakMap();
1039
-
1040
- function getQueryController(sceneObject) {
1041
- let parent = sceneObject;
1042
- while (parent) {
1043
- if (parent.state.$behaviors) {
1044
- for (const behavior of parent.state.$behaviors) {
1045
- if (isQueryController(behavior)) {
1046
- return behavior;
1047
- }
1220
+ startProfile(name) {
1221
+ if (document.hidden) {
1222
+ writeSceneLog("SceneRenderProfiler", "Tab is inactive, skipping profile", name);
1223
+ return;
1224
+ }
1225
+ if (__privateGet$2(this, _profileInProgress)) {
1226
+ if (__privateGet$2(this, _trailAnimationFrameId)) {
1227
+ this.cancelProfile();
1228
+ this._startNewProfile(name, true);
1229
+ } else {
1230
+ this.addCrumb(name);
1048
1231
  }
1232
+ } else {
1233
+ this._startNewProfile(name);
1049
1234
  }
1050
- parent = parent.parent;
1051
1235
  }
1052
- return void 0;
1053
- }
1054
-
1055
- class SceneDataNode extends SceneObjectBase {
1056
- constructor(state) {
1057
- super({
1058
- data: emptyPanelData,
1059
- ...state
1236
+ /**
1237
+ * Starts a new profile for performance measurement.
1238
+ *
1239
+ * @param name - The origin/trigger of the profile (e.g., 'time_range_change', 'variable_value_changed')
1240
+ * @param force - Whether this is a "forced" profile (true) or "clean" profile (false)
1241
+ * - "forced": Started by canceling an existing profile that was recording trailing frames
1242
+ * This happens when a new user interaction occurs before the previous one
1243
+ * finished measuring its performance impact
1244
+ * - "clean": Started when no profile is currently active
1245
+ */
1246
+ _startNewProfile(name, force = false) {
1247
+ var _a;
1248
+ __privateSet$2(this, _profileInProgress, { origin: name, crumbs: [] });
1249
+ __privateSet$2(this, _profileStartTs, performance.now());
1250
+ __privateSet$2(this, _longFramesCount, 0);
1251
+ __privateSet$2(this, _longFramesTotalTime, 0);
1252
+ if (typeof performance !== "undefined" && performance.mark) {
1253
+ const markName = `Dashboard Profile Start: ${name}`;
1254
+ performance.mark(markName);
1255
+ }
1256
+ writeSceneLogStyled(
1257
+ "SceneRenderProfiler",
1258
+ `Profile started[${force ? "forced" : "clean"}]`,
1259
+ "color: #FFCC00; font-weight: bold;"
1260
+ );
1261
+ writeSceneLog("", ` \u251C\u2500 Origin: ${((_a = __privateGet$2(this, _profileInProgress)) == null ? void 0 : _a.origin) || "unknown"}`);
1262
+ writeSceneLog("", ` \u2514\u2500 Timestamp: ${__privateGet$2(this, _profileStartTs).toFixed(1)}ms`);
1263
+ __privateGet$2(this, _longFrameDetector).start((event) => {
1264
+ if (!__privateGet$2(this, _profileInProgress) || !__privateGet$2(this, _profileStartTs)) {
1265
+ return;
1266
+ }
1267
+ if (event.timestamp < __privateGet$2(this, _profileStartTs)) {
1268
+ return;
1269
+ }
1270
+ __privateWrapper(this, _longFramesCount)._++;
1271
+ __privateSet$2(this, _longFramesTotalTime, __privateGet$2(this, _longFramesTotalTime) + event.duration);
1060
1272
  });
1061
1273
  }
1062
- getResultsStream() {
1063
- const result = {
1064
- origin: this,
1065
- data: this.state.data
1066
- };
1067
- return rxjs.of(result);
1068
- }
1069
- }
1070
- const emptyPanelData = {
1071
- state: schema.LoadingState.Done,
1072
- series: [],
1073
- timeRange: data.getDefaultTimeRange()
1074
- };
1075
-
1076
- class SceneObjectUrlSyncConfig {
1077
- constructor(_sceneObject, _options) {
1078
- this._sceneObject = _sceneObject;
1079
- this._nextChangeShouldAddHistoryStep = false;
1080
- this._keys = _options.keys;
1274
+ recordProfileTail(measurementStartTime, profileStartTs) {
1275
+ __privateSet$2(this, _trailAnimationFrameId, requestAnimationFrame(
1276
+ () => this.measureTrailingFrames(measurementStartTime, measurementStartTime, profileStartTs)
1277
+ ));
1081
1278
  }
1082
- getKeys() {
1083
- if (typeof this._keys === "function") {
1084
- return this._keys();
1279
+ tryCompletingProfile() {
1280
+ var _a;
1281
+ writeSceneLog("SceneRenderProfiler", "Trying to complete profile", __privateGet$2(this, _profileInProgress));
1282
+ if (((_a = this.queryController) == null ? void 0 : _a.runningQueriesCount()) === 0 && __privateGet$2(this, _profileInProgress)) {
1283
+ writeSceneLog("SceneRenderProfiler", "All queries completed, starting tail measurement");
1284
+ this.recordProfileTail(performance.now(), __privateGet$2(this, _profileStartTs));
1085
1285
  }
1086
- return this._keys;
1087
- }
1088
- getUrlState() {
1089
- return this._sceneObject.getUrlState();
1090
1286
  }
1091
- updateFromUrl(values) {
1092
- this._sceneObject.updateFromUrl(values);
1287
+ isTailRecording() {
1288
+ return Boolean(__privateGet$2(this, _trailAnimationFrameId));
1093
1289
  }
1094
- shouldCreateHistoryStep(values) {
1095
- return this._nextChangeShouldAddHistoryStep;
1290
+ cancelTailRecording() {
1291
+ if (__privateGet$2(this, _trailAnimationFrameId)) {
1292
+ cancelAnimationFrame(__privateGet$2(this, _trailAnimationFrameId));
1293
+ __privateSet$2(this, _trailAnimationFrameId, null);
1294
+ writeSceneLog("SceneRenderProfiler", "Cancelled recording frames, new profile started");
1295
+ }
1096
1296
  }
1097
- performBrowserHistoryAction(callback) {
1098
- this._nextChangeShouldAddHistoryStep = true;
1099
- callback();
1100
- this._nextChangeShouldAddHistoryStep = false;
1297
+ // cancel profile
1298
+ cancelProfile() {
1299
+ if (__privateGet$2(this, _profileInProgress)) {
1300
+ writeSceneLog("SceneRenderProfiler", "Cancelling profile", __privateGet$2(this, _profileInProgress));
1301
+ __privateSet$2(this, _profileInProgress, null);
1302
+ if (__privateGet$2(this, _trailAnimationFrameId)) {
1303
+ cancelAnimationFrame(__privateGet$2(this, _trailAnimationFrameId));
1304
+ __privateSet$2(this, _trailAnimationFrameId, null);
1305
+ }
1306
+ __privateGet$2(this, _longFrameDetector).stop();
1307
+ writeSceneLog("SceneRenderProfiler", "Stopped long frame detection - profile cancelled");
1308
+ __privateSet$2(this, _recordedTrailingSpans, []);
1309
+ __privateSet$2(this, _longFramesCount, 0);
1310
+ __privateSet$2(this, _longFramesTotalTime, 0);
1311
+ }
1101
1312
  }
1102
- }
1103
-
1104
- function getClosest(sceneObject, extract) {
1105
- let curSceneObject = sceneObject;
1106
- let extracted = void 0;
1107
- while (curSceneObject && !extracted) {
1108
- extracted = extract(curSceneObject);
1109
- curSceneObject = curSceneObject.parent;
1313
+ addCrumb(crumb) {
1314
+ if (__privateGet$2(this, _profileInProgress)) {
1315
+ writeSceneLog("SceneRenderProfiler", "Adding crumb:", crumb);
1316
+ __privateGet$2(this, _profileInProgress).crumbs.push(crumb);
1317
+ }
1110
1318
  }
1111
- return extracted;
1112
1319
  }
1113
-
1114
- const INTERVAL_STRING_REGEX = /^\d+[yYmMsSwWhHdD]$/;
1115
- function parseUrlParam(value) {
1116
- if (typeof value !== "string") {
1117
- return null;
1118
- }
1119
- if (value.indexOf("now") !== -1) {
1120
- return value;
1121
- }
1122
- if (INTERVAL_STRING_REGEX.test(value)) {
1123
- return value;
1124
- }
1125
- if (value.length === 8) {
1126
- const utcValue = data.toUtc(value, "YYYYMMDD");
1127
- if (utcValue.isValid()) {
1128
- return utcValue.toISOString();
1129
- }
1130
- } else if (value.length === 15) {
1131
- const utcValue = data.toUtc(value, "YYYYMMDDTHHmmss");
1132
- if (utcValue.isValid()) {
1133
- return utcValue.toISOString();
1134
- }
1135
- } else if (value.length === 19) {
1136
- const utcValue = data.toUtc(value, "YYYY-MM-DD HH:mm:ss");
1137
- if (utcValue.isValid()) {
1138
- return utcValue.toISOString();
1320
+ _profileInProgress = new WeakMap();
1321
+ _profileStartTs = new WeakMap();
1322
+ _trailAnimationFrameId = new WeakMap();
1323
+ _recordedTrailingSpans = new WeakMap();
1324
+ _longFrameDetector = new WeakMap();
1325
+ _longFramesCount = new WeakMap();
1326
+ _longFramesTotalTime = new WeakMap();
1327
+ _visibilityChangeHandler = new WeakMap();
1328
+ function processRecordedSpans(spans) {
1329
+ for (let i = spans.length - 1; i >= 0; i--) {
1330
+ if (spans[i] > DEFAULT_LONG_FRAME_THRESHOLD) {
1331
+ return spans.slice(0, i + 1);
1139
1332
  }
1140
- } else if (value.length === 24) {
1141
- const utcValue = data.toUtc(value);
1142
- return utcValue.toISOString();
1143
1333
  }
1144
- const epoch = parseInt(value, 10);
1145
- if (!isNaN(epoch)) {
1146
- return data.toUtc(epoch).toISOString();
1334
+ return [spans[0]];
1335
+ }
1336
+ function captureNetwork(startTs, endTs) {
1337
+ const entries = performance.getEntriesByType("resource");
1338
+ performance.clearResourceTimings();
1339
+ const networkEntries = entries.filter(
1340
+ (entry) => entry.startTime >= startTs && entry.startTime <= endTs && entry.responseEnd >= startTs && entry.responseEnd <= endTs
1341
+ );
1342
+ for (const entry of networkEntries) {
1343
+ performance.measure("Network entry " + entry.name, {
1344
+ start: entry.startTime,
1345
+ end: entry.responseEnd
1346
+ });
1147
1347
  }
1148
- return null;
1348
+ return calculateNetworkTime(networkEntries);
1149
1349
  }
1150
-
1151
- function evaluateTimeRange(from, to, timeZone, fiscalYearStartMonth, delay, weekStart) {
1152
- const hasDelay = delay && to === "now";
1153
- const now = Date.now();
1154
- if (weekStart) {
1155
- setWeekStartIfDifferent(weekStart);
1350
+ function calculateNetworkTime(requests) {
1351
+ if (requests.length === 0) {
1352
+ return 0;
1156
1353
  }
1157
- const parseOrToDateTime = (val, options) => {
1158
- if (data.dateMath.toDateTime) {
1159
- return data.dateMath.toDateTime(val, options);
1354
+ requests.sort((a, b) => a.startTime - b.startTime);
1355
+ let totalNetworkTime = 0;
1356
+ let currentStart = requests[0].startTime;
1357
+ let currentEnd = requests[0].responseEnd;
1358
+ for (let i = 1; i < requests.length; i++) {
1359
+ if (requests[i].startTime <= currentEnd) {
1360
+ currentEnd = Math.max(currentEnd, requests[i].responseEnd);
1160
1361
  } else {
1161
- return data.dateMath.parse(val, options.roundUp, options.timezone, options.fiscalYearStartMonth);
1162
- }
1163
- };
1164
- return {
1165
- to: parseOrToDateTime(hasDelay ? "now-" + delay : to, {
1166
- roundUp: true,
1167
- timezone: timeZone,
1168
- fiscalYearStartMonth,
1169
- now
1170
- }),
1171
- from: parseOrToDateTime(from, {
1172
- roundUp: false,
1173
- timezone: timeZone,
1174
- fiscalYearStartMonth,
1175
- now
1176
- }),
1177
- raw: {
1178
- from,
1179
- to
1362
+ totalNetworkTime += currentEnd - currentStart;
1363
+ currentStart = requests[i].startTime;
1364
+ currentEnd = requests[i].responseEnd;
1180
1365
  }
1181
- };
1182
- }
1183
- let prevWeekStart;
1184
- function setWeekStartIfDifferent(weekStart) {
1185
- if (weekStart !== prevWeekStart) {
1186
- prevWeekStart = weekStart;
1187
- data.setWeekStart(weekStart);
1188
- }
1189
- }
1190
-
1191
- function isValid$1(value, roundUp, timeZone) {
1192
- if (data.isDateTime(value)) {
1193
- return value.isValid();
1194
- }
1195
- if (data.dateMath.isMathString(value)) {
1196
- return data.dateMath.isValid(value);
1197
1366
  }
1198
- const parsed = data.dateTimeParse(value, { roundUp, timeZone });
1199
- return parsed.isValid();
1367
+ totalNetworkTime += currentEnd - currentStart;
1368
+ return totalNetworkTime;
1200
1369
  }
1370
+ const REFRESH_INTERACTION = "refresh";
1371
+ const TIME_RANGE_CHANGE_INTERACTION = "time_range_change";
1372
+ const FILTER_REMOVED_INTERACTION = "filter_removed";
1373
+ const FILTER_CHANGED_INTERACTION = "filter_changed";
1374
+ const FILTER_RESTORED_INTERACTION = "filter_restored";
1375
+ const VARIABLE_VALUE_CHANGED_INTERACTION = "variable_value_changed";
1376
+ const SCOPES_CHANGED_INTERACTION = "scopes_changed";
1201
1377
 
1202
1378
  class SceneTimeRange extends SceneObjectBase {
1203
1379
  constructor(state = {}) {
@@ -3784,13 +3960,10 @@ function GroupByVariableRenderer({ model }) {
3784
3960
  setUncommittedValue(newValue);
3785
3961
  },
3786
3962
  onOpenMenu: async () => {
3787
- const profiler = getInteractionProfiler(model);
3788
- profiler == null ? void 0 : profiler.startProfile(USER_INTERACTIONS.GROUPBY_DROPDOWN);
3789
3963
  setIsFetchingOptions(true);
3790
3964
  await rxjs.lastValueFrom(model.validateAndUpdate());
3791
3965
  setIsFetchingOptions(false);
3792
3966
  setIsOptionsOpen(true);
3793
- profiler == null ? void 0 : profiler.stopProfile();
3794
3967
  },
3795
3968
  onCloseMenu: () => {
3796
3969
  setIsOptionsOpen(false);
@@ -3840,13 +4013,10 @@ function GroupByVariableRenderer({ model }) {
3840
4013
  }
3841
4014
  },
3842
4015
  onOpenMenu: async () => {
3843
- const profiler = getInteractionProfiler(model);
3844
- profiler == null ? void 0 : profiler.startProfile(USER_INTERACTIONS.GROUPBY_DROPDOWN);
3845
4016
  setIsFetchingOptions(true);
3846
4017
  await rxjs.lastValueFrom(model.validateAndUpdate());
3847
4018
  setIsFetchingOptions(false);
3848
4019
  setIsOptionsOpen(true);
3849
- profiler == null ? void 0 : profiler.stopProfile();
3850
4020
  },
3851
4021
  onCloseMenu: () => {
3852
4022
  setIsOptionsOpen(false);
@@ -5011,11 +5181,6 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
5011
5181
  const handleFetchOptions = React.useCallback(
5012
5182
  async (inputType) => {
5013
5183
  var _a2;
5014
- const profiler = getInteractionProfiler(model);
5015
- const interactionName = inputType === "key" ? USER_INTERACTIONS.ADHOC_KEYS_DROPDOWN : USER_INTERACTIONS.ADHOC_VALUES_DROPDOWN;
5016
- if (inputType !== "operator") {
5017
- profiler == null ? void 0 : profiler.startProfile(interactionName);
5018
- }
5019
5184
  setOptionsError(false);
5020
5185
  setOptionsLoading(true);
5021
5186
  setOptions([]);
@@ -5029,7 +5194,6 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
5029
5194
  options2 = await model._getValuesFor(filter);
5030
5195
  }
5031
5196
  if (filterInputTypeRef.current !== inputType) {
5032
- profiler == null ? void 0 : profiler.stopProfile();
5033
5197
  return;
5034
5198
  }
5035
5199
  setOptions(options2);
@@ -5042,7 +5206,6 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
5042
5206
  setOptionsError(true);
5043
5207
  }
5044
5208
  setOptionsLoading(false);
5045
- profiler == null ? void 0 : profiler.stopProfile();
5046
5209
  },
5047
5210
  [filter, model]
5048
5211
  );
@@ -8090,7 +8253,6 @@ const sceneGraph = {
8090
8253
  findAllObjects,
8091
8254
  getAncestor,
8092
8255
  getQueryController,
8093
- getInteractionProfiler,
8094
8256
  findDescendents,
8095
8257
  getScopes
8096
8258
  };
@@ -9590,7 +9752,6 @@ var index$1 = /*#__PURE__*/Object.freeze({
9590
9752
  ActWhenVariableChanged: ActWhenVariableChanged,
9591
9753
  CursorSync: CursorSync,
9592
9754
  LiveNowTimer: LiveNowTimer,
9593
- SceneInteractionProfiler: SceneInteractionProfiler,
9594
9755
  SceneQueryController: SceneQueryController
9595
9756
  });
9596
9757
 
@@ -11634,15 +11795,14 @@ function SceneGridLayoutRenderer({ model }) {
11634
11795
  ))
11635
11796
  );
11636
11797
  };
11637
- return /* @__PURE__ */ React__default.default.createElement(
11638
- "div",
11639
- {
11640
- ref: outerDivRef,
11641
- style: { flex: "1 1 auto", position: "relative", zIndex: 1, width: "100%" }
11642
- },
11643
- renderGrid(width, height)
11644
- );
11798
+ return /* @__PURE__ */ React__default.default.createElement("div", { ref: outerDivRef, className: gridWrapperClass }, renderGrid(width, height));
11645
11799
  }
11800
+ const gridWrapperClass = css.css({
11801
+ flex: "1 1 auto",
11802
+ position: "relative",
11803
+ zIndex: 1,
11804
+ width: "100%"
11805
+ });
11646
11806
  const GridItemWrapper = React__default.default.forwardRef((props, ref) => {
11647
11807
  var _a;
11648
11808
  const { grid, layoutItem, index, totalCount, isLazy, style, onLoad, onChange, children, ...divProps } = props;
@@ -11847,6 +12007,20 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
11847
12007
  }
11848
12008
  };
11849
12009
  }
12010
+ adjustYPositions(after, amount) {
12011
+ for (const child of this.state.children) {
12012
+ if (child.state.y > after) {
12013
+ child.setState({ y: child.state.y + amount });
12014
+ }
12015
+ if (child instanceof SceneGridRow) {
12016
+ for (const rowChild of child.state.children) {
12017
+ if (rowChild.state.y > after) {
12018
+ rowChild.setState({ y: rowChild.state.y + amount });
12019
+ }
12020
+ }
12021
+ }
12022
+ }
12023
+ }
11850
12024
  toggleRow(row) {
11851
12025
  var _a, _b;
11852
12026
  const isCollapsed = row.state.isCollapsed;
@@ -14887,25 +15061,25 @@ const VizConfigBuilders = {
14887
15061
 
14888
15062
  function __variableDynamicImportRuntime0__(path) {
14889
15063
  switch (path) {
14890
- case '../locales/cs-CZ/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CY85TD5F.js'); });
14891
- case '../locales/de-DE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-n10eQkNF.js'); });
15064
+ case '../locales/cs-CZ/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BcDO8gk4.js'); });
15065
+ case '../locales/de-DE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CzZTvOrf.js'); });
14892
15066
  case '../locales/en-US/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-C_CT7peT.js'); });
14893
- case '../locales/es-ES/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-YMli37Xh.js'); });
14894
- case '../locales/fr-FR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-DXM1LI4B.js'); });
14895
- case '../locales/hu-HU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-DlUSL8jI.js'); });
14896
- case '../locales/id-ID/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-D5qs_fc9.js'); });
14897
- case '../locales/it-IT/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-Dy2CLUY9.js'); });
14898
- case '../locales/ja-JP/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CBRfJ-2H.js'); });
14899
- case '../locales/ko-KR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CgIzGE5F.js'); });
14900
- case '../locales/nl-NL/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-Br6NPcwR.js'); });
14901
- case '../locales/pl-PL/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-B3ypGD5T.js'); });
14902
- case '../locales/pt-BR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-COr0P0oM.js'); });
14903
- case '../locales/pt-PT/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-Cub9Gl0n.js'); });
14904
- case '../locales/ru-RU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BGCbMCFm.js'); });
14905
- case '../locales/sv-SE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CqRf9pRc.js'); });
14906
- case '../locales/tr-TR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CeVkPanY.js'); });
14907
- case '../locales/zh-Hans/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-DObtL2WT.js'); });
14908
- case '../locales/zh-Hant/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-B0JDDOYY.js'); });
15067
+ case '../locales/es-ES/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-zGpJY4O3.js'); });
15068
+ case '../locales/fr-FR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CfoPR_PZ.js'); });
15069
+ case '../locales/hu-HU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CoXR5Z7T.js'); });
15070
+ case '../locales/id-ID/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-kfW02M-K.js'); });
15071
+ case '../locales/it-IT/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CMtHJ23j.js'); });
15072
+ case '../locales/ja-JP/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-cTJt4LR7.js'); });
15073
+ case '../locales/ko-KR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BbJq3cEa.js'); });
15074
+ case '../locales/nl-NL/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BwQ_A3lk.js'); });
15075
+ case '../locales/pl-PL/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BbRDYrqK.js'); });
15076
+ case '../locales/pt-BR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-naZktXG6.js'); });
15077
+ case '../locales/pt-PT/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CixWq8rH.js'); });
15078
+ case '../locales/ru-RU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-VOzZRdKp.js'); });
15079
+ case '../locales/sv-SE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BtGEpoZT.js'); });
15080
+ case '../locales/tr-TR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CqMfWT-f.js'); });
15081
+ case '../locales/zh-Hans/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CS09sc_L.js'); });
15082
+ case '../locales/zh-Hant/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-C-CibbsO.js'); });
14909
15083
  default: return new Promise(function(resolve, reject) {
14910
15084
  (typeof queueMicrotask === 'function' ? queueMicrotask : setTimeout)(
14911
15085
  reject.bind(null, new Error("Unknown variable dynamic import: " + path))
@@ -15028,6 +15202,7 @@ exports.VizPanelExploreButton = VizPanelExploreButton;
15028
15202
  exports.VizPanelMenu = VizPanelMenu;
15029
15203
  exports.behaviors = index$1;
15030
15204
  exports.dataLayers = index;
15205
+ exports.escapeUrlPipeDelimiters = escapeUrlPipeDelimiters;
15031
15206
  exports.formatRegistry = formatRegistry;
15032
15207
  exports.getExploreURL = getExploreURL;
15033
15208
  exports.isCustomVariableValue = isCustomVariableValue;