diff --git a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java index e41043e2735aa5cf29493b220e926cac800741ea..476a273fa8ba916b31809ab556818085a9a0fc46 100644 --- a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java +++ b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java @@ -20,6 +20,7 @@ package org.olat.group.ui.main; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -35,6 +36,7 @@ import org.olat.basesecurity.BaseSecurityModule; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.SearchIdentityParams; import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.persistence.PersistenceHelper; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; @@ -721,39 +723,7 @@ public abstract class AbstractMemberListController extends FormBasicController i if(identityKeys.isEmpty()) { identities = new ArrayList<Identity>(0); } else { - SearchIdentityParams idParams = new SearchIdentityParams(); - if(StringHelper.containsNonWhitespace(params.getSearchString())) { - String searchString = params.getSearchString(); - - Map<String,String> propertiesSearch = new HashMap<>(); - for(UserPropertyHandler handler:userPropertyHandlers) { - propertiesSearch.put(handler.getName(), searchString); - } - idParams.setLogin(searchString); - idParams.setUserProperties(propertiesSearch); - } else { - if(params.getUserPropertiesSearch() != null && !params.getUserPropertiesSearch().isEmpty()) { - idParams.setUserProperties(params.getUserPropertiesSearch()); - } - if(StringHelper.containsNonWhitespace(params.getLogin())) { - idParams.setLogin(params.getLogin()); - } - } - - List<Long> identityKeyList = new ArrayList<>(identityKeys); - identities = new ArrayList<>(identityKeyList.size()); - - int count = 0; - int batch = 500; - do { - int toIndex = Math.min(count + batch, identityKeyList.size()); - List<Long> toLoad = identityKeyList.subList(count, toIndex); - idParams.setIdentityKeys(toLoad); - - List<Identity> batchOfIdentities = securityManager.getIdentitiesByPowerSearch(idParams, 0, -1); - identities.addAll(batchOfIdentities); - count += batch; - } while(count < identityKeyList.size()); + identities = filterIdentities(params, identityKeys); } Map<Long,MemberView> keyToMemberMap = new HashMap<Long,MemberView>(); @@ -770,13 +740,28 @@ public abstract class AbstractMemberListController extends FormBasicController i resourcesForReservations.add(group.getResource()); } List<ResourceReservation> reservations = acService.getReservations(resourcesForReservations); + List<Long> pendingIdentityKeys = new ArrayList<>(reservations.size()); + for(ResourceReservation reservation:reservations) { + pendingIdentityKeys.add(reservation.getIdentity().getKey()); + } + + if(StringHelper.containsNonWhitespace(params.getSearchString()) + || StringHelper.containsNonWhitespace(params.getLogin()) + || (params.getUserPropertiesSearch() != null && !params.getUserPropertiesSearch().isEmpty())) { + + List<Identity> pendingIdentities = filterIdentities(params, pendingIdentityKeys); + pendingIdentityKeys.retainAll(PersistenceHelper.toKeys(pendingIdentities)); + } + for(ResourceReservation reservation:reservations) { Identity identity = reservation.getIdentity(); - MemberView member = new MemberView(identity, userPropertyHandlers, locale); - member.getMembership().setPending(true); - memberList.add(member); - forgeLinks(member); - keyToMemberMap.put(identity.getKey(), member); + if(pendingIdentityKeys.contains(identity.getKey())) { + MemberView member = new MemberView(identity, userPropertyHandlers, locale); + member.getMembership().setPending(true); + memberList.add(member); + forgeLinks(member); + keyToMemberMap.put(identity.getKey(), member); + } } } @@ -862,6 +847,44 @@ public abstract class AbstractMemberListController extends FormBasicController i return memberList; } + private List<Identity> filterIdentities(SearchMembersParams params, Collection<Long> identityKeys) { + SearchIdentityParams idParams = new SearchIdentityParams(); + if(StringHelper.containsNonWhitespace(params.getSearchString())) { + String searchString = params.getSearchString(); + + Map<String,String> propertiesSearch = new HashMap<>(); + for(UserPropertyHandler handler:userPropertyHandlers) { + propertiesSearch.put(handler.getName(), searchString); + } + idParams.setLogin(searchString); + idParams.setUserProperties(propertiesSearch); + } else { + if(params.getUserPropertiesSearch() != null && !params.getUserPropertiesSearch().isEmpty()) { + idParams.setUserProperties(params.getUserPropertiesSearch()); + } + if(StringHelper.containsNonWhitespace(params.getLogin())) { + idParams.setLogin(params.getLogin()); + } + } + + List<Long> identityKeyList = new ArrayList<>(identityKeys); + List<Identity> identities = new ArrayList<>(identityKeyList.size()); + + int count = 0; + int batch = 500; + do { + int toIndex = Math.min(count + batch, identityKeyList.size()); + List<Long> toLoad = identityKeyList.subList(count, toIndex); + idParams.setIdentityKeys(toLoad); + + List<Identity> batchOfIdentities = securityManager.getIdentitiesByPowerSearch(idParams, 0, -1); + identities.addAll(batchOfIdentities); + count += batch; + } while(count < identityKeyList.size()); + + return identities; + } + protected void forgeLinks(MemberView row) { FormLink toolsLink = uifactory.addFormLink("tools_" + counter.incrementAndGet(), "tools", "", null, null, Link.NONTRANSLATED); toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg");