(js) Improve contact chips in card list editor

Exclude list members from auto-completion results.
pull/91/head
Francis Lachapelle 2015-05-27 15:06:42 -04:00
parent d159e12b3f
commit af353fb73f
4 changed files with 64 additions and 21 deletions

View File

@ -318,11 +318,11 @@
</label>
<md-contact-chips
ng-model="card.refs"
md-contacts="userFilter($query)"
md-contacts="userFilter($query, card.refs)"
md-contact-name="$$fullname"
md-contact-image="$$image"
md-contact-email="$$email"
md-require-match="true"
md-require-match="md-require-match"
filter-selected="false"
label:placeholder="Add Member"><!-- members --></md-contact-chips>
</div>

View File

@ -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;
};
/**

View File

@ -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) {

View File

@ -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) {