@grafana/scenes 6.35.1--canary.1235.17607489973.0 → 6.35.1--canary.1148.17638385485.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/behaviors/SceneRenderProfiler.js +19 -103
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +8 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/esm/components/layout/LazyLoader.js +6 -2
- package/dist/esm/components/layout/LazyLoader.js.map +1 -1
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +14 -0
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/utils/writeSceneLog.js +1 -10
- package/dist/esm/utils/writeSceneLog.js.map +1 -1
- package/dist/index.d.ts +7 -29
- package/dist/index.js +130 -379
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/esm/behaviors/LongFrameDetector.js +0 -185
- package/dist/esm/behaviors/LongFrameDetector.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -137,21 +137,21 @@ class UserActionEvent extends data.BusEventWithPayload {
|
|
|
137
137
|
}
|
|
138
138
|
UserActionEvent.type = "scene-object-user-action";
|
|
139
139
|
|
|
140
|
-
var __typeError$
|
|
140
|
+
var __typeError$4 = (msg) => {
|
|
141
141
|
throw TypeError(msg);
|
|
142
142
|
};
|
|
143
|
-
var __accessCheck$
|
|
144
|
-
var __privateGet$
|
|
145
|
-
var __privateAdd$
|
|
146
|
-
var __privateSet$
|
|
143
|
+
var __accessCheck$4 = (obj, member, msg) => member.has(obj) || __typeError$4("Cannot " + msg);
|
|
144
|
+
var __privateGet$4 = (obj, member, getter) => (__accessCheck$4(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
145
|
+
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);
|
|
146
|
+
var __privateSet$4 = (obj, member, value, setter) => (__accessCheck$4(obj, member, "write to private field"), member.set(obj, value), value);
|
|
147
147
|
var _ref;
|
|
148
148
|
class SceneObjectRef {
|
|
149
149
|
constructor(ref) {
|
|
150
|
-
__privateAdd$
|
|
151
|
-
__privateSet$
|
|
150
|
+
__privateAdd$4(this, _ref);
|
|
151
|
+
__privateSet$4(this, _ref, ref);
|
|
152
152
|
}
|
|
153
153
|
resolve() {
|
|
154
|
-
return __privateGet$
|
|
154
|
+
return __privateGet$4(this, _ref);
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
_ref = new WeakMap();
|
|
@@ -599,23 +599,14 @@ 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
|
-
}
|
|
611
602
|
|
|
612
|
-
var __typeError$
|
|
603
|
+
var __typeError$3 = (msg) => {
|
|
613
604
|
throw TypeError(msg);
|
|
614
605
|
};
|
|
615
|
-
var __accessCheck$
|
|
616
|
-
var __privateGet$
|
|
617
|
-
var __privateAdd$
|
|
618
|
-
var __privateSet$
|
|
606
|
+
var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$3("Cannot " + msg);
|
|
607
|
+
var __privateGet$3 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
608
|
+
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);
|
|
609
|
+
var __privateSet$3 = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), member.set(obj, value), value);
|
|
619
610
|
var _running, _tryCompleteProfileFrameId;
|
|
620
611
|
function isQueryController(s) {
|
|
621
612
|
return "isQueryController" in s;
|
|
@@ -625,10 +616,10 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
625
616
|
super({ ...state, isRunning: false });
|
|
626
617
|
this.profiler = profiler;
|
|
627
618
|
this.isQueryController = true;
|
|
628
|
-
__privateAdd$
|
|
629
|
-
__privateAdd$
|
|
619
|
+
__privateAdd$3(this, _running, /* @__PURE__ */ new Set());
|
|
620
|
+
__privateAdd$3(this, _tryCompleteProfileFrameId, null);
|
|
630
621
|
this.runningQueriesCount = () => {
|
|
631
|
-
return __privateGet$
|
|
622
|
+
return __privateGet$3(this, _running).size;
|
|
632
623
|
};
|
|
633
624
|
if (profiler) {
|
|
634
625
|
this.profiler = profiler;
|
|
@@ -637,7 +628,7 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
637
628
|
this.addActivationHandler(() => {
|
|
638
629
|
var _a;
|
|
639
630
|
(_a = this.profiler) == null ? void 0 : _a.setQueryController(this);
|
|
640
|
-
return () => __privateGet$
|
|
631
|
+
return () => __privateGet$3(this, _running).clear();
|
|
641
632
|
});
|
|
642
633
|
}
|
|
643
634
|
startProfile(name) {
|
|
@@ -652,19 +643,19 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
652
643
|
(_a = this.profiler) == null ? void 0 : _a.cancelProfile();
|
|
653
644
|
}
|
|
654
645
|
queryStarted(entry) {
|
|
655
|
-
__privateGet$
|
|
646
|
+
__privateGet$3(this, _running).add(entry);
|
|
656
647
|
this.changeRunningQueryCount(1, entry);
|
|
657
648
|
if (!this.state.isRunning) {
|
|
658
649
|
this.setState({ isRunning: true });
|
|
659
650
|
}
|
|
660
651
|
}
|
|
661
652
|
queryCompleted(entry) {
|
|
662
|
-
if (!__privateGet$
|
|
653
|
+
if (!__privateGet$3(this, _running).has(entry)) {
|
|
663
654
|
return;
|
|
664
655
|
}
|
|
665
|
-
__privateGet$
|
|
656
|
+
__privateGet$3(this, _running).delete(entry);
|
|
666
657
|
this.changeRunningQueryCount(-1);
|
|
667
|
-
if (__privateGet$
|
|
658
|
+
if (__privateGet$3(this, _running).size === 0) {
|
|
668
659
|
this.setState({ isRunning: false });
|
|
669
660
|
}
|
|
670
661
|
}
|
|
@@ -681,10 +672,10 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
681
672
|
}
|
|
682
673
|
}
|
|
683
674
|
if (this.state.enableProfiling) {
|
|
684
|
-
if (__privateGet$
|
|
685
|
-
cancelAnimationFrame(__privateGet$
|
|
675
|
+
if (__privateGet$3(this, _tryCompleteProfileFrameId)) {
|
|
676
|
+
cancelAnimationFrame(__privateGet$3(this, _tryCompleteProfileFrameId));
|
|
686
677
|
}
|
|
687
|
-
__privateSet$
|
|
678
|
+
__privateSet$3(this, _tryCompleteProfileFrameId, requestAnimationFrame(() => {
|
|
688
679
|
var _a2;
|
|
689
680
|
(_a2 = this.profiler) == null ? void 0 : _a2.tryCompletingProfile();
|
|
690
681
|
}));
|
|
@@ -692,7 +683,7 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
692
683
|
}
|
|
693
684
|
cancelAll() {
|
|
694
685
|
var _a;
|
|
695
|
-
for (const entry of __privateGet$
|
|
686
|
+
for (const entry of __privateGet$3(this, _running).values()) {
|
|
696
687
|
(_a = entry.cancel) == null ? void 0 : _a.call(entry);
|
|
697
688
|
}
|
|
698
689
|
}
|
|
@@ -862,187 +853,6 @@ function isValid$1(value, roundUp, timeZone) {
|
|
|
862
853
|
return parsed.isValid();
|
|
863
854
|
}
|
|
864
855
|
|
|
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
856
|
var __typeError$2 = (msg) => {
|
|
1047
857
|
throw TypeError(msg);
|
|
1048
858
|
};
|
|
@@ -1050,17 +860,9 @@ var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Ca
|
|
|
1050
860
|
var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
1051
861
|
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
862
|
var __privateSet$2 = (obj, member, value, setter) => (__accessCheck$2(obj, member, "write to private field"), member.set(obj, value), value);
|
|
1053
|
-
var
|
|
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;
|
|
863
|
+
var _profileInProgress, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans, _visibilityChangeHandler;
|
|
1062
864
|
const POST_STORM_WINDOW = 2e3;
|
|
1063
|
-
const
|
|
865
|
+
const SPAN_THRESHOLD = 30;
|
|
1064
866
|
const TAB_INACTIVE_THRESHOLD = 1e3;
|
|
1065
867
|
class SceneRenderProfiler {
|
|
1066
868
|
constructor(queryController) {
|
|
@@ -1070,13 +872,9 @@ class SceneRenderProfiler {
|
|
|
1070
872
|
__privateAdd$2(this, _trailAnimationFrameId, null);
|
|
1071
873
|
// Will keep measured lengths trailing frames
|
|
1072
874
|
__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
875
|
__privateAdd$2(this, _visibilityChangeHandler, null);
|
|
1078
876
|
this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
|
|
1079
|
-
var _a
|
|
877
|
+
var _a;
|
|
1080
878
|
const currentFrameTime = performance.now();
|
|
1081
879
|
const frameLength = currentFrameTime - lastFrameTime;
|
|
1082
880
|
if (frameLength > TAB_INACTIVE_THRESHOLD) {
|
|
@@ -1095,60 +893,18 @@ class SceneRenderProfiler {
|
|
|
1095
893
|
const slowFrames = processRecordedSpans(__privateGet$2(this, _recordedTrailingSpans));
|
|
1096
894
|
const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);
|
|
1097
895
|
writeSceneLog(
|
|
1098
|
-
|
|
1099
|
-
|
|
896
|
+
this.constructor.name,
|
|
897
|
+
"Profile tail recorded, slow frames duration:",
|
|
898
|
+
slowFramesTime,
|
|
899
|
+
slowFrames,
|
|
900
|
+
__privateGet$2(this, _profileInProgress)
|
|
1100
901
|
);
|
|
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
902
|
__privateSet$2(this, _recordedTrailingSpans, []);
|
|
1104
903
|
const profileDuration = measurementStartTs - profileStartTs;
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
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;"
|
|
904
|
+
writeSceneLog(
|
|
905
|
+
this.constructor.name,
|
|
906
|
+
"Stoped recording, total measured time (network included):",
|
|
907
|
+
profileDuration + slowFramesTime
|
|
1152
908
|
);
|
|
1153
909
|
__privateSet$2(this, _trailAnimationFrameId, null);
|
|
1154
910
|
const profileEndTs = profileStartTs + profileDuration + slowFramesTime;
|
|
@@ -1160,7 +916,7 @@ class SceneRenderProfiler {
|
|
|
1160
916
|
end: profileEndTs
|
|
1161
917
|
});
|
|
1162
918
|
const networkDuration = captureNetwork(profileStartTs, profileEndTs);
|
|
1163
|
-
if (((
|
|
919
|
+
if (((_a = this.queryController) == null ? void 0 : _a.state.onProfileComplete) && __privateGet$2(this, _profileInProgress)) {
|
|
1164
920
|
this.queryController.state.onProfileComplete({
|
|
1165
921
|
origin: __privateGet$2(this, _profileInProgress).origin,
|
|
1166
922
|
crumbs: __privateGet$2(this, _profileInProgress).crumbs,
|
|
@@ -1168,8 +924,6 @@ class SceneRenderProfiler {
|
|
|
1168
924
|
networkDuration,
|
|
1169
925
|
startTs: profileStartTs,
|
|
1170
926
|
endTs: profileEndTs,
|
|
1171
|
-
longFramesCount: __privateGet$2(this, _longFramesCount),
|
|
1172
|
-
longFramesTotalTime: __privateGet$2(this, _longFramesTotalTime),
|
|
1173
927
|
// @ts-ignore
|
|
1174
928
|
jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,
|
|
1175
929
|
// @ts-ignore
|
|
@@ -1189,7 +943,6 @@ class SceneRenderProfiler {
|
|
|
1189
943
|
}
|
|
1190
944
|
}
|
|
1191
945
|
};
|
|
1192
|
-
__privateSet$2(this, _longFrameDetector, new LongFrameDetector());
|
|
1193
946
|
this.setupVisibilityChangeHandler();
|
|
1194
947
|
}
|
|
1195
948
|
setQueryController(queryController) {
|
|
@@ -1214,7 +967,6 @@ class SceneRenderProfiler {
|
|
|
1214
967
|
document.removeEventListener("visibilitychange", __privateGet$2(this, _visibilityChangeHandler));
|
|
1215
968
|
__privateSet$2(this, _visibilityChangeHandler, null);
|
|
1216
969
|
}
|
|
1217
|
-
__privateGet$2(this, _longFrameDetector).stop();
|
|
1218
970
|
this.cancelProfile();
|
|
1219
971
|
}
|
|
1220
972
|
startProfile(name) {
|
|
@@ -1244,32 +996,14 @@ class SceneRenderProfiler {
|
|
|
1244
996
|
* - "clean": Started when no profile is currently active
|
|
1245
997
|
*/
|
|
1246
998
|
_startNewProfile(name, force = false) {
|
|
1247
|
-
var _a;
|
|
1248
999
|
__privateSet$2(this, _profileInProgress, { origin: name, crumbs: [] });
|
|
1249
1000
|
__privateSet$2(this, _profileStartTs, performance.now());
|
|
1250
|
-
|
|
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(
|
|
1001
|
+
writeSceneLog(
|
|
1257
1002
|
"SceneRenderProfiler",
|
|
1258
1003
|
`Profile started[${force ? "forced" : "clean"}]`,
|
|
1259
|
-
|
|
1004
|
+
__privateGet$2(this, _profileInProgress),
|
|
1005
|
+
__privateGet$2(this, _profileStartTs)
|
|
1260
1006
|
);
|
|
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);
|
|
1272
|
-
});
|
|
1273
1007
|
}
|
|
1274
1008
|
recordProfileTail(measurementStartTime, profileStartTs) {
|
|
1275
1009
|
__privateSet$2(this, _trailAnimationFrameId, requestAnimationFrame(
|
|
@@ -1280,7 +1014,7 @@ class SceneRenderProfiler {
|
|
|
1280
1014
|
var _a;
|
|
1281
1015
|
writeSceneLog("SceneRenderProfiler", "Trying to complete profile", __privateGet$2(this, _profileInProgress));
|
|
1282
1016
|
if (((_a = this.queryController) == null ? void 0 : _a.runningQueriesCount()) === 0 && __privateGet$2(this, _profileInProgress)) {
|
|
1283
|
-
writeSceneLog("SceneRenderProfiler", "All queries completed,
|
|
1017
|
+
writeSceneLog("SceneRenderProfiler", "All queries completed, stopping profile");
|
|
1284
1018
|
this.recordProfileTail(performance.now(), __privateGet$2(this, _profileStartTs));
|
|
1285
1019
|
}
|
|
1286
1020
|
}
|
|
@@ -1303,11 +1037,7 @@ class SceneRenderProfiler {
|
|
|
1303
1037
|
cancelAnimationFrame(__privateGet$2(this, _trailAnimationFrameId));
|
|
1304
1038
|
__privateSet$2(this, _trailAnimationFrameId, null);
|
|
1305
1039
|
}
|
|
1306
|
-
__privateGet$2(this, _longFrameDetector).stop();
|
|
1307
|
-
writeSceneLog("SceneRenderProfiler", "Stopped long frame detection - profile cancelled");
|
|
1308
1040
|
__privateSet$2(this, _recordedTrailingSpans, []);
|
|
1309
|
-
__privateSet$2(this, _longFramesCount, 0);
|
|
1310
|
-
__privateSet$2(this, _longFramesTotalTime, 0);
|
|
1311
1041
|
}
|
|
1312
1042
|
}
|
|
1313
1043
|
addCrumb(crumb) {
|
|
@@ -1321,13 +1051,10 @@ _profileInProgress = new WeakMap();
|
|
|
1321
1051
|
_profileStartTs = new WeakMap();
|
|
1322
1052
|
_trailAnimationFrameId = new WeakMap();
|
|
1323
1053
|
_recordedTrailingSpans = new WeakMap();
|
|
1324
|
-
_longFrameDetector = new WeakMap();
|
|
1325
|
-
_longFramesCount = new WeakMap();
|
|
1326
|
-
_longFramesTotalTime = new WeakMap();
|
|
1327
1054
|
_visibilityChangeHandler = new WeakMap();
|
|
1328
1055
|
function processRecordedSpans(spans) {
|
|
1329
1056
|
for (let i = spans.length - 1; i >= 0; i--) {
|
|
1330
|
-
if (spans[i] >
|
|
1057
|
+
if (spans[i] > SPAN_THRESHOLD) {
|
|
1331
1058
|
return spans.slice(0, i + 1);
|
|
1332
1059
|
}
|
|
1333
1060
|
}
|
|
@@ -6764,6 +6491,8 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
6764
6491
|
this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });
|
|
6765
6492
|
this._results.next({ origin: this, data: dataWithLayersApplied });
|
|
6766
6493
|
};
|
|
6494
|
+
this._isInView = true;
|
|
6495
|
+
this._queryNotExecutedWhenOutOfView = false;
|
|
6767
6496
|
this.addActivationHandler(() => this._onActivate());
|
|
6768
6497
|
}
|
|
6769
6498
|
getResultsStream() {
|
|
@@ -6985,6 +6714,11 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
6985
6714
|
if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {
|
|
6986
6715
|
return;
|
|
6987
6716
|
}
|
|
6717
|
+
if (this.isQueryModeAuto() && !this._isInView) {
|
|
6718
|
+
this._queryNotExecutedWhenOutOfView = true;
|
|
6719
|
+
return;
|
|
6720
|
+
}
|
|
6721
|
+
this._queryNotExecutedWhenOutOfView = false;
|
|
6988
6722
|
if (!this._dataLayersSub) {
|
|
6989
6723
|
this._handleDataLayers();
|
|
6990
6724
|
}
|
|
@@ -7148,6 +6882,13 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
7148
6882
|
var _a;
|
|
7149
6883
|
return ((_a = this.state.runQueriesMode) != null ? _a : "auto") === "auto";
|
|
7150
6884
|
}
|
|
6885
|
+
isInViewChanged(isInView) {
|
|
6886
|
+
writeSceneLog("SceneQueryRunner", `isInViewChanged: ${isInView}`, this.state.key);
|
|
6887
|
+
this._isInView = isInView;
|
|
6888
|
+
if (isInView && this._queryNotExecutedWhenOutOfView) {
|
|
6889
|
+
this.runQueries();
|
|
6890
|
+
}
|
|
6891
|
+
}
|
|
7151
6892
|
}
|
|
7152
6893
|
function findFirstDatasource(targets) {
|
|
7153
6894
|
var _a, _b;
|
|
@@ -8588,6 +8329,71 @@ const getStyles$8 = (theme) => ({
|
|
|
8588
8329
|
})
|
|
8589
8330
|
});
|
|
8590
8331
|
|
|
8332
|
+
function useUniqueId() {
|
|
8333
|
+
var _a;
|
|
8334
|
+
const idRefLazy = React.useRef(void 0);
|
|
8335
|
+
(_a = idRefLazy.current) != null ? _a : idRefLazy.current = lodash.uniqueId();
|
|
8336
|
+
return idRefLazy.current;
|
|
8337
|
+
}
|
|
8338
|
+
const LazyLoader = React__default.default.forwardRef(
|
|
8339
|
+
({ children, onLoad, onChange, className, ...rest }, ref) => {
|
|
8340
|
+
const id = useUniqueId();
|
|
8341
|
+
const { hideEmpty } = ui.useStyles2(getStyles$7);
|
|
8342
|
+
const [loaded, setLoaded] = React.useState(false);
|
|
8343
|
+
const [isInView, setIsInView] = React.useState(false);
|
|
8344
|
+
const innerRef = React.useRef(null);
|
|
8345
|
+
React.useImperativeHandle(ref, () => innerRef.current);
|
|
8346
|
+
reactUse.useEffectOnce(() => {
|
|
8347
|
+
LazyLoader.addCallback(id, (entry) => {
|
|
8348
|
+
if (!loaded && entry.isIntersecting) {
|
|
8349
|
+
setLoaded(true);
|
|
8350
|
+
onLoad == null ? void 0 : onLoad();
|
|
8351
|
+
}
|
|
8352
|
+
setIsInView(entry.isIntersecting);
|
|
8353
|
+
onChange == null ? void 0 : onChange(entry.isIntersecting);
|
|
8354
|
+
});
|
|
8355
|
+
const wrapperEl = innerRef.current;
|
|
8356
|
+
if (wrapperEl) {
|
|
8357
|
+
LazyLoader.observer.observe(wrapperEl);
|
|
8358
|
+
}
|
|
8359
|
+
return () => {
|
|
8360
|
+
wrapperEl && LazyLoader.observer.unobserve(wrapperEl);
|
|
8361
|
+
delete LazyLoader.callbacks[id];
|
|
8362
|
+
if (Object.keys(LazyLoader.callbacks).length === 0) {
|
|
8363
|
+
LazyLoader.observer.disconnect();
|
|
8364
|
+
}
|
|
8365
|
+
};
|
|
8366
|
+
});
|
|
8367
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { id, ref: innerRef, className: `${hideEmpty} ${className}`, ...rest }, !loaded || !isInView ? i18n.t("grafana-scenes.components.lazy-loader.placeholder", "\xA0") : /* @__PURE__ */ React__default.default.createElement(LazyLoaderInViewContext.Provider, { value: isInView }, children));
|
|
8368
|
+
}
|
|
8369
|
+
);
|
|
8370
|
+
function getStyles$7() {
|
|
8371
|
+
return {
|
|
8372
|
+
hideEmpty: css.css({
|
|
8373
|
+
"&:empty": {
|
|
8374
|
+
display: "none"
|
|
8375
|
+
}
|
|
8376
|
+
})
|
|
8377
|
+
};
|
|
8378
|
+
}
|
|
8379
|
+
LazyLoader.displayName = "LazyLoader";
|
|
8380
|
+
LazyLoader.callbacks = {};
|
|
8381
|
+
LazyLoader.addCallback = (id, c) => LazyLoader.callbacks[id] = c;
|
|
8382
|
+
LazyLoader.observer = new IntersectionObserver(
|
|
8383
|
+
(entries) => {
|
|
8384
|
+
for (const entry of entries) {
|
|
8385
|
+
if (typeof LazyLoader.callbacks[entry.target.id] === "function") {
|
|
8386
|
+
LazyLoader.callbacks[entry.target.id](entry);
|
|
8387
|
+
}
|
|
8388
|
+
}
|
|
8389
|
+
},
|
|
8390
|
+
{ rootMargin: "100px" }
|
|
8391
|
+
);
|
|
8392
|
+
const LazyLoaderInViewContext = React__default.default.createContext(true);
|
|
8393
|
+
function useLazyLoaderIsInView() {
|
|
8394
|
+
return React__default.default.useContext(LazyLoaderInViewContext);
|
|
8395
|
+
}
|
|
8396
|
+
|
|
8591
8397
|
function VizPanelRenderer({ model }) {
|
|
8592
8398
|
var _a;
|
|
8593
8399
|
const {
|
|
@@ -8630,6 +8436,12 @@ function VizPanelRenderer({ model }) {
|
|
|
8630
8436
|
const sceneTimeRange = sceneGraph.getTimeRange(model);
|
|
8631
8437
|
const timeZone = sceneTimeRange.getTimeZone();
|
|
8632
8438
|
const timeRange = model.getTimeRange(dataWithFieldConfig);
|
|
8439
|
+
const isInView = useLazyLoaderIsInView();
|
|
8440
|
+
React.useEffect(() => {
|
|
8441
|
+
if (dataObject.isInViewChanged) {
|
|
8442
|
+
dataObject.isInViewChanged(isInView);
|
|
8443
|
+
}
|
|
8444
|
+
}, [isInView, dataObject]);
|
|
8633
8445
|
const titleInterpolated = model.interpolate(title, void 0, "text");
|
|
8634
8446
|
const alertStateStyles = ui.useStyles2(getAlertStateStyles);
|
|
8635
8447
|
if (!plugin) {
|
|
@@ -11491,10 +11303,10 @@ class EmbeddedScene extends SceneObjectBase {
|
|
|
11491
11303
|
EmbeddedScene.Component = EmbeddedSceneRenderer;
|
|
11492
11304
|
function EmbeddedSceneRenderer({ model }) {
|
|
11493
11305
|
const { body, controls } = model.useState();
|
|
11494
|
-
const styles = ui.useStyles2(getStyles$
|
|
11306
|
+
const styles = ui.useStyles2(getStyles$6);
|
|
11495
11307
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: styles.container }, controls && /* @__PURE__ */ React__default.default.createElement("div", { className: styles.controls }, controls.map((control) => /* @__PURE__ */ React__default.default.createElement(control.Component, { key: control.state.key, model: control }))), /* @__PURE__ */ React__default.default.createElement("div", { className: styles.body }, /* @__PURE__ */ React__default.default.createElement(body.Component, { model: body })));
|
|
11496
11308
|
}
|
|
11497
|
-
const getStyles$
|
|
11309
|
+
const getStyles$6 = (theme) => {
|
|
11498
11310
|
return {
|
|
11499
11311
|
container: css.css({
|
|
11500
11312
|
flexGrow: 1,
|
|
@@ -11680,67 +11492,6 @@ function isSceneGridLayout(child) {
|
|
|
11680
11492
|
return child instanceof SceneGridLayout;
|
|
11681
11493
|
}
|
|
11682
11494
|
|
|
11683
|
-
function useUniqueId() {
|
|
11684
|
-
var _a;
|
|
11685
|
-
const idRefLazy = React.useRef(void 0);
|
|
11686
|
-
(_a = idRefLazy.current) != null ? _a : idRefLazy.current = lodash.uniqueId();
|
|
11687
|
-
return idRefLazy.current;
|
|
11688
|
-
}
|
|
11689
|
-
const LazyLoader = React__default.default.forwardRef(
|
|
11690
|
-
({ children, onLoad, onChange, className, ...rest }, ref) => {
|
|
11691
|
-
const id = useUniqueId();
|
|
11692
|
-
const { hideEmpty } = ui.useStyles2(getStyles$6);
|
|
11693
|
-
const [loaded, setLoaded] = React.useState(false);
|
|
11694
|
-
const [isInView, setIsInView] = React.useState(false);
|
|
11695
|
-
const innerRef = React.useRef(null);
|
|
11696
|
-
React.useImperativeHandle(ref, () => innerRef.current);
|
|
11697
|
-
reactUse.useEffectOnce(() => {
|
|
11698
|
-
LazyLoader.addCallback(id, (entry) => {
|
|
11699
|
-
if (!loaded && entry.isIntersecting) {
|
|
11700
|
-
setLoaded(true);
|
|
11701
|
-
onLoad == null ? void 0 : onLoad();
|
|
11702
|
-
}
|
|
11703
|
-
setIsInView(entry.isIntersecting);
|
|
11704
|
-
onChange == null ? void 0 : onChange(entry.isIntersecting);
|
|
11705
|
-
});
|
|
11706
|
-
const wrapperEl = innerRef.current;
|
|
11707
|
-
if (wrapperEl) {
|
|
11708
|
-
LazyLoader.observer.observe(wrapperEl);
|
|
11709
|
-
}
|
|
11710
|
-
return () => {
|
|
11711
|
-
wrapperEl && LazyLoader.observer.unobserve(wrapperEl);
|
|
11712
|
-
delete LazyLoader.callbacks[id];
|
|
11713
|
-
if (Object.keys(LazyLoader.callbacks).length === 0) {
|
|
11714
|
-
LazyLoader.observer.disconnect();
|
|
11715
|
-
}
|
|
11716
|
-
};
|
|
11717
|
-
});
|
|
11718
|
-
return /* @__PURE__ */ React__default.default.createElement("div", { id, ref: innerRef, className: `${hideEmpty} ${className}`, ...rest }, !loaded || !isInView ? i18n.t("grafana-scenes.components.lazy-loader.placeholder", "\xA0") : children);
|
|
11719
|
-
}
|
|
11720
|
-
);
|
|
11721
|
-
function getStyles$6() {
|
|
11722
|
-
return {
|
|
11723
|
-
hideEmpty: css.css({
|
|
11724
|
-
"&:empty": {
|
|
11725
|
-
display: "none"
|
|
11726
|
-
}
|
|
11727
|
-
})
|
|
11728
|
-
};
|
|
11729
|
-
}
|
|
11730
|
-
LazyLoader.displayName = "LazyLoader";
|
|
11731
|
-
LazyLoader.callbacks = {};
|
|
11732
|
-
LazyLoader.addCallback = (id, c) => LazyLoader.callbacks[id] = c;
|
|
11733
|
-
LazyLoader.observer = new IntersectionObserver(
|
|
11734
|
-
(entries) => {
|
|
11735
|
-
for (const entry of entries) {
|
|
11736
|
-
if (typeof LazyLoader.callbacks[entry.target.id] === "function") {
|
|
11737
|
-
LazyLoader.callbacks[entry.target.id](entry);
|
|
11738
|
-
}
|
|
11739
|
-
}
|
|
11740
|
-
},
|
|
11741
|
-
{ rootMargin: "100px" }
|
|
11742
|
-
);
|
|
11743
|
-
|
|
11744
11495
|
function SceneGridLayoutRenderer({ model }) {
|
|
11745
11496
|
const { children, isLazy, isDraggable, isResizable } = model.useState();
|
|
11746
11497
|
const [outerDivRef, { width, height }] = reactUse.useMeasure();
|