From 12004c5665ce00c85ecfeefd94b7433d179ccf28 Mon Sep 17 00:00:00 2001 From: Xavier Dubuc Date: Fri, 15 Jan 2021 12:59:27 +0000 Subject: [PATCH] [FIX] hr_holidays: show plane icon according to user status MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit task-2377882 closes odoo/odoo#64614 Signed-off-by: Alexandre Kühn (aku) --- addons/hr_holidays/models/res_partner.py | 2 + addons/hr_holidays/models/res_users.py | 2 + .../partner_im_status_icon.scss | 12 -- .../partner_im_status_icon.xml | 7 +- .../partner_im_status_icon_tests.js | 111 ++++++++++++++ .../components/thread_icon/thread_icon.scss | 11 -- .../components/thread_icon/thread_icon.xml | 7 +- .../thread_icon/thread_icon_tests.js | 142 ++++++++++++++++++ .../hr_holidays/views/hr_leave_template.xml | 4 +- 9 files changed, 269 insertions(+), 29 deletions(-) delete mode 100644 addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.scss create mode 100644 addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon_tests.js delete mode 100644 addons/hr_holidays/static/src/components/thread_icon/thread_icon.scss create mode 100644 addons/hr_holidays/static/src/components/thread_icon/thread_icon_tests.js diff --git a/addons/hr_holidays/models/res_partner.py b/addons/hr_holidays/models/res_partner.py index dde82f5cc9b..88446797175 100644 --- a/addons/hr_holidays/models/res_partner.py +++ b/addons/hr_holidays/models/res_partner.py @@ -14,6 +14,8 @@ class ResPartner(models.Model): if partner.id in absent_now: if partner.im_status == 'online': partner.im_status = 'leave_online' + elif partner.im_status == 'away': + partner.im_status = 'leave_away' else: partner.im_status = 'leave_offline' diff --git a/addons/hr_holidays/models/res_users.py b/addons/hr_holidays/models/res_users.py index 24f70cdecd5..d87c2c65488 100644 --- a/addons/hr_holidays/models/res_users.py +++ b/addons/hr_holidays/models/res_users.py @@ -46,6 +46,8 @@ class User(models.Model): if user.id in on_leave_user_ids: if user.im_status == 'online': user.im_status = 'leave_online' + elif user.im_status == 'away': + user.im_status = 'leave_away' else: user.im_status = 'leave_offline' diff --git a/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.scss b/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.scss deleted file mode 100644 index e981e30f4b4..00000000000 --- a/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.scss +++ /dev/null @@ -1,12 +0,0 @@ -// ----------------------------------------------------------------------------- -// Style -// ----------------------------------------------------------------------------- - -.o_PartnerImStatusIcon_icon { - &.o-leave-online { - color: $o-enterprise-primary-color; - } - &.o-leave-offline { - color: theme-color('warning'); - } -} diff --git a/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.xml b/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.xml index c07377d390a..44c15d14633 100644 --- a/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.xml +++ b/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.xml @@ -3,10 +3,13 @@ - + + + + - + diff --git a/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon_tests.js b/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon_tests.js new file mode 100644 index 00000000000..8ed83d06684 --- /dev/null +++ b/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon_tests.js @@ -0,0 +1,111 @@ +odoo.define('hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon_tests.js', function (require) { +'use strict'; + +const components = { + PartnerImStatusIcon: require('mail/static/src/components/partner_im_status_icon/partner_im_status_icon.js'), +}; +const { + afterEach, + beforeEach, + createRootComponent, + start, +} = require('mail/static/src/utils/test_utils.js'); + +QUnit.module('hr_holidays', {}, function () { +QUnit.module('components', {}, function () { +QUnit.module('partner_im_status_icon', {}, function () { +QUnit.module('partner_im_status_icon_tests.js', { + beforeEach() { + beforeEach(this); + + this.createPartnerImStatusIcon = async partner => { + await createRootComponent(this, components.PartnerImStatusIcon, { + props: { partnerLocalId: partner.localId }, + target: this.widget.el + }); + }; + + this.start = async params => { + const { env, widget } = await start(Object.assign({}, params, { + data: this.data, + })); + this.env = env; + this.widget = widget; + }; + }, + afterEach() { + afterEach(this); + }, +}); + +QUnit.test('on leave & online', async function (assert) { + assert.expect(2); + + await this.start(); + const partner = this.env.models['mail.partner'].create({ + id: 7, + name: "Demo User", + im_status: 'leave_online', + }); + await this.createPartnerImStatusIcon(partner); + assert.hasClass( + document.querySelector('.o_PartnerImStatusIcon_icon'), + 'o-online', + "partner IM status icon should have online status rendering" + ); + assert.hasClass( + document.querySelector('.o_PartnerImStatusIcon_icon'), + 'fa-plane', + "partner IM status icon should have leave status rendering" + ); +}); + +QUnit.test('on leave & away', async function (assert) { + assert.expect(2); + + await this.start(); + const partner = this.env.models['mail.partner'].create({ + id: 7, + name: "Demo User", + im_status: 'leave_away', + }); + await this.createPartnerImStatusIcon(partner); + assert.hasClass( + document.querySelector('.o_PartnerImStatusIcon_icon'), + 'o-away', + "partner IM status icon should have away status rendering" + ); + assert.hasClass( + document.querySelector('.o_PartnerImStatusIcon_icon'), + 'fa-plane', + "partner IM status icon should have leave status rendering" + ); +}); + +QUnit.test('on leave & offline', async function (assert) { + assert.expect(2); + + await this.start(); + const partner = this.env.models['mail.partner'].create({ + id: 7, + name: "Demo User", + im_status: 'leave_offline', + }); + await this.createPartnerImStatusIcon(partner); + assert.hasClass( + document.querySelector('.o_PartnerImStatusIcon_icon'), + 'o-offline', + "partner IM status icon should have offline status rendering" + ); + assert.hasClass( + document.querySelector('.o_PartnerImStatusIcon_icon'), + 'fa-plane', + "partner IM status icon should have leave status rendering" + ); +}); + +}); +}); +}); + +}); diff --git a/addons/hr_holidays/static/src/components/thread_icon/thread_icon.scss b/addons/hr_holidays/static/src/components/thread_icon/thread_icon.scss deleted file mode 100644 index 4caabb3b222..00000000000 --- a/addons/hr_holidays/static/src/components/thread_icon/thread_icon.scss +++ /dev/null @@ -1,11 +0,0 @@ -// ------------------------------------------------------------------ -// Style -// ------------------------------------------------------------------ - -.o_ThreadIcon_leaveOnline { - color: $o-enterprise-primary-color; -} - -.o_ThreadIcon_leaveOffline { - color: theme-color('warning'); -} diff --git a/addons/hr_holidays/static/src/components/thread_icon/thread_icon.xml b/addons/hr_holidays/static/src/components/thread_icon/thread_icon.xml index f8a728a9c6d..9b3022cf158 100644 --- a/addons/hr_holidays/static/src/components/thread_icon/thread_icon.xml +++ b/addons/hr_holidays/static/src/components/thread_icon/thread_icon.xml @@ -3,10 +3,13 @@ -
+
+ + +
-
+
diff --git a/addons/hr_holidays/static/src/components/thread_icon/thread_icon_tests.js b/addons/hr_holidays/static/src/components/thread_icon/thread_icon_tests.js new file mode 100644 index 00000000000..6070698abd9 --- /dev/null +++ b/addons/hr_holidays/static/src/components/thread_icon/thread_icon_tests.js @@ -0,0 +1,142 @@ +odoo.define('hr_holidays/static/src/components/thread_icon/thread_icon_tests.js', function (require) { +'use strict'; + +const components = { + ThreadIcon: require('mail/static/src/components/thread_icon/thread_icon.js'), +}; +const { + afterEach, + beforeEach, + createRootComponent, + start, +} = require('mail/static/src/utils/test_utils.js'); + +QUnit.module('mail', {}, function () { +QUnit.module('components', {}, function () { +QUnit.module('thread_icon', {}, function () { +QUnit.module('thread_icon_tests.js', { + beforeEach() { + beforeEach(this); + + this.createThreadIcon = async thread => { + await createRootComponent(this, components.ThreadIcon, { + props: { threadLocalId: thread.localId }, + target: this.widget.el + }); + }; + + this.start = async params => { + const { env, widget } = await start(Object.assign({}, params, { + data: this.data, + })); + this.env = env; + this.widget = widget; + }; + + }, + afterEach() { + afterEach(this); + }, +}); + +QUnit.test('thread icon of a chat when correspondent is on leave & online', async function (assert) { + assert.expect(2); + + this.data['res.partner'].records.push({ + id: 7, + im_status: 'leave_online', + name: 'Demo', + }); + this.data['mail.channel'].records.push({ + channel_type: 'chat', + id: 20, + members: [this.data.currentPartnerId, 7], + }); + await this.start(); + const thread = this.env.models['mail.thread'].findFromIdentifyingData({ + id: 20, + model: 'mail.channel', + }); + await this.createThreadIcon(thread); + + assert.containsOnce( + document.body, + '.o_ThreadIcon_online', + "thread icon should have online status rendering" + ); + assert.hasClass( + document.querySelector('.o_ThreadIcon_online'), + 'fa-plane', + "thread icon should have leave status rendering" + ); +}); + +QUnit.test('thread icon of a chat when correspondent is on leave & away', async function (assert) { + assert.expect(2); + + this.data['res.partner'].records.push({ + id: 7, + im_status: 'leave_away', + name: 'Demo', + }); + this.data['mail.channel'].records.push({ + channel_type: 'chat', + id: 20, + members: [this.data.currentPartnerId, 7], + }); + await this.start(); + const thread = this.env.models['mail.thread'].findFromIdentifyingData({ + id: 20, + model: 'mail.channel', + }); + await this.createThreadIcon(thread); + + assert.containsOnce( + document.body, + '.o_ThreadIcon_away', + "thread icon should have away status rendering" + ); + assert.hasClass( + document.querySelector('.o_ThreadIcon_away'), + 'fa-plane', + "thread icon should have leave status rendering" + ); +}); + +QUnit.test('thread icon of a chat when correspondent is on leave & offline', async function (assert) { + assert.expect(2); + + this.data['res.partner'].records.push({ + id: 7, + im_status: 'leave_offline', + name: 'Demo', + }); + this.data['mail.channel'].records.push({ + channel_type: 'chat', + id: 20, + members: [this.data.currentPartnerId, 7], + }); + await this.start(); + const thread = this.env.models['mail.thread'].findFromIdentifyingData({ + id: 20, + model: 'mail.channel', + }); + await this.createThreadIcon(thread); + + assert.containsOnce( + document.body, + '.o_ThreadIcon_offline', + "thread icon should have offline status rendering" + ); + assert.hasClass( + document.querySelector('.o_ThreadIcon_offline'), + 'fa-plane', + "thread icon should have leave status rendering" + ); +}); + +}); +}); +}); + +}); diff --git a/addons/hr_holidays/views/hr_leave_template.xml b/addons/hr_holidays/views/hr_leave_template.xml index 87fca6085cf..68e8706341e 100644 --- a/addons/hr_holidays/views/hr_leave_template.xml +++ b/addons/hr_holidays/views/hr_leave_template.xml @@ -11,8 +11,6 @@ - - @@ -25,6 +23,8 @@