diff --git a/addons/web_tour/static/src/js/running_tour_action_helper.js b/addons/web_tour/static/src/js/running_tour_action_helper.js
new file mode 100644
index 00000000000..3850eb391b7
--- /dev/null
+++ b/addons/web_tour/static/src/js/running_tour_action_helper.js
@@ -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;
+});
+
diff --git a/addons/web_tour/static/src/js/tour_manager.js b/addons/web_tour/static/src/js/tour_manager.js
index af7435a4ce1..76fba9c4d23 100644
--- a/addons/web_tour/static/src/js/tour_manager.js
+++ b/addons/web_tour/static/src/js/tour_manager.js
@@ -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);
diff --git a/addons/web_tour/views/tour_templates.xml b/addons/web_tour/views/tour_templates.xml
index 4cc2f826c8e..a8334cb0245 100644
--- a/addons/web_tour/views/tour_templates.xml
+++ b/addons/web_tour/views/tour_templates.xml
@@ -6,6 +6,7 @@
+