Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/support-3.8' into support-3.8
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Jul 31, 2018
2 parents 682dfcc + 199e4c0 commit e54a7d8
Show file tree
Hide file tree
Showing 7 changed files with 173 additions and 47 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 All @@ -52,7 +53,6 @@
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.form.Form;
Expand Down Expand Up @@ -199,8 +199,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 +233,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 Down Expand Up @@ -88,6 +90,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 +128,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 +151,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 +302,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 @@ -6,9 +6,14 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.prism.ContainerValueWrapper;
import com.evolveum.midpoint.web.session.RoleCatalogStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.model.AbstractReadOnlyModel;
Expand Down Expand Up @@ -368,4 +373,35 @@ public static QName getTargetType(AssignmentType assignment) {
return ConstructionType.COMPLEX_TYPE;

}

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

public static boolean isShoppingCartAssignmentsLimitReached(int assignmentsLimit, PageBase pageBase){
RoleCatalogStorage storage = pageBase.getSessionStorage().getRoleCatalog();
return assignmentsLimit >= 0 && storage.getAssignmentShoppingCart().size() >= assignmentsLimit;
}

public static int loadAssignmentsLimit(OperationResult result, PageBase pageBase){
int assignmentsLimit = -1;
try {
SystemConfigurationType sysConfig = pageBase.getModelInteractionService().getSystemConfiguration(result);
if (sysConfig != null && sysConfig.getAdminGuiConfiguration() != null && sysConfig.getAdminGuiConfiguration().getRoleManagement() != null){
assignmentsLimit = sysConfig.getAdminGuiConfiguration().getRoleManagement().getAssignmentApprovalRequestLimit();
}
} catch (ObjectNotFoundException | SchemaException ex){
LOGGER.error("Error getting system configuration: {}", ex.getMessage(), ex);
}
return assignmentsLimit;
}

}
Expand Up @@ -31,6 +31,7 @@
import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit;
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.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType;
Expand Down Expand Up @@ -63,10 +64,12 @@ public class RoleCatalogItemButton extends BasePanel<AssignmentEditorDto>{
private static final String ID_DETAILS_LINK = "detailsLink";
private static final String ID_DETAILS_LINK_LABEL = "detailsLinkLabel";
private static final String ID_DETAILS_LINK_ICON = "detailsLinkIcon";

private boolean plusIconClicked = false;

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

public RoleCatalogItemButton(String id, IModel<AssignmentEditorDto> model){
Expand All @@ -80,6 +83,8 @@ protected void onInitialize(){
}

private void initLayout(){
setOutputMarkupId(true);

WebMarkupContainer itemButtonContainer = new WebMarkupContainer(ID_ITEM_BUTTON_CONTAINER);
itemButtonContainer.setOutputMarkupId(true);
itemButtonContainer.add(new AttributeAppender("class", getBackgroundClass(getModelObject())));
Expand Down Expand Up @@ -120,14 +125,9 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) {
assignmentDetailsPerformed(RoleCatalogItemButton.this.getModelObject(), ajaxRequestTarget);
}
};
detailsLink.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(getModelObject());
}
});
detailsLink.add(getFooterLinksEnableBehaviour());
detailsLink.add(AttributeAppender.append("title",
AssignmentsUtil.getShoppingCartAssignmentsLimitReachedTitleModel(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), getPageBase())));
itemButtonContainer.add(detailsLink);

Label detailsLinkLabel = new Label(ID_DETAILS_LINK_LABEL, createStringResource("MultiButtonPanel.detailsLink"));
Expand All @@ -142,14 +142,7 @@ public void onClick(AjaxRequestTarget target) {
}

};
detailsLinkIcon.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(getModelObject());
}
});
detailsLinkIcon.add(getFooterLinksEnableBehaviour());
detailsLink.add(detailsLinkIcon);

AjaxLink addToCartLink = new AjaxLink(ID_ADD_TO_CART_LINK) {
Expand All @@ -160,14 +153,9 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) {
addAssignmentPerformed(RoleCatalogItemButton.this.getModelObject(), ajaxRequestTarget);
}
};
addToCartLink.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(getModelObject());
}
});
addToCartLink.add(getFooterLinksEnableBehaviour());
addToCartLink.add(AttributeAppender.append("title",
AssignmentsUtil.getShoppingCartAssignmentsLimitReachedTitleModel(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), getPageBase())));
itemButtonContainer.add(addToCartLink);

AjaxLink addToCartLinkIcon = new AjaxLink(ID_ADD_TO_CART_LINK_ICON) {
Expand All @@ -178,14 +166,7 @@ public void onClick(AjaxRequestTarget target) {
}

};
addToCartLinkIcon.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(getModelObject());
}
});
addToCartLinkIcon.add(getFooterLinksEnableBehaviour());
addToCartLink.add(addToCartLinkIcon);

WebMarkupContainer icon = new WebMarkupContainer(ID_TYPE_ICON);
Expand Down Expand Up @@ -245,6 +226,20 @@ protected String load() {
};
}

private VisibleEnableBehaviour getFooterLinksEnableBehaviour(){
return new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled(){
int assignmentsLimit = AssignmentsUtil.loadAssignmentsLimit(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT),
RoleCatalogItemButton.this.getPageBase());
return !AssignmentsUtil.isShoppingCartAssignmentsLimitReached(assignmentsLimit, RoleCatalogItemButton.this.getPageBase())
&& (isMultiUserRequest() || canAssign(getModelObject()));
}
};
}

private void assignmentDetailsPerformed(AssignmentEditorDto assignment, AjaxRequestTarget target){
if (!plusIconClicked) {
assignment.setMinimized(false);
Expand Down

0 comments on commit e54a7d8

Please sign in to comment.