/*
* Copyright (c) 2016-2017 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.data;
import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.BasePanel;
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.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.assignment.*;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.PageAdminAbstractRole;
import com.evolveum.midpoint.web.page.admin.roles.PageRole;
import com.evolveum.midpoint.web.page.admin.services.PageService;
import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit;
import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
import com.evolveum.midpoint.web.page.admin.workflow.PageWorkItem;
import com.evolveum.midpoint.web.page.self.PageAssignmentDetails;
import com.evolveum.midpoint.web.session.RoleCatalogStorage;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import java.util.ArrayList;
import java.util.List;
/**
* Created honchar.
*/
public class MultiButtonTable extends BasePanel<List<AssignmentEditorDto>> {
private static final long serialVersionUID = 1L;
private static final String ID_ROW = "row";
private static final String ID_CELL = "cell";
private static final String ID_ITEM_BUTTON_CONTAINER = "itemButtonContainer";
private static final String ID_INNER = "inner";
private static final String ID_INNER_LABEL = "innerLabel";
private static final String ID_TYPE_ICON = "typeIcon";
private static final String ID_ALREADY_ASSIGNED_ICON = "alreadyAssignedIcon";
private static final String ID_ADD_TO_CART_LINK = "addToCartLink";
private static final String ID_ADD_TO_CART_LINK_LABEL = "addToCartLinkLabel";
private static final String ID_ADD_TO_CART_LINK_ICON = "addToCartLinkIcon";
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 static final String DOT_CLASS = AssignmentCatalogPanel.class.getName();
private static final Trace LOGGER = TraceManager.getTrace(AssignmentCatalogPanel.class);
private static final String OPERATION_LOAD_TARGET_OBJECT = DOT_CLASS + "." + "loadTargetObject";
private String addToCartLinkIcon = "fa fa-times-circle fa-lg text-danger";
private String detailsLinkIcon = "fa fa-arrow-circle-right";
private long itemsCount = 0;
private long itemsPerRow = 0;
private PageBase pageBase;
private boolean plusIconClicked = false;
public MultiButtonTable (String id, long itemsPerRow, IModel<List<AssignmentEditorDto>> model, PageBase pageBase){
super(id, model);
this.itemsPerRow = itemsPerRow;
this.pageBase = pageBase;
initLayout();
}
private void initLayout(){
itemsCount = getModel() != null ? (getModel().getObject() != null ? getModel().getObject().size() : 0) : 0;
RepeatingView rows = new RepeatingView(ID_ROW);
rows.setOutputMarkupId(true);
if (itemsCount > 0 && itemsPerRow > 0){
int index = 0;
List<AssignmentEditorDto> assignmentsList = getModelObject();
long rowCount = itemsCount % itemsPerRow == 0 ? (itemsCount / itemsPerRow) : (itemsCount / itemsPerRow + 1);
for (int rowNumber = 0; rowNumber < rowCount; rowNumber++){
WebMarkupContainer rowContainer = new WebMarkupContainer(rows.newChildId());
rows.add(rowContainer);
RepeatingView columns = new RepeatingView(ID_CELL);
columns.setOutputMarkupId(true);
rowContainer.add(columns);
for (int colNumber = 0; colNumber < itemsPerRow; colNumber++){
WebMarkupContainer colContainer = new WebMarkupContainer(columns.newChildId());
columns.add(colContainer);
WebMarkupContainer itemButtonContainer = new WebMarkupContainer(ID_ITEM_BUTTON_CONTAINER);
itemButtonContainer.setOutputMarkupId(true);
itemButtonContainer.add(new AttributeAppender("class", getBackgroundClass(assignmentsList.get(index))));
colContainer.add(itemButtonContainer);
populateCell(itemButtonContainer, assignmentsList.get(index));
index++;
if (index >= assignmentsList.size()){
break;
}
}
}
}
add(rows);
}
protected void populateCell(WebMarkupContainer cellContainer, final AssignmentEditorDto assignment){
AjaxLink inner = new AjaxLink(ID_INNER) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
targetObjectDetailsPerformed(assignment, ajaxRequestTarget);
}
};
inner.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(assignment);
}
});
cellContainer.add(inner);
Label nameLabel = new Label(ID_INNER_LABEL, assignment.getName());
inner.add(nameLabel);
AjaxLink detailsLink = new AjaxLink(ID_DETAILS_LINK) {
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
assignmentDetailsPerformed(assignment, ajaxRequestTarget);
}
};
detailsLink.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(assignment);
}
});
cellContainer.add(detailsLink);
Label detailsLinkLabel = new Label(ID_DETAILS_LINK_LABEL, pageBase.createStringResource("MultiButtonPanel.detailsLink"));
detailsLinkLabel.setRenderBodyOnly(true);
detailsLink.add(detailsLinkLabel);
AjaxLink detailsLinkIcon = new AjaxLink(ID_DETAILS_LINK_ICON) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
}
};
detailsLinkIcon.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(assignment);
}
});
detailsLink.add(detailsLinkIcon);
AjaxLink addToCartLink = new AjaxLink(ID_ADD_TO_CART_LINK) {
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
addAssignmentPerformed(assignment, ajaxRequestTarget);
}
};
addToCartLink.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(assignment);
}
});
cellContainer.add(addToCartLink);
AjaxLink addToCartLinkIcon = new AjaxLink(ID_ADD_TO_CART_LINK_ICON) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
}
};
addToCartLinkIcon.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled(){
return isMultiUserRequest() || canAssign(assignment);
}
});
addToCartLink.add(addToCartLinkIcon);
WebMarkupContainer icon = new WebMarkupContainer(ID_TYPE_ICON);
icon.add(new AttributeAppender("class", getIconClass(assignment.getType())));
cellContainer.add(icon);
WebMarkupContainer alreadyAssignedIcon = new WebMarkupContainer(ID_ALREADY_ASSIGNED_ICON);
alreadyAssignedIcon.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible(){
return !isMultiUserRequest() && assignment.isAlreadyAssigned();
}
});
cellContainer.add(alreadyAssignedIcon);
}
private boolean canAssign(final AssignmentEditorDto assignment) {
return assignment.isAssignable();
}
private void assignmentDetailsPerformed(final AssignmentEditorDto assignment, AjaxRequestTarget target){
if (!plusIconClicked) {
assignment.setMinimized(false);
assignment.setSimpleView(true);
pageBase.navigateToNext(new PageAssignmentDetails(Model.of(assignment)));
} else {
plusIconClicked = false;
}
}
private void targetObjectDetailsPerformed(final AssignmentEditorDto assignment, AjaxRequestTarget target){
if (assignment.getTargetRef() == null || assignment.getTargetRef().getOid() == null){
return;
}
if (!plusIconClicked) {
PageParameters parameters = new PageParameters();
parameters.add(OnePageParameterEncoder.PARAMETER, assignment.getTargetRef().getOid());
if (AssignmentEditorDtoType.ORG_UNIT.equals(assignment.getType())){
getPageBase().navigateToNext(PageOrgUnit.class, parameters);
} else if (AssignmentEditorDtoType.ROLE.equals(assignment.getType())){
getPageBase().navigateToNext(PageRole.class, parameters);
} else if (AssignmentEditorDtoType.SERVICE.equals(assignment.getType())){
getPageBase().navigateToNext(PageService.class, parameters);
}
} else {
plusIconClicked = false;
}
}
private String getIconClass(AssignmentEditorDtoType type){
// TODO: switch to icon constants
if (AssignmentEditorDtoType.ROLE.equals(type)){
return GuiStyleConstants.CLASS_OBJECT_ROLE_ICON;
}else if (AssignmentEditorDtoType.SERVICE.equals(type)){
return GuiStyleConstants.CLASS_OBJECT_SERVICE_ICON;
}else if (AssignmentEditorDtoType.ORG_UNIT.equals(type)){
return GuiStyleConstants.CLASS_OBJECT_ORG_ICON;
} else {
return "";
}
}
private String getBackgroundClass(AssignmentEditorDto dto){
if (!isMultiUserRequest() && !canAssign(dto)){
return GuiStyleConstants.CLASS_DISABLED_OBJECT_ROLE_BG;
} else if (AssignmentEditorDtoType.ROLE.equals(dto.getType())){
return GuiStyleConstants.CLASS_OBJECT_ROLE_BG;
}else if (AssignmentEditorDtoType.SERVICE.equals(dto.getType())){
return GuiStyleConstants.CLASS_OBJECT_SERVICE_BG;
}else if (AssignmentEditorDtoType.ORG_UNIT.equals(dto.getType())){
return GuiStyleConstants.CLASS_OBJECT_ORG_BG;
} else {
return "";
}
}
private void addAssignmentPerformed(AssignmentEditorDto assignment, AjaxRequestTarget target){
plusIconClicked = true;
RoleCatalogStorage storage = pageBase.getSessionStorage().getRoleCatalog();
if (storage.getAssignmentShoppingCart() == null){
storage.setAssignmentShoppingCart(new ArrayList<AssignmentEditorDto>());
}
AssignmentEditorDto dto = assignment.clone();
dto.setDefaultRelation();
storage.getAssignmentShoppingCart().add(dto);
AssignmentCatalogPanel parent = MultiButtonTable.this.findParent(AssignmentCatalogPanel.class);
parent.reloadCartButton(target);
}
private PageBase getTargetObjectDetailsPage(AssignmentEditorDtoType type, PrismObject<AbstractRoleType> targetObject){
if (targetObject == null){
return pageBase;
}
if (AssignmentEditorDtoType.ORG_UNIT.equals(type)){
return new PageOrgUnit(((OrgType)targetObject.asObjectable()).asPrismObject()){
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createPageTitleModel() {
return createStringResource("PageAdminObjectDetails.title.editOrgType",
WebComponentUtil.getName(targetObject.asObjectable()));
}
};
} else if (AssignmentEditorDtoType.ROLE.equals(type)){
return new PageRole(((RoleType)targetObject.asObjectable()).asPrismObject()){
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createPageTitleModel() {
return createStringResource("PageAdminObjectDetails.title.editRoleType",
WebComponentUtil.getName(targetObject.asObjectable()));
}
};
} else if (AssignmentEditorDtoType.SERVICE.equals(type)){
return new PageService(((ServiceType)targetObject.asObjectable()).asPrismObject()){
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createPageTitleModel() {
return createStringResource("PageAdminObjectDetails.title.editServiceType",
WebComponentUtil.getName(targetObject.asObjectable()));
}
};
}
return pageBase;
}
private boolean isMultiUserRequest(){
return pageBase.getSessionStorage().getRoleCatalog().isMultiUserRequest();
}
}