diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py
index daac4829235..4980f295e93 100644
--- a/addons/mail/models/mail_channel.py
+++ b/addons/mail/models/mail_channel.py
@@ -150,7 +150,7 @@ class Channel(models.Model):
@api.multi
def action_unfollow(self):
result = self.write({'channel_partner_ids': [(3, self.env.user.partner_id.id)]})
- self.env['bus.bus'].sendone((self._cr.dbname, 'res.partner', self.env.user.partner_id.id), self.channel_info()[0])
+ self.env['bus.bus'].sendone((self._cr.dbname, 'res.partner', self.env.user.partner_id.id), self.channel_info('unsubscribe')[0])
notification = _('
') % (self.id, self.name,)
self.message_post(body=notification, message_type="notification", subtype="mail.mt_comment")
return result
@@ -251,7 +251,7 @@ class Channel(models.Model):
return notifications
@api.multi
- def channel_info(self):
+ def channel_info(self, extra_info = False):
""" Get the informations header for the current channels
:returns a list of channels values
:rtype : list(dict)
@@ -272,6 +272,8 @@ class Channel(models.Model):
'channel_type': channel.channel_type,
'public': channel.public,
}
+ if extra_info:
+ info['info'] = extra_info
# add the partner for 'direct mesage' channel
if channel.channel_type == 'chat':
info['direct_partner'] = channel.sudo().channel_partner_ids.filtered(lambda p: p.id != self.env.user.partner_id.id).read(['id', 'name', 'im_status'])
diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js
index 9115ea995c8..325357a650e 100644
--- a/addons/mail/static/src/js/chat_manager.js
+++ b/addons/mail/static/src/js/chat_manager.js
@@ -487,18 +487,21 @@ function init () {
// new message in a channel
var message = notification[1];
var channel_id = message.channel_ids[0];
- // fetch the channel info if not done already
var channel = _.findWhere(channels, {id: channel_id});
- var channel_ready;
- if (!channel) {
- channel_ready = chat_manager.join_channel(channel_id, { autoswitch: false });
- }
- $.when(channel_ready).then(function () {
+ if (channel) {
add_message(message, { channel_id: channel_id, show_notification: true });
- });
+ }
}
if (model === 'res.partner') {
var chat_session = notification[1];
+ if (chat_session.info === "unsubscribe") {
+ var channel = _.findWhere(channels, {id: chat_session.id});
+ if (channel) {
+ channels = _.without(channels, channel);
+ }
+ chat_manager.bus.trigger("unsubscribe_from_channel", chat_session.id);
+ return;
+ }
if ((chat_session.channel_type === "channel") && (chat_session.public === "private") && (chat_session.state === "open")) {
add_channel(chat_session, {autoswitch: false});
if (!chat_session.is_minimized) {
@@ -507,7 +510,7 @@ function init () {
}
// partner specific change (open a detached window for example)
if ((chat_session.state === "open") || (chat_session.state === "folded")) {
- add_channel(chat_session, {autoswitch: false, silent: true, hidden: true});
+ add_channel(chat_session, {autoswitch: false});
if (chat_session.is_minimized) {
chat_manager.bus.trigger("open_chat", chat_session);
}
diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js
index 9a0f6f914d1..251f6e3b772 100644
--- a/addons/mail/static/src/js/client_action.js
+++ b/addons/mail/static/src/js/client_action.js
@@ -204,6 +204,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
query.is_displayed = query.is_displayed || channel.id === self.channel.id;
});
chat_manager.bus.on('update_needaction', self, self.on_update_needaction);
+ chat_manager.bus.on('unsubscribe_from_channel', self, self.render_sidebar);
});
},
diff --git a/addons/mail/static/src/js/window_manager.js b/addons/mail/static/src/js/window_manager.js
index 5c9a24b6dc5..aacf2a2919f 100644
--- a/addons/mail/static/src/js/window_manager.js
+++ b/addons/mail/static/src/js/window_manager.js
@@ -106,6 +106,14 @@ core.bus.on('web_client_ready', null, function () {
});
});
+ chat_manager.bus.on('unsubscribe_from_channel', null, function (channel_id) {
+ _.each(chat_sessions, function (session) {
+ if (channel_id === session.id) {
+ close_chat(session);
+ }
+ });
+ });
+
chat_manager.is_ready.then(function() {
_.each(chat_manager.get_channels(), function (channel) {
if (channel.is_detached) {