diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/GuiStyleConstants.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/GuiStyleConstants.java index 8d019c46012..35e05539a85 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/GuiStyleConstants.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/GuiStyleConstants.java @@ -31,6 +31,7 @@ public class GuiStyleConstants { public static final String CLASS_OBJECT_ROLE_ICON = "fa fa-street-view"; public static final String CLASS_OBJECT_ROLE_BG = "object-role-bg"; + public static final String CLASS_DISABLED_OBJECT_ROLE_BG = "object-disabled-bg"; public static final String CLASS_OBJECT_ROLE_ICON_COLORED = CLASS_OBJECT_ROLE_ICON + " object-role-color"; public static final String CLASS_OBJECT_ROLE_BOX_CSS_CLASSES = "object-role-box"; public static final String CLASS_OBJECT_ROLE_BOX_THIN_CSS_CLASSES = "object-role-box-thin"; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentCatalogPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentCatalogPanel.java index ee6d409b770..49f868fd0eb 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentCatalogPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentCatalogPanel.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.ModelInteractionService; import com.evolveum.midpoint.model.api.RoleSelectionSpecification; import com.evolveum.midpoint.model.api.context.*; @@ -30,6 +31,8 @@ import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +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; @@ -45,6 +48,7 @@ import com.evolveum.midpoint.web.page.admin.orgs.OrgTreePanel; import com.evolveum.midpoint.web.page.admin.users.dto.TreeStateSet; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; +import com.evolveum.midpoint.web.page.self.PageAssignmentShoppingKart; import com.evolveum.midpoint.web.page.self.PageAssignmentsList; import com.evolveum.midpoint.web.page.self.dto.AssignmentConflictDto; import com.evolveum.midpoint.web.page.self.dto.AssignmentViewType; @@ -142,7 +146,9 @@ protected void initProvider() { @Override public AssignmentEditorDto createDataObjectWrapper(PrismObject obj) { - return AssignmentEditorDto.createDtoFromObject(obj.asObjectable(), UserDtoStatus.ADD, pageBase); + AssignmentEditorDto dto = AssignmentEditorDto.createDtoFromObject(obj.asObjectable(), UserDtoStatus.ADD, pageBase); + dto.setAlreadyAssigned(isAlreadyAssigned(obj)); + return dto; } @Override @@ -334,15 +340,7 @@ public Search load() { targetUserModel = new IModel>() { @Override public PrismObject getObject() { - PrismObject targetUser = pageBase.getSessionStorage().getRoleCatalog().getTargetUser(); - if (targetUser != null){ - return targetUser; - } - PrismObject user = pageBase.loadUserSelf(pageBase); - if (user != null){ - return user; - } - return null; + return getTargetUser(); } @Override @@ -663,5 +661,26 @@ public void detach() { } }; } + + private boolean isAlreadyAssigned(PrismObject obj){ + PrismObject user = getTargetUser(); + if (user == null || user.asObjectable().getAssignment() == null){ + return false; + } + for (AssignmentType assignment : user.asObjectable().getAssignment()){ + if (assignment.getTargetRef() != null && assignment.getTargetRef().getOid().equals(obj.getOid())){ + return true; + } + } + return false; + } + + private PrismObject getTargetUser(){ + PrismObject targetUser = pageBase.getSessionStorage().getRoleCatalog().getTargetUser(); + if (targetUser != null){ + return targetUser; + } + return pageBase.loadUserSelf(pageBase); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java index 022bc223a9b..65812ddcd53 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java @@ -94,6 +94,8 @@ public class AssignmentEditorDto extends SelectableBean implements Comparable attributes; @@ -663,6 +665,14 @@ public void setSimpleView(boolean simpleView) { this.simpleView = simpleView; } + public boolean isAlreadyAssigned() { + return isAlreadyAssigned; + } + + public void setAlreadyAssigned(boolean alreadyAssigned) { + isAlreadyAssigned = alreadyAssigned; + } + public List getPrivilegeLimitationList() { return privilegeLimitationList; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java index 317d35bc9e6..87bebd2b7b7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/MultiButtonTable.java @@ -18,9 +18,17 @@ import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.assignment.*; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.self.PageAssignmentDetails; import com.evolveum.midpoint.web.session.RoleCatalogStorage; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentMultiplicityType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.behavior.AttributeAppender; @@ -51,6 +59,10 @@ public class MultiButtonTable extends BasePanel> { private static final String ID_DETAILS_LINK_LABEL = "detailsLinkLabel"; private static final String ID_DETAILS_LINK_ICON = "detailsLinkIcon"; + private static final String DOT_CLASS = AssignmentCatalogPanel.class.getName(); + private static final Trace LOGGER = TraceManager.getTrace(AssignmentCatalogPanel.class); + private static final String OPERATION_LOAD_ASSIGNMENT_MULTIPLICITY = DOT_CLASS + "loadAssignmentMultiplicity"; + private String addToCartLinkIcon = "fa fa-times-circle fa-lg text-danger"; private String detailsLinkIcon = "fa fa-arrow-circle-right"; private long itemsCount = 0; @@ -92,7 +104,7 @@ private void initLayout(){ WebMarkupContainer itemButtonContainer = new WebMarkupContainer(ID_ITEM_BUTTON_CONTAINER); itemButtonContainer.setOutputMarkupId(true); - itemButtonContainer.add(new AttributeAppender("class", getBackgroundClass(assignmentsList.get(index).getType()))); + itemButtonContainer.add(new AttributeAppender("class", getBackgroundClass(assignmentsList.get(index)))); colContainer.add(itemButtonContainer); populateCell(itemButtonContainer, assignmentsList.get(index)); index++; @@ -115,6 +127,15 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { assignmentDetailsPerformed(assignment, ajaxRequestTarget); } }; + inner.add(new VisibleEnableBehaviour(){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isEnabled(){ + return !(AssignmentMultiplicityType.SINGLE.equals(getAssignmentMultiplicity()) + && assignment.isAlreadyAssigned()); + } + }); cellContainer.add(inner); Label nameLabel = new Label(ID_INNER_LABEL, assignment.getName()); @@ -126,6 +147,15 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { assignmentDetailsPerformed(assignment, ajaxRequestTarget); } }; + detailsLink.add(new VisibleEnableBehaviour(){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isEnabled(){ + return !(AssignmentMultiplicityType.SINGLE.equals(getAssignmentMultiplicity()) + && assignment.isAlreadyAssigned()); + } + }); cellContainer.add(detailsLink); Label detailsLinkLabel = new Label(ID_DETAILS_LINK_LABEL, pageBase.createStringResource("MultiButtonPanel.detailsLink")); @@ -140,6 +170,15 @@ public void onClick(AjaxRequestTarget target) { } }; + detailsLinkIcon.add(new VisibleEnableBehaviour(){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isEnabled(){ + return !(AssignmentMultiplicityType.SINGLE.equals(getAssignmentMultiplicity()) + && assignment.isAlreadyAssigned()); + } + }); detailsLink.add(detailsLinkIcon); AjaxLink addToCartLink = new AjaxLink(ID_ADD_TO_CART_LINK) { @@ -148,6 +187,15 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { addAssignmentPerformed(assignment, ajaxRequestTarget); } }; + addToCartLink.add(new VisibleEnableBehaviour(){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isEnabled(){ + return !(AssignmentMultiplicityType.SINGLE.equals(getAssignmentMultiplicity()) + && assignment.isAlreadyAssigned()); + } + }); cellContainer.add(addToCartLink); AjaxLink addToCartLinkIcon = new AjaxLink(ID_ADD_TO_CART_LINK_ICON) { @@ -158,6 +206,15 @@ public void onClick(AjaxRequestTarget target) { } }; + addToCartLinkIcon.add(new VisibleEnableBehaviour(){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isEnabled(){ + return !(AssignmentMultiplicityType.SINGLE.equals(getAssignmentMultiplicity()) + && assignment.isAlreadyAssigned()); + } + }); addToCartLink.add(addToCartLinkIcon); WebMarkupContainer icon = new WebMarkupContainer(ID_TYPE_ICON); @@ -205,12 +262,14 @@ private String getIconClass(AssignmentEditorDtoType type){ } } - private String getBackgroundClass(AssignmentEditorDtoType type){ - if (AssignmentEditorDtoType.ROLE.equals(type)){ + private String getBackgroundClass(AssignmentEditorDto dto){ + if (dto.isAlreadyAssigned()){ + return GuiStyleConstants.CLASS_DISABLED_OBJECT_ROLE_BG; + } else if (AssignmentEditorDtoType.ROLE.equals(dto.getType())){ return GuiStyleConstants.CLASS_OBJECT_ROLE_BG; - }else if (AssignmentEditorDtoType.SERVICE.equals(type)){ + }else if (AssignmentEditorDtoType.SERVICE.equals(dto.getType())){ return GuiStyleConstants.CLASS_OBJECT_SERVICE_BG; - }else if (AssignmentEditorDtoType.ORG_UNIT.equals(type)){ + }else if (AssignmentEditorDtoType.ORG_UNIT.equals(dto.getType())){ return GuiStyleConstants.CLASS_OBJECT_ORG_BG; } else { return ""; @@ -231,4 +290,20 @@ private void addAssignmentPerformed(AssignmentEditorDto assignment, AjaxRequestT } + private AssignmentMultiplicityType getAssignmentMultiplicity(){ + OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNMENT_MULTIPLICITY); + SystemConfigurationType systemConfig = null; + try { + systemConfig = pageBase.getModelInteractionService().getSystemConfiguration(result); + } catch (ObjectNotFoundException | SchemaException e) { + LOGGER.error("Error getting system configuration: {}", e.getMessage(), e); + return AssignmentMultiplicityType.SINGLE; + } + if (systemConfig != null && systemConfig.getRoleManagement() != null && + systemConfig.getRoleManagement().getDefaultAssignmentMultiplicity() != null && + !systemConfig.getRoleManagement().getDefaultAssignmentMultiplicity().toString().equals("")){ + return systemConfig.getRoleManagement().getDefaultAssignmentMultiplicity(); + } + return AssignmentMultiplicityType.SINGLE; + } } diff --git a/gui/admin-gui/src/main/webapp/less/midpoint-theme-variables.less b/gui/admin-gui/src/main/webapp/less/midpoint-theme-variables.less index 56d7aa09340..2c817f60471 100644 --- a/gui/admin-gui/src/main/webapp/less/midpoint-theme-variables.less +++ b/gui/admin-gui/src/main/webapp/less/midpoint-theme-variables.less @@ -27,3 +27,4 @@ @object-resource-color: #605CA8; @object-task-color: #001f3f; @object-shadow-color: #001F3F; +@object-disabled-color: #BEBEBE; diff --git a/gui/admin-gui/src/main/webapp/less/midpoint-theme.less b/gui/admin-gui/src/main/webapp/less/midpoint-theme.less index f3e5dec8e28..4753a62ca71 100644 --- a/gui/admin-gui/src/main/webapp/less/midpoint-theme.less +++ b/gui/admin-gui/src/main/webapp/less/midpoint-theme.less @@ -270,6 +270,11 @@ th.cog, td.cog { color: #fff !important; } +.object-disabled-bg { + background-color: @object-disabled-color !important; + color: #fff !important; +} + // Colored boxes for each object type #box-object(@color) {