From 33beee5b089bd564bc58a95497e897352cc047ce Mon Sep 17 00:00:00 2001 From: Rohan Patel Date: Fri, 8 Apr 2016 18:13:14 +0530 Subject: [PATCH] [IMP] mail: Discuss: lookup in JS cache before doing RPC When opening a new DM from the Discuss sidebar or from a chat window, and when inviting people to a channel, first search for a match in the prefetched partners (basically, the employees), and only perform the im_search RPC (extending the research to all users) if there is no match. Also sort the results by name. --- addons/mail/static/src/js/chat_manager.js | 30 +++++++++++++++------- addons/mail/static/src/js/client_action.js | 15 +++++------ 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js index 1c85166ed45..bfb1f86ee12 100644 --- a/addons/mail/static/src/js/chat_manager.js +++ b/addons/mail/static/src/js/chat_manager.js @@ -934,16 +934,28 @@ var chat_manager = { }, 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); - values.push(_.extend(user, { - 'value': escaped_name, - 'label': escaped_name, - })); + var def = $.Deferred(); + var values = []; + // search among prefetched partners + var search_regexp = new RegExp(utils.unaccent(search_val), 'i'); + _.each(mention_partner_suggestions, function (partners) { + if (values.length < limit) { + values = values.concat(_.filter(partners, function (partner) { + return session.partner_id !== partner.id && search_regexp.test(partner.name); + })).splice(0, limit); + } + }); + if (!values.length) { + // extend the research to all users + def = PartnerModel.call('im_search', [search_val, limit || 20], {}, {shadow: true}); + } else { + def = $.when(values); + } + return def.then(function (values) { + var autocomplete_data = _.map(values, function (value) { + return { id: value.id, value: value.name, label: value.name }; }); - return values; + return _.sortBy(autocomplete_data, 'label'); }); }, }; diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js index 82c0dd67e60..55b1160340f 100644 --- a/addons/mail/static/src/js/client_action.js +++ b/addons/mail/static/src/js/client_action.js @@ -56,13 +56,12 @@ var PartnerInviteDialog = Dialog.extend({ return $('').text(item.text).prepend(status); }, query: function (query) { - chat_manager.search_partner(query.term, 20).then(function(result){ - var data = []; - _.each(result, function(partner){ - partner.text = partner.name; - data.push(partner); + chat_manager.search_partner(query.term, 20).then(function (partners) { + query.callback({ + results: _.map(partners, function (partner) { + return _.extend(partner, { text: partner.label }); + }), }); - query.callback({results: data}); }); } }); @@ -331,13 +330,12 @@ var ChatAction = Widget.extend(ControlPanelMixin, { focus: function(event) { event.preventDefault(); }, - html: true, }); this.$('.o_mail_add_channel[data-type=dm]').find("input").autocomplete({ source: function(request, response) { self.last_search_val = _.escape(request.term); - chat_manager.search_partner(self.last_search_val).done(response); + chat_manager.search_partner(self.last_search_val, 10).done(response); }, select: function(event, ui) { var partner_id = ui.item.id; @@ -346,7 +344,6 @@ var ChatAction = Widget.extend(ControlPanelMixin, { focus: function(event) { event.preventDefault(); }, - html: true, }); this.$('.o_mail_add_channel[data-type=private]').find("input").on('keyup', this, function (event) {