diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js
index 280af961b5a..3fa366dbe49 100644
--- a/addons/mail/static/src/js/chat_manager.js
+++ b/addons/mail/static/src/js/chat_manager.js
@@ -196,9 +196,8 @@ function make_channel (data, options) {
return channel;
}
-function get_channel_cache (channel_id, domain) {
+function get_channel_cache (channel, domain) {
var stringified_domain = JSON.stringify(domain || []);
- var channel = _.findWhere(channels, {id: channel_id});
if (!channel.cache[stringified_domain]) {
channel.cache[stringified_domain] = {
all_history_loaded: false,
@@ -218,11 +217,11 @@ function remove_message_from_channel (channel_id, message) {
}
// options: domain, load_more
-function fetch_from_channel (channel_id, options) {
+function fetch_from_channel (channel, options) {
var domain =
- (channel_id === "channel_inbox") ? [['needaction', '=', true]] :
- (channel_id === "channel_starred") ? [['starred', '=', true]] :
- [['channel_ids', 'in', channel_id]];
+ (channel.id === "channel_inbox") ? [['needaction', '=', true]] :
+ (channel.id === "channel_starred") ? [['starred', '=', true]] :
+ [['channel_ids', 'in', channel.id]];
options = options || {};
if (options.domain) {
@@ -230,7 +229,7 @@ function fetch_from_channel (channel_id, options) {
}
if (options.load_more) {
var min_message_id = _.chain(messages)
- .filter(function (msg) { return _.contains(msg.channel_ids, channel_id); })
+ .filter(function (msg) { return _.contains(msg.channel_ids, channel.id); })
.pluck("id")
.min()
.value();
@@ -239,7 +238,7 @@ function fetch_from_channel (channel_id, options) {
}
return MessageModel.call('message_fetch', [domain], {limit: LIMIT}).then(function (msgs) {
- var cache = get_channel_cache(channel_id, options.domain);
+ var cache = get_channel_cache(channel, options.domain);
cache.message_ids = _.uniq(cache.message_ids.concat(_.pluck(msgs, 'id')));
if (!cache.all_history_loaded) {
@@ -248,7 +247,7 @@ function fetch_from_channel (channel_id, options) {
cache.loaded = true;
_.each(msgs, function (msg) {
- add_message(msg, {channel_id: channel_id, silent: true});
+ add_message(msg, {channel_id: channel.id, silent: true});
});
return _.filter(messages, function (m) {
return _.contains(cache.message_ids, m.id);
@@ -290,22 +289,23 @@ var chat_manager = {
get_messages: function (options) {
if ('channel_id' in options) { // channel message
- var channel_cache = get_channel_cache(options.channel_id, options.domain);
+ var channel = this.get_channel(options.channel_id);
+ var channel_cache = get_channel_cache(channel, options.domain);
if (channel_cache.loaded) {
return $.when(_.filter(messages, function (message) {
return _.contains(message.channel_ids, options.channel_id);
}));
} else {
- return fetch_from_channel(options.channel_id);
+ return fetch_from_channel(channel);
}
} else { // chatter message
}
},
- fetch: function (channel_id, domain) {
- return fetch_from_channel(channel_id, {domain: domain});
+ fetch: function (channel, domain) {
+ return fetch_from_channel(channel, {domain: domain});
},
- fetch_more: function (channel_id, domain) {
- return fetch_from_channel(channel_id, {domain: domain, load_more: true});
+ fetch_more: function (channel, domain) {
+ return fetch_from_channel(channel, {domain: domain, load_more: true});
},
/**
* Fetches chatter messages from their ids
@@ -342,8 +342,8 @@ var chat_manager = {
return _.findWhere(channels, {id: id}) || channels[0];
},
- all_history_loaded: function (channel_id, domain) {
- return get_channel_cache(channel_id, domain).all_history_loaded;
+ all_history_loaded: function (channel, domain) {
+ return get_channel_cache(channel, domain).all_history_loaded;
},
get_emojis: function() {
@@ -354,8 +354,7 @@ var chat_manager = {
return needaction_counter;
},
- detach_channel: function (channel_id) {
- var channel = this.get_channel(channel_id);
+ detach_channel: function (channel) {
return ChannelModel.call("channel_minimize", [channel.uuid, true]);
},
remove_chatter_messages: function (model) {
@@ -384,13 +383,12 @@ var chat_manager = {
});
},
- unsubscribe: function (channel_id) {
+ unsubscribe: function (channel) {
var def;
- var channel = chat_manager.get_channel(channel_id);
if (channel.type === "dm") {
def = ChannelModel.call('channel_pin', [channel.uuid, false]);
} else {
- def = ChannelModel.call('action_unfollow', [[channel_id]]);
+ def = ChannelModel.call('action_unfollow', [[channel.id]]);
}
return def.then(function () {
channels = _.without(channels, channel);
diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js
index 7d118ce261f..c6a872ae54e 100644
--- a/addons/mail/static/src/js/client_action.js
+++ b/addons/mail/static/src/js/client_action.js
@@ -91,7 +91,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
"click .o_mail_chat_channel_item": function (event) {
event.preventDefault();
var channel_id = this.$(event.currentTarget).data('channel-id');
- this.set_channel(channel_id);
+ this.set_channel(chat_manager.get_channel(channel_id));
},
"click .o_mail_sidebar_title .o_add": function (event) {
event.preventDefault();
@@ -108,18 +108,20 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
event.stopPropagation();
var self = this;
var channel_id = $(event.target).data("channel-id");
- chat_manager.unsubscribe(channel_id).then(function () {
- self.render_sidebar();
- self.set_channel("channel_inbox");
- });
+ chat_manager
+ .unsubscribe(chat_manager.get_channel(channel_id))
+ .then(function () {
+ self.render_sidebar();
+ self.set_channel(chat_manager.get_channel("channel_inbox"));
+ });
},
},
on_attach_callback: function () {
- this.thread.scroll_to({offset: this.channels_scrolltop[this.channel_id]});
+ this.thread.scroll_to({offset: this.channels_scrolltop[this.channel.id]});
},
on_detach_callback: function () {
- this.channels_scrolltop[this.channel_id] = this.thread.get_scrolltop();
+ this.channels_scrolltop[this.channel.id] = this.thread.get_scrolltop();
},
init: function(parent, action) {
@@ -141,7 +143,9 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
};
var dataset = new data.DataSetSearch(this, 'mail.message');
var view_id = (this.action && this.action.search_view_id && this.action.search_view_id[0]) || false;
- var default_channel = this.action.context.active_id || this.action.params.default_active_id || 'channel_inbox';
+ var default_channel_id = this.action.context.active_id ||
+ this.action.params.default_active_id ||
+ 'channel_inbox';
this.searchview = new SearchView(this, dataset, view_id, {}, options);
this.searchview.on('search_data', this, this.on_search);
@@ -185,13 +189,13 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
this.render_sidebar();
return $.when(def1, def2, def3, def4)
- .then(this.set_channel.bind(this, default_channel))
+ .then(this.set_channel.bind(this, chat_manager.get_channel(default_channel_id)))
.then(function () {
chat_manager.bus.on('new_message', self, self.on_new_message);
chat_manager.bus.on('update_message', self, self.on_update_message);
chat_manager.bus.on('new_channel', self, self.on_new_channel);
chat_manager.bus.on('anyone_listening', self, function (channel, query) {
- query.is_displayed = query.is_displayed || channel.id === self.channel_id;
+ query.is_displayed = query.is_displayed || channel.id === self.channel.id;
});
chat_manager.bus.on('update_needaction', self, self.on_update_needaction);
});
@@ -284,16 +288,14 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
});
},
- set_channel: function (channel_id) {
+ set_channel: function (channel) {
var self = this;
// Store scroll position of previous channel
- if (this.channel_id) {
- this.channels_scrolltop[this.channel_id] = this.thread.get_scrolltop();
+ if (this.channel) {
+ this.channels_scrolltop[this.channel.id] = this.thread.get_scrolltop();
}
- var new_channel_scrolltop = this.channels_scrolltop[channel_id];
- var channel = chat_manager.get_channel(channel_id);
- channel_id = channel.id;
- this.channel_id = channel_id;
+ var new_channel_scrolltop = this.channels_scrolltop[channel.id];
+ this.channel = channel;
this.set("title", channel.name);
this.$buttons.toggle(channel.type !== "static");
this.$buttons
@@ -301,12 +303,12 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
.toggle(channel.type !== "dm");
this.update_cp();
- this.action.context.active_id = channel_id;
- this.action.context.active_ids = [channel_id];
+ this.action.context.active_id = channel.id;
+ this.action.context.active_ids = [channel.id];
this.$('.o_mail_chat_channel_item')
.removeClass('o_active')
- .filter('[data-channel-id=' + channel_id + ']')
+ .filter('[data-channel-id=' + channel.id + ']')
.removeClass('o_unread_message')
.addClass('o_active');
@@ -320,15 +322,15 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
}
self.action_manager.do_push_state({
action: self.action.id,
- active_id: self.channel_id,
+ active_id: self.channel.id,
});
});
},
fetch_and_render_thread: function () {
var self = this;
- return chat_manager.fetch(this.channel_id, this.domain).then(function(result) {
- var history_loaded = chat_manager.all_history_loaded(self.channel_id, self.domain);
+ return chat_manager.fetch(this.channel, this.domain).then(function(result) {
+ var history_loaded = chat_manager.all_history_loaded(self.channel, self.domain);
self.thread.render(result, {display_load_more: !history_loaded});
});
},
@@ -339,9 +341,9 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
var oldest_msg_selector = '.o_thread_message[data-message-id="' + oldest_msg_id + '"]';
var offset = -framework.getPosition(document.querySelector(oldest_msg_selector)).top;
return chat_manager
- .fetch_more(this.channel_id, this.domain)
+ .fetch_more(this.channel, this.domain)
.then(function(result) {
- var history_loaded = chat_manager.all_history_loaded(self.channel_id, self.domain);
+ var history_loaded = chat_manager.all_history_loaded(self.channel, self.domain);
self.thread.render(result, {display_load_more: !history_loaded});
offset += framework.getPosition(document.querySelector(oldest_msg_selector)).top;
self.thread.scroll_to({offset: offset});
@@ -390,11 +392,11 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
this.update_cp(); // do not reload the client action, just display it, but a refresh of the control panel is needed.
this.action_manager.do_push_state({
action: this.action.id,
- active_id: this.channel_id,
+ active_id: this.channel.id,
});
},
on_post_message: function (message) {
- message.channel_id = this.channel_id;
+ message.channel_id = this.channel.id;
chat_manager
.post_message(message)
.fail(function () {
@@ -403,13 +405,13 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
},
on_new_message: function (message) {
var self = this;
- if (_.contains(message.channel_ids, this.channel_id)) {
+ if (_.contains(message.channel_ids, this.channel.id)) {
this.fetch_and_render_thread().then(function () {
self.thread.scroll_to({id: message.id});
});
}
// Indicate in the sidebar that there is a new message in the corresponding channels
- _.each(_.without(message.channel_ids, this.channel_id), function (channel_id) {
+ _.each(_.without(message.channel_ids, this.channel.id), function (channel_id) {
self.$('.o_mail_chat_channel_item')
.filter('[data-channel-id=' + channel_id + ']')
.addClass('o_unread_message');
@@ -419,20 +421,21 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
},
on_update_message: function (message) {
var self = this;
- if ((this.channel_id === "channel_starred" && !message.is_starred) ||
- (this.channel_id === "channel_inbox" && !message.is_needaction)) {
- chat_manager.fetch(this.channel_id, this.domain).then(function (messages) {
- var history_loaded = chat_manager.all_history_loaded(self.channel_id, self.domain);
+ var current_channel_id = this.channel.id;
+ if ((current_channel_id === "channel_starred" && !message.is_starred) ||
+ (current_channel_id === "channel_inbox" && !message.is_needaction)) {
+ chat_manager.fetch(this.channel, this.domain).then(function (messages) {
+ var history_loaded = chat_manager.all_history_loaded(self.channel, self.domain);
self.thread.remove_message_and_render(message.id, messages, {display_load_more: !history_loaded});
});
- } else if (_.contains(message.channel_ids, this.channel_id)) {
+ } else if (_.contains(message.channel_ids, current_channel_id)) {
this.fetch_and_render_thread();
}
},
on_new_channel: function (channel) {
this.render_sidebar();
if (channel.autoswitch) {
- this.set_channel(channel.id);
+ this.set_channel(channel);
}
},
on_update_needaction: function () {
@@ -443,23 +446,21 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
},
on_click_button_invite: function () {
- var channel = chat_manager.get_channel(this.channel_id);
- var title = _.str.sprintf(_t('Invite people to %s'), channel.name);
- new PartnerInviteDialog(this, title, this.channel_id).open();
+ var title = _.str.sprintf(_t('Invite people to %s'), this.channel.name);
+ new PartnerInviteDialog(this, title, this.channel.id).open();
},
on_click_button_detach: function () {
- chat_manager.detach_channel(this.channel_id);
+ chat_manager.detach_channel(this.channel);
},
on_click_button_unsubscribe: function () {
var self = this;
- var channel = chat_manager.get_channel(this.channel_id);
chat_manager
- .unsubscribe(channel.id)
+ .unsubscribe(this.channel)
.then(this.set_channel.bind(this, "channel_inbox"))
.then(this.render_sidebar.bind(this))
.then(function () {
- var msg = _.str.sprintf(_t('You unsubscribed from %s.'), channel.name);
+ var msg = _.str.sprintf(_t('You unsubscribed from %s.'), self.channel.name);
self.do_notify(_t("Unsubscribed"), msg);
});
},
@@ -467,7 +468,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
this.do_action({
type: 'ir.actions.act_window',
res_model: "mail.channel",
- res_id: this.channel_id,
+ res_id: this.channel.id,
views: [[false, 'form']],
target: 'current'
}, {