/*
* Copyright (c) 2010-2016 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.
*/
package com.evolveum.midpoint.web.component.assignment;
import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.togglebutton.ToggleIconButton;
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.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.DateInput;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.users.PageUser;
import com.evolveum.midpoint.web.page.admin.users.component.AssignmentPreviewDialog;
import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto;
import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OtherPrivilegesLimitationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemSelectorType;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.*;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.ArrayList;
import java.util.List;
/**
* Created by honchar.
*/
public class DelegationEditorPanel extends AssignmentEditorPanel {
private static final String ID_DELEGATION_VALID_FROM = "delegationValidFrom";
private static final String ID_DELEGATION_VALID_TO = "delegationValidTo";
private static final String ID_DESCRIPTION = "delegationDescription";
private static final String ID_ARROW_ICON = "arrowIcon";
private static final String ID_DELEGATED_TO_IMAGE = "delegatedToImage";
private static final String ID_DELEGATED_TO = "delegatedTo";
private static final String ID_DELEGATED_TO_LABEL = "delegatedToLabel";
private static final String ID_SELECTED = "selected";
private static final String ID_TYPE_IMAGE = "typeImage";
private static final String ID_NAME_LABEL = "nameLabel";
private static final String ID_NAME = "name";
private static final String ID_HEADER_ROW = "headerRow";
private static final String ID_PRIVILEGES_LIST = "privilegesList";
private static final String ID_PRIVILEGE = "privilege";
private static final String ID_LIMIT_PRIVILEGES_BUTTON = "limitPrivilegesButton";
private List<String> privilegesNames = new ArrayList<>();
private static final String ID_EXPAND = "expand";
private static final String ID_DELEGATE_APPROVAL_WI = "approvalWorkItems";
private static final String ID_DELEGATE_CERTIFICATION_WI = "certificationWorkItems";
private static final String ID_DELEGATE_MANAGEMENT_WI = "managementWorkItems";
private static final String ID_ASSIGNMENT_PRIVILEGES_CHECKBOX = "assignmentPrivilegesCheckbox";
private static final String ID_ASSIGNMENT_PRIVILEGES_LABEL = "assignmentPrivilegesLabel";
private static final String ID_ASSIGNMENT_PRIVILEGES_CONTAINER = "assignmentPrivilegesContainer";
private static final String ID_ASSIGNMENT_PRIVILEGES_LABEL_CONTAINER = "assignmentPrivilegesLabelContainer";
private static final String DOT_CLASS = DelegationEditorPanel.class.getName() + ".";
private static final String OPERATION_GET_TARGET_REF_NAME = DOT_CLASS + "getTargetRefName";
private List<UserType> usersToUpdate;
public DelegationEditorPanel(String id, IModel<AssignmentEditorDto> delegationTargetObjectModel, boolean delegatedToMe,
List<AssignmentsPreviewDto> privilegesList, PageBase pageBase) {
super(id, delegationTargetObjectModel, delegatedToMe, privilegesList, pageBase);
}
@Override
protected void initHeaderRow(){
if (delegatedToMe){
privilegesList = getModelObject().getPrivilegeLimitationList();
}
AjaxCheckBox selected = new AjaxCheckBox(ID_SELECTED,
new PropertyModel<Boolean>(getModel(), AssignmentEditorDto.F_SELECTED)) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
}
};
selected.add(new VisibleEnableBehaviour(){
@Override
public boolean isVisible(){
return !getModel().getObject().isSimpleView();
}
});
headerRow.add(selected);
Label arrowIcon = new Label(ID_ARROW_ICON);
headerRow.add(arrowIcon);
WebMarkupContainer typeImage = new WebMarkupContainer(ID_TYPE_IMAGE);
typeImage.add(AttributeModifier.append("class", createImageTypeModel(getModel())));
headerRow.add(typeImage);
AjaxLink name = new AjaxLink(ID_NAME) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
nameClickPerformed(target);
}
};
headerRow.add(name);
Label nameLabel;
if (delegatedToMe) {
OperationResult result = new OperationResult(OPERATION_GET_TARGET_REF_NAME);
Task task = pageBase.createSimpleTask(OPERATION_GET_TARGET_REF_NAME);
nameLabel = new Label(ID_NAME_LABEL,
WebModelServiceUtils.resolveReferenceName(getModelObject().getTargetRef(), pageBase, task, result));
} else {
nameLabel = new Label(ID_NAME_LABEL, pageBase.createStringResource("DelegationEditorPanel.meLabel"));
}
nameLabel.setOutputMarkupId(true);
name.add(nameLabel);
AssignmentEditorDto dto = getModelObject();
dto.getTargetRef();
WebMarkupContainer delegatedToTypeImage = new WebMarkupContainer(ID_DELEGATED_TO_IMAGE);
if (delegatedToMe){
delegatedToTypeImage.add(AttributeModifier.append("class",
WebComponentUtil.createDefaultIcon(((PageUser)pageBase).getObjectWrapper().getObject())));
} else {
if (getModelObject().getDelegationOwner() != null) {
delegatedToTypeImage.add(AttributeModifier.append("class",
WebComponentUtil.createDefaultIcon(getModelObject().getDelegationOwner().asPrismObject())));
}
}
headerRow.add(delegatedToTypeImage);
AjaxLink delegatedToName = new AjaxLink(ID_DELEGATED_TO) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
nameClickPerformed(target);
}
};
headerRow.add(delegatedToName);
Label delegatedToNameLabel;
if (delegatedToMe) {
delegatedToNameLabel = new Label(ID_DELEGATED_TO_LABEL, pageBase.createStringResource("DelegationEditorPanel.meLabel"));
} else {
delegatedToNameLabel = new Label(ID_DELEGATED_TO_LABEL, getUserDisplayName());
}
delegatedToNameLabel.setOutputMarkupId(true);
delegatedToName.add(delegatedToNameLabel);
ToggleIconButton expandButton = new ToggleIconButton(ID_EXPAND, GuiStyleConstants.CLASS_ICON_EXPAND,
GuiStyleConstants.CLASS_ICON_COLLAPSE) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
nameClickPerformed(target);
}
@Override
public boolean isOn() {
return !DelegationEditorPanel.this.getModelObject().isMinimized();
}
};
headerRow.add(expandButton);
}
protected void initBodyLayout(WebMarkupContainer body) {
DateInput validFrom = new DateInput(ID_DELEGATION_VALID_FROM,
createDateModel(new PropertyModel<XMLGregorianCalendar>(getModel(),
AssignmentEditorDto.F_ACTIVATION + ".validFrom")));
validFrom.setEnabled(getModel().getObject().isEditable());
body.add(validFrom);
DateInput validTo = new DateInput(ID_DELEGATION_VALID_TO,
createDateModel(new PropertyModel<XMLGregorianCalendar>(getModel(),
AssignmentEditorDto.F_ACTIVATION + ".validTo")));
validTo.setEnabled(getModel().getObject().isEditable());
body.add(validTo);
TextArea<String> description = new TextArea<>(ID_DESCRIPTION,
new PropertyModel<String>(getModel(), AssignmentEditorDto.F_DESCRIPTION));
description.setEnabled(getModel().getObject().isEditable());
body.add(description);
WebMarkupContainer assignmentPrivilegesContainer = new WebMarkupContainer(ID_ASSIGNMENT_PRIVILEGES_CONTAINER);
assignmentPrivilegesContainer.setOutputMarkupId(true);
assignmentPrivilegesContainer.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible(){
if (!UserDtoStatus.ADD.equals(getModelObject().getStatus())){
return true;
}
return privilegesList != null && privilegesList.size() > 0;
}
});
body.add(assignmentPrivilegesContainer);
AjaxCheckBox assignmentPrivilegesCheckbox = new AjaxCheckBox(ID_ASSIGNMENT_PRIVILEGES_CHECKBOX,
new IModel<Boolean>(){
private static final long serialVersionUID = 1L;
@Override
public Boolean getObject(){
return getModelObject().getPrivilegeLimitationList() != null
&& getModelObject().getPrivilegeLimitationList().size() > 0;
}
@Override
public void setObject(Boolean value){
if (value){
getModelObject().setPrivilegeLimitationList(privilegesList);
} else {
getModelObject().setPrivilegeLimitationList(new ArrayList<>());
}
}
@Override
public void detach(){
}
}) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
target.add(DelegationEditorPanel.this.get(ID_BODY).get(ID_ASSIGNMENT_PRIVILEGES_CONTAINER));
}
};
assignmentPrivilegesCheckbox.setOutputMarkupId(true);
assignmentPrivilegesCheckbox.add(new AjaxFormComponentUpdatingBehavior("blur") {
@Override
protected void onUpdate(AjaxRequestTarget target) {}
});
assignmentPrivilegesCheckbox.add(new VisibleEnableBehaviour(){
@Override
public boolean isEnabled(){
return UserDtoStatus.ADD.equals(getModelObject().getStatus());
}
});
assignmentPrivilegesContainer.add(assignmentPrivilegesCheckbox);
WebMarkupContainer labelContainer = new WebMarkupContainer(ID_ASSIGNMENT_PRIVILEGES_LABEL_CONTAINER);
labelContainer.setOutputMarkupId(true);
assignmentPrivilegesContainer.add(labelContainer);
Label assignmentPrivilegesLabel = new Label(ID_ASSIGNMENT_PRIVILEGES_LABEL,
createStringResource("DelegationEditorPanel.allPrivilegesLabel"));
assignmentPrivilegesLabel.add(new VisibleEnableBehaviour(){
@Override
public boolean isVisible(){
return true;
}
});
assignmentPrivilegesLabel.setOutputMarkupId(true);
labelContainer.add(assignmentPrivilegesLabel);
addPrivilegesPanel(assignmentPrivilegesContainer);
AjaxButton limitPrivilegesButton = new AjaxButton(ID_LIMIT_PRIVILEGES_BUTTON,
pageBase.createStringResource("DelegationEditorPanel.limitPrivilegesButton")) {
@Override
public void onClick(AjaxRequestTarget target) {
AssignmentPreviewDialog assignmentPreviewDialog =
new AssignmentPreviewDialog(pageBase.getMainPopupBodyId(),
selectExistingPrivileges(privilegesList),
null, pageBase, true){
@Override
protected boolean isDelegationPreview(){
return true;
}
@Override
public StringResourceModel getTitle() {
return new StringResourceModel("AssignmentPreviewDialog.delegationPreviewLabel");
}
@Override
protected void addButtonClicked(AjaxRequestTarget target, List<AssignmentsPreviewDto> dtoList){
DelegationEditorPanel.this.getModelObject().setPrivilegeLimitationList(dtoList);
pageBase.hideMainPopup(target);
}
};
pageBase.showMainPopup(assignmentPreviewDialog, target);
}
};
limitPrivilegesButton.add(new VisibleEnableBehaviour(){
@Override
public boolean isVisible(){
return UserDtoStatus.ADD.equals(getModelObject().getStatus()) &&
assignmentPrivilegesCheckbox.getModelObject();
}
});
labelContainer.add(limitPrivilegesButton);
AjaxCheckBox approvalRights = new AjaxCheckBox(ID_DELEGATE_APPROVAL_WI,
new IModel<Boolean>(){
private static final long serialVersionUID = 1L;
@Override
public Boolean getObject(){
AssignmentEditorDto dto = getModelObject();
if (dto.getPrivilegesLimitation() == null ||
dto.getPrivilegesLimitation().getApprovalWorkItems() == null ||
dto.getPrivilegesLimitation().getApprovalWorkItems().isAll() == null){
return false;
}
return dto.getPrivilegesLimitation().getApprovalWorkItems().isAll();
}
@Override
public void setObject(Boolean value){
AssignmentEditorDto dto = getModelObject();
OtherPrivilegesLimitationType limitations = dto.getPrivilegesLimitation();
if (limitations == null ){
limitations = new OtherPrivilegesLimitationType();
dto.setPrivilegesLimitation(limitations);
}
WorkItemSelectorType workItemSelector = new WorkItemSelectorType();
workItemSelector.all(value);
limitations.setApprovalWorkItems(workItemSelector);
}
@Override
public void detach(){
}
}) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
}
};
approvalRights.setOutputMarkupId(true);
approvalRights.add(new AjaxFormComponentUpdatingBehavior("blur") {
@Override
protected void onUpdate(AjaxRequestTarget target) {}
});
approvalRights.add(new VisibleEnableBehaviour(){
@Override
public boolean isEnabled(){
return getModel().getObject().isEditable();
}
});
body.add(approvalRights);
AjaxCheckBox certificationRights = new AjaxCheckBox(ID_DELEGATE_CERTIFICATION_WI,
new IModel<Boolean>(){
private static final long serialVersionUID = 1L;
@Override
public Boolean getObject(){
AssignmentEditorDto dto = getModelObject();
if (dto.getPrivilegesLimitation() == null ||
dto.getPrivilegesLimitation().getCertificationWorkItems() == null ||
dto.getPrivilegesLimitation().getCertificationWorkItems().isAll() == null){
return false;
}
return dto.getPrivilegesLimitation().getCertificationWorkItems().isAll();
}
@Override
public void setObject(Boolean value){
AssignmentEditorDto dto = getModelObject();
OtherPrivilegesLimitationType limitations = dto.getPrivilegesLimitation();
if (limitations == null ){
limitations = new OtherPrivilegesLimitationType();
dto.setPrivilegesLimitation(limitations);
}
WorkItemSelectorType workItemSelector = new WorkItemSelectorType();
workItemSelector.all(value);
limitations.setCertificationWorkItems(workItemSelector);
}
@Override
public void detach(){
}
}) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
}
};
certificationRights.add(new AjaxFormComponentUpdatingBehavior("blur") {
@Override
protected void onUpdate(AjaxRequestTarget target) {}
});
certificationRights.add(new VisibleEnableBehaviour(){
@Override
public boolean isEnabled(){
return getModel().getObject().isEditable();
}
});
certificationRights.setOutputMarkupId(true);
body.add(certificationRights);
AjaxCheckBox managementWorkItems = new AjaxCheckBox(ID_DELEGATE_MANAGEMENT_WI,
new Model<Boolean>(false)) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
}
};
managementWorkItems.setOutputMarkupId(true);
managementWorkItems.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible(){
//TODO not implemented yet
return false;
}
});
body.add(managementWorkItems);
addAjaxOnUpdateBehavior(body);
};
private void addPrivilegesPanel(WebMarkupContainer body){
privilegesNames = getPrivilegesNamesList();
ListView<String> privilegesListComponent = new ListView<String>(ID_PRIVILEGES_LIST, privilegesNames){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<String> item) {
Label privilageNameLabel = new Label(ID_PRIVILEGE, item.getModel());
item.add(privilageNameLabel);
}
};
privilegesListComponent.setOutputMarkupId(true);
privilegesListComponent.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible(){
if (!UserDtoStatus.ADD.equals(getModelObject().getStatus())){
return true;
}
return false;
}
});
body.addOrReplace(privilegesListComponent);
}
private boolean allAssignmentPrivilegesSelected(){
return getModelObject().getPrivilegeLimitationList() == null ||
getModelObject().getPrivilegeLimitationList().size() == 0 ||
getModelObject().getPrivilegeLimitationList().size() == privilegesList.size();
}
private List<String> getPrivilegesNamesList(){
List<String> privilegesNamesList = new ArrayList<>();
List<AssignmentsPreviewDto> dtos = getModel().getObject().getPrivilegeLimitationList();
if (dtos != null){
for (AssignmentsPreviewDto assignmentsPreviewDto : dtos){
privilegesNamesList.add(assignmentsPreviewDto.getTargetName());
}
}
return privilegesNamesList;
}
private String getUserDisplayName(){
String displayName = "";
UserType delegationUser = getModelObject().getDelegationOwner();
if (getModelObject().getDelegationOwner() != null) {
if (delegationUser.getFullName() != null && StringUtils.isNotEmpty(delegationUser.getFullName().getOrig())) {
displayName = delegationUser.getFullName().getOrig() + " (" + delegationUser.getName().getOrig() + ")";
} else {
displayName = delegationUser.getName() != null ? delegationUser.getName().getOrig() : "";
}
}
return displayName;
}
private List<AssignmentsPreviewDto> selectExistingPrivileges(List<AssignmentsPreviewDto> list){
for (AssignmentsPreviewDto dto : list){
dto.setSelected(false);
}
if (getModelObject().getPrivilegeLimitationList() == null){
return list;
}
for (AssignmentsPreviewDto dto : list){
if (getModelObject().getPrivilegeLimitationList().contains(dto)){
dto.setSelected(true);
}
}
return list;
}
}