diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java index 00c2bf94fa4..3fa8e93da40 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java @@ -633,7 +633,8 @@ private List getGuiObjectColumnTypeList(){ } private boolean isCustomColumnsListConfigured(){ - return getGuiObjectColumnTypeList() != null; + List columnList = getGuiObjectColumnTypeList(); + return columnList != null && !columnList.isEmpty(); } private String getItemDisplayName(GuiObjectColumnType column){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index b2316c6288a..1207aeca1f3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -105,10 +105,7 @@ import com.evolveum.midpoint.web.page.admin.server.PageTasksCertScheduling; import com.evolveum.midpoint.web.page.admin.services.PageService; import com.evolveum.midpoint.web.page.admin.services.PageServices; -import com.evolveum.midpoint.web.page.admin.users.PageOrgTree; -import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit; -import com.evolveum.midpoint.web.page.admin.users.PageUser; -import com.evolveum.midpoint.web.page.admin.users.PageUsers; +import com.evolveum.midpoint.web.page.admin.users.*; import com.evolveum.midpoint.web.page.admin.valuePolicy.PageValuePolicies; import com.evolveum.midpoint.web.page.admin.valuePolicy.PageValuePolicy; import com.evolveum.midpoint.web.page.admin.workflow.*; @@ -177,6 +174,7 @@ public abstract class PageBase extends WebPage implements ModelServiceLocator { private static final String DOT_CLASS = PageBase.class.getName() + "."; private static final String OPERATION_LOAD_USER = DOT_CLASS + "loadUser"; + private static final String OPERATION_LOAD_USERS_VIEW_COLLECTION_REF = DOT_CLASS + "loadUsersViewCollectionRef"; private static final String OPERATION_LOAD_WORK_ITEM_COUNT = DOT_CLASS + "loadWorkItemCount"; private static final String OPERATION_LOAD_CERT_WORK_ITEM_COUNT = DOT_CLASS + "loadCertificationWorkItemCount"; @@ -1732,6 +1730,8 @@ private MainMenuItem createUsersItems() { createFocusPageNewEditMenu(item.getItems(), "PageAdmin.menu.top.users.new", "PageAdmin.menu.top.users.edit", PageUser.class, true); + addUsersViewMenuItems(item.getItems()); + return item; } @@ -1875,6 +1875,51 @@ private MainMenuItem createServicesItems() { return item; } + private void addUsersViewMenuItems(List menu){ + List objectListViews = getObjectViewsList(); + if (objectListViews == null){ + return; + } + objectListViews.forEach(objectListView -> { + if (objectListView.getType() != null && !objectListView.getType().equals(UserType.COMPLEX_TYPE)){ + return; + } + ObjectReferenceType collectionRef = objectListView.getCollectionRef(); + if (collectionRef == null){ + return; + } + OperationResult result = new OperationResult(OPERATION_LOAD_USERS_VIEW_COLLECTION_REF); + Task task = createSimpleTask(OPERATION_LOAD_USERS_VIEW_COLLECTION_REF); + PrismObject collectionObject = WebModelServiceUtils.resolveReferenceNoFetch(collectionRef, this, task, result); + if (collectionObject == null){ + return; + } + if (collectionObject.getValue().asObjectable() instanceof ObjectCollectionType) { + ObjectCollectionType collectionValue = (ObjectCollectionType) collectionObject.getValue().asObjectable(); + if (!collectionValue.getType().equals(UserType.COMPLEX_TYPE)) { + return; + } + DisplayType viewDisplayType = objectListView.getDisplay(); + + PageParameters pageParameters = new PageParameters(); + pageParameters.add(PageUsersView.PARAMETER_OBJECT_COLLECTION_TYPE_OID, collectionValue.getOid()); + + MenuItem userViewMenu = new MenuItem(viewDisplayType != null && StringUtils.isNotEmpty(viewDisplayType.getLabel()) ? + createStringResource(viewDisplayType.getLabel()) : createStringResource("MenuItem.noName"), PageUsersView.class, + pageParameters, null); + menu.add(userViewMenu); + } + }); + } + + private List getObjectViewsList(){ + GuiObjectListViewsType objectListViews = getAdminGuiConfiguration().getObjectLists(); + if (objectListViews == null){ + return null; + } + return objectListViews.getObjectList(); + } + public PrismObject loadUserSelf() { Task task = createSimpleTask(OPERATION_LOAD_USER); OperationResult result = task.getResult(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java index cf78366879a..855e4d9790a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.prism.query.InOidFilter; import com.evolveum.midpoint.prism.query.NotFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.web.application.Url; import com.evolveum.midpoint.web.component.data.column.*; import com.evolveum.midpoint.web.component.search.SearchFactory; @@ -69,7 +70,6 @@ import com.evolveum.midpoint.web.component.search.Search; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.page.admin.users.component.ExecuteChangeOptionsDto; -import com.evolveum.midpoint.web.page.admin.users.dto.UsersDto; import com.evolveum.midpoint.web.session.UserProfileStorage.TableId; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; @@ -115,14 +115,10 @@ public class PageUsers extends PageAdminUsers { private LoadableModel executeOptionsModel; public PageUsers() { - this(true, null, null); + this(null); } - public PageUsers(boolean clearPagingInSession) { - this(clearPagingInSession, null, null); - } - - public PageUsers(boolean clearPagingInSession, final UsersDto.SearchType type, final String text) { + public PageUsers(final String text) { executeOptionsModel = new LoadableModel(false) { @@ -135,11 +131,12 @@ protected ExecuteChangeOptionsDto load() { if (StringUtils.isNotEmpty(text)){ initSearch(text); } - initLayout(); } - public PageUsers(UsersDto.SearchType type, String text) { - this(true, type, text); + @Override + protected void onInitialize(){ + super.onInitialize(); + initLayout(); } private void initSearch(String text){ @@ -215,6 +212,19 @@ protected void objectDetailsPerformed(AjaxRequestTarget target, UserType object) protected void newObjectPerformed(AjaxRequestTarget target) { navigateToNext(PageUser.class); } + + @Override + protected ObjectQuery createContentQuery() { + ObjectQuery contentQuery = super.createContentQuery(); + ObjectFilter usersViewFilter = getUsersViewFilter(); + if (usersViewFilter != null){ + if (contentQuery == null){ + contentQuery = new ObjectQuery(); + } + contentQuery.addFilter(usersViewFilter); + } + return contentQuery; + } }; userListPanel.setAdditionalBoxCssClasses(GuiStyleConstants.CLASS_OBJECT_USER_BOX_CSS_CLASSES); @@ -678,4 +688,8 @@ private boolean isShowConfirmationDialog(ColumnMenuAction action){ return action.getRowModel() != null || getTable().getSelectedObjectsCount() > 0; } + + protected ObjectFilter getUsersViewFilter(){ + return null; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsersView.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsersView.java new file mode 100644 index 00000000000..d760d9d79b8 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsersView.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.web.page.admin.users; + +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.marshaller.QueryConvertor; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.application.AuthorizationAction; +import com.evolveum.midpoint.web.application.PageDescriptor; +import com.evolveum.midpoint.web.application.Url; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import org.apache.catalina.User; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.string.StringValue; + +/** + * @author honchar + */ +@PageDescriptor( + urls = { + @Url(mountUrl = "/admin/usersView", matchUrlForSecurity = "/admin/usersView") + }, + action = { + @AuthorizationAction(actionUri = PageAdminUsers.AUTH_USERS_ALL, + label = PageAdminUsers.AUTH_USERS_ALL_LABEL, + description = PageAdminUsers.AUTH_USERS_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_USERS_VIEW_URL, + label = "PageUsers.auth.users.label", + description = "PageUsers.auth.users.description") + }) +public class PageUsersView extends PageUsers { + private static final long serialVersionUID = 1L; + + public static final String PARAMETER_OBJECT_COLLECTION_TYPE_OID = "collectionOid"; + + private static final Trace LOGGER = TraceManager.getTrace(PageUsersView.class); + + private static final String DOT_CLASS = PageUsersView.class.getName() + "."; + private static final String OPERATION_LOAD_USERS_VIEW_COLLECTION_REF = DOT_CLASS + "loadUsersViewCollectionRef"; + + private ObjectFilter viewFilter; + + public PageUsersView(){ + super(); + } + + @Override + protected ObjectFilter getUsersViewFilter(){ + PageParameters parameters = getPageParameters(); + StringValue collectionOidValue = parameters.get(PARAMETER_OBJECT_COLLECTION_TYPE_OID); + if (collectionOidValue == null || collectionOidValue.isEmpty()){ + return null; + } + OperationResult result = new OperationResult(OPERATION_LOAD_USERS_VIEW_COLLECTION_REF); + Task task = createSimpleTask(OPERATION_LOAD_USERS_VIEW_COLLECTION_REF); + PrismObject collectionObject = WebModelServiceUtils.loadObject(ObjectCollectionType.class, collectionOidValue.toString(), + this, task, result); + if (collectionObject == null){ + return null; + } + ObjectCollectionType collectionValue = collectionObject.getValue().asObjectable(); + if (!collectionValue.getType().equals(UserType.COMPLEX_TYPE)){ + return null; + } + ObjectFilter filter = null; + try { + filter = QueryConvertor.parseFilter(collectionValue.getFilter(), UserType.class, getPrismContext()); + } catch (SchemaException ex){ + result.recomputeStatus(); + result.recordFatalError("Couldn't parse filter. Filter: " + collectionValue.getFilter(), ex); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse filter. Filter: " + collectionValue.getFilter(), ex); + } + return filter; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/DashboardSearchPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/DashboardSearchPanel.java index f832046dec1..c51b7857084 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/DashboardSearchPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/DashboardSearchPanel.java @@ -155,7 +155,7 @@ protected void onComponentTag(final ComponentTag tag) { private void performSearch(String searchType, String text) { if (SEARCH_TYPES.indexOf(searchType) == USER_INDEX) { - setResponsePage(new PageUsers(UsersDto.SearchType.NAME, text)); + setResponsePage(new PageUsers(text)); } else if (SEARCH_TYPES.indexOf(searchType) == RESOURCE_INDEX) { setResponsePage(new PageResources(text)); } else if (SEARCH_TYPES.indexOf(searchType) == TASK_INDEX) { diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 63fe431ac61..f6543b86f60 100755 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -3938,6 +3938,7 @@ AbstractAssignmentDetailsPanel.properties=Properties AssignmentPanel.doneButton=Done AssignmentPanel.cancelButton=Cancel AssignmentPanel.noName=n/a +MenuItem.noName=n/a ObjectPolicyConfigurationEditor.conflictResolution=(conflict resolution) PageSelfConsents.title=Consents SelfConsentPanel.button.revoke=Revoke @@ -4034,6 +4035,7 @@ CertCampaignStateFilter.REVIEW_STAGE_DONE=Review stage done CertCampaignStateFilter.IN_REMEDIATION=In remediation CertCampaignStateFilter.CLOSED=Closed DisplayNamePanel.kindIntentLabel=Kind: {0}, Intent: {1} +PageUsersView.title=Users view pageAdminFocus.dataProtection=Data protection PageInternals.title.cache=Caches PageInternals.tab.cache=Cache management diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_ru.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_ru.properties index 178eaf15634..67f2aa8b34c 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_ru.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_ru.properties @@ -3241,7 +3241,7 @@ SystemInfoPanel.starttime=Дата и время запуска SystemInfoPanel.uptime=Время непрерывной работы CountToolbar.label.unknownCount=Отображение {0,number,integer} до{1,number,integer}, неизвестное число подходящих результатов. TableConfigurationPanel.pageSize=Размер страницы -TableConfigurationPanel.tableColumns=Таблица columnsCountToolbar.label.unknownCount=Отображение {0,number,integer} до{1,number,integer}, неизвестное число подходящих результатов. +TableConfigurationPanel.tableColumns=Колонки таблицы MyRequestsPanel.started=Начато выполнение MyRequestsPanel.rejected=Отклонено MyRequestsPanel.skipped=Skipped diff --git a/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java b/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java index 61733603747..db1efd311f3 100644 --- a/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java +++ b/repo/security-api/src/main/java/com/evolveum/midpoint/security/api/AuthorizationConstants.java @@ -96,6 +96,9 @@ public class AuthorizationConstants { public static final QName AUTZ_UI_USERS_QNAME = new QName(NS_AUTHORIZATION_UI, "users"); public static final String AUTZ_UI_USERS_URL = NS_AUTHORIZATION_UI + "#users"; + public static final QName AUTZ_UI_USERS_VIEW_QNAME = new QName(NS_AUTHORIZATION_UI, "usersView"); + public static final String AUTZ_UI_USERS_VIEW_URL = NS_AUTHORIZATION_UI + "usersView"; + public static final QName AUTZ_UI_FIND_USERS_QNAME = new QName(NS_AUTHORIZATION_UI, "findUsers"); public static final String AUTZ_UI_FIND_USERS_URL = NS_AUTHORIZATION_UI + "#findUsers";