From a0ddaf8b84b6c04508d9c114b4c06469d06a47f0 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Mon, 13 Jul 2015 14:46:54 +0200 Subject: [IMP] web: trigger an event when webclient is ready The main purpose of this commit is to be consistent with the enterprise edition, in which the event 'DOM_updated' is triggered when new content is inserted in the DOM. This way, addons that need to know when a view has been attached in the DOM (e.g. web_tip) can listen to this event and will work fine with both editions of the web addon. With the actual structure of the webclient (action_manager, view_manager), there is no easy way to decide whether or not a view is attached in the DOM, because every rendering is performed in a detached element. For instance, when a view_manager instantiates a new view, it appends it in its $el once the view is ready, but it can't know if its $el is attached in the DOM (it is only the case if the view_manager is the current action of the action manager). This rev. introduces utility functions to centralize the appending/prepending of content, so that an event can be triggered (at a unique place) when the content is really in the DOM. These functions are used by the the action_manager and the view_manager. Another change is that the action_manager keeps the view_manager informed when they are attached in/detached from the DOM, through the variable is_in_DOM. --- addons/web/static/src/js/framework/misc.js | 37 ++++++++++++++++++++++++++++++ addons/web/static/src/js/framework/view.js | 11 +-------- 2 files changed, 38 insertions(+), 10 deletions(-) (limited to 'addons/web/static/src/js/framework') diff --git a/addons/web/static/src/js/framework/misc.js b/addons/web/static/src/js/framework/misc.js index 7a87c05350b..ef073d1ab0d 100644 --- a/addons/web/static/src/js/framework/misc.js +++ b/addons/web/static/src/js/framework/misc.js @@ -322,10 +322,47 @@ $.extend( proto, { } }); +/** + * Private function that triggers an event on core.bus + * @param {htmlString or Element or Array or jQuery} [content] the content that + * has been attached in the DOM + */ +function _notify (content) { + core.bus.trigger('DOM_updated', content); +} +/** + * Appends content in a jQuery object and optionnally triggers an event + * @param {jQuery} [$target] the node where content will be appended + * @param {htmlString or Element or Array or jQuery} [content] DOM element, + * array of elements, HTML string or jQuery object to append to $target + * @param {jQuery} [trigger] true to trigger an event, false otherwise + */ +function append ($target, content, trigger) { + $target.append(content); + if (trigger) { + _notify(content); + } +} +/** + * Prepends content in a jQuery object and optionnally triggers an event + * @param {jQuery} [$target] the node where content will be prepended + * @param {htmlString or Element or Array or jQuery} [content] DOM element, + * array of elements, HTML string or jQuery object to prepend to $target + * @param {jQuery} [trigger] true to trigger an event, false otherwise + */ +function prepend ($target, content, trigger) { + $target.prepend(content); + if (trigger) { + _notify(content); + } +} + return { blockUI: blockUI, unblockUI: unblockUI, redirect: redirect, + append: append, + prepend: prepend, }; }); diff --git a/addons/web/static/src/js/framework/view.js b/addons/web/static/src/js/framework/view.js index 8eee01d414d..d803b7487df 100644 --- a/addons/web/static/src/js/framework/view.js +++ b/addons/web/static/src/js/framework/view.js @@ -166,18 +166,9 @@ var View = Widget.extend({ this.embedded_view = embedded_view; }, do_show: function () { - var self = this; - this.$el.show(); - setTimeout(function () { - self.$el.parent().addClass('in'); - }, 0); - + this._super(); core.bus.trigger('view_shown', this); }, - do_hide: function () { - this.$el.parent().removeClass('in'); - this.$el.hide(); - }, is_active: function () { return this.ViewManager.active_view.controller === this; }, -- cgit v1.2.3