[FIX] im_livechat, mail, website_livechat: invite button in livechats

Task-2334724

closes odoo/odoo#57511

X-original-commit: 5316c91c27e48bfaa3ebf3fb97e35220fabc986e
Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
Alexandre Kühn
2020-09-11 11:07:12 +00:00
parent 8141e878fe
commit 8be77ece37
8 changed files with 100 additions and 13 deletions
@@ -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"
);
});
});
});
});
@@ -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;
},
});
});
@@ -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;
@@ -68,6 +70,16 @@ registerInstancePatchModel('mail.thread', 'im_livechat/static/src/models/thread/
// Private
//----------------------------------------------------------------------
/**
* @override
*/
_computeCorrespondent() {
if (this.channel_type === 'livechat') {
// livechat correspondent never change: always the public member.
return [];
}
return this._super();
},
/**
* @override
*/
@@ -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();
},
});
});
@@ -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"/>
@@ -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`.
*
@@ -162,6 +162,16 @@ const DiscussWidget = AbstractAction.extend({
active_id: this.discuss.activeId,
});
},
/**
* @private
* @returns {boolean}
*/
_shouldHaveInviteButton() {
return (
this.discuss.thread &&
this.discuss.thread.channel_type === 'channel'
);
},
/**
* @private
*/
@@ -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');
@@ -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,