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 @@ +