diff options
| author | Alexandre Kühn <aku@odoo.com> | 2020-09-07 09:26:38 +0000 |
|---|---|---|
| committer | Alexandre Kühn <aku@odoo.com> | 2020-09-11 10:40:22 +0000 |
| commit | 4a693c0233d3fbfdc991e2ccbfcbcd2d360ce788 (patch) | |
| tree | 79d4b3124355f7fdf4cb0cf18578bba24b2aa344 | |
| parent | 170cd2a0217c8d172115dee32e1e0e5e0451fc7a (diff) | |
[FIX] im_livechat, mail, website_livechat: invite button in livechats
Task-2334724
closes odoo/odoo#57505
X-original-commit: 5316c91c27e48bfaa3ebf3fb97e35220fabc986e
Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
8 files changed, 100 insertions, 13 deletions
diff --git a/addons/im_livechat/static/src/components/discuss/discuss_tests.js b/addons/im_livechat/static/src/components/discuss/discuss_tests.js index 166e4fd679f..c756f2dff93 100644 --- a/addons/im_livechat/static/src/components/discuss/discuss_tests.js +++ b/addons/im_livechat/static/src/components/discuss/discuss_tests.js @@ -411,6 +411,32 @@ QUnit.test('livechats with no messages are sorted by creation date in the sideba ); }); +QUnit.test('invite button should be present on livechat', async function (assert) { + assert.expect(1); + + this.data['mail.channel'].records.push( + { + anonymous_name: "Visitor 11", + channel_type: 'livechat', + id: 11, + livechat_operator_id: this.data.currentPartnerId, + members: [this.data.currentPartnerId, this.data.publicPartnerId], + }, + ); + await this.start({ + discuss: { + params: { + default_active_id: 'mail.channel_11', + }, + }, + }); + assert.containsOnce( + document.body, + '.o_widget_Discuss_controlPanelButtonInvite', + "Invite button should be visible in control panel when livechat is active thread" + ); +}); + }); }); }); diff --git a/addons/im_livechat/static/src/models/partner/partner.js b/addons/im_livechat/static/src/models/partner/partner.js new file mode 100644 index 00000000000..7392c8d6229 --- /dev/null +++ b/addons/im_livechat/static/src/models/partner/partner.js @@ -0,0 +1,23 @@ +odoo.define('im_livechat/static/src/models/partner/partner.js', function (require) { +'use strict'; + +const { + registerClassPatchModel, +} = require('mail/static/src/model/model_core.js'); + +let nextPublicId = -1; + +registerClassPatchModel('mail.partner', 'im_livechat/static/src/models/partner/partner.js', { + + //---------------------------------------------------------------------- + // Public + //---------------------------------------------------------------------- + + getNextPublicId() { + const id = nextPublicId; + nextPublicId -= 1; + return id; + }, +}); + +}); diff --git a/addons/im_livechat/static/src/models/thread/thread.js b/addons/im_livechat/static/src/models/thread/thread.js index 190a2088066..1ec06246ec7 100644 --- a/addons/im_livechat/static/src/models/thread/thread.js +++ b/addons/im_livechat/static/src/models/thread/thread.js @@ -53,9 +53,11 @@ registerClassPatchModel('mail.thread', 'im_livechat/static/src/models/thread/thr ) ); data2.members.push(['link', partner]); + data2.correspondent = [['link', partner]]; } else { const partnerData = this.env.models['mail.partner'].convertData(data.livechat_visitor); data2.members.push(['insert', partnerData]); + data2.correspondent = [['insert', partnerData]]; } } return data2; @@ -71,6 +73,16 @@ registerInstancePatchModel('mail.thread', 'im_livechat/static/src/models/thread/ /** * @override */ + _computeCorrespondent() { + if (this.channel_type === 'livechat') { + // livechat correspondent never change: always the public member. + return []; + } + return this._super(); + }, + /** + * @override + */ _computeDisplayName() { if (this.channel_type === 'livechat' && this.correspondent) { if (this.correspondent.country) { diff --git a/addons/im_livechat/static/src/widgets/discuss/discuss.js b/addons/im_livechat/static/src/widgets/discuss/discuss.js new file mode 100644 index 00000000000..37673669efa --- /dev/null +++ b/addons/im_livechat/static/src/widgets/discuss/discuss.js @@ -0,0 +1,25 @@ +odoo.define('im_livechat/static/src/widgets/discuss/discuss.js', function (require) { +'use strict'; + +const Discuss = require('mail/static/src/widgets/discuss/discuss.js'); + +Discuss.include({ + //---------------------------------------------------------------------- + // Private + //---------------------------------------------------------------------- + + /** + * @override + */ + _shouldHaveInviteButton() { + if ( + this.discuss.thread && + this.discuss.thread.channel_type === 'livechat' + ) { + return true; + } + return this._super(); + }, +}); + +}); diff --git a/addons/im_livechat/views/im_livechat_channel_templates.xml b/addons/im_livechat/views/im_livechat_channel_templates.xml index 045b9811701..59338e6dbc8 100644 --- a/addons/im_livechat/views/im_livechat_channel_templates.xml +++ b/addons/im_livechat/views/im_livechat_channel_templates.xml @@ -18,7 +18,9 @@ <script type="text/javascript" src="/im_livechat/static/src/components/thread_preview/thread_preview.js"></script> <script type="text/javascript" src="/im_livechat/static/src/models/messaging_initializer/messaging_initializer.js"></script> <script type="text/javascript" src="/im_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js"></script> + <script type="text/javascript" src="/im_livechat/static/src/models/partner/partner.js"></script> <script type="text/javascript" src="/im_livechat/static/src/models/thread/thread.js"></script> + <script type="text/javascript" src="/im_livechat/static/src/widgets/discuss/discuss.js"></script> <link rel="stylesheet" type="text/scss" href="/im_livechat/static/src/bugfix/bugfix.scss"/> <link rel="stylesheet" type="text/scss" href="/im_livechat/static/src/scss/im_livechat_history.scss"/> diff --git a/addons/mail/static/src/models/partner/partner.js b/addons/mail/static/src/models/partner/partner.js index 0b08451efcd..eb56720b862 100644 --- a/addons/mail/static/src/models/partner/partner.js +++ b/addons/mail/static/src/models/partner/partner.js @@ -8,8 +8,6 @@ const utils = require('web.utils'); function factory(dependencies) { - let nextPublicId = -1; - class Partner extends dependencies['mail.model'] { //---------------------------------------------------------------------- @@ -67,12 +65,6 @@ function factory(dependencies) { return data2; } - static getNextPublicId() { - const id = nextPublicId; - nextPublicId -= 1; - return id; - } - /** * Search for partners matching `keyword`. * diff --git a/addons/mail/static/src/widgets/discuss/discuss.js b/addons/mail/static/src/widgets/discuss/discuss.js index 53ed2f73b00..ac1eea69bf0 100644 --- a/addons/mail/static/src/widgets/discuss/discuss.js +++ b/addons/mail/static/src/widgets/discuss/discuss.js @@ -164,6 +164,16 @@ const DiscussWidget = AbstractAction.extend({ }, /** * @private + * @returns {boolean} + */ + _shouldHaveInviteButton() { + return ( + this.discuss.thread && + this.discuss.thread.channel_type === 'channel' + ); + }, + /** + * @private */ _showRainbowMan() { this.trigger_up('show_effect', { @@ -176,10 +186,7 @@ const DiscussWidget = AbstractAction.extend({ */ _updateControlPanel() { // Invite - if ( - this.discuss.thread && - this.discuss.thread.channel_type === 'channel' - ) { + if (this._shouldHaveInviteButton()) { this.$buttons.find('.o_invite').removeClass('o_hidden'); } else { this.$buttons.find('.o_invite').addClass('o_hidden'); diff --git a/addons/website_livechat/models/mail_channel.py b/addons/website_livechat/models/mail_channel.py index fd3189b8400..f82559491ab 100644 --- a/addons/website_livechat/models/mail_channel.py +++ b/addons/website_livechat/models/mail_channel.py @@ -36,7 +36,7 @@ class MailChannel(models.Model): 'name': visitor.display_name, 'country_code': visitor.country_id.code.lower() if visitor.country_id else False, 'is_connected': visitor.is_connected, - 'history': self._get_visitor_history(visitor), + 'history': self.sudo()._get_visitor_history(visitor), 'website': visitor.website_id.name, 'lang': visitor.lang_id.name, 'partner_id': visitor.partner_id.id, |
