From 4bb5ba85e04b67b1ca3be015419bd13b1fb8a4a1 Mon Sep 17 00:00:00 2001 From: honchar Date: Tue, 18 Apr 2017 14:38:17 +0200 Subject: [PATCH] added new tab to role edit page for owner/approver/manager members. not finished yet --- .../midpoint/gui/api/ComponentConstants.java | 3 + .../objectdetails/RoleMainPanel.java | 100 ++++++++++++++++++ .../web/page/admin/roles/RoleMemberPanel.java | 60 ++++++++--- .../component/AbstractRoleMemberPanel.java | 55 ++++++---- .../localization/Midpoint.properties | 5 + 5 files changed, 192 insertions(+), 31 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/ComponentConstants.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/ComponentConstants.java index 9cfdd2c7abf..79ecad98910 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/ComponentConstants.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/ComponentConstants.java @@ -51,6 +51,9 @@ public class ComponentConstants { public static final QName UI_FOCUS_TAB_INDUCEMENTS = new QName(NS_COMPONENTS_PREFIX, "focusTabInducements"); public static final String UI_FOCUS_TAB_INDUCEMENTS_URL = QNameUtil.qNameToUri(UI_FOCUS_TAB_INDUCEMENTS); + public static final QName UI_FOCUS_TAB_GOVERNANCE = new QName(NS_COMPONENTS_PREFIX, "focusTabGovernance"); + public static final String UI_FOCUS_TAB_GOVERNANCE_URL = QNameUtil.qNameToUri(UI_FOCUS_TAB_GOVERNANCE); + public static final QName UI_FOCUS_TAB_DELEGATIONS = new QName(NS_COMPONENTS_PREFIX, "focusTabDelegations"); public static final String UI_FOCUS_TAB_DELEGATIONS_URL = QNameUtil.qNameToUri(UI_FOCUS_TAB_DELEGATIONS); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/RoleMainPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/RoleMainPanel.java index 3d5e334893e..78f6a708652 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/RoleMainPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/RoleMainPanel.java @@ -15,10 +15,15 @@ */ package com.evolveum.midpoint.web.component.objectdetails; +import java.util.ArrayList; import java.util.List; import com.evolveum.midpoint.gui.api.ComponentConstants; import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior; +import com.evolveum.midpoint.web.component.assignment.RelationTypes; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; +import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction; +import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.model.Model; @@ -56,6 +61,24 @@ protected List createTabs(final PageAdminObjectDetails parentPag List tabs = super.createTabs(parentPage); FocusTabVisibleBehavior authorization = new FocusTabVisibleBehavior(unwrapModel(), + ComponentConstants.UI_FOCUS_TAB_GOVERNANCE_URL); + + tabs.add(new PanelTab(parentPage.createStringResource("pageRole.governance"), authorization) { + + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + return createGovernancePanel(panelId); + } + + @Override + public boolean isVisible() { + return getObjectWrapper().getStatus() != ContainerStatus.ADDING; + } + }); + + authorization = new FocusTabVisibleBehavior(unwrapModel(), ComponentConstants.UI_FOCUS_TAB_POLICY_CONSTRAINTS_URL); tabs.add(new PanelTab(parentPage.createStringResource("AbstractRoleType.policyConstraints"), authorization) { @@ -94,6 +117,83 @@ public AbstractRoleMemberPanel createMemberPanel(String panelId) { return new RoleMemberPanel(panelId, new Model(getObject().asObjectable()), getDetailsPage()); } + public AbstractRoleMemberPanel createGovernancePanel(String panelId) { + List relationsList = new ArrayList<>(); + relationsList.add(RelationTypes.APPROVER); + relationsList.add(RelationTypes.OWNER); + relationsList.add(RelationTypes.MANAGER); + + return new RoleMemberPanel(panelId, new Model(getObject().asObjectable()), + relationsList, getDetailsPage()){ + private static final long serialVersionUID = 1L; + + @Override + protected List createNewMemberInlineMenuItems() { + List newMemberMenuItems = new ArrayList<>(); + newMemberMenuItems.add(new InlineMenuItem(createStringResource("roleMemberPanel.menu.createApprover"), + false, new HeaderMenuAction(this) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + createFocusMemberPerformed(RelationTypes.APPROVER.getRelation(), target); + } + })); + + newMemberMenuItems.add(new InlineMenuItem(createStringResource("roleMemberPanel.menu.assignApprovers"), false, + new HeaderMenuAction(this) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + addMembers(RelationTypes.APPROVER.getRelation(), target); + } + })); + + newMemberMenuItems.add(new InlineMenuItem(createStringResource("roleMemberPanel.menu.createOwner"), + false, new HeaderMenuAction(this) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + createFocusMemberPerformed(RelationTypes.OWNER.getRelation(), target); + } + })); + + newMemberMenuItems.add(new InlineMenuItem(createStringResource("roleMemberPanel.menu.assignOwners"), false, + new HeaderMenuAction(this) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + addMembers(RelationTypes.OWNER.getRelation(), target); + } + })); + newMemberMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.createManager"), + false, new HeaderMenuAction(this) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + createFocusMemberPerformed(RelationTypes.MANAGER.getRelation(), target); + } + })); + + newMemberMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.addManagers"), false, + new HeaderMenuAction(this) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + addMembers(RelationTypes.MANAGER.getRelation(), target); + } + })); + return newMemberMenuItems; + + } + }; + } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java index 7c5e54964db..140a849d889 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/RoleMemberPanel.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.prism.query.TypeFilter; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -39,9 +40,11 @@ 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.component.assignment.RelationTypes; import com.evolveum.midpoint.web.component.data.column.CheckBoxPanel; import com.evolveum.midpoint.web.component.input.ObjectTypeChoiceRenderer; import com.evolveum.midpoint.web.component.input.QNameChoiceRenderer; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.util.VisibleBehaviour; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.users.component.AbstractRoleMemberPanel; @@ -83,6 +86,10 @@ public RoleMemberPanel(String id, IModel model, PageBase pageBase) { super(id, TableId.ROLE_MEMEBER_PANEL, model, pageBase); } + public RoleMemberPanel(String id, IModel model, List relations, PageBase pageBase) { + super(id, TableId.ROLE_MEMEBER_PANEL, model, relations, pageBase); + } + protected boolean isRole() { return true; } @@ -186,17 +193,27 @@ private ObjectQuery getActionQuery(QueryScope scope) { } private ObjectQuery createAllMemberQuery(boolean allRelations) { - return QueryBuilder.queryFor(FocusType.class, getPrismContext()) - .item(FocusType.F_ROLE_MEMBERSHIP_REF).ref(createReferenceValue(allRelations)) - .build(); + return getRelationsFilter(allRelations).build(); } - private PrismReferenceValue createReferenceValue(boolean allRelations) { - PrismReferenceValue rv = new PrismReferenceValue(getModelObject().getOid()); - if (allRelations) { - rv.setRelation(PrismConstants.Q_ANY); + private List createReferenceValuesList(boolean allRelations) { + List referenceValuesList = new ArrayList<>(); + if (relations.size() > 0){ + for (RelationTypes relation : relations) { + PrismReferenceValue rv = new PrismReferenceValue(getModelObject().getOid()); + rv.setRelation(relation.getRelation()); + referenceValuesList.add(rv); + } + } else { + PrismReferenceValue rv = new PrismReferenceValue(getModelObject().getOid()); + if (allRelations) { + rv.setRelation(PrismConstants.Q_ANY); + } + referenceValuesList.add(rv); } - return rv; + + return referenceValuesList; + } private ObjectQuery createRecomputeQuery() { @@ -336,10 +353,7 @@ private ObjectQuery createDirectMemberQuery(boolean allRelations) { ObjectQuery query; String oid = getModelObject().getOid(); - - S_AtomicFilterExit q = QueryBuilder.queryFor(FocusType.class, getPrismContext()) - .item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF) - .ref(createReference(allRelations ? PrismConstants.Q_ANY : null).asReferenceValue()); + S_AtomicFilterExit q = getRelationsFilter(allRelations); DropDownChoice tenantChoice = (DropDownChoice) get(createComponentPath(ID_TENANT)); OrgType tenant = tenantChoice.getModelObject(); if (tenant != null) { @@ -365,4 +379,26 @@ private ObjectQuery createDirectMemberQuery(boolean allRelations) { return ObjectQuery.createObjectQuery(TypeFilter.createType(objectType, query.getFilter())); } } + + private S_AtomicFilterExit getRelationsFilter(boolean allRelations){ + List referenceValues = createReferenceValuesList(allRelations); + S_AtomicFilterExit q = null; + S_FilterEntryOrEmpty filter = QueryBuilder.queryFor(FocusType.class, getPrismContext()); + for (PrismReferenceValue value : referenceValues) { + if (q == null) { + q = filter.item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF) + .ref(value); + } else { + q = q.or().item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF) + .ref(value); + } + } + return q; + } + + @Override + protected List createNewMemberInlineMenuItems() { + return super.createNewMemberInlineMenuItems(); + } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java index 7ab7f5a0253..ff53d938745 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java @@ -5,6 +5,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.web.component.assignment.RelationTypes; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; @@ -78,12 +79,22 @@ protected enum MemberOperation { protected static final String ID_MANAGER_TABLE = "managerTable"; protected static final String ID_MEMBER_TABLE = "memberTable"; + protected List relations = new ArrayList<>(); + public AbstractRoleMemberPanel(String id, TableId tableId, IModel model, PageBase parentPage) { super(id, model); setParent(parentPage); initLayout(tableId); } + public AbstractRoleMemberPanel(String id, TableId tableId, IModel model, + List relations, PageBase parentPage) { + super(id, model); + this.relations = relations; + setParent(parentPage); + initLayout(tableId); + } + private void initLayout(TableId tableId) { Form form = new Form(ID_FORM); form.setOutputMarkupId(true); @@ -175,25 +186,7 @@ protected ObjectQuery createContentQuery() { protected List createMembersHeaderInlineMenu() { List headerMenuItems = new ArrayList<>(); - headerMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.createMember"), - false, new HeaderMenuAction(this) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - createFocusMemberPerformed(null, target); - } - })); - - headerMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.addMembers"), false, - new HeaderMenuAction(this) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - addMembers(null, target); - } - })); + headerMenuItems.addAll(createNewMemberInlineMenuItems()); headerMenuItems.add(new InlineMenuItem()); @@ -254,6 +247,30 @@ public void onClick(AjaxRequestTarget target) { return headerMenuItems; } + protected List createNewMemberInlineMenuItems() { + List newMemberMenuItems = new ArrayList<>(); + newMemberMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.createMember"), + false, new HeaderMenuAction(this) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + createFocusMemberPerformed(null, target); + } + })); + + newMemberMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.addMembers"), false, + new HeaderMenuAction(this) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + addMembers(null, target); + } + })); + return newMemberMenuItems; + } + protected void createFocusMemberPerformed(final QName relation, AjaxRequestTarget target) { ChooseFocusTypeDialogPanel chooseTypePopupContent = new ChooseFocusTypeDialogPanel( diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index e7cee5762b2..065b20a53e1 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -1835,6 +1835,7 @@ pageResource.version=Version PageResourceWizard.title=New resource PageResourceWizard.title.edit=Edit resource '{0}' pageRole.members=Members +pageRole.governance=Governance PageRoleEditor.extension=Extension PageRoleEditor.label.approverRef=Approver PageRoleEditor.label.approverRef.placeholder=Set approver @@ -3075,6 +3076,10 @@ roleMemberPanel.tenant=Tenant: roleMemberPanel.project=Org/Project: roleMemberPanel.indirectMembers=Include indirect members roleMemberPanel.allRelations=Show all relations +roleMemberPanel.menu.createOwner=Create owner +roleMemberPanel.menu.assignOwners=Assign owners +roleMemberPanel.menu.createApprover=Create approver +roleMemberPanel.menu.assignApprovers=Assign approvers SearchPanel.more=More... SearchPanel.add=Add SearchPanel.close=Close