This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository coselmar. See http://git.codelutin.com/coselmar.git commit 9ba6c666d063cdd8f476cf1f2b2aacd0ce2200bf Author: Yannick Martel <martel@©odelutin.com> Date: Thu Nov 27 15:33:01 2014 +0100 Add search by keyword and filter on active in users list Fix Document search --- .../fr/ifremer/coselmar/persistence/DaoUtils.java | 2 +- .../persistence/entity/CoselmarUserTopiaDao.java | 75 ++++++++++++++++++++++ .../persistence/entity/DocumentTopiaDao.java | 8 ++- .../coselmar/services/v1/UsersWebService.java | 17 +++-- .../src/main/webapp/js/coselmar-controllers.js | 14 ++-- .../src/main/webapp/js/coselmar-user-services.js | 2 +- coselmar-ui/src/main/webapp/views/users/users.html | 9 ++- 7 files changed, 110 insertions(+), 17 deletions(-) diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/DaoUtils.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/DaoUtils.java index c8c1cc6..f44bac9 100644 --- a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/DaoUtils.java +++ b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/DaoUtils.java @@ -99,7 +99,7 @@ public class DaoUtils { String alias = StringUtils.isBlank(entityAlias) ? "" : entityAlias + "."; String queryAttributeName = addQueryAttribute(args, entityAttributeName, value); - result += String.format(" %s %s in element( :%s )", operator, queryAttributeName, alias + entityAttributeName); + result += String.format(" %s :%s in elements( %s )", operator, queryAttributeName, alias + entityAttributeName); return result; } diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/CoselmarUserTopiaDao.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/CoselmarUserTopiaDao.java new file mode 100644 index 0000000..221c67f --- /dev/null +++ b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/CoselmarUserTopiaDao.java @@ -0,0 +1,75 @@ +package fr.ifremer.coselmar.persistence.entity; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import fr.ifremer.coselmar.persistence.DaoUtils; + +public class CoselmarUserTopiaDao extends AbstractCoselmarUserTopiaDao<CoselmarUser> { + + /** + * Retrieve all user that contains part of the given keywords in at least + * one property. + * For Example, a search witj keywords ['John', 'Doe'] will return users + * that contains "John" in one of these properties and Doe in one these properties : + * <ul> + * <li>User with firstName John and mail containing doe</li> + * <li>User with firstName Johnathan and name doe</li> + * <li>User with mail john.doe@knowhere.uni</li> + * </ul> + * + * @param onlyActive : to filter on only active users + * @param keywords : List of String to search (if several, a "AND" operation + * is done) + * + * @return Users thats contains in a property at least all given keywords + * + */ + public List<CoselmarUser> findAllLikeKeywords(List<String> keywords, boolean onlyActive) { + + StringBuilder hqlBuilder = new StringBuilder("FROM " + CoselmarUser.class.getName() + " CU"); + hqlBuilder.append(" WHERE 1=1 "); // Just because next clause will begin with operator + + Map<String, Object> args = new HashMap<>(); + + // only active ? + if (onlyActive) { + String activeCondition = DaoUtils.andAttributeEquals("CU", CoselmarUser.PROPERTY_ACTIVE, args, true); + hqlBuilder.append(activeCondition); + } + + // Now lets start keywords on each text fields on User ! + if (keywords != null) { + for (String keyword : keywords) { + // a keyword is an AND clause with lot of OR clauses inside ! + hqlBuilder.append(" AND ( 1=0 "); // Same as previously : need to have an insignificant clause to add all OR after + String orFirstname = DaoUtils.orAttributeLike("CU", CoselmarUser.PROPERTY_FIRSTNAME, args, keyword); + hqlBuilder.append(orFirstname); + + // Name + String orName = DaoUtils.orAttributeLike("CU", CoselmarUser.PROPERTY_NAME, args, keyword); + hqlBuilder.append(orName); + + // Name + String orMail = DaoUtils.orAttributeLike("CU", CoselmarUser.PROPERTY_MAIL, args, keyword); + hqlBuilder.append(orMail); + + // Name + String orOrganization = DaoUtils.orAttributeLike("CU", CoselmarUser.PROPERTY_ORGANIZATION, args, keyword); + hqlBuilder.append(orOrganization); + + // Name + String orQualification = DaoUtils.orAttributeLike("CU", CoselmarUser.PROPERTY_QUALIFICATION, args, keyword); + hqlBuilder.append(orQualification); + + hqlBuilder.append(" ) "); // Close this keywords clause + } + } + + List<CoselmarUser> coselmarUsers = forHql(hqlBuilder.toString(), args).findAll(); + + return coselmarUsers; + } + +} //CoselmarUserTopiaDao \ No newline at end of file diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/DocumentTopiaDao.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/DocumentTopiaDao.java index 4648ff4..77321b7 100644 --- a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/DocumentTopiaDao.java +++ b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/DocumentTopiaDao.java @@ -51,17 +51,19 @@ public class DocumentTopiaDao extends AbstractDocumentTopiaDao<Document> { // can list all public document String privacyPublicCondition = DaoUtils.getQueryForAttributeEquals("D", Document.PROPERTY_PRIVACY, args, DocumentPrivacy.PUBLIC, ""); - hqlBuilder.append(" WHERE " + privacyPublicCondition); + hqlBuilder.append(" WHERE ( " + privacyPublicCondition); // Can list his own private document String privacyPrivateCondition = DaoUtils.getQueryForAttributeEquals("D", Document.PROPERTY_PRIVACY, args, DocumentPrivacy.PRIVATE, ""); String ownerCondition = DaoUtils.andAttributeEquals("D", Document.PROPERTY_OWNER, args, currentUser); - hqlBuilder.append(" OR ( " + privacyPrivateCondition + " " + ownerCondition + " )"); + hqlBuilder.append(" OR ( " + privacyPrivateCondition + " " + ownerCondition + " ) )"); + // Manage keywords if (keywords != null) { for (String keyword : keywords) { - DaoUtils.andAttributeContains("D", Document.PROPERTY_KEYWORDS, args, keyword); + String containsKeyword = DaoUtils.andAttributeContains("D", Document.PROPERTY_KEYWORDS, args, keyword); + hqlBuilder.append(containsKeyword); } } diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/UsersWebService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/UsersWebService.java index dfe55b6..ec05f83 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/UsersWebService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/UsersWebService.java @@ -3,6 +3,7 @@ package fr.ifremer.coselmar.services.v1; import java.io.StringWriter; import java.security.InvalidParameterException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Map; @@ -67,15 +68,21 @@ public class UsersWebService extends CoselmarWebServiceSupport { return userBean; } - public List<UserBean> getUsers(String searchKey) { + public List<UserBean> getUsers(String searchKeyword, boolean onlyActive) { List<CoselmarUser> userList; - if (StringUtils.isNotBlank(searchKey)) { - //TODO find on all parts ? - userList = new ArrayList<>(); + if (StringUtils.isNotBlank(searchKeyword)) { + userList = getCoselmarUserDao().findAllLikeKeywords(Arrays.asList(searchKeyword), onlyActive); + } else { - userList = getCoselmarUserDao().findAll(); + if (onlyActive) { + userList = getCoselmarUserDao().forActiveEquals(true).findAll(); + + } else { + userList = getCoselmarUserDao().findAll(); + } } + List<UserBean> result = new ArrayList<>(userList.size()); for (CoselmarUser user : userList) { diff --git a/coselmar-ui/src/main/webapp/js/coselmar-controllers.js b/coselmar-ui/src/main/webapp/js/coselmar-controllers.js index 0a0a8cf..26040d2 100644 --- a/coselmar-ui/src/main/webapp/js/coselmar-controllers.js +++ b/coselmar-ui/src/main/webapp/js/coselmar-controllers.js @@ -30,7 +30,6 @@ coselmarControllers.controller("HomeCtrl", ['$scope', '$http', '$location', 'use var jwtToken = localStorage.getItem('coselmar-jwt'); if (jwtToken && !jwtHelper.isTokenExpired(jwtToken)) { $scope.currentUser = jwtHelper.decodeToken(jwtToken); - console.log($scope.currentUser); } //Just get the version from a file @@ -167,12 +166,16 @@ coselmarControllers.directive('ngFileModel', ['$parse', function ($parse) { coselmarControllers.controller("UsersCtrl", ['$scope', '$route', '$routeParams', '$location', 'userService', function($scope, $route, $routeParams, $location, userService){ //manage keywords if given - $scope.searchKeywords = []; + $scope.search = { searchKeyword : '', onlyActive : false }; var keywords = $routeParams.keywords; if (Array.isArray(keywords)) { - $scope.searchKeywords = keywords; + $scope.search.searchKeyword = keywords[0]; } else if (keywords) { - $scope.searchKeywords.push(keywords); + $scope.search.searchKeyword = keywords; + } + var onlyActive = $routeParams.onlyActive; + if (onlyActive) { + $scope.search.onlyActive = onlyActive; } userService.getUsers($scope); @@ -186,7 +189,8 @@ coselmarControllers.controller("UsersCtrl", ['$scope', '$route', '$routeParams', }; $scope.searchUsers = function(){ - $location.search('keywords', $scope.searchKeywords); + $location.search('keywords', $scope.search.searchKeyword); + $location.search('onlyActive', $scope.search.onlyActive); } }]); diff --git a/coselmar-ui/src/main/webapp/js/coselmar-user-services.js b/coselmar-ui/src/main/webapp/js/coselmar-user-services.js index f3b24d3..dbd0707 100644 --- a/coselmar-ui/src/main/webapp/js/coselmar-user-services.js +++ b/coselmar-ui/src/main/webapp/js/coselmar-user-services.js @@ -71,7 +71,7 @@ function User(resource, config){ this.getUsers = function(scope){ // Load all users - var userResource = resource(baseURL, {searchKeywords : scope.searchKeywords}); + var userResource = resource(baseURL, scope.search); userResource.query(function(users){ scope.users = users; }, function(errorResult) { diff --git a/coselmar-ui/src/main/webapp/views/users/users.html b/coselmar-ui/src/main/webapp/views/users/users.html index 047107b..77afec8 100644 --- a/coselmar-ui/src/main/webapp/views/users/users.html +++ b/coselmar-ui/src/main/webapp/views/users/users.html @@ -11,15 +11,20 @@ <div class="form-group"> <a href="#/users/new" class="form-inline navbar-left btn btn-primary">Add an user</a> </div> - <form class="form-inline pull-right" role="userOptions" ng-submit="searchUser()"> + <form class="form-inline pull-right" role="userOptions" ng-submit="searchUsers()"> <div class="form-group"> - <input type="search" class="form-control" placeholder="Search an user" ng-model="searchKeywords" ng-list /> + <input type="checkbox" class="form-control" ng-model="search.onlyActive" /> + <span>Only Active</span> + </div> + <div class="form-group"> + <input type="search" class="form-control" placeholder="Search an user" ng-model="search.searchKeyword" /> </div> <div class="form-group"> <button type="submit" class="btn btn-default glyphicon glyphicon-search"></button> </div> </form> </div> + <br/> <table class="table"> <tr> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.