diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py
index fa4ba2e8f02..51c1bc0e658 100644
--- a/addons/mail/models/mail_channel.py
+++ b/addons/mail/models/mail_channel.py
@@ -628,3 +628,12 @@ class Channel(models.Model):
You can insert canned responses in your message by typing :shortcut.
""")
self._send_transient_message(partner, msg)
+
+ def _define_command_leave(self):
+ return {'help': _("Leave this channel")}
+
+ def _execute_command_leave(self, **kwargs):
+ if self.channel_type == 'channel':
+ self.action_unfollow()
+ else:
+ self.channel_pin(self.uuid, False)
diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js
index f2a29fc5916..2adf913faab 100644
--- a/addons/mail/static/src/js/chat_manager.js
+++ b/addons/mail/static/src/js/chat_manager.js
@@ -484,8 +484,18 @@ function on_channel_notification (message) {
function on_partner_notification (data) {
if (data.info === "unsubscribe") {
- remove_channel(chat_manager.get_channel(data.id));
- chat_manager.bus.trigger("unsubscribe_from_channel", data.id);
+ var channel = chat_manager.get_channel(data.id);
+ if (channel) {
+ var msg;
+ if (_.contains(['public', 'private'], channel.type)) {
+ msg = _.str.sprintf(_t('You unsubscribed from %s.'), channel.name);
+ } else {
+ msg = _.str.sprintf(_t('You unpinned your conversation with %s.'), channel.name);
+ }
+ remove_channel(channel);
+ chat_manager.bus.trigger("unsubscribe_from_channel", data.id);
+ web_client.do_notify(_("Unsubscribed"), msg);
+ }
} else if (data.type === 'toggle_star') {
on_toggle_star_notification(data);
} else if (data.type === 'mark_as_read') {
@@ -863,15 +873,11 @@ var chat_manager = {
},
unsubscribe: function (channel) {
- var def;
if (_.contains(['public', 'private'], channel.type)) {
- def = ChannelModel.call('action_unfollow', [[channel.id]]);
+ return ChannelModel.call('action_unfollow', [[channel.id]]);
} else {
- def = ChannelModel.call('channel_pin', [channel.uuid, false]);
+ return ChannelModel.call('channel_pin', [channel.uuid, false]);
}
- return def.then(function () {
- remove_channel(channel);
- });
},
close_chat_session: function (channel_id) {
var channel = this.get_channel(channel_id);
diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js
index 72626469a19..7870f79041c 100644
--- a/addons/mail/static/src/js/client_action.js
+++ b/addons/mail/static/src/js/client_action.js
@@ -105,7 +105,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
"click .o_mail_partner_unpin": function (event) {
event.stopPropagation();
var channel_id = $(event.target).data("channel-id");
- this.unsubscribe_from_channel(chat_manager.get_channel(channel_id));
+ chat_manager.unsubscribe(chat_manager.get_channel(channel_id));
},
"click .o_snackbar_undo": function (event) {
event.preventDefault();
@@ -259,7 +259,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
chat_manager.bus.on('anyone_listening', self, function (channel, query) {
query.is_displayed = query.is_displayed || (channel.id === self.channel.id && self.thread.is_at_bottom());
});
- chat_manager.bus.on('unsubscribe_from_channel', self, self.render_sidebar);
+ chat_manager.bus.on('unsubscribe_from_channel', self, self.on_channel_unsubscribed);
chat_manager.bus.on('update_needaction', self, self.throttled_render_sidebar);
chat_manager.bus.on('update_starred', self, self.throttled_render_sidebar);
chat_manager.bus.on('update_channel_unread_counter', self, self.throttled_render_sidebar);
@@ -469,20 +469,6 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
});
});
},
- unsubscribe_from_channel: function (channel) {
- var self = this;
- chat_manager
- .unsubscribe(channel)
- .then(this.render_sidebar.bind(this))
- .then(this.set_channel.bind(this, chat_manager.get_channel("channel_inbox")))
- .then(function () {
- if (_.contains(['public', 'private'], channel.type)) {
- var msg = _.str.sprintf(_t('You unsubscribed from %s.'), channel.name);
- self.do_notify(_t("Unsubscribed"), msg);
- }
- delete self.channels_scrolltop[channel.id];
- });
- },
get_thread_rendering_options: function (messages) {
// Compute position of the 'New messages' separator, only once when joining
@@ -642,6 +628,13 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
this.set_channel(channel);
}
},
+ on_channel_unsubscribed: function (channel_id) {
+ if (this.channel.id === channel_id) {
+ this.set_channel(chat_manager.get_channel("channel_inbox"));
+ }
+ this.render_sidebar();
+ delete this.channels_scrolltop[channel_id];
+ },
on_composer_input_focused: function () {
var composer = this.channel.mass_mailing ? this.extended_composer : this.basic_composer;
var commands = chat_manager.get_commands(this.channel);
@@ -656,7 +649,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
},
on_click_button_unsubscribe: function () {
- this.unsubscribe_from_channel(this.channel);
+ chat_manager.unsubscribe(this.channel);
},
on_click_button_settings: function() {
this.do_action({