branch develop updated (b411b4d -> 9ba6c66)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository coselmar. See http://git.codelutin.com/coselmar.git from b411b4d #6015 User deletion is not a real deletion : user become non active new 9ba6c66 Add search by keyword and filter on active in users list Fix Document search The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: 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 Summary of changes: .../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(-) create mode 100644 coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/CoselmarUserTopiaDao.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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>.
participants (1)
-
codelutin.com scm