diff --git a/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox b/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox index d976d04c1..0a2381de8 100644 --- a/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +++ b/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox @@ -318,11 +318,11 @@ diff --git a/UI/WebServerResources/js/Contacts/AddressBook.service.js b/UI/WebServerResources/js/Contacts/AddressBook.service.js index b72b7693f..5303b7018 100644 --- a/UI/WebServerResources/js/Contacts/AddressBook.service.js +++ b/UI/WebServerResources/js/Contacts/AddressBook.service.js @@ -161,6 +161,8 @@ this.isOwned = AddressBook.activeUser.isSuperUser || this.owner == AddressBook.activeUser.login; this.isSubscription = !this.isRemote && this.owner != AddressBook.activeUser.login; this.$query = undefined; + this.$cards = []; + this.cards = []; }; /** @@ -199,39 +201,81 @@ * @param {object} [options] - additional options to the query * @returns a collection of Cards instances */ - AddressBook.prototype.$filter = function(search, options) { + AddressBook.prototype.$filter = function(search, excludedCards, options) { var _this = this, + deferred = AddressBook.$q.defer(), params = { search: 'name_or_address', value: search, sort: 'c_cn', asc: 'true' }; - if (options) + if (options) { angular.extend(params, options); - return this.$id().then(function(addressbookId) { + if (options.dry) { + if (!search) { + // No query specified + this.$cards = []; + deferred.resolve(this.$cards); + return deferred.promise; + } + else if (this.$query == search) { + // Query hasn't changed + deferred.resolve(this.$cards); + return deferred.promise; + } + } + } + this.$query = search; + + this.$id().then(function(addressbookId) { var futureAddressBookData = AddressBook.$$resource.fetch(addressbookId, 'view', params); - return futureAddressBookData.then(function(data) { - var cards; - _this.$query = search; + futureAddressBookData.then(function(response) { + var results, cards, card, index; if (options && options.dry) { // Don't keep a copy of the resulting cards. // This is usefull when doing autocompletion. - cards = data.cards; + cards = _this.$cards; } else { - _this.cards = data.cards; cards = _this.cards; } - // Instanciate Card objects - angular.forEach(cards, function(o, i) { - cards[i] = new AddressBook.$Card(o, search); + if (excludedCards) { + // Remove excluded cards from results + results = _.filter(response.cards, function(data) { + return !_.find(excludedCards, function(card) { + return card.id == data.id; + }); + }); + } + else { + results = response.cards; + } + // Add new cards matching the search query + angular.forEach(results, function(data) { + if (!_.find(cards, function(card) { + return card.id == data.id; + })) { + var card = new AddressBook.$Card(data, search), + index = _.sortedIndex(cards, card, '$$fullname'); + cards.splice(index, 0, card); + } }); + // Remove cards that no longer match the search query + for (index = cards.length - 1; index >= 0; index--) { + card = cards[index]; + if (!_.find(results, function(data) { + return card.id == data.id; + })) { + cards.splice(index, 1); + } + } + deferred.resolve(cards); + }, deferred.reject); + }, deferred.reject); - return cards; - }); - }); + return deferred.promise; }; /** diff --git a/UI/WebServerResources/js/Contacts/Card.service.js b/UI/WebServerResources/js/Contacts/Card.service.js index b83345337..5b4648fe4 100644 --- a/UI/WebServerResources/js/Contacts/Card.service.js +++ b/UI/WebServerResources/js/Contacts/Card.service.js @@ -433,6 +433,7 @@ // Instanciate Card objects for list members angular.forEach(_this.refs, function(o, i) { if (o.email) o.emails = [{value: o.email}]; + o.id = o.reference; _this.refs[i] = new Card(o); }); if (_this.birthday) { diff --git a/UI/WebServerResources/js/Contacts/CardController.js b/UI/WebServerResources/js/Contacts/CardController.js index f3ccc3e7e..6868aa8e1 100644 --- a/UI/WebServerResources/js/Contacts/CardController.js +++ b/UI/WebServerResources/js/Contacts/CardController.js @@ -42,11 +42,9 @@ var i = $scope.card.$addMember(''); focus('ref_' + i); }; - $scope.userFilter = function($query) { - $scope.currentFolder.$filter($query, {dry: true, excludeLists: true}).then(function(results) { - $scope.userFilterResults = results; - }); - return $scope.userFilterResults; + $scope.userFilter = function($query, excludedCards) { + $scope.currentFolder.$filter($query, excludedCards, {dry: true, excludeLists: true}); + return $scope.currentFolder.$cards; }; $scope.save = function(form) { if (form.$valid) {