summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Lefèvre <lul@odoo.com>2020-02-28 11:25:41 +0000
committerLucas Lefèvre <lul@odoo.com>2020-03-03 11:01:03 +0000
commitb7d1db596bf2dcbf5d95d7258d9a2978bc0003f8 (patch)
tree23827e84f2bc40d4261dcfb326d507a723b47ec2
parent4f602d31b4062723149989142bcc0926f2c76160 (diff)
[FIX] web: Call on_attach_callback on systray widgets
Currently, the method `on_attach_callback` is never called on any Widget in the systray. Calling `on_attach_callback` is required if any systray widget uses an OWL component via the ComponentWrapper. Without the callback, the component is never considered mounted to the DOM and no event handler is triggered. closes odoo/odoo#46566 Related: odoo/enterprise#8887 Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
-rw-r--r--addons/web/static/src/js/chrome/menu.js1
-rw-r--r--addons/web/static/src/js/chrome/systray_menu.js5
-rw-r--r--addons/web/static/tests/chrome/menu_tests.js47
-rw-r--r--addons/web/views/webclient_templates.xml1
4 files changed, 54 insertions, 0 deletions
diff --git a/addons/web/static/src/js/chrome/menu.js b/addons/web/static/src/js/chrome/menu.js
index 6f2815b670a..3c3530d49e9 100644
--- a/addons/web/static/src/js/chrome/menu.js
+++ b/addons/web/static/src/js/chrome/menu.js
@@ -69,6 +69,7 @@ var Menu = Widget.extend({
// Systray Menu
this.systray_menu = new SystrayMenu(this);
var systrayMenuProm = this.systray_menu.attachTo(this.$('.o_menu_systray')).then(function() {
+ self.systray_menu.on_attach_callback(); // At this point, we know we are in the DOM
dom.initAutoMoreMenu(self.$section_placeholder, {
maxWidth: function () {
return self.$el.width() - (self.$menu_apps.outerWidth(true) + self.$menu_brand_placeholder.outerWidth(true) + self.systray_menu.$el.outerWidth(true));
diff --git a/addons/web/static/src/js/chrome/systray_menu.js b/addons/web/static/src/js/chrome/systray_menu.js
index cb292a9b90f..0e25f2566de 100644
--- a/addons/web/static/src/js/chrome/systray_menu.js
+++ b/addons/web/static/src/js/chrome/systray_menu.js
@@ -39,6 +39,11 @@ var SystrayMenu = Widget.extend({
return Promise.all(proms);
});
},
+ on_attach_callback() {
+ this.widgets
+ .filter(widget => widget.on_attach_callback)
+ .forEach(widget => widget.on_attach_callback());
+ },
/**
* Add the instanciated items, using the object located in this.wisgets
*/
diff --git a/addons/web/static/tests/chrome/menu_tests.js b/addons/web/static/tests/chrome/menu_tests.js
new file mode 100644
index 00000000000..c7ce40b16c2
--- /dev/null
+++ b/addons/web/static/tests/chrome/menu_tests.js
@@ -0,0 +1,47 @@
+odoo.define('web.menu_tests', function (require) {
+ "use strict";
+
+ const testUtils = require('web.test_utils');
+ const Menu = require('web.Menu');
+ const SystrayMenu = require('web.SystrayMenu');
+ const Widget = require('web.Widget');
+
+
+ QUnit.module('chrome', {}, function () {
+ QUnit.module('Menu');
+
+ QUnit.test('Systray on_attach_callback is called', async function (assert) {
+ assert.expect(4);
+
+ const parent = testUtils.createParent({});
+
+ // Add some widgets to the systray
+ const Widget1 = Widget.extend({
+ on_attach_callback: () => assert.step('on_attach_callback widget1')
+ });
+ const Widget2 = Widget.extend({
+ on_attach_callback: () => assert.step('on_attach_callback widget2')
+ });
+ SystrayMenu.Items = [Widget1, Widget2]
+
+ testUtils.mock.patch(SystrayMenu, {
+ on_attach_callback: function () {
+ assert.step('on_attach_callback systray');
+ this._super(...arguments);
+ }
+ });
+
+ const menu = new Menu(parent, {children: []});
+ await menu.appendTo($('#qunit-fixture'));
+
+ assert.verifySteps([
+ 'on_attach_callback systray',
+ 'on_attach_callback widget1',
+ 'on_attach_callback widget2',
+ ]);
+ testUtils.mock.unpatch(SystrayMenu);
+ parent.destroy();
+ });
+ });
+
+});
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
index 39513722b99..62ebfb2d6da 100644
--- a/addons/web/views/webclient_templates.xml
+++ b/addons/web/views/webclient_templates.xml
@@ -723,6 +723,7 @@
<script type="text/javascript" src="/web/static/tests/chrome/action_manager_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/pager_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/keyboard_navigation_mixin_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/chrome/menu_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/user_menu_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/systray_tests.js"></script>