diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js index e8a2ad3951e..adf1b5f6b57 100644 --- a/addons/mail/static/src/js/chat_manager.js +++ b/addons/mail/static/src/js/chat_manager.js @@ -15,6 +15,7 @@ var preview_msg_max_size = 50; var MessageModel = new Model('mail.message', session.context); var ChannelModel = new Model('mail.channel', session.context); +var UserModel = new Model('res.users', session.context); // Private model //---------------------------------------------------------------------------------- @@ -399,7 +400,7 @@ function on_needaction_notification (message) { function on_channel_notification (message) { var def; - if ((message.channel_ids.length === 1) && !chat_manager.get_channel(message.channel_ids[0])) { + if (message.channel_ids.length === 1) { def = chat_manager.join_channel(message.channel_ids[0], {autoswitch: false}); } else { def = $.when(); @@ -638,15 +639,21 @@ var chat_manager = { }, join_channel: function (channel_id, options) { if (channel_id in channel_defs) { + // prevents concurrent calls to channel_join_and_get_info return channel_defs[channel_id]; } - var def = ChannelModel - .call('channel_join_and_get_info', [[channel_id]]) - .then(function (result) { - add_channel(result, options); - }); - channel_defs[channel_id] = def; - return def; + var channel = this.get_channel(channel_id); + if (channel) { + // channel already joined + channel_defs[channel_id] = $.when(channel); + } else { + channel_defs[channel_id] = ChannelModel + .call('channel_join_and_get_info', [[channel_id]]) + .then(function (result) { + return add_channel(result, options); + }); + } + return channel_defs[channel_id]; }, unsubscribe: function (channel) { @@ -671,6 +678,38 @@ var chat_manager = { channel.is_folded = !channel.is_folded; }); }, + /** + * Special redirection handling for given model and id + * + * If the model is res.partner, and there is a user associated with this + * partner which isn't the current user, open the DM with this user. + * Otherwhise, open the record's form view, if this is not the current user's. + */ + redirect: function (res_model, res_id, dm_redirection_callback) { + var self = this; + var redirect_to_document = function (res_model, res_id) { + web_client.do_action({ + type:'ir.actions.act_window', + view_type: 'form', + view_mode: 'form', + res_model: res_model, + views: [[false, 'form']], + res_id: res_id, + }); + }; + if (res_model === "res.partner") { + var domain = [["partner_id", "=", res_id]]; + UserModel.call("search", [domain]).then(function (user_ids) { + if (user_ids.length && user_ids[0] !== session.uid) { + self.create_channel(res_id, 'dm').then(dm_redirection_callback || function () {}); + } else if (!user_ids.length) { + redirect_to_document(res_model, res_id); + } + }); + } else { + redirect_to_document(res_model, res_id); + } + }, }; // Initialization diff --git a/addons/mail/static/src/js/chat_window.js b/addons/mail/static/src/js/chat_window.js index 3936ef956e1..6166c4bce3d 100644 --- a/addons/mail/static/src/js/chat_window.js +++ b/addons/mail/static/src/js/chat_window.js @@ -37,9 +37,9 @@ return Widget.extend({ display_needactions: false, display_stars: this.options.display_stars, }); - this.thread.on('toggle_star_status', this, function (message_id) { - this.trigger('toggle_star_status', message_id); - }); + this.thread.on('toggle_star_status', null, this.trigger.bind(this, 'toggle_star_status')); + this.thread.on('redirect_to_channel', null, this.trigger.bind(this, 'redirect_to_channel')); + this.thread.on('redirect', null, this.trigger.bind(this, 'redirect')); this.fold(); var def = this.thread.appendTo(this.$content); @@ -67,8 +67,8 @@ return Widget.extend({ height: this.folded ? "28px" : "333px" }); }, - toggle_fold: function () { - this.folded = !this.folded; + toggle_fold: function (fold) { + this.folded = _.isBoolean(fold) ? fold : !this.folded; if (!this.folded) { this.unread_msgs = 0; this.trigger('messages_read'); diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js index d29312cf6f6..d812d2093ad 100644 --- a/addons/mail/static/src/js/chatter.js +++ b/addons/mail/static/src/js/chatter.js @@ -781,12 +781,7 @@ var Chatter = form_common.AbstractField.extend({ on_channel_redirect: function (channel_id) { var self = this; - var def; - var channel = chat_manager.get_channel(channel_id); - // If not registered to 'channel' yet, do it - if (!channel) { - def = chat_manager.join_channel(channel_id); - } + var def = chat_manager.join_channel(channel_id); $.when(def).then(function () { // Execute Discuss client action with 'channel' as default channel var discuss_ids = chat_manager.get_discuss_ids(); diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js index e4908188122..a1ecb7b8003 100644 --- a/addons/mail/static/src/js/client_action.js +++ b/addons/mail/static/src/js/client_action.js @@ -179,14 +179,11 @@ var ChatAction = Widget.extend(ControlPanelMixin, { }); this.$buttons.on('click', '.o_mail_chat_button_unstar_all', chat_manager.unstar_all); - this.thread.on('redirect', this, this.on_redirect); + this.thread.on('redirect', this, function (res_model, res_id) { + chat_manager.redirect(res_model, res_id, this.set_channel.bind(this)); + }); this.thread.on('redirect_to_channel', this, function (channel_id) { - var channel = chat_manager.get_channel(channel_id); - if (channel) { - this.set_channel(channel); - } else { - chat_manager.join_channel(channel_id); - } + chat_manager.join_channel(channel_id).then(this.set_channel.bind(this)); }); this.thread.on('load_more_messages', this, this.load_more_messages); this.thread.on('mark_as_read', this, function (message_id) { @@ -364,7 +361,6 @@ var ChatAction = Widget.extend(ControlPanelMixin, { self.$buttons .find('.o_mail_chat_button_unstar_all') .toggle(channel.id === "channel_starred"); - self.update_cp(); self.$('.o_chat_composer').toggle(channel.type !== 'static'); @@ -382,6 +378,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, { self.$('.o_mail_chat_sidebar').hide(); } + self.update_cp(); self.action_manager.do_push_state({ action: self.action.id, active_id: self.channel.id, @@ -478,6 +475,15 @@ var ChatAction = Widget.extend(ControlPanelMixin, { }); }, + do_show: function () { + this._super.apply(this, arguments); + this.update_cp(); + this.action_manager.do_push_state({ + action: this.action.id, + active_id: this.channel.id, + }); + }, + on_search: function (domains) { var result = pyeval.sync_eval_domains_and_contexts({ domains: domains @@ -487,56 +493,6 @@ var ChatAction = Widget.extend(ControlPanelMixin, { this.fetch_and_render_thread(); }, - /** - * Callback performed on o_mail_redirect element clicked - * - * If the model is res.partner, and there is a user associated with this - * partner which isn't the current user, open the DM with this user. - * Otherwhise, open the record's form view. - */ - on_redirect: function (res_model, res_id) { - var self = this; - var redirect_to_document = function (res_model, res_id) { - self.action_manager.do_push_state({ - model: res_model, - id: res_id, - }); - self.do_action({ - type:'ir.actions.act_window', - view_type: 'form', - view_mode: 'form', - res_model: res_model, - views: [[false, 'form']], - res_id: res_id, - }, { - on_reverse_breadcrumb: self.on_reverse_breadcrumb, - }); - }; - - if (res_model === "res.partner") { - var domain = [["partner_id", "=", res_id]]; - new Model('res.users').call("search", [domain]).then(function (user_ids) { - if (user_ids.length && user_ids[0] !== session.uid) { - chat_manager.create_channel(res_id, 'dm').then(function (channel) { - if (!self.channel || self.channel.id !== channel.id) { - self.set_channel(channel); - } - }); - } else { - redirect_to_document(res_model, res_id); - } - }); - } else { - redirect_to_document(res_model, res_id); - } - }, - on_reverse_breadcrumb: function () { - 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, - }); - }, on_post_message: function (message) { message.channel_id = this.channel.id; chat_manager @@ -604,8 +560,6 @@ var ChatAction = Widget.extend(ControlPanelMixin, { res_id: this.channel.id, views: [[false, 'form']], target: 'current' - }, { - on_reverse_breadcrumb: this.on_reverse_breadcrumb, }); }, }); diff --git a/addons/mail/static/src/js/window_manager.js b/addons/mail/static/src/js/window_manager.js index 22eb60f9180..65bc7ba8e91 100644 --- a/addons/mail/static/src/js/window_manager.js +++ b/addons/mail/static/src/js/window_manager.js @@ -43,6 +43,19 @@ function open_chat (session) { chat_session.window.on("messages_read", null, function () { chat_manager.mark_channel_as_seen(channel); }); + chat_session.window.on("redirect", null, function (res_model, res_id) { + chat_manager.redirect(res_model, res_id, open_chat); + }); + chat_session.window.on("redirect_to_channel", null, function (channel_id) { + var session = _.findWhere(chat_sessions, {id: channel_id}); + if (!session) { + chat_manager.join_channel(channel_id).then(function (channel) { + chat_manager.detach_channel(channel); + }); + } else { + session.window.toggle_fold(false); + } + }); chat_sessions.push(chat_session); chat_session.window.appendTo($('body'))