[FIX] web_tour: support pointer events in tour helpers

This commit adds support for pointer events in tour helpers. The way it
works is that every event triggered in the "click" helper has been
changed to be a pointer event, and when needed the equivalent mouse
event is also triggered for compatibility.

closes odoo/odoo#126772

Related: odoo/enterprise#43305
Signed-off-by: Géry Debongnie <ged@odoo.com>
This commit is contained in:
Julien Mougenot
2023-07-11 09:10:07 +02:00
parent 0fab57e4eb
commit 1fdfe36d9b
@@ -166,6 +166,26 @@ export function getScrollParent(element) {
}
}
/**
* @param {HTMLElement} el
* @param {string} type
* @param {boolean} canBubbleAndBeCanceled
* @param {PointerEventInit} [additionalParams]
*/
const triggerPointerEvent = (el, type, canBubbleAndBeCanceled, additionalParams) => {
const eventInit = {
bubbles: canBubbleAndBeCanceled,
cancelable: canBubbleAndBeCanceled,
view: window,
...additionalParams,
};
el.dispatchEvent(new PointerEvent(type, eventInit));
if (type.startsWith("pointer")) {
el.dispatchEvent(new MouseEvent(type.replace("pointer", "mouse"), eventInit));
}
};
export class RunningTourActionHelper {
constructor(tip_widget) {
this.tip_widget = tip_widget;
@@ -227,41 +247,21 @@ export class RunningTourActionHelper {
};
}
_click(values, nb, leave) {
trigger_mouse_event(values.$element, "mouseover");
values.$element.trigger("mouseenter");
for (var i = 1; i <= (nb || 1); i++) {
trigger_mouse_event(values.$element, "mousedown");
trigger_mouse_event(values.$element, "mouseup");
trigger_mouse_event(values.$element, "click", i);
const target = values.$element[0];
triggerPointerEvent(target, "pointerover", true);
triggerPointerEvent(target, "pointerenter", false);
triggerPointerEvent(target, "pointermove", true);
for (let i = 1; i <= (nb || 1); i++) {
triggerPointerEvent(target, "pointerdown", true);
triggerPointerEvent(target, "pointerup", true);
triggerPointerEvent(target, "click", true, { detail: i });
if (i % 2 === 0) {
trigger_mouse_event(values.$element, "dblclick");
triggerPointerEvent(target, "dblclick", true);
}
}
if (leave !== false) {
trigger_mouse_event(values.$element, "mouseout");
values.$element.trigger("mouseleave");
}
function trigger_mouse_event($element, type, count) {
var e = document.createEvent("MouseEvents");
e.initMouseEvent(
type,
true,
true,
window,
count || 0,
0,
0,
0,
0,
false,
false,
false,
false,
0,
$element[0]
);
$element[0].dispatchEvent(e);
triggerPointerEvent(target, "pointerout", true);
triggerPointerEvent(target, "pointerleave", false);
}
}
_text(values, text) {
@@ -385,43 +385,14 @@ export class RunningTourActionHelper {
clientY: targetRect.y + targetRect.height / 2,
};
source.dispatchEvent(
new PointerEvent("pointerdown", {
bubbles: true,
cancelable: true,
button: 0,
which: 1,
...sourcePosition,
})
);
source.dispatchEvent(
new PointerEvent("pointermove", {
bubbles: true,
cancelable: true,
...targetPosition,
})
);
triggerPointerEvent(source, "pointerdown", true, sourcePosition);
triggerPointerEvent(source, "pointermove", true, targetPosition);
for (const parent of getDifferentParents(source, target)) {
parent.dispatchEvent(
new PointerEvent("pointerenter", {
bubbles: false,
cancelable: false,
...targetPosition,
})
);
triggerPointerEvent(parent, "pointerenter", false, targetPosition);
}
target.dispatchEvent(
new PointerEvent("pointerup", {
bubbles: true,
cancelable: true,
button: 0,
which: 1,
...targetPosition,
})
);
triggerPointerEvent(target, "pointerup", true, targetPosition);
}
_drag_move_and_drop(values, params) {
// Extract parameters from string: '[deltaX,deltaY]@from => actualTo'.