diff options
| author | Christophe Simonis <chs@odoo.com> | 2016-01-27 12:17:12 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2016-01-27 12:17:12 +0100 |
| commit | 6f923cbdcdc9a78d1999999b3bbd917eb8b4e921 (patch) | |
| tree | e33942eb0be8605f6219853a66b66df54f94f329 /addons/mail/static/src/js | |
| parent | e5e7c4c1217c04d93820cf6007fd8ceed30d0cfa (diff) | |
| parent | 4bbddc7476ff26098207ed80e89ce881f6dd161a (diff) | |
[MERGE] forward port of branch 9.0 up to 4bbddc7
Diffstat (limited to 'addons/mail/static/src/js')
| -rw-r--r-- | addons/mail/static/src/js/chat_manager.js | 52 | ||||
| -rw-r--r-- | addons/mail/static/src/js/chat_window.js | 10 | ||||
| -rw-r--r-- | addons/mail/static/src/js/chatter.js | 21 | ||||
| -rw-r--r-- | addons/mail/static/src/js/client_action.js | 10 | ||||
| -rw-r--r-- | addons/mail/static/src/js/composer.js | 3 | ||||
| -rw-r--r-- | addons/mail/static/src/js/window_manager.js | 6 |
6 files changed, 73 insertions, 29 deletions
diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js index aff51c721cf..75b1819ddd2 100644 --- a/addons/mail/static/src/js/chat_manager.js +++ b/addons/mail/static/src/js/chat_manager.js @@ -118,7 +118,7 @@ function strip_html (node, transform_children) { function inline (node, transform_children) { if (node.nodeType === 3) return node.data; if (node.tagName === "BR") return " "; - if (node.tagName.match(/^(A|P|DIV)$/)) return transform_children(); + if (node.tagName.match(/^(A|P|DIV|PRE)$/)) return transform_children(); node.innerHTML = transform_children(); return node.outerHTML; } @@ -133,7 +133,7 @@ function add_message (data, options) { if (!msg) { msg = make_message(data); - // Keep the array ordered by date when inserting the new message + // Keep the array ordered by id when inserting the new message messages.splice(_.sortedIndex(messages, msg, 'id'), 0, msg); _.each(msg.channel_ids, function (channel_id) { var channel = chat_manager.get_channel(channel_id); @@ -457,9 +457,7 @@ function update_channel_unread_counter (channel, counter) { } var channel_seen = _.throttle(function (channel) { - return ChannelModel.call('channel_seen', [[channel.id]]).then(function (last_seen_message_id) { - channel.last_seen_message_id = last_seen_message_id; - }); + return ChannelModel.call('channel_seen', [[channel.id]], {}, {shadow: true}); }, 3000); // Notification handlers @@ -573,7 +571,7 @@ function on_mark_as_read_notification (data) { _.each(data.channel_ids, function (channel_id) { var channel = chat_manager.get_channel(channel_id); if (channel) { - channel.needaction_counter -= data.message_ids.length; + channel.needaction_counter = Math.max(channel.needaction_counter - data.message_ids.length, 0); } }); } else { // if no channel_ids specified, this is a 'mark all read' in the inbox @@ -581,7 +579,7 @@ function on_mark_as_read_notification (data) { channel.needaction_counter = 0; }); } - needaction_counter -= data.message_ids.length; + needaction_counter = Math.max(needaction_counter - data.message_ids.length, 0); chat_manager.bus.trigger('update_needaction', needaction_counter); } @@ -609,8 +607,11 @@ function on_mark_as_unread_notification (data) { function on_channel_seen_notification (data) { var channel = chat_manager.get_channel(data.id); - if (channel && channel.unread_counter) { - update_channel_unread_counter(channel, 0); + if (channel) { + channel.last_seen_message_id = data.last_message_id; + if (channel.unread_counter) { + update_channel_unread_counter(channel, 0); + } } } @@ -781,7 +782,7 @@ var chat_manager = { } if (!channel.members_deferred) { channel.members_deferred = ChannelModel - .call("channel_fetch_listeners", [channel.uuid]) + .call("channel_fetch_listeners", [channel.uuid], {}, {shadow: true}) .then(function (members) { var suggestions = []; _.each(mention_partner_suggestions, function (partners) { @@ -790,7 +791,7 @@ var chat_manager = { })); }); - return [members].concat(suggestions); + return [members]; }); } return channel.members_deferred; @@ -807,12 +808,27 @@ var chat_manager = { return chat_unread_counter; }, + get_last_seen_message: function (channel) { + if (channel.last_seen_message_id) { + var messages = channel.cache['[]'].messages; + var msg = _.findWhere(messages, {id: channel.last_seen_message_id}); + if (msg) { + var i = _.sortedIndex(messages, msg, 'id') + 1; + while (i < messages.length && messages[i].author_id && messages[i].author_id[0] === session.partner_id) { + msg = messages[i]; + i++; + } + return msg; + } + } + }, + get_discuss_ids: function () { return discuss_ids; }, detach_channel: function (channel) { - return ChannelModel.call("channel_minimize", [channel.uuid, true]); + return ChannelModel.call("channel_minimize", [channel.uuid, true], {}, {shadow: true}); }, remove_chatter_messages: function (model) { messages = _.reject(messages, function (message) { @@ -864,7 +880,7 @@ var chat_manager = { }, close_chat_session: function (channel_id) { var channel = this.get_channel(channel_id); - ChannelModel.call("channel_fold", [], {uuid : channel.uuid, state : "closed"}); + ChannelModel.call("channel_fold", [], {uuid : channel.uuid, state : "closed"}, {shadow: true}); }, fold_channel: function (channel_id, folded) { var args = { @@ -873,7 +889,7 @@ var chat_manager = { if (_.isBoolean(folded)) { args.state = folded ? 'folded' : 'open'; } - return ChannelModel.call("channel_fold", [], args); + return ChannelModel.call("channel_fold", [], args, {shadow: true}); }, /** * Special redirection handling for given model and id @@ -948,8 +964,8 @@ var chat_manager = { return parse_and_transform(message_body, inline); }, - search_partner: function (search_val) { - return PartnerModel.call('im_search', [search_val, 20]).then(function(result) { + search_partner: function (search_val, limit) { + return PartnerModel.call('im_search', [search_val, limit || 20], {}, {shadow: true}).then(function(result) { var values = []; _.each(result, function(user) { var escaped_name = _.escape(user.name); @@ -994,8 +1010,8 @@ function init () { }); var ir_model = new Model("ir.model.data"); - var load_menu_id = ir_model.call("xmlid_to_res_id", ["mail.mail_channel_menu_root_chat"]); - var load_action_id = ir_model.call("xmlid_to_res_id", ["mail.mail_channel_action_client_chat"]); + var load_menu_id = ir_model.call("xmlid_to_res_id", ["mail.mail_channel_menu_root_chat"], {}, {shadow: true}); + var load_action_id = ir_model.call("xmlid_to_res_id", ["mail.mail_channel_action_client_chat"], {}, {shadow: true}); bus.on('notification', null, on_notification); diff --git a/addons/mail/static/src/js/chat_window.js b/addons/mail/static/src/js/chat_window.js index 851c7fa56d2..95ac9dd8897 100644 --- a/addons/mail/static/src/js/chat_window.js +++ b/addons/mail/static/src/js/chat_window.js @@ -24,10 +24,10 @@ return Widget.extend({ this._super(parent); this.title = title; this.channel_id = channel_id; - this.placeholder = _t("Say something"); this.folded = is_folded; this.options = _.defaults(options || {}, { display_stars: true, + placeholder: _t("Say something"), }); this.unread_msgs = unread_msgs || 0; this.is_hidden = false; @@ -46,6 +46,8 @@ return Widget.extend({ if (this.folded) { this.$el.css('height', HEIGHT_FOLDED); + } else { + this.focus_input(); } var def = this.thread.replace(this.$('.o_chat_content')); return $.when(this._super(), def); @@ -67,9 +69,15 @@ return Widget.extend({ this.folded = _.isBoolean(fold) ? fold : !this.folded; if (!this.folded) { this.thread.scroll_to(); + this.focus_input(); } this.fold(); }, + focus_input: function () { + if (!config.device.touch) { + this.$input.focus(); + } + }, do_show: function () { this.is_hidden = false; this._super.apply(this, arguments); diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js index c0613666be3..dc528b2b1aa 100644 --- a/addons/mail/static/src/js/chatter.js +++ b/addons/mail/static/src/js/chatter.js @@ -451,6 +451,7 @@ var ChatterComposer = composer.BasicComposer.extend({ record_name: false, is_log: false, internal_subtypes: [], + default_body: '', }); if (this.options.is_log) { this.options.send_text = _('Log'); @@ -467,6 +468,13 @@ var ChatterComposer = composer.BasicComposer.extend({ return $.when(this._super.apply(this, arguments), this.message_get_suggested_recipients()); }, + start: function () { + var self = this; + return this._super().then(function () { + self.$input.val(self.options.default_body); + }); + }, + should_send: function () { return false; }, @@ -866,6 +874,8 @@ var Chatter = form_common.AbstractField.extend({ // destroy current composer, if any if (this.composer) { this.composer.destroy(); + this.composer = undefined; + this.mute_new_message_button(false); } // fetch and render messages of current document @@ -895,6 +905,7 @@ var Chatter = form_common.AbstractField.extend({ internal_subtypes: this.options.internal_subtypes, is_log: options && options.is_log, record_name: this.record_name, + default_body: old_composer && old_composer.$input.val(), }); this.composer.on('input_focused', this, function () { this.composer.mention_set_prefetched_partners(this.mention_suggestions || []); @@ -910,11 +921,19 @@ var Chatter = form_common.AbstractField.extend({ self.composer.on('post_message', self, self.on_post_message); self.composer.on('need_refresh', self, self.refresh_followers); }); - + this.mute_new_message_button(true); }, close_composer: function () { if (this.composer.is_empty()) { this.composer.do_hide(); + this.mute_new_message_button(false); + } + }, + mute_new_message_button: function (mute) { + if (mute) { + this.$('.o_chatter_button_new_message').removeClass('btn-primary').addClass('btn-default'); + } else if (!mute) { + this.$('.o_chatter_button_new_message').removeClass('btn-default').addClass('btn-primary'); } }, diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js index 38cc26e8997..82b36f3425d 100644 --- a/addons/mail/static/src/js/client_action.js +++ b/addons/mail/static/src/js/client_action.js @@ -171,8 +171,8 @@ var ChatAction = Widget.extend(ControlPanelMixin, { this.searchview = new SearchView(this, dataset, view_id, {}, options); this.searchview.on('search_data', this, this.on_search); - this.basic_composer = new composer.BasicComposer(this); - this.extended_composer = new composer.ExtendedComposer(this); + this.basic_composer = new composer.BasicComposer(this, {mention_partners_restricted: true}); + this.extended_composer = new composer.ExtendedComposer(this, {mention_partners_restricted: true}); this.thread = new ChatThread(this, { display_help: true, shorten_messages: false, @@ -423,13 +423,11 @@ var ChatAction = Widget.extend(ControlPanelMixin, { // Compute position of the 'New messages' separator, only once when joining // a channel to keep it in the thread when new messages arrive if (_.isUndefined(this.messages_separator_position)) { - var msg_id = this.last_seen_message_id; if (!this.unread_counter) { this.messages_separator_position = false; // no unread message -> don't display separator - } else if ((msg_id === false) || !_.findWhere(messages, {id: msg_id})) { - this.messages_separator_position = 'top'; // all displayed messages are unread } else { - this.messages_separator_position = msg_id; // last read message is msg_id + var msg = chat_manager.get_last_seen_message(this.channel); + this.messages_separator_position = msg ? msg.id : 'top'; } } return { diff --git a/addons/mail/static/src/js/composer.js b/addons/mail/static/src/js/composer.js index dae8cdc4241..5d6de2bad50 100644 --- a/addons/mail/static/src/js/composer.js +++ b/addons/mail/static/src/js/composer.js @@ -331,6 +331,7 @@ var BasicComposer = Widget.extend({ input_max_height: 150, input_min_height: 28, mention_fetch_limit: 8, + mention_partners_restricted: false, // set to true to only suggest prefetched partners send_text: _('Send'), }); this.context = this.options.context; @@ -620,7 +621,7 @@ var BasicComposer = Widget.extend({ } } }); - if (!suggestions.length) { + if (!suggestions.length && !self.options.mention_partners_restricted) { // no result found among prefetched partners, fetch other suggestions var kwargs = { limit: limit, diff --git a/addons/mail/static/src/js/window_manager.js b/addons/mail/static/src/js/window_manager.js index 05afc816712..65488129884 100644 --- a/addons/mail/static/src/js/window_manager.js +++ b/addons/mail/static/src/js/window_manager.js @@ -343,8 +343,10 @@ core.bus.on('web_client_ready', null, function () { var chat_session = _.findWhere(chat_sessions, {id: channel.id}); if (!chat_session || chat_session.window.folded) { chat_manager.detach_channel(channel); - } else if (chat_session && chat_session.window.is_hidden) { + } else if (chat_session.window.is_hidden) { make_session_visible(chat_session); + } else { + chat_session.window.focus_input(); } }); @@ -370,7 +372,7 @@ return ChatWindow.extend({ self.$('.o_chat_search_input input') .autocomplete({ source: function(request, response) { - chat_manager.search_partner(request.term).done(response); + chat_manager.search_partner(request.term, 10).done(response); }, select: function(event, ui) { self.trigger('open_dm_session', ui.item.id); |
