From 9222bf80ef2ad9b62faa3c01c1b8f45d4d43621b Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 19 May 2015 14:50:26 -0400 Subject: [PATCH] (js) Fix mdContactChips in preferencs module By keeping the same array reference throughout the auto-completion, we fix the ng-click on a list item. It also avoids constant redraws of the list. --- UI/Templates/PreferencesUI/UIxPreferences.wox | 2 +- .../js/Common/User.service.js | 36 +++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 18233703c..cf439dec3 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -457,7 +457,7 @@ md-contact-email="c_email" md-require-match="md-require-match" filter-selected="false" - placeholder="Add"> + label:placeholder="Add"> diff --git a/UI/WebServerResources/js/Common/User.service.js b/UI/WebServerResources/js/Common/User.service.js index cc60d5d6c..3066c24c0 100644 --- a/UI/WebServerResources/js/Common/User.service.js +++ b/UI/WebServerResources/js/Common/User.service.js @@ -17,9 +17,10 @@ * @desc The factory we'll use to register with Angular. * @return the User constructor */ - User.factory = ['$q', 'sgSettings', 'Resource', 'Gravatar', function($q, Settings, Resource, Gravatar) { + User.factory = ['$q', '$log', 'sgSettings', 'Resource', 'Gravatar', function($q, $log, Settings, Resource, Gravatar) { angular.extend(User, { $q: $q, + $log: $log, $$resource: new Resource(Settings.activeUser.folderURL, Settings.activeUser), $gravatar: Gravatar }); @@ -44,23 +45,44 @@ param = {search: search}; if (!search) { + // No query specified User.$users = []; deferred.resolve(User.$users); return deferred.promise; } if (angular.isUndefined(User.$users)) { + // First session query User.$users = []; } + else if (User.$query == search) { + // Query hasn't changed + deferred.resolve(User.$users); + return deferred.promise; + } + User.$query = search; User.$$resource.fetch(null, 'usersSearch', param).then(function(response) { - var results = []; + var index, user; + // Add new users matching the search query angular.forEach(response.users, function(data) { - console.debug(JSON.stringify(data, undefined, 2)); - var user = new User(data); - results.push(user); + if (!_.find(User.$users, function(user) { + return user.uid == data.uid; + })) { + var user = new User(data), + index = _.sortedIndex(User.$users, user, '$$shortFormat'); + User.$users.splice(index, 0, user); + } }); - User.$users = results; - deferred.resolve(results); + // Remove users that no longer match the search query + for (index = User.$users.length - 1; index >= 0; index--) { + user = User.$users[index]; + if (!_.find(response.users, function(data) { + return user.uid == data.uid; + })) { + User.$users.splice(index, 1); + } + } + deferred.resolve(User.$users); }, deferred.reject); return deferred.promise;