@grafana/scenes 6.37.0 → 6.38.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/CHANGELOG.md +12 -0
- package/dist/esm/behaviors/SceneInteractionTracker.js +30 -0
- package/dist/esm/behaviors/SceneInteractionTracker.js.map +1 -0
- package/dist/esm/behaviors/SceneRenderProfiler.js +65 -2
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
- package/dist/esm/behaviors/index.js +1 -0
- package/dist/esm/behaviors/index.js.map +1 -1
- package/dist/esm/core/sceneGraph/getInteractionTracker.js +19 -0
- package/dist/esm/core/sceneGraph/getInteractionTracker.js.map +1 -0
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +9 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariable.js +8 -0
- package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/index.d.ts +26 -0
- package/dist/index.js +119 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
@@ -1058,7 +1058,7 @@ var __privateWrapper = (obj, member, setter, getter) => ({
|
|
1058
1058
|
return __privateGet$2(obj, member, getter);
|
1059
1059
|
}
|
1060
1060
|
});
|
1061
|
-
var _profileInProgress, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans, _longFrameDetector, _longFramesCount, _longFramesTotalTime, _visibilityChangeHandler;
|
1061
|
+
var _profileInProgress, _interactionInProgress, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans, _longFrameDetector, _longFramesCount, _longFramesTotalTime, _visibilityChangeHandler, _onInteractionComplete;
|
1062
1062
|
const POST_STORM_WINDOW = 2e3;
|
1063
1063
|
const DEFAULT_LONG_FRAME_THRESHOLD = 30;
|
1064
1064
|
const TAB_INACTIVE_THRESHOLD = 1e3;
|
@@ -1066,6 +1066,7 @@ class SceneRenderProfiler {
|
|
1066
1066
|
constructor(queryController) {
|
1067
1067
|
this.queryController = queryController;
|
1068
1068
|
__privateAdd$2(this, _profileInProgress, null);
|
1069
|
+
__privateAdd$2(this, _interactionInProgress, null);
|
1069
1070
|
__privateAdd$2(this, _profileStartTs, null);
|
1070
1071
|
__privateAdd$2(this, _trailAnimationFrameId, null);
|
1071
1072
|
// Will keep measured lengths trailing frames
|
@@ -1075,6 +1076,7 @@ class SceneRenderProfiler {
|
|
1075
1076
|
__privateAdd$2(this, _longFramesCount, 0);
|
1076
1077
|
__privateAdd$2(this, _longFramesTotalTime, 0);
|
1077
1078
|
__privateAdd$2(this, _visibilityChangeHandler, null);
|
1079
|
+
__privateAdd$2(this, _onInteractionComplete, null);
|
1078
1080
|
this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
|
1079
1081
|
var _a, _b, _c, _d;
|
1080
1082
|
const currentFrameTime = performance.now();
|
@@ -1191,10 +1193,14 @@ class SceneRenderProfiler {
|
|
1191
1193
|
};
|
1192
1194
|
__privateSet$2(this, _longFrameDetector, new LongFrameDetector());
|
1193
1195
|
this.setupVisibilityChangeHandler();
|
1196
|
+
__privateSet$2(this, _interactionInProgress, null);
|
1194
1197
|
}
|
1195
1198
|
setQueryController(queryController) {
|
1196
1199
|
this.queryController = queryController;
|
1197
1200
|
}
|
1201
|
+
setInteractionCompleteHandler(handler) {
|
1202
|
+
__privateSet$2(this, _onInteractionComplete, handler != null ? handler : null);
|
1203
|
+
}
|
1198
1204
|
setupVisibilityChangeHandler() {
|
1199
1205
|
if (__privateGet$2(this, _visibilityChangeHandler)) {
|
1200
1206
|
return;
|
@@ -1233,6 +1239,55 @@ class SceneRenderProfiler {
|
|
1233
1239
|
this._startNewProfile(name);
|
1234
1240
|
}
|
1235
1241
|
}
|
1242
|
+
startInteraction(interaction) {
|
1243
|
+
if (__privateGet$2(this, _interactionInProgress)) {
|
1244
|
+
writeSceneLog("profile", "Cancelled interaction:", __privateGet$2(this, _interactionInProgress));
|
1245
|
+
__privateSet$2(this, _interactionInProgress, null);
|
1246
|
+
}
|
1247
|
+
__privateSet$2(this, _interactionInProgress, {
|
1248
|
+
interaction,
|
1249
|
+
startTs: performance.now()
|
1250
|
+
});
|
1251
|
+
writeSceneLog("SceneRenderProfiler", "Started interaction:", interaction);
|
1252
|
+
}
|
1253
|
+
stopInteraction() {
|
1254
|
+
if (!__privateGet$2(this, _interactionInProgress)) {
|
1255
|
+
return;
|
1256
|
+
}
|
1257
|
+
const endTs = performance.now();
|
1258
|
+
const interactionDuration = endTs - __privateGet$2(this, _interactionInProgress).startTs;
|
1259
|
+
const networkDuration = captureNetwork(__privateGet$2(this, _interactionInProgress).startTs, endTs);
|
1260
|
+
writeSceneLog("SceneRenderProfiler", "Completed interaction:");
|
1261
|
+
writeSceneLog("", ` \u251C\u2500 Total time: ${interactionDuration.toFixed(1)}ms`);
|
1262
|
+
writeSceneLog("", ` \u251C\u2500 Network duration: ${networkDuration.toFixed(1)}ms`);
|
1263
|
+
writeSceneLog("", ` \u251C\u2500 StartTs: ${__privateGet$2(this, _interactionInProgress).startTs.toFixed(1)}ms`);
|
1264
|
+
writeSceneLog("", ` \u2514\u2500 EndTs: ${endTs.toFixed(1)}ms`);
|
1265
|
+
if (__privateGet$2(this, _onInteractionComplete) && __privateGet$2(this, _profileInProgress)) {
|
1266
|
+
__privateGet$2(this, _onInteractionComplete).call(this, {
|
1267
|
+
origin: __privateGet$2(this, _interactionInProgress).interaction,
|
1268
|
+
duration: interactionDuration,
|
1269
|
+
networkDuration,
|
1270
|
+
startTs: __privateGet$2(this, _interactionInProgress).startTs,
|
1271
|
+
endTs
|
1272
|
+
});
|
1273
|
+
}
|
1274
|
+
performance.mark(`${__privateGet$2(this, _interactionInProgress).interaction}_start`, {
|
1275
|
+
startTime: __privateGet$2(this, _interactionInProgress).startTs
|
1276
|
+
});
|
1277
|
+
performance.mark(`${__privateGet$2(this, _interactionInProgress).interaction}_end`, {
|
1278
|
+
startTime: endTs
|
1279
|
+
});
|
1280
|
+
performance.measure(
|
1281
|
+
`Interaction_${__privateGet$2(this, _interactionInProgress).interaction}`,
|
1282
|
+
`${__privateGet$2(this, _interactionInProgress).interaction}_start`,
|
1283
|
+
`${__privateGet$2(this, _interactionInProgress).interaction}_end`
|
1284
|
+
);
|
1285
|
+
__privateSet$2(this, _interactionInProgress, null);
|
1286
|
+
}
|
1287
|
+
getCurrentInteraction() {
|
1288
|
+
var _a, _b;
|
1289
|
+
return (_b = (_a = __privateGet$2(this, _interactionInProgress)) == null ? void 0 : _a.interaction) != null ? _b : null;
|
1290
|
+
}
|
1236
1291
|
/**
|
1237
1292
|
* Starts a new profile for performance measurement.
|
1238
1293
|
*
|
@@ -1278,6 +1333,9 @@ class SceneRenderProfiler {
|
|
1278
1333
|
}
|
1279
1334
|
tryCompletingProfile() {
|
1280
1335
|
var _a;
|
1336
|
+
if (!__privateGet$2(this, _profileInProgress)) {
|
1337
|
+
return;
|
1338
|
+
}
|
1281
1339
|
writeSceneLog("SceneRenderProfiler", "Trying to complete profile", __privateGet$2(this, _profileInProgress));
|
1282
1340
|
if (((_a = this.queryController) == null ? void 0 : _a.runningQueriesCount()) === 0 && __privateGet$2(this, _profileInProgress)) {
|
1283
1341
|
writeSceneLog("SceneRenderProfiler", "All queries completed, starting tail measurement");
|
@@ -1318,6 +1376,7 @@ class SceneRenderProfiler {
|
|
1318
1376
|
}
|
1319
1377
|
}
|
1320
1378
|
_profileInProgress = new WeakMap();
|
1379
|
+
_interactionInProgress = new WeakMap();
|
1321
1380
|
_profileStartTs = new WeakMap();
|
1322
1381
|
_trailAnimationFrameId = new WeakMap();
|
1323
1382
|
_recordedTrailingSpans = new WeakMap();
|
@@ -1325,6 +1384,7 @@ _longFrameDetector = new WeakMap();
|
|
1325
1384
|
_longFramesCount = new WeakMap();
|
1326
1385
|
_longFramesTotalTime = new WeakMap();
|
1327
1386
|
_visibilityChangeHandler = new WeakMap();
|
1387
|
+
_onInteractionComplete = new WeakMap();
|
1328
1388
|
function processRecordedSpans(spans) {
|
1329
1389
|
for (let i = spans.length - 1; i >= 0; i--) {
|
1330
1390
|
if (spans[i] > DEFAULT_LONG_FRAME_THRESHOLD) {
|
@@ -1374,6 +1434,9 @@ const FILTER_CHANGED_INTERACTION = "filter_changed";
|
|
1374
1434
|
const FILTER_RESTORED_INTERACTION = "filter_restored";
|
1375
1435
|
const VARIABLE_VALUE_CHANGED_INTERACTION = "variable_value_changed";
|
1376
1436
|
const SCOPES_CHANGED_INTERACTION = "scopes_changed";
|
1437
|
+
const ADHOC_KEYS_DROPDOWN_INTERACTION = "adhoc_keys_dropdown";
|
1438
|
+
const ADHOC_VALUES_DROPDOWN_INTERACTION = "adhoc_values_dropdown";
|
1439
|
+
const GROUPBY_DIMENSIONS_INTERACTION = "groupby_dimensions";
|
1377
1440
|
|
1378
1441
|
class SceneTimeRange extends SceneObjectBase {
|
1379
1442
|
constructor(state = {}) {
|
@@ -3655,6 +3718,47 @@ const GroupByValueContainer = ({
|
|
3655
3718
|
return /* @__PURE__ */ React__default.default.createElement("div", { className: css.cx(styles.multiValueContainer, !isApplicable && css.cx(disabledPill, strikethrough)) }, children);
|
3656
3719
|
};
|
3657
3720
|
|
3721
|
+
function isInteractionTracker(s) {
|
3722
|
+
return "isInteractionTracker" in s;
|
3723
|
+
}
|
3724
|
+
class SceneInteractionTracker extends SceneObjectBase {
|
3725
|
+
constructor(state = {}, renderProfiler) {
|
3726
|
+
super(state);
|
3727
|
+
this.renderProfiler = renderProfiler;
|
3728
|
+
this.isInteractionTracker = true;
|
3729
|
+
if (renderProfiler) {
|
3730
|
+
this.renderProfiler = renderProfiler;
|
3731
|
+
this.renderProfiler.setInteractionCompleteHandler(state.onInteractionComplete);
|
3732
|
+
}
|
3733
|
+
}
|
3734
|
+
startInteraction(name) {
|
3735
|
+
var _a;
|
3736
|
+
if (!this.state.enableInteractionTracking) {
|
3737
|
+
return;
|
3738
|
+
}
|
3739
|
+
(_a = this.renderProfiler) == null ? void 0 : _a.startInteraction(name);
|
3740
|
+
}
|
3741
|
+
stopInteraction() {
|
3742
|
+
var _a;
|
3743
|
+
(_a = this.renderProfiler) == null ? void 0 : _a.stopInteraction();
|
3744
|
+
}
|
3745
|
+
}
|
3746
|
+
|
3747
|
+
function getInteractionTracker(sceneObject) {
|
3748
|
+
let parent = sceneObject;
|
3749
|
+
while (parent) {
|
3750
|
+
if (parent.state.$behaviors) {
|
3751
|
+
for (const behavior of parent.state.$behaviors) {
|
3752
|
+
if (isInteractionTracker(behavior)) {
|
3753
|
+
return behavior;
|
3754
|
+
}
|
3755
|
+
}
|
3756
|
+
}
|
3757
|
+
parent = parent.parent;
|
3758
|
+
}
|
3759
|
+
return void 0;
|
3760
|
+
}
|
3761
|
+
|
3658
3762
|
class GroupByVariable extends MultiValueVariable {
|
3659
3763
|
constructor(initialState) {
|
3660
3764
|
super({
|
@@ -3960,10 +4064,13 @@ function GroupByVariableRenderer({ model }) {
|
|
3960
4064
|
setUncommittedValue(newValue);
|
3961
4065
|
},
|
3962
4066
|
onOpenMenu: async () => {
|
4067
|
+
const profiler = getInteractionTracker(model);
|
4068
|
+
profiler == null ? void 0 : profiler.startInteraction(GROUPBY_DIMENSIONS_INTERACTION);
|
3963
4069
|
setIsFetchingOptions(true);
|
3964
4070
|
await rxjs.lastValueFrom(model.validateAndUpdate());
|
3965
4071
|
setIsFetchingOptions(false);
|
3966
4072
|
setIsOptionsOpen(true);
|
4073
|
+
profiler == null ? void 0 : profiler.stopInteraction();
|
3967
4074
|
},
|
3968
4075
|
onCloseMenu: () => {
|
3969
4076
|
setIsOptionsOpen(false);
|
@@ -4013,10 +4120,13 @@ function GroupByVariableRenderer({ model }) {
|
|
4013
4120
|
}
|
4014
4121
|
},
|
4015
4122
|
onOpenMenu: async () => {
|
4123
|
+
const profiler = getInteractionTracker(model);
|
4124
|
+
profiler == null ? void 0 : profiler.startInteraction(GROUPBY_DIMENSIONS_INTERACTION);
|
4016
4125
|
setIsFetchingOptions(true);
|
4017
4126
|
await rxjs.lastValueFrom(model.validateAndUpdate());
|
4018
4127
|
setIsFetchingOptions(false);
|
4019
4128
|
setIsOptionsOpen(true);
|
4129
|
+
profiler == null ? void 0 : profiler.stopInteraction();
|
4020
4130
|
},
|
4021
4131
|
onCloseMenu: () => {
|
4022
4132
|
setIsOptionsOpen(false);
|
@@ -5181,6 +5291,11 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
|
|
5181
5291
|
const handleFetchOptions = React.useCallback(
|
5182
5292
|
async (inputType) => {
|
5183
5293
|
var _a2;
|
5294
|
+
const profiler = getInteractionTracker(model);
|
5295
|
+
const interactionName = inputType === "key" ? ADHOC_KEYS_DROPDOWN_INTERACTION : ADHOC_VALUES_DROPDOWN_INTERACTION;
|
5296
|
+
if (inputType !== "operator") {
|
5297
|
+
profiler == null ? void 0 : profiler.startInteraction(interactionName);
|
5298
|
+
}
|
5184
5299
|
setOptionsError(false);
|
5185
5300
|
setOptionsLoading(true);
|
5186
5301
|
setOptions([]);
|
@@ -5194,6 +5309,7 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
|
|
5194
5309
|
options2 = await model._getValuesFor(filter);
|
5195
5310
|
}
|
5196
5311
|
if (filterInputTypeRef.current !== inputType) {
|
5312
|
+
profiler == null ? void 0 : profiler.stopInteraction();
|
5197
5313
|
return;
|
5198
5314
|
}
|
5199
5315
|
setOptions(options2);
|
@@ -5206,6 +5322,7 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
|
|
5206
5322
|
setOptionsError(true);
|
5207
5323
|
}
|
5208
5324
|
setOptionsLoading(false);
|
5325
|
+
profiler == null ? void 0 : profiler.stopInteraction();
|
5209
5326
|
},
|
5210
5327
|
[filter, model]
|
5211
5328
|
);
|
@@ -9859,6 +9976,7 @@ var index$1 = /*#__PURE__*/Object.freeze({
|
|
9859
9976
|
ActWhenVariableChanged: ActWhenVariableChanged,
|
9860
9977
|
CursorSync: CursorSync,
|
9861
9978
|
LiveNowTimer: LiveNowTimer,
|
9979
|
+
SceneInteractionTracker: SceneInteractionTracker,
|
9862
9980
|
SceneQueryController: SceneQueryController
|
9863
9981
|
});
|
9864
9982
|
|