Skip to content

Commit

Permalink
fixign MID-4302
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Dec 5, 2017
1 parent 28990e7 commit 4f6839c
Show file tree
Hide file tree
Showing 7 changed files with 343 additions and 48 deletions.
Expand Up @@ -15,36 +15,42 @@
*/
package com.evolveum.midpoint.web.page.admin.roles;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.namespace.QName;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

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.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
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.RelationTypes;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

import java.util.ArrayList;
import java.util.List;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;

/**
* Created by honchar.
Expand Down Expand Up @@ -136,15 +142,94 @@ public void onClick(AjaxRequestTarget target) {
}));
return assignMemberMenuItems;
}

@Override
protected ObjectDelta getDeleteAssignmentDelta(Class classType) throws SchemaException {
ObjectDelta delta = ObjectDelta.createModificationDeleteContainer(classType, "fakeOid",
FocusType.F_ASSIGNMENT, getPrismContext(), createMemberAssignmentToModify(RelationTypes.OWNER.getRelation()));
delta.addModificationDeleteContainer(FocusType.F_ASSIGNMENT, createMemberAssignmentToModify(RelationTypes.APPROVER.getRelation()));
delta.addModificationDeleteContainer(FocusType.F_ASSIGNMENT, createMemberAssignmentToModify(RelationTypes.MANAGER.getRelation()));
return delta;
}

protected List<InlineMenuItem> createUnassignMemberInlineMenuItems() {
List<InlineMenuItem> unassignMenuItems = new ArrayList<>();
unassignMenuItems
.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.unassignApproversSelected"),
false, new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
removeMembersPerformed(QueryScope.SELECTED, Arrays.asList(SchemaConstants.ORG_APPROVER), target);
}
}));

unassignMenuItems
.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.unassignOwnersSelected"),
false, new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
removeMembersPerformed(QueryScope.SELECTED, Arrays.asList(SchemaConstants.ORG_OWNER), target);
}
}));

unassignMenuItems
.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.unassignManagersSelected"),
false, new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
removeMembersPerformed(QueryScope.SELECTED, Arrays.asList(SchemaConstants.ORG_MANAGER), target);
}
}));

unassignMenuItems.add(new InlineMenuItem(createStringResource("TreeTablePanel.menu.unassignMembersAll"),
false, new HeaderMenuAction(this) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
removeAllMembersPerformed(target);
}
}));
return unassignMenuItems;
}

private void removeAllMembersPerformed(AjaxRequestTarget target) {

RoleRelationSelectionPanel relatioNSelectionPanel = new RoleRelationSelectionPanel(getPageBase().getMainPopupBodyId(), new RoleRelationSelectionDto()) {

private static final long serialVersionUID = 1L;

@Override
protected void onConfirmPerformed(IModel<RoleRelationSelectionDto> model, AjaxRequestTarget target) {
getPageBase().hideMainPopup(target);

RoleRelationSelectionDto relationsSelected = model.getObject();
ArrayList<QName> relations= new ArrayList<>();
if (relationsSelected.isApprover()) {
relations.add(SchemaConstants.ORG_APPROVER);
}

if (relationsSelected.isOwner()) {
relations.add(SchemaConstants.ORG_OWNER);
}

if (relationsSelected.isManager()) {
relations.add(SchemaConstants.ORG_MANAGER);
}

removeMembersPerformed(QueryScope.ALL, relations, target);
}
};

getPageBase().showMainPopup(relatioNSelectionPanel, target);

}

// @Override
// protected ObjectDelta getDeleteAssignmentDelta(Class classType) throws SchemaException {
// ObjectDelta delta = ObjectDelta.createModificationDeleteContainer(classType, "fakeOid",
// FocusType.F_ASSIGNMENT, getPrismContext(), createMemberAssignmentToModify(RelationTypes.OWNER.getRelation()));
// delta.addModificationDeleteContainer(FocusType.F_ASSIGNMENT, createMemberAssignmentToModify(RelationTypes.APPROVER.getRelation()));
// delta.addModificationDeleteContainer(FocusType.F_ASSIGNMENT, createMemberAssignmentToModify(RelationTypes.MANAGER.getRelation()));
// return delta;
// }

@Override
protected ObjectQuery createAllMemberQuery() {
Expand Down Expand Up @@ -311,5 +396,24 @@ private List<String> getObjectOidsList(List<PrismObject<FocusType>> objectList){
return oidsList;
}

class RoleRelationSelectionDto implements Serializable {

private static final long serialVersionUID = 1L;
private boolean approver;
private boolean owner;
private boolean manager;

public boolean isApprover() {
return approver;
}

public boolean isManager() {
return manager;
}

public boolean isOwner() {
return owner;
}
}

}
Expand Up @@ -310,28 +310,36 @@ public Class<OrgType> getObjectTypeClass() {
}

@Override
protected void addMembersPerformed(QName type, QName relation, List selected, AjaxRequestTarget target) {
protected void addMembersPerformed(QName type, List<QName> relation, List selected, AjaxRequestTarget target) {
Task operationalTask = getPageBase().createSimpleTask(getTaskName("Add", null));
ObjectDelta delta = prepareDelta(type, relation, MemberOperation.ADD, operationalTask.getResult());
executeMemberOperation(operationalTask, type, createQueryForAdd(selected), delta,
TaskCategory.EXECUTE_CHANGES, target);

}

private ObjectDelta prepareDelta(QName type, QName relation, MemberOperation operation, OperationResult result) {
private ObjectDelta prepareDelta(QName type, List<QName> relations, MemberOperation operation, OperationResult result) {
Class classType = WebComponentUtil.qnameToClass(getPrismContext(), type);
ObjectDelta delta = null;
try {
switch (operation) {
case ADD:

if (relations == null || relations.isEmpty()) {
delta = ObjectDelta.createModificationAddContainer(classType, "fakeOid",
FocusType.F_ASSIGNMENT, getPrismContext(), createMemberAssignmentToModify(relation));

FocusType.F_ASSIGNMENT, getPrismContext(), createMemberAssignmentToModify(null));
} else {
delta = ObjectDelta.createEmptyModifyDelta(classType, "fakeOid", getPrismContext());

for (QName relation : relations) {
delta.addModificationAddContainer(FocusType.F_ASSIGNMENT, createAssignmentToModify(relation));
}

return delta;
}
break;

case REMOVE:
delta = getDeleteAssignmentDelta(classType);
delta = getDeleteAssignmentDelta(relations, classType);
break;
}
} catch (SchemaException e) {
Expand All @@ -341,15 +349,26 @@ private ObjectDelta prepareDelta(QName type, QName relation, MemberOperation ope
return delta;
}

protected ObjectDelta getDeleteAssignmentDelta(Class classType) throws SchemaException {
return ObjectDelta.createModificationDeleteContainer(classType, "fakeOid",
FocusType.F_ASSIGNMENT, getPrismContext(), createMemberAssignmentToModify(null));
protected ObjectDelta getDeleteAssignmentDelta(List<QName> relations, Class classType) throws SchemaException {
if (relations == null || relations.isEmpty()) {
return ObjectDelta.createModificationDeleteContainer(classType, "fakeOid",
FocusType.F_ASSIGNMENT, getPrismContext(), createMemberAssignmentToModify(null));
}

ObjectDelta delta = ObjectDelta.createEmptyModifyDelta(classType, "fakeOid", getPrismContext());

for (QName relation : relations) {
delta.addModificationDeleteContainer(FocusType.F_ASSIGNMENT, createAssignmentToModify(relation));
}

return delta;

}

@Override
protected void removeMembersPerformed(QueryScope scope, AjaxRequestTarget target) {
protected void removeMembersPerformed(QueryScope scope, List<QName> relation, AjaxRequestTarget target) {
Task operationalTask = getPageBase().createSimpleTask(getTaskName("Remove", scope));
ObjectDelta delta = prepareDelta(FocusType.COMPLEX_TYPE, null, MemberOperation.REMOVE, operationalTask.getResult());
ObjectDelta delta = prepareDelta(FocusType.COMPLEX_TYPE, relation, MemberOperation.REMOVE, operationalTask.getResult());
executeMemberOperation(operationalTask, FocusType.COMPLEX_TYPE, getActionQuery(scope), delta,
TaskCategory.EXECUTE_CHANGES, target);

Expand Down
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (c) 2010-2015 Evolveum
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<div class="form-group">
<label class="col-md-4 control-label">
<wicket:message key="RoleRelationSelectionPanel.manager" />
</label>
<div class="input-group col-md-8">
<div wicket:id="manager"/>
</div>
</div>

<div class="form-group">
<label class="col-md-4 control-label">
<wicket:message key="RoleRelationSelectionPanel.owner" />
</label>
<div class="input-group col-md-8">
<div wicket:id="owner"/>
</div>
</div>

<div class="form-group">
<label class="col-md-4 control-label">
<wicket:message key="RoleRelationSelectionPanel.approver" />
</label>
<div class="input-group col-md-8">
<div wicket:id="approver"/>
</div>
</div>


<p align="center">
<a class="btn btn-primary btn-sm" wicket:id="okButton"/>
<a class="btn btn-default btn-sm" wicket:id="cancelButton"/>
</p>

</wicket:panel>
</body>
</html>

0 comments on commit 4f6839c

Please sign in to comment.