[REF] web_tour: allows to include RunningTourActionHelper

Moves this class in an Odoo module so that other addons are able to
require and include the class in order to add different helpers.

This will be usefil in the `stock_barcode` module that will add a `scan`
helper.
This commit is contained in:
Arnaud Baes
2018-06-11 16:56:55 +02:00
committed by Simon Lejeune
parent cea38a8ea9
commit 9c262fe6f8
3 changed files with 114 additions and 103 deletions
@@ -0,0 +1,112 @@
odoo.define('web_tour.RunningTourActionHelper', function(require) {
"use strict";
var core = require('web.core');
var Tip = require('web_tour.Tip');
var RunningTourActionHelper = core.Class.extend({
init: function (tip_widget) {
this.tip_widget = tip_widget;
},
click: function (element) {
this._click(this._get_action_values(element));
},
text: function (text, element) {
this._text(this._get_action_values(element), text);
},
drag_and_drop: function (to, element) {
this._drag_and_drop(this._get_action_values(element), to);
},
keydown: function (keyCodes, element) {
this._keydown(this._get_action_values(element), keyCodes.split(/[,\s]+/));
},
auto: function (element) {
var values = this._get_action_values(element);
if (values.consume_event === "input") {
this._text(values);
} else {
this._click(values);
}
},
_get_action_values: function (element) {
var $e = $(element);
var $element = element ? get_first_visible_element($e) : this.tip_widget.$anchor;
if ($element.length === 0) {
$element = $e.first();
}
var consume_event = element ? Tip.getConsumeEventType($element) : this.tip_widget.consume_event;
return {
$element: $element,
consume_event: consume_event,
};
},
_click: function (values) {
trigger_mouse_event(values.$element, "mouseover");
values.$element.trigger("mouseenter");
trigger_mouse_event(values.$element, "mousedown");
trigger_mouse_event(values.$element, "mouseup");
trigger_mouse_event(values.$element, "click");
trigger_mouse_event(values.$element, "mouseout");
values.$element.trigger("mouseleave");
function trigger_mouse_event($element, type) {
var e = document.createEvent("MouseEvents");
e.initMouseEvent(type, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, $element[0]);
$element[0].dispatchEvent(e);
}
},
_text: function (values, text) {
this._click(values);
text = text || "Test";
if (values.consume_event === "input") {
values.$element.trigger("keydown").val(text).trigger("keyup").trigger("input");
} else if (values.$element.is("select")) {
var $options = values.$element.children("option");
$options.prop("selected", false).removeProp("selected");
var $selectedOption = $options.filter(function () { return $(this).val() === text; });
if ($selectedOption.length === 0) {
$selectedOption = $options.filter(function () { return $(this).text() === text; });
}
$selectedOption.prop("selected", true);
this._click(values);
} else {
values.$element.text(text);
}
values.$element.trigger("change");
},
_drag_and_drop: function (values, to) {
var $to = $(to || document.body);
var elementCenter = values.$element.offset();
elementCenter.left += values.$element.outerWidth()/2;
elementCenter.top += values.$element.outerHeight()/2;
var toCenter = $to.offset();
toCenter.left += $to.outerWidth()/2;
toCenter.top += $to.outerHeight()/2;
values.$element.trigger($.Event("mousedown", {which: 1, pageX: elementCenter.left, pageY: elementCenter.top}));
values.$element.trigger($.Event("mousemove", {which: 1, pageX: toCenter.left, pageY: toCenter.top}));
values.$element.trigger($.Event("mouseup", {which: 1, pageX: toCenter.left, pageY: toCenter.top}));
},
_keydown: function (values, keyCodes) {
while (keyCodes.length) {
var keyCode = +keyCodes.shift();
values.$element.trigger({type: "keydown", keyCode: keyCode});
if ((keyCode > 47 && keyCode < 58) // number keys
|| keyCode === 32 // spacebar
|| (keyCode > 64 && keyCode < 91) // letter keys
|| (keyCode > 95 && keyCode < 112) // numpad keys
|| (keyCode > 185 && keyCode < 193) // ;=,-./` (in order)
|| (keyCode > 218 && keyCode < 223)) { // [\]' (in order))
document.execCommand("insertText", 0, String.fromCharCode(keyCode));
}
values.$element.trigger({type: "keyup", keyCode: keyCode});
}
},
});
return RunningTourActionHelper;
});
+1 -103
View File
@@ -5,6 +5,7 @@ var core = require('web.core');
var local_storage = require('web.local_storage');
var mixins = require('web.mixins');
var RainbowMan = require('web.RainbowMan');
var RunningTourActionHelper = require('web_tour.RunningTourActionHelper');
var ServicesMixin = require('web.ServicesMixin');
var session = require('web.session');
var Tip = require('web_tour.Tip');
@@ -51,109 +52,6 @@ function do_before_unload(if_unload_callback, if_not_unload_callback) {
});
}
var RunningTourActionHelper = core.Class.extend({
init: function (tip_widget) {
this.tip_widget = tip_widget;
},
click: function (element) {
this._click(this._get_action_values(element));
},
text: function (text, element) {
this._text(this._get_action_values(element), text);
},
drag_and_drop: function (to, element) {
this._drag_and_drop(this._get_action_values(element), to);
},
keydown: function (keyCodes, element) {
this._keydown(this._get_action_values(element), keyCodes.split(/[,\s]+/));
},
auto: function (element) {
var values = this._get_action_values(element);
if (values.consume_event === "input") {
this._text(values);
} else {
this._click(values);
}
},
_get_action_values: function (element) {
var $e = $(element);
var $element = element ? get_first_visible_element($e) : this.tip_widget.$anchor;
if ($element.length === 0) {
$element = $e.first();
}
var consume_event = element ? Tip.getConsumeEventType($element) : this.tip_widget.consume_event;
return {
$element: $element,
consume_event: consume_event,
};
},
_click: function (values) {
trigger_mouse_event(values.$element, "mouseover");
values.$element.trigger("mouseenter");
trigger_mouse_event(values.$element, "mousedown");
trigger_mouse_event(values.$element, "mouseup");
trigger_mouse_event(values.$element, "click");
trigger_mouse_event(values.$element, "mouseout");
values.$element.trigger("mouseleave");
function trigger_mouse_event($element, type) {
var e = document.createEvent("MouseEvents");
e.initMouseEvent(type, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, $element[0]);
$element[0].dispatchEvent(e);
}
},
_text: function (values, text) {
this._click(values);
text = text || "Test";
if (values.consume_event === "input") {
values.$element.trigger("keydown").val(text).trigger("keyup").trigger("input");
} else if (values.$element.is("select")) {
var $options = values.$element.children("option");
$options.prop("selected", false).removeProp("selected");
var $selectedOption = $options.filter(function () { return $(this).val() === text; });
if ($selectedOption.length === 0) {
$selectedOption = $options.filter(function () { return $(this).text() === text; });
}
$selectedOption.prop("selected", true);
this._click(values);
} else {
values.$element.text(text);
}
values.$element.trigger("change");
},
_drag_and_drop: function (values, to) {
var $to = $(to || document.body);
var elementCenter = values.$element.offset();
elementCenter.left += values.$element.outerWidth()/2;
elementCenter.top += values.$element.outerHeight()/2;
var toCenter = $to.offset();
toCenter.left += $to.outerWidth()/2;
toCenter.top += $to.outerHeight()/2;
values.$element.trigger($.Event("mousedown", {which: 1, pageX: elementCenter.left, pageY: elementCenter.top}));
values.$element.trigger($.Event("mousemove", {which: 1, pageX: toCenter.left, pageY: toCenter.top}));
values.$element.trigger($.Event("mouseup", {which: 1, pageX: toCenter.left, pageY: toCenter.top}));
},
_keydown: function (values, keyCodes) {
while (keyCodes.length) {
var keyCode = +keyCodes.shift();
values.$element.trigger({type: "keydown", keyCode: keyCode});
if ((keyCode > 47 && keyCode < 58) // number keys
|| keyCode === 32 // spacebar
|| (keyCode > 64 && keyCode < 91) // letter keys
|| (keyCode > 95 && keyCode < 112) // numpad keys
|| (keyCode > 185 && keyCode < 193) // ;=,-./` (in order)
|| (keyCode > 218 && keyCode < 223)) { // [\]' (in order))
document.execCommand("insertText", 0, String.fromCharCode(keyCode));
}
values.$element.trigger({type: "keyup", keyCode: keyCode});
}
},
});
return core.Class.extend(mixins.EventDispatcherMixin, ServicesMixin, {
init: function(parent, consumed_tours) {
mixins.EventDispatcherMixin.init.call(this);
+1
View File
@@ -6,6 +6,7 @@
<link rel="stylesheet" type="text/scss" href="/web_tour/static/src/scss/tip.scss"/>
<link rel="stylesheet" type="text/scss" href="/web_tour/static/src/scss/keyframes.scss"/>
<script type="text/javascript" src="/web_tour/static/src/js/tip.js"></script>
<script type="text/javascript" src="/web_tour/static/src/js/running_tour_action_helper.js"></script>
<script type="text/javascript" src="/web_tour/static/src/js/tour_manager.js"></script>
<script type="text/javascript" src="/web_tour/static/src/js/tour_service.js"></script>
</xpath>