Skip to content

Commit

Permalink
support sorting for operation result table (MID-7154)
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Sep 17, 2021
1 parent 95e2a3a commit b1e5670
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,26 @@
*/
package com.evolveum.midpoint.gui.impl.page.admin.task.component;

import java.util.*;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
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.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
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.component.result.OpResult;
import com.evolveum.midpoint.gui.api.component.result.OperationResultPanel;
import com.evolveum.midpoint.gui.api.model.ReadOnlyModel;
import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.page.admin.AbstractObjectMainPanel;
import com.evolveum.midpoint.gui.impl.page.admin.ObjectDetailsModels;
import com.evolveum.midpoint.gui.impl.page.admin.task.TaskDetailsModel;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand All @@ -32,20 +44,6 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationTypeType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
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.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
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.*;

/**
* @author semancik
*/
Expand All @@ -67,19 +65,19 @@ public TaskResultPanel(String id, TaskDetailsModel taskWrapperModel, ContainerPa

protected void initLayout() {

IModel<List<OperationResult>> resultModel= new ReadOnlyModel<>(() -> createOperationResultList());
IModel<List<OperationResult>> resultModel= new ReadOnlyModel<>(this::createOperationResultList);

SelectableListDataProvider<SelectableBean<OperationResult>, OperationResult> provider = new SelectableListDataProvider<>(this, resultModel);
BoxedTablePanel<SelectableBean<OperationResult>> resultTablePanel = new BoxedTablePanel<>(ID_OPERATION_RESULT, provider, initResultColumns());
resultTablePanel.setOutputMarkupId(true);
add(resultTablePanel);

AjaxFallbackLink<Void> showResult = new AjaxFallbackLink<Void>(ID_SHOW_RESULT) {
AjaxFallbackLink<Void> showResult = new AjaxFallbackLink<>(ID_SHOW_RESULT) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(Optional<AjaxRequestTarget> optionalTarget) {
if (!optionalTarget.isPresent()) {
if (optionalTarget.isEmpty()) {
LOGGER.warn("Cannot show result in interactive way, request target not present.");
return;
}
Expand All @@ -94,7 +92,6 @@ public void onClick(Optional<AjaxRequestTarget> optionalTarget) {
getPageBase().showMainPopup(body, target);
}


};
showResult.setOutputMarkupId(true);
add(showResult);
Expand All @@ -121,15 +118,15 @@ private List<OperationResult> createOperationResultList() {

private List<IColumn<SelectableBean<OperationResult>, String>> initResultColumns() {
List<IColumn<SelectableBean<OperationResult>, String>> columns = new ArrayList<>();
columns.add(new PropertyColumn<>(createStringResource("pageTaskEdit.opResult.token"), createPropertyExpression("token")));
columns.add(new PropertyColumn<>(createStringResource("pageTaskEdit.opResult.operation"), createPropertyExpression("operation")));
columns.add(new PropertyColumn<>(createStringResource("pageTaskEdit.opResult.status"), createPropertyExpression("status")));
columns.add(new AbstractColumn<SelectableBean<OperationResult>, String>(createStringResource("pageTaskEdit.opResult.timestamp")){
columns.add(new PropertyColumn<>(createStringResource("pageTaskEdit.opResult.token"), OperationResultType.F_TOKEN.getLocalPart(), createPropertyExpression("token")));
columns.add(new PropertyColumn<>(createStringResource("pageTaskEdit.opResult.operation"), OperationResultType.F_OPERATION.getLocalPart(), createPropertyExpression("operation")));
columns.add(new PropertyColumn<>(createStringResource("pageTaskEdit.opResult.status"), OperationResultType.F_STATUS.getLocalPart(), createPropertyExpression("status")));
columns.add(new AbstractColumn<>(createStringResource("pageTaskEdit.opResult.timestamp"), OperationResultType.F_END.getLocalPart()) {
private static final long serialVersionUID = 1L;

@Override
public void populateItem(Item<ICellPopulator<SelectableBean<OperationResult>>> cellItem, String componentId,
IModel<SelectableBean<OperationResult>> rowModel) {
IModel<SelectableBean<OperationResult>> rowModel) {
Label label = new Label(componentId, (IModel<String>) () -> {
Long resultEndTime = rowModel.getObject().getValue().getEnd();
return resultEndTime != null && resultEndTime > 0 ?
Expand All @@ -138,7 +135,7 @@ public void populateItem(Item<ICellPopulator<SelectableBean<OperationResult>>> c
cellItem.add(label);
}
});
columns.add(new AbstractColumn<SelectableBean<OperationResult>, String>(createStringResource("pageTaskEdit.opResult.message"), createPropertyExpression("message")) {
columns.add(new AbstractColumn<>(createStringResource("pageTaskEdit.opResult.message"), OperationResultType.F_MESSAGE.getLocalPart()) {
private static final long serialVersionUID = 1L;

@Override
Expand All @@ -149,7 +146,6 @@ public void populateItem(Item<ICellPopulator<SelectableBean<OperationResult>>> c
cellItem.add(label);
}
});
//columns.add(new PropertyColumn(createStringResource("pageTaskEdit.opResult.message"), "message"));
return columns;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.Iterator;
import java.util.List;

import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.web.component.data.ISelectableDataProvider;

import org.apache.commons.beanutils.PropertyUtils;
Expand All @@ -29,6 +30,7 @@

import org.apache.wicket.model.Model;
import org.jetbrains.annotations.NotNull;
import org.opensaml.xmlsec.signature.P;

/**
* @author lazyman
Expand Down Expand Up @@ -56,6 +58,8 @@ public Iterator<W> internalIterator(long first, long count) {
getAvailableData().clear();

List<T> list = model.getObject();
sort(list);

if (list != null) {
for (long i = first; i < first + count; i++) {
if (i < 0 || i >= list.size()) {
Expand All @@ -69,6 +73,32 @@ public Iterator<W> internalIterator(long first, long count) {
return getAvailableData().iterator();
}

//TODO clenaup, coppied from MultivalueCOntainerListDataProvider
@SuppressWarnings("unchecked")
protected <V extends Comparable<V>> void sort(List<T> list) {
if (getSort() == null) {
return;
}

list.sort((o1, o2) -> {
SortParam<String> sortParam = getSort();
String propertyName = sortParam.getProperty();
V prop1 = getPropertyValue(o1, propertyName);
V prop2 = getPropertyValue(o2, propertyName);

int comparison = ObjectUtils.compare(prop1, prop2, true);
return sortParam.isAscending() ? comparison : -comparison;
});
}

private <V extends Comparable<V>> V getPropertyValue(T o1, String propertyName) {
try {
return (V) PropertyUtils.getProperty(o1, propertyName);
} catch (RuntimeException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
return null;
}
}

protected W createObjectWrapper(T object) {
return (W) new SelectableBeanImpl<>(object);
}
Expand Down

0 comments on commit b1e5670

Please sign in to comment.