diff --git a/addons/im_livechat/models/mail_channel.py b/addons/im_livechat/models/mail_channel.py index 8fb014f0b8f..08777c6a525 100644 --- a/addons/im_livechat/models/mail_channel.py +++ b/addons/im_livechat/models/mail_channel.py @@ -47,11 +47,16 @@ class MailChannel(models.Model): partner_name = self.env['res.partner'].browse(self.env.context.get('im_livechat_operator_partner_id')).name_get()[0] for channel_info in channel_infos: channel_info['operator_pid'] = partner_name - # add the anonymous name channel_infos_dict = dict((c['id'], c) for c in channel_infos) for channel in self: + # add the anonymous name if channel.anonymous_name: channel_infos_dict[channel.id]['anonymous_name'] = channel.anonymous_name + # add the last message date + if channel.channel_type == 'livechat': + last_msg = self.env['mail.message'].search([("channel_ids", "in", [channel.id])], limit=1) + if last_msg: + channel_infos_dict[channel.id]['last_message_date'] = last_msg.date return channel_infos_dict.values() @api.model diff --git a/addons/im_livechat/static/src/js/im_livechat_backend.js b/addons/im_livechat/static/src/js/im_livechat_backend.js index e69de29bb2d..f098e3dbe34 100644 --- a/addons/im_livechat/static/src/js/im_livechat_backend.js +++ b/addons/im_livechat/static/src/js/im_livechat_backend.js @@ -0,0 +1,31 @@ +odoo.define('im_livechat.chat_client_action', function (require) { +"use strict"; + +require('mail.chat_client_action'); +var chat_manager = require('mail.chat_manager'); +var core = require('web.core'); + +core.action_registry.get('mail.chat.instant_messaging').include({ + _render_sidebar: function (options) { + // Override to sort livechat channels by last message's date + var channel_partition = _.partition(options.channels, function (channel) { + return channel.type === 'livechat'; + }); + channel_partition[0].sort(function (c1, c2) { + return c2.last_message_date.diff(c1.last_message_date); + }); + options.channels = channel_partition[0].concat(channel_partition[1]); + return this._super(options); + }, +}); + +chat_manager.bus.on('new_message', null, function (msg) { + _.each(msg.channel_ids, function (channel_id) { + var channel = chat_manager.get_channel(channel_id); + if (channel) { + channel.last_message_date = msg.date; // update the last message's date of the channel + } + }); +}); + +}); diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js index ab9f88826dd..b70b601c7e7 100644 --- a/addons/mail/static/src/js/chat_manager.js +++ b/addons/mail/static/src/js/chat_manager.js @@ -273,6 +273,9 @@ function make_channel (data, options) { } else if ('anonymous_name' in data) { channel.name = data.anonymous_name; } + if (data.last_message_date) { + channel.last_message_date = moment(time.str_to_datetime(data.last_message_date)); + } channel.is_chat = !channel.type.match(/^(public|private|static)$/); if (data.message_unread_counter) { update_channel_unread_counter(channel, data.message_unread_counter); diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js index 8d4222f5a5e..a585a8ebcc5 100644 --- a/addons/mail/static/src/js/client_action.js +++ b/addons/mail/static/src/js/client_action.js @@ -293,11 +293,11 @@ var ChatAction = Widget.extend(ControlPanelMixin, { render_sidebar: function () { var self = this; - var $sidebar = $(QWeb.render("mail.chat.Sidebar", { + var $sidebar = this._render_sidebar({ active_channel_id: this.channel ? this.channel.id: undefined, channels: chat_manager.get_channels(), needaction_counter: chat_manager.get_needaction_counter(), - })); + }); this.$(".o_mail_chat_sidebar").html($sidebar.contents()); this.$('.o_mail_add_channel[data-type=public]').find("input").autocomplete({ @@ -349,6 +349,10 @@ var ChatAction = Widget.extend(ControlPanelMixin, { }); }, + _render_sidebar: function (options) { + return $(QWeb.render("mail.chat.Sidebar", options)); + }, + render_snackbar: function (template, context, timeout) { if (this.$snackbar) { this.$snackbar.remove();