Skip to content

Commit

Permalink
adding column for outcome of CaseType to cases default columns (creat…
Browse files Browse the repository at this point in the history
…ing of panel with icon and count) (MID-6629)
  • Loading branch information
skublik committed Nov 4, 2020
1 parent 4ebf61c commit 33de01f
Show file tree
Hide file tree
Showing 6 changed files with 266 additions and 25 deletions.
Expand Up @@ -23,6 +23,7 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.web.page.admin.server.dto.ApprovalOutcomeIcon;
import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType;

import org.apache.commons.collections4.CollectionUtils;
Expand Down Expand Up @@ -735,12 +736,12 @@ private static boolean isArchetypedTask(TaskType taskType, SystemObjectsType arc
return archetype.value().equals(archetypeRef.getOid());
}

private static ObjectReferenceType getArchetypeReference(TaskType task) {
private static ObjectReferenceType getArchetypeReference(AssignmentHolderType assignmentHolder) {
ObjectReferenceType archetypeRef = null;
if (task.getAssignment() == null || task.getAssignment().size() == 0) {
if (assignmentHolder.getAssignment() == null || assignmentHolder.getAssignment().size() == 0) {
return archetypeRef;
}
for (AssignmentType assignment : task.getAssignment()) {
for (AssignmentType assignment : assignmentHolder.getAssignment()) {
if (StringUtils.isNotEmpty(assignment.getTargetRef().getOid())
&& assignment.getTargetRef() != null && QNameUtil.match(assignment.getTargetRef().getType(), ArchetypeType.COMPLEX_TYPE)) {
archetypeRef = assignment.getTargetRef();
Expand Down Expand Up @@ -3756,6 +3757,15 @@ public static DisplayType createDisplayType(String iconCssClass) {
return createDisplayType(iconCssClass, "", "");
}

public static DisplayType createDisplayType(ApprovalOutcomeIcon caseIcon) {
return createDisplayType(caseIcon.getIcon(), "", caseIcon.getTitle());
}

public static DisplayType createDisplayType(OperationResultStatusPresentationProperties OperationIcon) {
return createDisplayType(OperationIcon.getIcon(), "", OperationIcon.getStatusLabelKey());
}


public static DisplayType createDisplayType(String iconCssClass, String iconColor, String title) {
DisplayType displayType = new DisplayType();
IconType icon = new IconType();
Expand Down
Expand Up @@ -12,8 +12,16 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.util.*;
import com.evolveum.midpoint.util.QNameUtil;

import com.evolveum.midpoint.web.page.admin.cases.ChildCasesTabPanel;
import com.evolveum.midpoint.web.page.admin.server.dto.ApprovalOutcomeIcon;
import com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusPresentationProperties;
import com.evolveum.midpoint.wf.util.ApprovalUtils;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
Expand Down Expand Up @@ -48,10 +56,6 @@
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ApprovalContextUtil;
import com.evolveum.midpoint.schema.util.CaseTypeUtil;
import com.evolveum.midpoint.schema.util.CaseWorkItemUtil;
import com.evolveum.midpoint.schema.util.ShadowUtil;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.DateLabelComponent;
Expand All @@ -60,6 +64,8 @@
import com.evolveum.midpoint.web.util.TooltipBehavior;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

public class ColumnUtils {
private static final Trace LOGGER = TraceManager.getTrace(ColumnUtils.class);

Expand Down Expand Up @@ -793,29 +799,41 @@ public String getCssClass() {
columns.add(column);
}

column = new PropertyColumn<SelectableBean<CaseType>, String>(createStringResource("CaseType.outcome"), CaseType.F_OUTCOME.getLocalPart(), "value.outcome") {
column = new CountIconColumn<SelectableBean<CaseType>>(createStringResource("CaseType.outcome")) {

@Override
public String getCssClass() {
return isDashboard ? "col-md-1 col-sm-2" : super.getCssClass();
protected Map<DisplayType, Integer> getIconDisplayType(IModel<SelectableBean<CaseType>> rowModel) {
Map<DisplayType, Integer> map = new HashMap<>();
CaseType caseType = rowModel.getObject().getValue();
if(ObjectTypeUtil.hasArchetype(caseType, SystemObjectsType.ARCHETYPE_OPERATION_REQUEST.value())){
ObjectQuery queryFilter = pageBase.getPrismContext().queryFor(CaseType.class)
.item(CaseType.F_PARENT_REF)
.ref(caseType.getOid())
.build();
List<PrismObject<CaseType>> childs =
WebModelServiceUtils.searchObjects(CaseType.class, queryFilter, new OperationResult("search_case_child"), pageBase);

for (PrismObject<CaseType> child : childs) {
processCaseOutcome(child.asObjectable(), map, false);
}
} else {
processCaseOutcome(caseType, map, true);
}

return map;
}

@Override
public IModel<?> getDataModel(IModel<SelectableBean<CaseType>> rowModel) {
IModel<String> dataModel = (IModel<String>) super.getDataModel(rowModel);
if (StringUtils.isNotBlank(dataModel.getObject())) {
QName value = QNameUtil.uriToQName(dataModel.getObject(), true);
String key = CaseType.COMPLEX_TYPE.getLocalPart() + "." + CaseType.F_OUTCOME.getLocalPart() + "." + value.getLocalPart();
return new StringResourceModel(key, pageBase).setModel(new Model<String>()).setDefaultValue(value.getLocalPart());
}
return dataModel;
public String getCssClass() {
return "col-lg-1";
}
};
columns.add(column);

column = new PropertyColumn<SelectableBean<CaseType>, String>(createStringResource("pageCases.table.state"), CaseType.F_STATE.getLocalPart(), "value.state") {
@Override
public String getCssClass() {
return isDashboard ? "col-md-1 col-sm-2" : super.getCssClass();
return "col-lg-1";
}

@Override
Expand Down Expand Up @@ -848,13 +866,70 @@ public IModel<String> getDataModel(IModel<SelectableBean<CaseType>> rowModel) {
Integer.toString(rowModel.getObject().getValue().getWorkItem().size()) : "");
}

@Override
public String getCssClass() {
return "col-lg-1";
}

};
columns.add(column);
}

return columns;
}

private static void processCaseOutcome(CaseType caseType, Map<DisplayType, Integer> map, boolean useNullAsOne) {
if (caseType == null){
return;
}
Integer one = null;
if (!useNullAsOne) {
one = 1;
}
if(CaseTypeUtil.isApprovalCase(caseType)){
Boolean result = ApprovalUtils.approvalBooleanValueFromUri(caseType.getOutcome());
if (result == null) {
if (caseType.getCloseTimestamp() != null) {
return;
} else {
putDisplayTypeToMapWithCount(map, one, WebComponentUtil.createDisplayType(ApprovalOutcomeIcon.IN_PROGRESS));
}
} else if (result){
putDisplayTypeToMapWithCount(map, one, WebComponentUtil.createDisplayType(ApprovalOutcomeIcon.APPROVED));
} else {
putDisplayTypeToMapWithCount(map, one, WebComponentUtil.createDisplayType(ApprovalOutcomeIcon.REJECTED));
}
return;
} if(CaseTypeUtil.isManualProvisioningCase(caseType)) {

if (StringUtils.isEmpty(caseType.getOutcome())) {
if (caseType.getCloseTimestamp() != null) {
putDisplayTypeToMapWithCount(map, one, WebComponentUtil.createDisplayType(OperationResultStatusPresentationProperties.UNKNOWN));
} else {
putDisplayTypeToMapWithCount(map, one, WebComponentUtil.createDisplayType(OperationResultStatusPresentationProperties.IN_PROGRESS));
}
} else {
OperationResultStatusType result;
try {
result = OperationResultStatusType.fromValue(caseType.getOutcome());
} catch (IllegalArgumentException e) {
putDisplayTypeToMapWithCount(map, one, WebComponentUtil.createDisplayType(OperationResultStatusPresentationProperties.UNKNOWN));
return;
}
OperationResultStatusPresentationProperties resultStatus = OperationResultStatusPresentationProperties.parseOperationalResultStatus(result);
putDisplayTypeToMapWithCount(map, one, WebComponentUtil.createDisplayType(resultStatus));
}
}
}

private static void putDisplayTypeToMapWithCount(Map<DisplayType, Integer> map, Integer one, DisplayType caseDisplayType){
if (map.containsKey(caseDisplayType)) {
map.merge(caseDisplayType, 1, Integer::sum);
} else {
map.put(caseDisplayType, one);
}
}

public static AbstractColumn<SelectableBean<CaseType>, String> createCaseActorsColumn(PageBase pageBase) {
return new AbstractColumn<SelectableBean<CaseType>, String>(createStringResource("pageCases.table.actors")) {
@Override
Expand Down
@@ -0,0 +1,48 @@
/*
* Copyright (c) 2010-2018 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.web.component.data.column;

import com.evolveum.midpoint.gui.api.model.ReadOnlyModel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.DisplayType;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;

import java.util.Map;

/**
* @author skublik
*/
public abstract class CountIconColumn<T> extends AbstractColumn<T, String> {//implements IExportableColumn<T, String> {
private static final long serialVersionUID = 1L;

public CountIconColumn(IModel<String> displayModel) {
super(displayModel);
}

public CountIconColumn(IModel<String> displayModel, String sortProperty) {
super(displayModel, sortProperty);
}

@Override
public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) {
Map<DisplayType, Integer> map = getIconDisplayType(rowModel);
if (map != null) {
cellItem.add(new CountIconPanel(componentId, getIconDisplayType(rowModel)));
} else {
cellItem.add(new WebMarkupContainer(componentId));
}
}

protected abstract Map<DisplayType, Integer> getIconDisplayType(final IModel<T> rowModel);

}
@@ -0,0 +1,18 @@
<!--
~ Copyright (c) 2010-2013 Evolveum
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->

<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
<div wicket:id="icons">
<div style="display: inline-block; float: left; padding-right: 10px;" >
<i style="float: left; margin-top: 2px;" wicket:id="icon"/>
<div style="float: left;" wicket:id="count"/>
</div>
</div>
</wicket:panel>
</html>
@@ -0,0 +1,96 @@
/*
* Copyright (C) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.web.component.data.column;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.model.ReadOnlyModel;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import com.evolveum.midpoint.xml.ns._public.common.common_3.DisplayType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.IconType;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

import java.util.*;

/**
* @author skublik
*/
public class CountIconPanel extends BasePanel<List<DisplayType>> {

private static final String ID_ICONS = "icons";
private static final String ID_COUNT = "count";
private static final String ID_ICON = "icon";

private Map<DisplayType, Integer> icons;

public CountIconPanel(String id, Map<DisplayType, Integer> icons) {
super(id, new Model());
this.icons = icons;
getModel().setObject(new ArrayList<>(icons.keySet()));
}

@Override
protected void onInitialize() {
super.onInitialize();
initLayout();
}

private void initLayout() {

getModelObject().sort((d1, d2) -> {
if (d1 == null || d1.getIcon() == null || d1.getIcon().getCssClass() == null
|| d2 == null || d2.getIcon() == null || d2.getIcon().getCssClass() == null) {
return 0;
}
return d1.getIcon().getCssClass().compareTo(d2.getIcon().getCssClass());
});

ListView<DisplayType> iconsPanel = new ListView<DisplayType>(ID_ICONS, getModel()) {

private static final long serialVersionUID = 1L;

@Override
protected void populateItem(ListItem<DisplayType> item) {
Label icon = new Label(ID_ICON);
icon.add(AttributeModifier.replace("class", new PropertyModel<>(item.getModel(), "icon.cssClass")));
if (item.getModelObject() != null && item.getModelObject().getTooltip() != null) {
icon.add(AttributeModifier.replace("title", getPageBase().createStringResource(item.getModelObject().getTooltip().getOrig())));
}
icon.add(AttributeAppender.append("style",
new ReadOnlyModel<>(() -> StringUtils.isNotBlank(getColor(item.getModelObject())) ? "color: " + getColor(item.getModelObject()) + ";" : "")));
icon.setOutputMarkupId(true);
icon.add(new VisibleBehaviour(() -> item.getModelObject() != null && item.getModelObject().getIcon() != null && StringUtils.isNotEmpty(item.getModelObject().getIcon().getCssClass())));
item.add(icon);

Integer count = icons.get(item.getModelObject());
Label countPanel = new Label(ID_COUNT, Model.of(count));
item.add(countPanel);
}
};
add(iconsPanel);
}

private String getColor(DisplayType displayType) {
if (displayType == null) {
return null;
}

IconType icon = displayType.getIcon();
if (icon == null) {
return null;
}

return icon.getColor();
}
}
Expand Up @@ -41,16 +41,10 @@ public String getCssClass() {
return "icon";
}


@Override
public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) {
cellItem.add(new ImagePanel(componentId, new ReadOnlyModel<>(() -> getIconDisplayType(rowModel))));
}

protected abstract DisplayType getIconDisplayType(final IModel<T> rowModel);

// @Override
// public IModel<String> getDataModel(IModel<T> rowModel) {
// return Model.of("");
// }
}

0 comments on commit 33de01f

Please sign in to comment.