Skip to content

Commit

Permalink
New "process instances" panel. Work in progress.
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Mar 7, 2016
1 parent 652ac55 commit b85ca12
Show file tree
Hide file tree
Showing 19 changed files with 326 additions and 382 deletions.
Expand Up @@ -406,10 +406,10 @@ private void fillInWorkflowAttributes(TaskType taskType) throws SchemaException
PrismProperty<Boolean> finished = getExtensionProperty(taskType, WfTaskExtensionItemsNames.WFPROCESS_INSTANCE_FINISHED_PROPERTY_NAME);
workflowProcessInstanceFinished = finished != null && Boolean.TRUE.equals(finished.getRealValue());

PrismProperty<String> lastDetails = getExtensionProperty(taskType, WfTaskExtensionItemsNames.WFLAST_DETAILS_PROPERTY_NAME);
if (lastDetails != null) {
workflowLastDetails = lastDetails.getRealValue();
}
// PrismProperty<String> lastDetails = getExtensionProperty(taskType, WfTaskExtensionItemsNames.WFLAST_DETAILS_PROPERTY_NAME);
// if (lastDetails != null) {
// workflowLastDetails = lastDetails.getRealValue();
// }

workflowDeltasIn = retrieveDeltasToProcess(taskType);
workflowDeltasOut = retrieveResultingDeltas(taskType);
Expand Down
Expand Up @@ -33,6 +33,7 @@
import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto;
import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDtoProvider;
import com.evolveum.midpoint.web.security.SecurityUtils;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.wf.util.ApprovalUtils;

Expand All @@ -41,6 +42,7 @@
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.ISortableDataProvider;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
Expand All @@ -54,13 +56,18 @@
import java.util.Date;
import java.util.List;

import static com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto.F_ANSWER;
import static com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto.F_END_FORMATTED;
import static com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto.F_START_FORMATTED;

/**
* @author mederly
*/
public abstract class PageProcessInstances extends PageAdminWorkItems {

public static final String ID_STOP = "stop";
public static final String ID_BACK = "back";
public static final String ID_PROCESS_INSTANCES_TABLE = "processInstancesTable";

boolean requestedBy; // true if we want to show process instances requested BY a user
boolean requestedFor; // true if we want to show instances requested FOR a user
Expand All @@ -79,78 +86,15 @@ private void initLayout() {
Form mainForm = new Form("mainForm");
add(mainForm);

List<IColumn<ProcessInstanceDto, String>> columns = initColumns();
TablePanel<ProcessInstanceDto> table = new TablePanel<ProcessInstanceDto>("processInstancesTable", new ProcessInstanceDtoProvider(PageProcessInstances.this, requestedBy, requestedFor, false), columns);
table.setOutputMarkupId(true);
mainForm.add(table);
ISortableDataProvider<ProcessInstanceDto, String> provider = new ProcessInstanceDtoProvider(PageProcessInstances.this, requestedBy, requestedFor);
WorkflowRequestsPanel panel = new WorkflowRequestsPanel(ID_PROCESS_INSTANCES_TABLE, provider,
UserProfileStorage.TableId.PAGE_WORKFLOW_REQUESTS, getItemsPerPage(UserProfileStorage.TableId.PAGE_WORKFLOW_REQUESTS));
panel.setOutputMarkupId(true);
mainForm.add(panel);

initItemButtons(mainForm);
}

private List<IColumn<ProcessInstanceDto, String>> initColumns() {
List<IColumn<ProcessInstanceDto, String>> columns = new ArrayList<IColumn<ProcessInstanceDto, String>>();

IColumn column = new CheckBoxHeaderColumn<>();
columns.add(column);

column = new LinkColumn<ProcessInstanceDto>(createStringResource("pageProcessInstances.item.name"), ProcessInstanceDto.F_NAME) {

@Override
public void onClick(AjaxRequestTarget target, IModel<ProcessInstanceDto> rowModel) {
ProcessInstanceDto piDto = rowModel.getObject();
itemDetailsPerformed(target, piDto.getTaskOid());
}
};
columns.add(column);

columns.add(new PropertyColumn<ProcessInstanceDto, String>(createStringResource("pageProcessInstances.item.started"), ProcessInstanceDto.F_START_FORMATTED));

// columns.add(new AbstractColumn<ProcessInstanceDto, String>(createStringResource("pageProcessInstances.item.finished")) {
//
// @Override
// public void populateItem(Item<ICellPopulator<ProcessInstanceDto>> item, String componentId,
// final IModel<ProcessInstanceDto> rowModel) {
// item.add(new Label(componentId, new AbstractReadOnlyModel<Object>() {
//
// @Override
// public Object getObject() {
// ProcessInstanceDto pi = rowModel.getObject();
// Date finished = XmlTypeConverter.toDate(pi.getProcessInstance().getEndTimestamp());
// if (finished == null) {
// return getString("pageProcessInstances.notYet");
// } else {
// return WebComponentUtil.formatDate(finished);
// }
// }
// }));
// }
// });
//
// columns.add(new AbstractColumn<ProcessInstanceDto, String>(createStringResource("pageProcessInstances.item.result")) {
//
// @Override
// public void populateItem(Item<ICellPopulator<ProcessInstanceDto>> item, String componentId,
// final IModel<ProcessInstanceDto> rowModel) {
// item.add(new Label(componentId, new AbstractReadOnlyModel<Object>() {
//
// @Override
// public Object getObject() {
// ProcessInstanceDto pi = rowModel.getObject();
// Boolean result = ApprovalUtils.approvalBooleanValue(pi.getAnswer());
// if (result == null) {
// return "";
// } else {
// return result ? "APPROVED" : "REJECTED"; // todo i18n
// }
// }
// }));
// }
// });

return columns;
}


private void initItemButtons(Form mainForm) {

AjaxButton stop = new AjaxButton(ID_STOP, createStringResource("pageProcessInstances.button.stop")) {
Expand Down
@@ -0,0 +1,147 @@
package com.evolveum.midpoint.web.page.admin.workflow;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.web.component.data.TablePanel;
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.IconColumn;
import com.evolveum.midpoint.web.component.data.column.LinkColumn;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.SimplePanel;
import com.evolveum.midpoint.web.page.admin.resources.dto.ResourceController;
import com.evolveum.midpoint.web.page.admin.resources.dto.ResourceDto;
import com.evolveum.midpoint.web.page.admin.resources.dto.ResourceState;
import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit;
import com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon;
import com.evolveum.midpoint.web.page.admin.workflow.PageProcessInstance;
import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto;
import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDtoProvider;
import com.evolveum.midpoint.web.page.admin.workflow.dto.WorkItemNewDto;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.wf.util.ApprovalUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType;
import org.apache.commons.lang.time.DurationFormatUtils;
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.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
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.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon.FATAL_ERROR;
import static com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon.IN_PROGRESS;
import static com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon.SUCCESS;
import static com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto.*;

/**
* @author Kate
* @author mederly
*/

public class WorkflowRequestsPanel extends BasePanel {

private static final String ID_REQUESTS_TABLE = "requestsTable";

private ISortableDataProvider<ProcessInstanceDto, String> provider;

public WorkflowRequestsPanel(String id, ISortableDataProvider<ProcessInstanceDto, String> provider,
UserProfileStorage.TableId tableId, long pageSize) {
super(id);
this.provider = provider;
initLayout(tableId, pageSize);
}

private void initLayout(UserProfileStorage.TableId tableId, long pageSize) {
TablePanel<ProcessInstanceDto> table = new TablePanel<>(ID_REQUESTS_TABLE, provider, initColumns(), tableId, pageSize);
table.setOutputMarkupId(true);
add(table);
}

private List<IColumn<ProcessInstanceDto, String>> initColumns() {

List<IColumn<ProcessInstanceDto, String>> columns = new ArrayList<IColumn<ProcessInstanceDto, String>>();

IColumn column = new CheckBoxHeaderColumn<>();
columns.add(column);

columns.add(new PropertyColumn<ProcessInstanceDto, String>(createStringResource("pageProcessInstances.item.object"), F_OBJECT_NAME));
columns.add(new PropertyColumn<ProcessInstanceDto, String>(createStringResource("pageProcessInstances.item.target"), F_TARGET_NAME));

if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_WORK_ITEMS_ALL_URL,
AuthorizationConstants.AUTZ_UI_WORK_ITEMS_PROCESS_INSTANCE_URL)) {
columns.add(new LinkColumn<ProcessInstanceDto>(createStringResource("MyRequestsPanel.name"), "name") {
@Override
public void onClick(AjaxRequestTarget target, IModel<ProcessInstanceDto> rowModel) {
ProcessInstanceDto piDto = rowModel.getObject();
itemDetailsPerformed(target, piDto.getTaskOid());
}
});
} else {
columns.add(new PropertyColumn<ProcessInstanceDto, String>(createStringResource("MyRequestsPanel.name"), F_NAME));
}

columns.add(new PropertyColumn<ProcessInstanceDto, String>(createStringResource("pageProcessInstances.item.state"), F_STATE));

columns.add(new PropertyColumn<ProcessInstanceDto, String>(createStringResource("pageProcessInstances.item.started"), F_START_FORMATTED));

columns.add(new IconColumn<ProcessInstanceDto>(createStringResource("pageProcessInstances.item.result")) {
@Override
protected IModel<String> createIconModel(final IModel<ProcessInstanceDto> rowModel) {
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
return choose(rowModel, IN_PROGRESS.getIcon(), SUCCESS.getIcon(), FATAL_ERROR.getIcon());
}
};
}

@Override
protected IModel<String> createTitleModel(final IModel<ProcessInstanceDto> rowModel) {
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
return choose(rowModel,
createStringResource("MyRequestsPanel.inProgress").getString(),
createStringResource("MyRequestsPanel.approved").getString(),
createStringResource("MyRequestsPanel.rejected").getString());
}
};
}

private String choose(IModel<ProcessInstanceDto> rowModel, String inProgress, String approved, String rejected) {
ProcessInstanceDto dto = rowModel.getObject();
Boolean result = ApprovalUtils.approvalBooleanValue(dto.getAnswer());
if (result == null) {
return inProgress;
} else {
return result ? approved : rejected;
}
}
});

columns.add(new PropertyColumn<ProcessInstanceDto, String>(createStringResource("pageProcessInstances.item.finished"), F_END_FORMATTED));

return columns;
}



private void itemDetailsPerformed(AjaxRequestTarget target, String pid) {
PageParameters parameters = new PageParameters();
parameters.add(OnePageParameterEncoder.PARAMETER, pid);
setResponsePage(new PageTaskEdit(parameters, this.getPageBase()));
}
}
Expand Up @@ -20,21 +20,33 @@
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.web.component.util.Selectable;
import com.evolveum.midpoint.wf.util.ApprovalUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import org.apache.commons.lang.Validate;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;

import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Date;

import static com.evolveum.midpoint.gui.api.util.WebComponentUtil.formatDate;
import static com.evolveum.midpoint.prism.xml.XmlTypeConverter.*;

/**
* @author mederly
*/
public class ProcessInstanceDto extends Selectable {

public static final String F_SHADOW_TASK = "shadowTask";
public static final String F_OBJECT_NAME = "objectName";
public static final String F_TARGET_NAME = "targetName";
public static final String F_SHADOW_TASK = "shadowTask"; // DELETE THIS!
public static final String F_NAME = "name";
public static final String F_START_FORMATTED = "startFormatted";
public static final String F_END_FORMATTED = "endFormatted";
public static final String F_STATE = "state";
public static final String F_ANSWER = "answer";

private TaskType task;

Expand All @@ -48,15 +60,39 @@ public XMLGregorianCalendar getStartTimestamp() {
return task.getWorkflowContext().getStartTimestamp();
}

public XMLGregorianCalendar getEndTimestamp() {
return task.getWorkflowContext().getEndTimestamp();
}

public String getStartFormatted() {
Date started = XmlTypeConverter.toDate(getStartTimestamp());
return WebComponentUtil.formatDate(started);
Date started = toDate(getStartTimestamp());
return formatDate(started);
}

public String getEndFormatted() {
return formatDate(toDate(getEndTimestamp()));
}

public String getName() {
return PolyString.getOrig(task.getName());
}

public String getAnswer() {
return task.getWorkflowContext().getAnswer();
}

public String getObjectName() {
return WebComponentUtil.getName(task.getWorkflowContext().getObjectRef());
}

public String getTargetName() {
return WebComponentUtil.getName(task.getWorkflowContext().getTargetRef());
}

public String getState() {
return task.getWorkflowContext().getState();
}

// public List<WorkItemDto> getWorkItems() {
// List<WorkItemDto> retval = new ArrayList<WorkItemDto>();
// if (processInstance.getWorkItems() != null) {
Expand Down
Expand Up @@ -46,6 +46,7 @@
import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_WORKFLOW_CONTEXT;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_PROCESS_INSTANCE_ID;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_REQUESTER_REF;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_START_TIMESTAMP;

/**
* @author lazyman
Expand All @@ -64,8 +65,7 @@ public class ProcessInstanceDtoProvider extends BaseSortableDataProvider<Process
* - false = we are interested in process instances REQUESTED FOR a user (e.g. the user is to be granted a role)
*/

boolean requestedBy;
private boolean finished;
private boolean requestedBy;
private boolean requestedFor;

public static String currentUser() {
Expand All @@ -77,12 +77,10 @@ public static String currentUser() {
return principal.getOid();
}

public ProcessInstanceDtoProvider(Component component, boolean requestedBy, boolean requestedFor, boolean finished) {
public ProcessInstanceDtoProvider(Component component, boolean requestedBy, boolean requestedFor) {
super(component);
LOGGER.trace("requestedBy = " + requestedBy + ", requestedFor = " + requestedFor + ", finished = " + finished);
this.requestedBy = requestedBy;
this.requestedFor = requestedFor;
this.finished = finished;
}

@Override
Expand Down Expand Up @@ -141,6 +139,7 @@ private ObjectQuery getObjectQuery() throws SchemaException {
}
return q
.not().item(F_WORKFLOW_CONTEXT, F_PROCESS_INSTANCE_ID).isNull()
.desc(F_WORKFLOW_CONTEXT, F_START_TIMESTAMP)
.build();
}

Expand Down

0 comments on commit b85ca12

Please sign in to comment.