Enable search by fullname and email

pull/91/head
Alexandre Cloutier 2014-10-20 13:52:35 -04:00 committed by Francis Lachapelle
parent 7e43b13f21
commit 5b83b0c7b6
4 changed files with 91 additions and 50 deletions

View File

@ -331,16 +331,15 @@
<div id="search-box" class="item-input-inset">
<div class="item-input-wrapper">
<i class="icon ion-search placeholder-icon"></i>
<input type="text" label:placeholder="Search" ng-model="searchCards.fn" data-ng-keyup="showPopOver($event)" />
<!--TODO <i class="clear-search icon ion-ios7-close-empty" ng-click="clearSearch()"></i> -->
<input type="text" label:placeholder="Search" data-ng-model="search.query" data-ng-keyup="showPopOver($event)" />
<i ng-show="displayIcon()" class="clear-search icon ion-ios7-close-empty" ng-click="clearSearch()"><!-- spacer --></i>
</div>
</div>
<ion-list class="list-clear">
<ion-item ng-repeat="ref in card.refs" class="item-input">
<button class="button button-small button-assertive button-icon icon ion-minus-circled"
data-ng-click="card.$delete('refs', $index)"><!-- remove --></button>
<span ng-if="ref.fn">({{ref.fn}})</span>
<span>{{ref.email}}</span>
<span>{{shortFormat(ref)}}</span>
</ion-item>
</ion-list>
<button class="button button-block button-assertive" ng-hide="card.isNew"
@ -354,22 +353,8 @@
<ion-popover-view>
<ion-content>
<ion-list ng-repeat="card in addressbook.cards | orderBy:['sn'] | filter:searchCards">
<ion-item ng-if="card.emails.length > 1" ng-click="toggleEMailList(card)" ng-class="{active: isEMailsShown(card)}">
<i class="icon" ng-class="isEMailsShown(card) ? 'ion-minus' : 'ion-plus'"><!-- spacer --></i>
<span ng-if="card.fn">{{card.fn}}</span>
<!--TODO<span ng-if="!card.fn && card.c_givenname">{{card.c_givenname}}</span>-->
<!--TODO<span ng-if="!card.fn && !card.c_givenname">{{card.c_mail}}</span>-->
<ion-item class="item-accordion"
ng-repeat="email in card.emails"
ng-show="isEMailsShown(card)"
ng-click="card.$updateMember($index, $model, $item)">
{{email}}
</ion-item>
</ion-item>
<ion-item ng-if="displayContact(card)" ng-click="addMember(card)">
<span ng-if="card.fn">{{card.fn}}</span>
<!--TODO<span ng-if="!card.fn">{{card.c_givenname}}</span>-->
<span ng-if="!card.fn">{{card.c_mail}}</span>
<span>{{card.$shortFormat()}}</span>
</ion-item>
</ion-list>
</ion-content>

View File

@ -0,0 +1,28 @@
(function() {
'use strict';
function User() {}
/* The factory we'll use to register with Angular */
User.factory = ['sgSettings', 'sgResource', function(Settings, Resource) {
angular.extend(User, {
$$resource: new Resource(Settings.baseURL)
});
return User; // return constructor
}];
/* Factory registration in Angular module */
angular.module('SOGo.Common').factory('sgUser', User.factory);
/* Instance methods
* Public method, assigned to prototype
*/
User.prototype.$filter = function(search) {
// return a collections of users for a filter
var param = {search: search};
return User.$$resource.fetch(null, "usersSearch", param).then(function(results) {
return results;
})
};
})();

View File

@ -239,7 +239,57 @@
}).then(function(popover) {
$scope.popover = popover;
});
$scope.searchCards = {fn: ""};
$scope.search = {query: ""};
$scope.shortFormat = function(ref) {
var fullname = ref.fn,
email = ref.email;
if (email && fullname)
fullname += ' (' + email + ')';
return fullname;
};
$scope.searchCards = function(item) {
if (item.tag == "vcard" && $scope.search.query) {
var displayCard = false;
if(item.emails.length > 0) {
angular.forEach(item.emails, function(email) {
var mail = email.value.toLowerCase();
if(mail.indexOf($scope.search.query.toLowerCase()) != -1) {
displayCard = true;
}
})
}
if (item.fn) {
var fullName = item.fn.toLowerCase();
if(fullName.indexOf($scope.search.query.toLowerCase())!=-1)
displayCard = true;
}
return displayCard;
}
};
$scope.clearSearch = function() {
$scope.search.query = null;
};
$scope.displayIcon = function() {
if ($scope.search.query) {
return true;
}
else
return false;
};
$scope.displayContact = function(card) {
var contact = true;
if(card.tag == "vcard" && card.c_mail){
angular.forEach($scope.card.refs, function(ref) {
if( card.c_mail == ref.email)
contact = false;
})
}
return contact;
};
$scope.edit = function() {
// Build modal editor
@ -293,46 +343,22 @@
focus('address_' + i);
};
$scope.addMember = function(member) {
var isAlreadyInList = angular.forEach($scope.card.refs, function(ref) {
var isAlreadyInList = false;
angular.forEach($scope.card.refs, function(ref) {
if (member.c_mail == ref.email)
return false;
isAlreadyInList = true;
else
return true;
isAlreadyInList = false;
});
if (member.c_mail && isAlreadyInList) {
if (member.c_mail && !isAlreadyInList) {
var i = $scope.card.$addMember('');
$scope.card.$updateMember(i, member.c_mail, member);
$scope.popover.hide();
}
};
$scope.toggleEMailList = function(card) {
if ($scope.isEMailsShown(card))
$scope.EMailsShown = null;
else
$scope.EMailsShown = card;
};
$scope.isEMailsShown = function(card) {
return $scope.EMailsShown === card;
};
$scope.showPopOver = function(keyEvent) {
$scope.popover.show(keyEvent);
}
$scope.displayContact = function(card) {
var b = true;
if(card.tag == "vcard" && card.emails.length > 0){
angular.forEach($scope.card.refs, function(ref) {
angular.forEach(card.emails, function(email) {
if (email.value == ref.email) {
b = false;
}
})
})
}
else
b = false;
return b;
};
$scope.save = function(form) {
if (form.$valid) {
$scope.card.$save()

View File

@ -63,7 +63,6 @@ ion-item {
color: $positive !important;
}
}
/* Additional styles */
.label {
@ -83,3 +82,6 @@ ion-item {
font-size: 120%;
text-shadow: 1px #145fd7;
}
.popover {
}