Skip to content

Commit

Permalink
assignment request limit for delete/modify operations
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Sep 21, 2018
1 parent 0d0e120 commit b144f82
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 29 deletions.
Expand Up @@ -163,11 +163,9 @@ protected <T extends ObjectType> void addSelectedAssignmentsPerformed(AjaxReques
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));
boolean isAssignmentsLimitReached = isAssignmentsLimitReached(assignmentsList != null ? assignmentsList.size() : 0, true);
if (isAssignmentsLimitReached) {
warn(getParentPage().getString("AssignmentPanel.assignmentsLimitReachedWarning", assignmentsRequestsLimit));
target.add(getPageBase().getFeedbackPanel());
return;
}
Expand Down
Expand Up @@ -31,6 +31,7 @@
import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel;
import com.evolveum.midpoint.web.component.prism.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.github.sommeri.less4j.utils.ArraysUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand Down Expand Up @@ -96,6 +97,7 @@ public abstract class AssignmentPanel extends BasePanel<ContainerWrapper<Assignm

protected boolean assignmentDetailsVisible;
private List<ContainerValueWrapper<AssignmentType>> detailsPanelAssignmentsList = new ArrayList<>();
protected int assignmentsRequestsLimit = -1;

public AssignmentPanel(String id, IModel<ContainerWrapper<AssignmentType>> assignmentContainerWrapperModel) {
super(id, assignmentContainerWrapperModel);
Expand All @@ -106,6 +108,7 @@ public AssignmentPanel(String id, IModel<ContainerWrapper<AssignmentType>> assig
@Override
protected void onInitialize() {
super.onInitialize();
assignmentsRequestsLimit = AssignmentsUtil.loadAssignmentsLimit(new OperationResult(OPERATION_LOAD_ASSIGNMENTS_LIMIT), getPageBase());
initPaging();
initLayout();
}
Expand All @@ -129,7 +132,7 @@ private void initListPanel() {
assignmentsContainer.add(assignmentTable);

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

private static final long serialVersionUID = 1L;

Expand Down Expand Up @@ -199,7 +202,18 @@ protected List<ContainerValueWrapper<AssignmentType>> searchThroughList() {

List<IColumn<ContainerValueWrapper<AssignmentType>, String>> columns = initBasicColumns();
List<InlineMenuItem> menuActionsList = getAssignmentMenuActions();
columns.add(new InlineMenuButtonColumn<>(menuActionsList, menuActionsList.size(), getPageBase()));
columns.add(new InlineMenuButtonColumn<ContainerValueWrapper<AssignmentType>>(menuActionsList, menuActionsList.size(), getPageBase()){
private static final long serialVersionUID = 1L;

@Override
public boolean isButtonEnabled(int id, IModel<ContainerValueWrapper<AssignmentType>> rowModel){
if (rowModel != null
&& ValueStatus.ADDED.equals(rowModel.getObject().getStatus())) {
return true;
}
return !isAssignmentsLimitReached();
}
});

BoxedTablePanel<ContainerValueWrapper<AssignmentType>> assignmentTable = new BoxedTablePanel<ContainerValueWrapper<AssignmentType>>(ID_ASSIGNMENTS_TABLE,
assignmentsProvider, columns, getTableId(), getItemsPerPage()) {
Expand Down Expand Up @@ -303,35 +317,35 @@ protected void initCustomLayout(WebMarkupContainer assignmentsContainer) {

}

private IModel<String> getAssignmentsLimitReachedTitleModel(){
private IModel<String> getAssignmentsLimitReachedTitleModel(String defaultTitleKey){
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() : "";
AssignmentPanel.this.getPageBase().createStringResource("RoleCatalogItemButton.assignmentsLimitReachedTitle",
assignmentsRequestsLimit).getString() : createStringResource(defaultTitleKey).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;
return isAssignmentsLimitReached(0, false);
}

protected int getNewAssignmentsCount(){
protected boolean isAssignmentsLimitReached(int selectedAssignmentsCount, boolean actionPerformed){
if (assignmentsRequestsLimit < 0){
return false;
}
int changedItems = 0;
List<ContainerValueWrapper<AssignmentType>> assignmentsList = getModelObject().getValues();
int addedAssignmentsCount = 0;
for (ContainerValueWrapper<AssignmentType> assignment : assignmentsList){
if (ValueStatus.ADDED.equals(assignment.getStatus())){
addedAssignmentsCount++;
for (ContainerValueWrapper assignment : assignmentsList){
if (assignment.hasChanged()){
changedItems++;
}
}
return addedAssignmentsCount;

return actionPerformed ? (changedItems + selectedAssignmentsCount) > assignmentsRequestsLimit :
(changedItems + selectedAssignmentsCount) >= assignmentsRequestsLimit;
}

private void initDetailsPanel() {
Expand Down Expand Up @@ -364,6 +378,11 @@ public List<ContainerValueWrapper<AssignmentType>> getObject() {
@Override
protected void populateItem(ListItem<ContainerValueWrapper<AssignmentType>> item) {
Form form = this.findParent(Form.class);
if (isAssignmentsLimitReached()){
item.getModelObject().setReadonly(true, true);
} else if (item.getModelObject().isReadonly()){
item.getModelObject().setReadonly(false, true);
}
AbstractAssignmentDetailsPanel details = createDetailsPanel(ID_ASSIGNMENT_DETAILS, form, item.getModel());
item.add(details);
details.setOutputMarkupId(true);
Expand Down Expand Up @@ -427,7 +446,7 @@ private List<InlineMenuItem> getAssignmentMenuActions() {
AuthorizationPhaseType.REQUEST, obj,
null, null, null);
if (isUnassignAuthorized) {
menuItems.add(new InlineMenuItem(createStringResource("PageBase.button.unassign"), new Model<Boolean>(true),
menuItems.add(new InlineMenuItem(getAssignmentsLimitReachedTitleModel("PageBase.button.unassign"), new Model<Boolean>(true),
new Model<Boolean>(true), false, createDeleteColumnAction(), 0, GuiStyleConstants.CLASS_DELETE_MENU_ITEM,
DoubleButtonColumn.BUTTON_COLOR_CLASS.DANGER.toString()));
isUnassignMenuAdded = true;
Expand Down Expand Up @@ -481,11 +500,7 @@ public void onClick(AjaxRequestTarget target) {
}

protected void assignmentDetailsPerformed(AjaxRequestTarget target, IModel<ContainerValueWrapper<AssignmentType>> rowModel) {
assignmentDetailsVisible = true;
detailsPanelAssignmentsList.clear();
detailsPanelAssignmentsList.add(rowModel.getObject());
rowModel.getObject().setSelected(false);
target.add(AssignmentPanel.this);
assignmentDetailsPerformed(target, ArraysUtils.asList(rowModel.getObject()));
}

protected void assignmentDetailsPerformed(AjaxRequestTarget target, List<ContainerValueWrapper<AssignmentType>> rowModel) {
Expand All @@ -507,6 +522,19 @@ protected void refreshTable(AjaxRequestTarget target) {
}

protected void deleteAssignmentPerformed(AjaxRequestTarget target, List<ContainerValueWrapper<AssignmentType>> toDelete) {
int countAddedAssignments = 0;
for (ContainerValueWrapper<AssignmentType> assignment : toDelete) {
if (ValueStatus.ADDED.equals(assignment.getStatus())){
countAddedAssignments++;
}
}
boolean isLimitReached = isAssignmentsLimitReached(toDelete.size() - countAddedAssignments, true);
if (isLimitReached) {
warn(getParentPage().getString("AssignmentPanel.assignmentsLimitReachedWarning", assignmentsRequestsLimit));
target.add(getPageBase().getFeedbackPanel());
return;
}

if (toDelete == null){
return;
}
Expand Down
Expand Up @@ -107,6 +107,11 @@ public boolean isButtonVisible(int id, IModel<T> model) {
return InlineMenuButtonColumn.this.isButtonVisible(id, model);
}

@Override
public boolean isButtonEnabled(int id, IModel<T> model) {
return InlineMenuButtonColumn.this.isButtonEnabled(id, model);
}

@Override
public String getButtonSizeCssClass(int id) {
return InlineMenuButtonColumn.this.getButtonSizeCssClass(id);
Expand Down
Expand Up @@ -273,7 +273,25 @@ public boolean isReadonly() {
}

public void setReadonly(boolean readonly) {
setReadonly(readonly, false);
}

public void setReadonly(boolean readonly, boolean recursive) {
this.readonly = readonly;
if (recursive) {
getItems().forEach(item -> {
if (item instanceof PropertyOrReferenceWrapper) {
((PropertyOrReferenceWrapper) item).setReadonly(readonly);
return;
}
if (item instanceof ContainerWrapper){
List<ContainerValueWrapper> itemWrapperValues = ((ContainerWrapper) item).getValues();
itemWrapperValues.forEach(containerValueWrapper -> {
containerValueWrapper.setReadonly(readonly, recursive);
});
}
});
}
}

public boolean isSelected() {
Expand Down
Expand Up @@ -3624,7 +3624,7 @@ 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 the requested assignments has been reached ({0}). No more item can be added.
RoleCatalogItemButton.assignmentsLimitReachedTitle=Maximum number of the assignments requests has been reached ({0}). No more item can be added/modified/deleted.
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)
Expand Down

0 comments on commit b144f82

Please sign in to comment.