Skip to content

Commit 38ea07a

Browse files
odeimaizmrnicegyu11
authored andcommitted
🐛 [Frontend] Guided Tours: point to visible selector or skip (ITISFoundation#6481)
1 parent a90d033 commit 38ea07a

File tree

4 files changed

+55
-34
lines changed

4 files changed

+55
-34
lines changed

services/static-webserver/client/source/class/osparc/dashboard/ToggleButtonContainer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ qx.Class.define("osparc.dashboard.ToggleButtonContainer", {
9595
},
9696

9797
areMoreResourcesRequired: function(loadingResourcesBtn) {
98-
if (this.nextRequest !== null && loadingResourcesBtn && osparc.utils.Utils.checkIsOnScreen(loadingResourcesBtn)) {
98+
if (this.nextRequest !== null && loadingResourcesBtn && osparc.utils.Utils.isWidgetOnScreen(loadingResourcesBtn)) {
9999
return true;
100100
}
101101
return false;

services/static-webserver/client/source/class/osparc/tours/Manager.js

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -160,27 +160,44 @@ qx.Class.define("osparc.tours.Manager", {
160160
}
161161
},
162162

163+
__getVisibleElement: function(selector) {
164+
// get all elements...
165+
const elements = document.querySelectorAll(`[${selector}]`);
166+
// ...and use the first on screen match
167+
const element = [...elements].find(el => osparc.utils.Utils.isElementOnScreen(el));
168+
return element;
169+
},
170+
163171
__toStepCheck: function(idx = 0) {
164172
const steps = this.getSteps();
165173
if (idx >= steps.length) {
166-
idx = 0;
174+
return;
167175
}
168176

169177
this.__removeCurrentBubble();
170178
this.__removeBlankets();
171179
this.__currentIdx = idx;
172180
const step = steps[idx];
173181
if (step.beforeClick && step.beforeClick.selector) {
174-
const element = document.querySelector(`[${step.beforeClick.selector}]`);
175-
const widget = qx.ui.core.Widget.getWidgetByElement(element);
176-
if (step.beforeClick.action) {
177-
widget[step.beforeClick.action]();
178-
} else if (step.beforeClick.event) {
179-
widget.fireEvent(step.beforeClick.event);
182+
let targetWidget = null;
183+
const element = this.__getVisibleElement(step.beforeClick.selector);
184+
if (element) {
185+
targetWidget = qx.ui.core.Widget.getWidgetByElement(element);
186+
}
187+
if (targetWidget) {
188+
if (step.beforeClick.action) {
189+
targetWidget[step.beforeClick.action]();
190+
} else if (step.beforeClick.event) {
191+
targetWidget.fireEvent(step.beforeClick.event);
192+
} else {
193+
targetWidget.execute();
194+
}
195+
setTimeout(() => this.__toStep(steps, idx), 150);
180196
} else {
181-
widget.execute();
197+
// target not found, move to the next step
198+
this.__toStepCheck(this.__currentIdx+1);
199+
return;
182200
}
183-
setTimeout(() => this.__toStep(steps, idx), 100);
184201
} else {
185202
this.__toStep(steps, idx);
186203
}
@@ -207,8 +224,11 @@ qx.Class.define("osparc.tours.Manager", {
207224
const step = steps[idx];
208225
const stepWidget = this.__currentBubble = this.__createStep();
209226
if (step.anchorEl) {
210-
const el = document.querySelector(`[${step.anchorEl}]`);
211-
const targetWidget = qx.ui.core.Widget.getWidgetByElement(el);
227+
let targetWidget = null;
228+
const element = this.__getVisibleElement(step.anchorEl);
229+
if (element) {
230+
targetWidget = qx.ui.core.Widget.getWidgetByElement(element);
231+
}
212232
if (targetWidget) {
213233
stepWidget.setElement(targetWidget);
214234
if (step.placement) {
@@ -224,6 +244,7 @@ qx.Class.define("osparc.tours.Manager", {
224244
// intro text, it will be centered
225245
stepWidget.getChildControl("caret").exclude();
226246
}
247+
227248
if (step.title) {
228249
stepWidget.setTitle(step.title);
229250
}

services/static-webserver/client/source/class/osparc/utils/Utils.js

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -287,27 +287,27 @@ qx.Class.define("osparc.utils.Utils", {
287287
return title;
288288
},
289289

290-
checkIsOnScreen: function(elem) {
291-
const isInViewport = element => {
292-
if (element) {
293-
const rect = element.getBoundingClientRect();
294-
const html = document.documentElement;
295-
return (
296-
rect.width > 0 &&
297-
rect.height > 0 &&
298-
rect.top >= 0 &&
299-
rect.left >= 0 &&
300-
// a bit of tolerance to deal with zooming factors
301-
rect.bottom*0.95 <= (window.innerHeight || html.clientHeight) &&
302-
rect.right*0.95 <= (window.innerWidth || html.clientWidth)
303-
);
304-
}
305-
return false;
306-
};
290+
isElementOnScreen: function(element) {
291+
if (element) {
292+
const rect = element.getBoundingClientRect();
293+
const html = document.documentElement;
294+
return (
295+
rect.width > 0 &&
296+
rect.height > 0 &&
297+
rect.top >= 0 &&
298+
rect.left >= 0 &&
299+
// a bit of tolerance to deal with zooming factors
300+
rect.bottom*0.95 <= (window.innerHeight || html.clientHeight) &&
301+
rect.right*0.95 <= (window.innerWidth || html.clientWidth)
302+
);
303+
}
304+
return false;
305+
},
307306

308-
const domElem = elem.getContentElement().getDomElement();
309-
const checkIsOnScreen = isInViewport(domElem);
310-
return checkIsOnScreen;
307+
isWidgetOnScreen: function(widget) {
308+
const domElem = widget.getContentElement().getDomElement();
309+
const isWidgetOnScreen = this.isElementOnScreen(domElem);
310+
return isWidgetOnScreen;
311311
},
312312

313313
growSelectBox: function(selectBox, maxWidth) {

services/static-webserver/client/source/class/osparc/widget/logger/LoggerView.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,8 +413,8 @@ qx.Class.define("osparc.widget.logger.LoggerView", {
413413
__updateTable: function() {
414414
if (this.__loggerModel) {
415415
this.__loggerModel.reloadData();
416-
// checkIsOnScreen will avoid rendering every single line when the user click on the Logger button the first time
417-
if (!this.isLockLogs() && osparc.utils.Utils.checkIsOnScreen(this.__loggerTable)) {
416+
// isWidgetOnScreen will avoid rendering every single line when the user click on the Logger button the first time
417+
if (!this.isLockLogs() && osparc.utils.Utils.isWidgetOnScreen(this.__loggerTable)) {
418418
const nFilteredRows = this.__loggerModel.getFilteredRowCount();
419419
this.__loggerTable.scrollCellVisible(0, nFilteredRows);
420420
}

0 commit comments

Comments
 (0)