@@ -53,5 +50,43 @@
+
+
+
+ No activities planned.
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+ 0 Late
+
+ 0 Today
+
+ 0 Future
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/mail/static/tests/systray_tests.js b/addons/mail/static/tests/systray_tests.js
new file mode 100644
index 00000000000..7368bc59859
--- /dev/null
+++ b/addons/mail/static/tests/systray_tests.js
@@ -0,0 +1,90 @@
+odoo.define('mail.systray_tests', function (require) {
+"use strict";
+
+var systray = require('mail.systray');
+var testUtils = require('web.test_utils');
+
+
+QUnit.module('mail', {}, function () {
+
+QUnit.module('ActivityMenu', {
+ beforeEach: function () {
+
+ this.data = {
+ 'mail.activity.menu': {
+ fields: {
+ name: { type: "char" },
+ res_model: { type: "char" },
+ planned_count: { type: "integer"},
+ today_count: { type: "integer"},
+ overdue_count: { type: "integer"},
+ total_count: { type: "integer"},
+ },
+ records: [{
+ name: "Contact",
+ res_model: "res.partner",
+ planned_count: 0,
+ today_count: 1,
+ overdue_count: 0,
+ total_count: 1,
+ },
+ {
+ name: "Task",
+ res_model: "project.task",
+ planned_count: 1,
+ today_count: 0,
+ overdue_count: 0,
+ total_count: 1,
+ },
+ {
+ name: "Issue",
+ res_model: "project.issue",
+ planned_count: 1,
+ today_count: 1,
+ overdue_count: 0,
+ total_count: 2,
+ }],
+ },
+ };
+ }
+ });
+
+QUnit.test('activity menu widget: menu with no records', function (assert) {
+ assert.expect(1);
+
+ var activityMenu = new systray.ActivityMenu();
+ testUtils.addMockEnvironment(activityMenu, {
+ mockRPC: function (route, args) {
+ if (args.method === 'activity_user_count') {
+ return $.when([]);
+ }
+ return this._super(route, args);
+ },
+ });
+ activityMenu.appendTo($('#qunit-fixture'));
+ assert.ok(activityMenu.$('.o_no_activity').hasClass('o_no_activity'), "should not have instance of widget");
+ activityMenu.destroy();
+});
+
+QUnit.test('activity menu widget: activity menu with 3 records', function (assert) {
+ assert.expect(4);
+ var self = this;
+ var activityMenu = new systray.ActivityMenu();
+
+ testUtils.addMockEnvironment(activityMenu, {
+ mockRPC: function (route, args) {
+ if (args.method === 'activity_user_count') {
+ return $.when(self.data['mail.activity.menu']['records']);
+ }
+ return this._super(route, args);
+ },
+ });
+ activityMenu.appendTo($('#qunit-fixture'));
+ assert.ok(activityMenu.$el.hasClass('o_mail_navbar_item'), 'should be the instance of widget');
+ assert.ok(activityMenu.$('.o_mail_channel_preview').hasClass('o_mail_channel_preview'), "should instance of widget");
+ assert.ok(activityMenu.$('.o_notification_counter').hasClass('o_notification_counter'), "widget should have notification counter");
+ assert.strictEqual(parseInt(activityMenu.el.innerText), 4, "widget should have 4 notification counter");
+ activityMenu.destroy();
+});
+});
+});
diff --git a/addons/mail/views/mail_activity_views.xml b/addons/mail/views/mail_activity_views.xml
index 0eed66a79f1..a1104eec0c9 100644
--- a/addons/mail/views/mail_activity_views.xml
+++ b/addons/mail/views/mail_activity_views.xml
@@ -120,6 +120,9 @@
+
diff --git a/addons/mail/views/mail_templates.xml b/addons/mail/views/mail_templates.xml
index f0002c9dc2c..368978bb551 100644
--- a/addons/mail/views/mail_templates.xml
+++ b/addons/mail/views/mail_templates.xml
@@ -40,6 +40,7 @@
+
diff --git a/addons/mail/views/res_partner_views.xml b/addons/mail/views/res_partner_views.xml
index cd3d62cc7a0..eeaf586d1a9 100644
--- a/addons/mail/views/res_partner_views.xml
+++ b/addons/mail/views/res_partner_views.xml
@@ -43,6 +43,9 @@
+
diff --git a/addons/maintenance/views/maintenance_views.xml b/addons/maintenance/views/maintenance_views.xml
index d0d918664fe..7638212451d 100644
--- a/addons/maintenance/views/maintenance_views.xml
+++ b/addons/maintenance/views/maintenance_views.xml
@@ -36,6 +36,9 @@
+
@@ -483,6 +486,9 @@
+
diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml
index 25a9d56abed..39196c3661a 100644
--- a/addons/mrp/views/mrp_production_views.xml
+++ b/addons/mrp/views/mrp_production_views.xml
@@ -281,6 +281,9 @@
+
diff --git a/addons/mrp/views/mrp_unbuild_views.xml b/addons/mrp/views/mrp_unbuild_views.xml
index 112f72fcf53..e73a263ecc4 100644
--- a/addons/mrp/views/mrp_unbuild_views.xml
+++ b/addons/mrp/views/mrp_unbuild_views.xml
@@ -34,6 +34,9 @@
+
diff --git a/addons/mrp_repair/views/mrp_repair_views.xml b/addons/mrp_repair/views/mrp_repair_views.xml
index 0c59eb3e89d..524188e261f 100644
--- a/addons/mrp_repair/views/mrp_repair_views.xml
+++ b/addons/mrp_repair/views/mrp_repair_views.xml
@@ -253,6 +253,9 @@
+
diff --git a/addons/note/views/note_views.xml b/addons/note/views/note_views.xml
index aee385698f5..7d84e1d6e43 100644
--- a/addons/note/views/note_views.xml
+++ b/addons/note/views/note_views.xml
@@ -192,6 +192,9 @@
+
diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml
index 3e1923628e1..045d38090f1 100644
--- a/addons/project/views/project_views.xml
+++ b/addons/project/views/project_views.xml
@@ -47,6 +47,9 @@
+
@@ -447,7 +450,7 @@ action = model.activate_sample_project()
project.task.kanban
project.task
-
+
diff --git a/addons/project_issue/views/project_issue_views.xml b/addons/project_issue/views/project_issue_views.xml
index 4995c706b85..064487dab57 100644
--- a/addons/project_issue/views/project_issue_views.xml
+++ b/addons/project_issue/views/project_issue_views.xml
@@ -133,6 +133,9 @@
+
diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml
index 5e6662daa39..c50b14a63fc 100644
--- a/addons/purchase/views/purchase_views.xml
+++ b/addons/purchase/views/purchase_views.xml
@@ -334,6 +334,9 @@
+
diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml
index c788f449503..1873a81b900 100644
--- a/addons/sale/views/sale_views.xml
+++ b/addons/sale/views/sale_views.xml
@@ -407,6 +407,9 @@
+
diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml
index ff42bf3095a..d5606751094 100644
--- a/addons/stock/views/stock_picking_views.xml
+++ b/addons/stock/views/stock_picking_views.xml
@@ -416,6 +416,9 @@
+
diff --git a/addons/survey/views/survey_views.xml b/addons/survey/views/survey_views.xml
index 1f502263a3f..de452c32741 100644
--- a/addons/survey/views/survey_views.xml
+++ b/addons/survey/views/survey_views.xml
@@ -302,6 +302,9 @@
+
diff --git a/addons/website_event_track/views/event_track_views.xml b/addons/website_event_track/views/event_track_views.xml
index 21a68c401d4..5e8e4dfe60b 100644
--- a/addons/website_event_track/views/event_track_views.xml
+++ b/addons/website_event_track/views/event_track_views.xml
@@ -92,6 +92,9 @@
+