Skip to content

Commit

Permalink
MID-4697 assignments limit for assignments panel
Browse files Browse the repository at this point in the history
# Conflicts:
#	gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java
#	gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractRoleMainPanel.java
  • Loading branch information
KaterynaHonchar committed Jul 27, 2018
1 parent 74a46eb commit e8276c5
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 23 deletions.
Expand Up @@ -26,6 +26,7 @@
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.web.component.prism.*;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto;
Expand Down Expand Up @@ -199,8 +200,17 @@ protected <T extends ObjectType> void addSelectedAssignmentsPerformed(AjaxReques
target.add(getPageBase().getFeedbackPanel());
return;
}

for (T object : assignmentsList){

int assignmentsLimit = AssignmentsUtil.loadAssignmentsLimit(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT),
getPageBase());
int addedAssignmentsCount = getNewAssignmentsCount() + assignmentsList.size();
if (assignmentsLimit >= 0 && addedAssignmentsCount > assignmentsLimit) {
warn(getParentPage().getString("AssignmentPanel.assignmentsLimitReachedWarning", assignmentsLimit));
target.add(getPageBase().getFeedbackPanel());
return;
}

for (T object : assignmentsList){
PrismContainerDefinition<AssignmentType> definition = getModelObject().getItem().getDefinition();
PrismContainerValue<AssignmentType> newAssignment;
try {
Expand All @@ -224,11 +234,44 @@ protected <T extends ObjectType> void addSelectedAssignmentsPerformed(AjaxReques
target.add(getPageBase().getFeedbackPanel());
target.add(this);
}

}


}
protected <T extends ObjectType> void addSelectedAssignmentsPerformed(AjaxRequestTarget target, List<T> assignmentsList, QName relation) {
if (assignmentsList == null || assignmentsList.isEmpty()) {
warn(getParentPage().getString("AssignmentTablePanel.message.noAssignmentSelected"));
target.add(getPageBase().getFeedbackPanel());
return;
}
int assignmentsLimit = AssignmentsUtil.loadAssignmentsLimit(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT),
getPageBase());
int addedAssignmentsCount = getNewAssignmentsCount() + assignmentsList.size();
if (assignmentsLimit >= 0 && addedAssignmentsCount > assignmentsLimit) {
warn(getParentPage().getString("AssignmentPanel.assignmentsLimitReachedWarning", assignmentsLimit));
target.add(getPageBase().getFeedbackPanel());
return;
}

for (T object : assignmentsList) {
PrismContainerValue<AssignmentType> newAssignment = getModelObject().getItem().createNewValue();
ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(object, relation);
AssignmentType assignmentType = newAssignment.asContainerable();
if (ResourceType.class.equals(object.getClass())) {
ConstructionType constructionType = new ConstructionType();
constructionType.setResourceRef(ref);
assignmentType.setConstruction(constructionType);
} else {
assignmentType.setTargetRef(ref);
}
createNewAssignmentContainerValueWrapper(newAssignment);
}

refreshTable(target);
target.add(getAssignmentContainer());
reloadSavePreviewButtons(target);
}

protected List<IColumn<ContainerValueWrapper<AssignmentType>, String>> initColumns() {
List<IColumn<ContainerValueWrapper<AssignmentType>, String>> columns = new ArrayList<>();
Expand Down
Expand Up @@ -20,10 +20,12 @@
import java.util.List;
import java.util.stream.Collectors;

import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel;
Expand All @@ -32,6 +34,7 @@
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
Expand Down Expand Up @@ -88,6 +91,8 @@ public abstract class AssignmentPanel extends BasePanel<ContainerWrapper<Assignm
private final static String ID_CANCEL_BUTTON = "cancelButton";

private static final Trace LOGGER = TraceManager.getTrace(AssignmentPanel.class);
private static final String DOT_CLASS = AssignmentPanel.class.getName() + ".";
protected static final String OPERATION_LOAD_ASSIGNMENTS_LIMIT = DOT_CLASS + "loadAssignmentsLimit";

protected boolean assignmentDetailsVisible;
private List<ContainerValueWrapper<AssignmentType>> detailsPanelAssignmentsList = new ArrayList<>();
Expand Down Expand Up @@ -124,7 +129,7 @@ private void initListPanel() {
assignmentsContainer.add(assignmentTable);

AjaxIconButton newObjectIcon = new AjaxIconButton(ID_NEW_ASSIGNMENT_BUTTON, new Model<>("fa fa-plus"),
createStringResource("MainObjectListPanel.newObject")) {
getAssignmentsLimitReachedTitleModel()) {

private static final long serialVersionUID = 1L;

Expand All @@ -147,6 +152,11 @@ AuthorizationPhaseType.REQUEST, getFocusObject(),
return WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_ADMIN_ASSIGN_ACTION_URI);
}
}

@Override
public boolean isEnabled(){
return !isAssignmentsLimitReached();
}
});
assignmentsContainer.add(newObjectIcon);

Expand Down Expand Up @@ -293,6 +303,37 @@ protected void initCustomLayout(WebMarkupContainer assignmentsContainer) {

}

private IModel<String> getAssignmentsLimitReachedTitleModel(){
return new LoadableModel<String>(true) {
@Override
protected String load() {
int assignmentsLimit = AssignmentsUtil.loadAssignmentsLimit(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT),
AssignmentPanel.this.getPageBase());
return isAssignmentsLimitReached() ?
AssignmentPanel.this.getPageBase().createStringResource("RoleCatalogItemButton.assignmentsLimitReachedTitle", assignmentsLimit)
.getString() : "";
}
};
}

protected boolean isAssignmentsLimitReached(){
int assignmentsLimit = AssignmentsUtil.loadAssignmentsLimit(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT),
AssignmentPanel.this.getPageBase());
int addedAssignmentsCount = getNewAssignmentsCount();
return assignmentsLimit >= 0 && addedAssignmentsCount >= assignmentsLimit;
}

protected int getNewAssignmentsCount(){
List<ContainerValueWrapper<AssignmentType>> assignmentsList = getModelObject().getValues();
int addedAssignmentsCount = 0;
for (ContainerValueWrapper<AssignmentType> assignment : assignmentsList){
if (ValueStatus.ADDED.equals(assignment.getStatus())){
addedAssignmentsCount++;
}
}
return addedAssignmentsCount;
}

private void initDetailsPanel() {
WebMarkupContainer details = new WebMarkupContainer(ID_DETAILS);
details.setOutputMarkupId(true);
Expand Down
Expand Up @@ -374,19 +374,19 @@ public static QName getTargetType(AssignmentType assignment) {

}

public static IModel<String> getAssignmentsLimitReachedTitleModel(OperationResult result, PageBase pageBase){
public static IModel<String> getShoppingCartAssignmentsLimitReachedTitleModel(OperationResult result, PageBase pageBase){
return new LoadableModel<String>(true) {
@Override
protected String load() {
int assignmentsLimit = loadAssignmentsLimit(result, pageBase);
return isAssignmentsLimitReached(assignmentsLimit, pageBase) ?
pageBase.createStringResource("RoleCatalogItemButton.assignmentsLimitReachedTitle", loadAssignmentsLimit(result, pageBase))
return isShoppingCartAssignmentsLimitReached(assignmentsLimit, pageBase) ?
pageBase.createStringResource("RoleCatalogItemButton.assignmentsLimitReachedTitle", assignmentsLimit)
.getString() : "";
}
};
}

public static boolean isAssignmentsLimitReached(int assignmentsLimit, PageBase pageBase){
public static boolean isShoppingCartAssignmentsLimitReached(int assignmentsLimit, PageBase pageBase){
RoleCatalogStorage storage = pageBase.getSessionStorage().getRoleCatalog();
return assignmentsLimit >= 0 && storage.getAssignmentShoppingCart().size() >= assignmentsLimit;
}
Expand Down
Expand Up @@ -23,8 +23,6 @@
import com.evolveum.midpoint.prism.PrismObject;
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.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
Expand Down Expand Up @@ -129,7 +127,7 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) {
};
detailsLink.add(getFooterLinksEnableBehaviour());
detailsLink.add(AttributeAppender.append("title",
AssignmentsUtil.getAssignmentsLimitReachedTitleModel(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), getPageBase())));
AssignmentsUtil.getShoppingCartAssignmentsLimitReachedTitleModel(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), getPageBase())));
itemButtonContainer.add(detailsLink);

Label detailsLinkLabel = new Label(ID_DETAILS_LINK_LABEL, createStringResource("MultiButtonPanel.detailsLink"));
Expand Down Expand Up @@ -157,7 +155,7 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) {
};
addToCartLink.add(getFooterLinksEnableBehaviour());
addToCartLink.add(AttributeAppender.append("title",
AssignmentsUtil.getAssignmentsLimitReachedTitleModel(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), getPageBase())));
AssignmentsUtil.getShoppingCartAssignmentsLimitReachedTitleModel(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), getPageBase())));
itemButtonContainer.add(addToCartLink);

AjaxLink addToCartLinkIcon = new AjaxLink(ID_ADD_TO_CART_LINK_ICON) {
Expand Down Expand Up @@ -236,7 +234,7 @@ private VisibleEnableBehaviour getFooterLinksEnableBehaviour(){
public boolean isEnabled(){
int assignmentsLimit = AssignmentsUtil.loadAssignmentsLimit(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT),
RoleCatalogItemButton.this.getPageBase());
return !AssignmentsUtil.isAssignmentsLimitReached(assignmentsLimit, RoleCatalogItemButton.this.getPageBase())
return !AssignmentsUtil.isShoppingCartAssignmentsLimitReached(assignmentsLimit, RoleCatalogItemButton.this.getPageBase())
&& (isMultiUserRequest() || canAssign(getModelObject()));
}
};
Expand Down
Expand Up @@ -16,20 +16,20 @@
package com.evolveum.midpoint.web.component.objectdetails;

import com.evolveum.midpoint.gui.api.ComponentConstants;
import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab;
import com.evolveum.midpoint.gui.api.component.tabs.PanelTab;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
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;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
import com.evolveum.midpoint.web.component.assignment.*;
import com.evolveum.midpoint.web.component.breadcrumbs.Breadcrumb;
import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageClass;
Expand All @@ -56,9 +56,6 @@
import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails;
import com.evolveum.midpoint.web.page.admin.users.component.AbstractRoleMemberPanel;
import com.evolveum.midpoint.web.page.admin.users.dto.FocusSubwrapperDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;

import java.util.List;

Expand Down Expand Up @@ -133,12 +130,12 @@ public boolean isEnabled(){
parentPage);
AssignmentEditorDto dto = AssignmentEditorDto.createDtoFromObject(AbstractRoleMainPanel.this.getObject().asObjectable(),
UserDtoStatus.ADD, parentPage);
return !AssignmentsUtil.isAssignmentsLimitReached(assignmentsLimit, parentPage)
return !AssignmentsUtil.isShoppingCartAssignmentsLimitReached(assignmentsLimit, parentPage)
&& (storage.isMultiUserRequest() || dto.isAssignable());
}
});
addToCartButton.add(AttributeAppender.append("title",
AssignmentsUtil.getAssignmentsLimitReachedTitleModel(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), parentPage)));
AssignmentsUtil.getShoppingCartAssignmentsLimitReachedTitleModel(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), parentPage)));

shoppingCartButtonsPanel.add(addToCartButton);

Expand Down
Expand Up @@ -3700,7 +3700,8 @@ PageEvaluateMapping.sample.FullName_Delta_Cond=Full name mapping with condition
PageEvaluateMapping.sample.OrgName=Deriving attribute from parent org's name
PageAssignmentShoppingKart.title=Assignment request
PageAssignmentShoppingKart.roleCatalogIsNotConfigured=Role catalog is not configured in the system configuration xml
RoleCatalogItemButton.assignmentsLimitReachedTitle=Maximum number of items in the shopping cart has been reached ({0}). Please reduce your request.
RoleCatalogItemButton.assignmentsLimitReachedTitle=Maximum number of the requested assignments has been reached ({0}). No more item can be added.
AssignmentPanel.assignmentsLimitReachedWarning=The number of the selected items exceeds assignments request limit ({0}).
AssignmentConflictPanel.existingAssignmentLabelMessage=(which user already has)
AssignmentConflictPanel.addedAssignmentLabelMessage=(which is added to shopping cart)
AssignmentConflictPanel.conflictMessage=conflicts with
Expand Down

0 comments on commit e8276c5

Please sign in to comment.