diff --git a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java index 348eca9ef640d216d8880376510b8df8fa192d82..aa1348f2f20a5c3f534e13fc4f1bcfff4b0e42be 100644 --- a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java +++ b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java @@ -29,6 +29,7 @@ import java.util.Set; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityModule; +import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityPowerSearchQueries; import org.olat.basesecurity.OrganisationRoles; import org.olat.basesecurity.OrganisationService; @@ -111,6 +112,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { private final boolean isAdministrativeUser; private final List<UserPropertyHandler> userSearchFormPropertyHandlers; private final List<Organisation> searchableOrganisations; + private final GroupRoles repositoryEntryRole; @Autowired private UserManager userManager; @@ -123,14 +125,11 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { @Autowired private IdentityPowerSearchQueries identitySearchQueries; - /** - * @param ureq - * @param wControl - * @param cancelbutton - * @param userMultiSelect - * @param statusEnabled - */ public UserSearchFlexiController(UserRequest ureq, WindowControl wControl, Form rootForm) { + this(ureq, wControl, rootForm, null); + } + + public UserSearchFlexiController(UserRequest ureq, WindowControl wControl, Form rootForm, GroupRoles repositoryEntryRole) { super(ureq, wControl, LAYOUT_CUSTOM, "usersearchext", rootForm); setTranslator(Util.createPackageTranslator(UserPropertyHandler.class, getLocale(), getTranslator())); setTranslator(Util.createPackageTranslator(UserSearchFlexiController.class, getLocale(), getTranslator())); @@ -142,8 +141,9 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { UserSession usess = ureq.getUserSession(); searchableOrganisations = organisationService.getOrganisations(getIdentity(), usess.getRoles(), OrganisationRoles.valuesWithoutGuestAndInvitee()); + this.repositoryEntryRole = repositoryEntryRole; - ListProvider provider = new UserSearchListProvider(searchableOrganisations); + ListProvider provider = new UserSearchListProvider(searchableOrganisations, repositoryEntryRole); setListProvider(provider); setAllowNewValues(false); @@ -249,7 +249,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { @Override public void event(UserRequest ureq, Component source, Event event) { - if (source == backLink) { + if (source == backLink) { flc.contextPut("showButton","false"); } else if(autoCompleterContainer != null && source == autoCompleterContainer.getComponent()) { if (event.getCommand().equals(COMMAND_SELECT)) { @@ -278,7 +278,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { } } } catch (NumberFormatException e) { - getWindowControl().setWarning(translate("error.no.user.found")); + getWindowControl().setWarning(translate("error.no.user.found")); } } else { getWindowControl().setWarning(translate("error.search.form.notempty")); @@ -299,7 +299,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { } boolean filled = !loginEl.isEmpty(); - StringBuilder full = new StringBuilder(loginEl.getValue().trim()); + StringBuilder full = new StringBuilder(loginEl.getValue().trim()); FormItem lastFormElement = loginEl; // DO NOT validate each user field => see OLAT-3324 @@ -460,6 +460,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { userPropertiesSearch, userPropertiesAsIntersectionSearch, null, null, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT); params.setOrganisations(searchableOrganisations); + params.setRepositoryEntryRole(repositoryEntryRole); return identitySearchQueries.getIdentitiesByPowerSearch(params, 0, -1); } } \ No newline at end of file diff --git a/src/main/java/org/olat/admin/user/UserSearchListProvider.java b/src/main/java/org/olat/admin/user/UserSearchListProvider.java index 6b4209996a04a36c89015bebe1623dc6a1720c9f..85bd3eb292fb709e2521eee0ba5fc94cd465c1f9 100644 --- a/src/main/java/org/olat/admin/user/UserSearchListProvider.java +++ b/src/main/java/org/olat/admin/user/UserSearchListProvider.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import org.olat.basesecurity.BaseSecurity; +import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityShort; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.control.generic.ajax.autocompletion.ListProvider; @@ -43,15 +44,20 @@ public class UserSearchListProvider implements ListProvider { private final BaseSecurity securityManager; private final UserManager userManager; - public final List<Organisation> searchableOrganisations; + private final List<Organisation> searchableOrganisations; + private final GroupRoles repositoryEntryRole; public UserSearchListProvider(List<Organisation> searchableOrganisations) { + this(searchableOrganisations, null); + } + + public UserSearchListProvider(List<Organisation> searchableOrganisations, GroupRoles repositoryEntryRole) { this.searchableOrganisations = searchableOrganisations; + this.repositoryEntryRole = repositoryEntryRole; securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); userManager = CoreSpringFactory.getImpl(UserManager.class); } - @Override public void getResult(String searchValue, ListReceiver receiver) { Map<String, String> userProperties = new HashMap<>(); @@ -63,7 +69,7 @@ public class UserSearchListProvider implements ListProvider { // Search in all fileds -> non intersection search int maxEntries = MAX_ENTRIES; - List<IdentityShort> res = securityManager.searchIdentityShort(searchValue, searchableOrganisations, maxEntries); + List<IdentityShort> res = securityManager.searchIdentityShort(searchValue, searchableOrganisations, repositoryEntryRole, maxEntries); boolean hasMore = false; for (Iterator<IdentityShort> it_res = res.iterator(); (hasMore=it_res.hasNext()) && maxEntries > 0;) { @@ -73,7 +79,7 @@ public class UserSearchListProvider implements ListProvider { String displayKey = ident.getName(); String displayText = userManager.getUserDisplayName(ident); receiver.addEntry(key, displayKey, displayText, null); - } + } if(hasMore){ receiver.addEntry(".....","....."); } diff --git a/src/main/java/org/olat/basesecurity/BaseSecurity.java b/src/main/java/org/olat/basesecurity/BaseSecurity.java index 1c52d4fce107c7e19f88291b9bb55aee8f0eda0e..7703b432b1432a12f29490fb3a85bde172f22643 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurity.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurity.java @@ -173,10 +173,12 @@ public interface BaseSecurity { * * @param search Search string * @param searchableOrganisations The organisations where the identities are + * @param repositoryEntryRole restrict to role * @param maxResults The max results or -1 * @return A list of identities (short version) */ - public List<IdentityShort> searchIdentityShort(String search, List<? extends OrganisationRef> searchableOrganisations, int maxResults); + public List<IdentityShort> searchIdentityShort(String search, + List<? extends OrganisationRef> searchableOrganisations, GroupRoles repositoryEntryRole, int maxResults); public IdentityShort loadIdentityShortByKey(Long identityKey); diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index 33de84d86732f0cc07d01d6fbd864f49d601e457..3e973f57ea2763766ed4326a796c6f4bb84df21b 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -638,11 +638,12 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable { @Override public List<IdentityShort> searchIdentityShort(String search, int maxResults) { - return searchIdentityShort(search, null, maxResults); + return searchIdentityShort(search, null, null, maxResults); } @Override - public List<IdentityShort> searchIdentityShort(String search, List<? extends OrganisationRef> searcheableOrgnisations, int maxResults) { + public List<IdentityShort> searchIdentityShort(String search, + List<? extends OrganisationRef> searcheableOrgnisations, GroupRoles repositoryEntryRole, int maxResults) { String[] searchArr = search.split(" "); String[] attributes = new String[]{ "name", "firstName", "lastName", "email" }; @@ -675,6 +676,12 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable { .append(" inner join organisation as org on (org.group.key=orgtomember.group.key)") .append(" where orgtomember.identity.key=ident.key and org.key in (:organisationKey))"); } + if (repositoryEntryRole != null) { + sb.append(" and exists (select rmember.key from repoentrytogroup as relGroup") + .append(" inner join relGroup.group as rGroup") + .append(" inner join rGroup.members as rmember") + .append(" where rmember.identity.key=ident.key and rmember.role=:repositoryEntryRole)"); + } TypedQuery<IdentityShort> searchQuery = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), IdentityShort.class); @@ -687,6 +694,9 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable { .map(OrganisationRef::getKey).collect(Collectors.toList()); searchQuery.setParameter("organisationKey", organisationKeys); } + if (repositoryEntryRole != null) { + searchQuery.setParameter("repositoryEntryRole", repositoryEntryRole.name()); + } return searchQuery .setFirstResult(0) diff --git a/src/main/java/org/olat/modules/quality/ui/DataCollectionConfigurationController.java b/src/main/java/org/olat/modules/quality/ui/DataCollectionConfigurationController.java index 556bb7e539040b7e0a88c53b2a9bf348fd624fbf..606f8f8db851b05372c111aabd05e068e7a5afd8 100644 --- a/src/main/java/org/olat/modules/quality/ui/DataCollectionConfigurationController.java +++ b/src/main/java/org/olat/modules/quality/ui/DataCollectionConfigurationController.java @@ -30,7 +30,6 @@ import java.util.Date; import java.util.List; import org.olat.NewControllerFactory; -import org.olat.admin.user.UserSearchController; import org.olat.basesecurity.OrganisationService; import org.olat.basesecurity.events.SingleIdentityChosenEvent; import org.olat.core.gui.UserRequest; @@ -121,7 +120,7 @@ public class DataCollectionConfigurationController extends FormBasicController i private final TooledStackedPanel stackPanel; private CloseableModalController cmc; private ReferencableEntriesSearchController formSearchCtrl; - private UserSearchController topicIdentitySearchCtrl; + private TopicIdentitySearchController topicIdentitySearchCtrl; private ReferencableEntriesSearchController topicRepositorySearchCtrl; private DataCollectionStartConfirmationController startConfirmationController; private DataCollectionFinishConfirmationController finishConfirmationController; @@ -687,7 +686,7 @@ public class DataCollectionConfigurationController extends FormBasicController i } private void doSelectTopicIdentity(UserRequest ureq) { - topicIdentitySearchCtrl = new UserSearchController(ureq, getWindowControl(), true, false, true); + topicIdentitySearchCtrl = new TopicIdentitySearchController(ureq, getWindowControl()); listenTo(topicIdentitySearchCtrl); String title = translate("data.collection.topic.identity.select"); diff --git a/src/main/java/org/olat/modules/quality/ui/TopicIdentitySearchController.java b/src/main/java/org/olat/modules/quality/ui/TopicIdentitySearchController.java new file mode 100644 index 0000000000000000000000000000000000000000..c743905844fe493ff5e33f290d6ca6b23387e749 --- /dev/null +++ b/src/main/java/org/olat/modules/quality/ui/TopicIdentitySearchController.java @@ -0,0 +1,72 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.quality.ui; + +import org.olat.admin.user.UserSearchFlexiController; +import org.olat.basesecurity.GroupRoles; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; + +/** + * + * Initial date: 17.07.2018<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +public class TopicIdentitySearchController extends FormBasicController { + + private UserSearchFlexiController searchController; + + public TopicIdentitySearchController(UserRequest ureq, WindowControl wControl) { + super(ureq, wControl, LAYOUT_BAREBONE); + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + searchController = new UserSearchFlexiController(ureq, getWindowControl(), + formLayout.getRootForm(), GroupRoles.coach); + listenTo(searchController); + formLayout.add(searchController.getInitialFormItem()); + } + + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if (source == searchController) { + fireEvent(ureq, event); + } + super.event(ureq, source, event); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + + @Override + protected void doDispose() { + // + } + +} diff --git a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties index b82c8c4b28e76ed4bfbac502a23c0330764cbd13..e85dbcdcb7ca3a2d3dcae1dfef85f1bbed3941a9 100644 --- a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties @@ -36,10 +36,10 @@ data.collection.topic.curriculum.element=Curriculumelement data.collection.topic.curriculum=Curriculum data.collection.topic.custom.text=Gegenstand data.collection.topic.custom=weiteres -data.collection.topic.identity.name=Benutzer -data.collection.topic.identity.none=Kein Benutzer ausgew\u00E4lt +data.collection.topic.identity.name=Betreuer +data.collection.topic.identity.none=Kein Betreuer ausgew\u00E4lt data.collection.topic.identity.select=Select -data.collection.topic.identity=Benutzer +data.collection.topic.identity=Betreuer data.collection.topic.organisation=Organisation data.collection.topic.repository.name=Kurs data.collection.topic.repository.none=Kein Kurs ausgew\u00E4lt diff --git a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties index 9d88cf6150567f8c6a92efce83a41337d12db017..cc6054647393b8f1e2ced40ee878d991bed58720 100644 --- a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties @@ -12,7 +12,7 @@ data.collection.delete=Delete data.collection.edit=Edit data.collection.finish.confirm.button=Finish data.collection.finish.confirm.title=Finish data collection now -data.collection.finish.confirm=Do you really want to finish the data collection now? +data.collection.finish.confirm=Do you really want to finish the data collection now? data.collection.form.edit=Edit data.collection.form.preview.title=Preview data.collection.form.preview= @@ -24,7 +24,7 @@ data.collection.participations=Participants data.collection.reminders=Reminders data.collection.start.confirm.button=Start data.collection.start.confirm.title=Start data collection now -data.collection.start.confirm=Do you really want to start the data collection now? The "from" date will be changed to today. Afterwards you can not change the configuration anymore. +data.collection.start.confirm=Do you really want to start the data collection now? The "from" date will be changed to today. Afterwards you can not change the configuration anymore. data.collection.start=From data.collection.status.finished=Execution done data.collection.status.preparation=Preparation @@ -36,10 +36,10 @@ data.collection.topic.curriculum.element=Curriculum element data.collection.topic.curriculum=Curriculum data.collection.topic.custom.text=Topic data.collection.topic.custom=Custom -data.collection.topic.identity.name=User -data.collection.topic.identity.none=No user selected +data.collection.topic.identity.name=Coach +data.collection.topic.identity.none=No coach selected data.collection.topic.identity.select=Select -data.collection.topic.identity=User +data.collection.topic.identity=Coach data.collection.topic.organisation=Organisation data.collection.topic.repository.name=Course data.collection.topic.repository.none=No course selected