From 9c262fe6f8ca8b47d97d42b4b4b0bcb9229654a7 Mon Sep 17 00:00:00 2001 From: Arnaud Baes Date: Wed, 2 May 2018 13:19:04 +0200 Subject: [PATCH] [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. --- .../src/js/running_tour_action_helper.js | 112 ++++++++++++++++++ addons/web_tour/static/src/js/tour_manager.js | 104 +--------------- addons/web_tour/views/tour_templates.xml | 1 + 3 files changed, 114 insertions(+), 103 deletions(-) create mode 100644 addons/web_tour/static/src/js/running_tour_action_helper.js 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 @@ +