Skip to content

Commit

Permalink
New tabs on Task page: Subtasks, Progress, States/Actions, Performanc…
Browse files Browse the repository at this point in the history
…e, Approvals, Operation context, Result.
  • Loading branch information
mederly committed Mar 30, 2016
1 parent 9fda82b commit 1a5e6ce
Show file tree
Hide file tree
Showing 42 changed files with 1,218 additions and 226 deletions.
Expand Up @@ -322,7 +322,7 @@ protected WorkflowService getWorkflowService() {
return workflowService;
}

protected WorkflowManager getWorkflowManager() {
public WorkflowManager getWorkflowManager() {
return workflowManager;
}

Expand Down
Expand Up @@ -19,11 +19,11 @@
<wicket:panel>

<wicket:message key="ModelOperationStatusPanel.label.state"/> <b><span wicket:id="state"></span></b>
<!--<br/>-->
<!--<wicket:message key="ModelOperationStatusPanel.label.focusName"/> <b><span wicket:id="focusName" /></b>-->
<!--<wicket:message key="ModelOperationStatusPanel.label.focusType"/> <span wicket:id="focusType" />-->
<br/>
<wicket:message key="ModelOperationStatusPanel.label.focusName"/> <b><span wicket:id="focusName" /></b>
<wicket:message key="ModelOperationStatusPanel.label.focusType"/> <span wicket:id="focusType" />
<br/>
<h3><wicket:message key="ModelOperationStatusPanel.label.primaryDelta"/></h3>
<!--<h3><wicket:message key="ModelOperationStatusPanel.label.primaryDelta"/></h3>-->
<span wicket:id="primaryDelta" />
<br/>

Expand Down
Expand Up @@ -46,8 +46,8 @@ public ModelOperationStatusPanel(String id, IModel<ModelOperationStatusDto> mode
protected void initLayout() {

add(new Label(ID_STATE, new StringResourceModel("ModelOperationStatusPanel.state.${}", new PropertyModel<ModelState>(getModel(), ModelOperationStatusDto.F_STATE))));
add(new Label(ID_FOCUS_TYPE, new PropertyModel<String>(getModel(), ModelOperationStatusDto.F_FOCUS_TYPE)));
add(new Label(ID_FOCUS_NAME, new PropertyModel<String>(getModel(), ModelOperationStatusDto.F_FOCUS_NAME)));
// add(new Label(ID_FOCUS_TYPE, new PropertyModel<String>(getModel(), ModelOperationStatusDto.F_FOCUS_TYPE)));
// add(new Label(ID_FOCUS_NAME, new PropertyModel<String>(getModel(), ModelOperationStatusDto.F_FOCUS_NAME)));


ScenePanel deltaPanel = new ScenePanel(ID_PRIMARY_DELTA, new PropertyModel<SceneDto>(getModel(), ModelOperationStatusDto.F_PRIMARY_DELTA));
Expand Down
Expand Up @@ -40,13 +40,15 @@ public static Scene visualizeObjectTreeDeltas(ObjectTreeDeltasType deltas, Strin
PrismContext prismContext, ModelInteractionService modelInteractionService,
Task task, OperationResult result) throws SchemaException {
List<Scene> scenes = new ArrayList<>();
if (deltas.getFocusPrimaryDelta() != null) {
ObjectDelta<? extends ObjectType> delta = DeltaConvertor.createObjectDelta(deltas.getFocusPrimaryDelta(), prismContext);
scenes.add(modelInteractionService.visualizeDelta(delta, task, result));
}
for (ProjectionObjectDeltaType projectionObjectDelta : deltas.getProjectionPrimaryDelta()) {
ObjectDelta<? extends ObjectType> delta = DeltaConvertor.createObjectDelta(projectionObjectDelta.getPrimaryDelta(), prismContext);
scenes.add(modelInteractionService.visualizeDelta(delta, task, result));
if (deltas != null) {
if (deltas.getFocusPrimaryDelta() != null) {
ObjectDelta<? extends ObjectType> delta = DeltaConvertor.createObjectDelta(deltas.getFocusPrimaryDelta(), prismContext);
scenes.add(modelInteractionService.visualizeDelta(delta, task, result));
}
for (ProjectionObjectDeltaType projectionObjectDelta : deltas.getProjectionPrimaryDelta()) {
ObjectDelta<? extends ObjectType> delta = DeltaConvertor.createObjectDelta(projectionObjectDelta.getPrimaryDelta(), prismContext);
scenes.add(modelInteractionService.visualizeDelta(delta, task, result));
}
}
return new WrapperScene(scenes, displayNameKey);
}
Expand Down
Expand Up @@ -16,10 +16,13 @@

package com.evolveum.midpoint.web.component.wf;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.web.component.data.BoxedTablePanel;
import com.evolveum.midpoint.web.component.data.TablePanel;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.SimplePanel;
import com.evolveum.midpoint.web.page.admin.workflow.dto.DecisionDto;
import com.evolveum.midpoint.web.session.UserProfileStorage;
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;
Expand All @@ -32,25 +35,25 @@
* @author lazyman
* @author mederly
*/
public class DecisionsPanel extends SimplePanel<List<DecisionDto>> {
public class DecisionsPanel extends BasePanel<List<DecisionDto>> {

private static final String ID_DECISIONS_TABLE = "decisionsTable";

// todo options to select which columns will be shown
public DecisionsPanel(String id, IModel<List<DecisionDto>> model) {
public DecisionsPanel(String id, IModel<List<DecisionDto>> model, UserProfileStorage.TableId tableId, int pageSize) {
super(id, model);
initLayout(tableId, pageSize);
}

@Override
protected void initLayout() {
protected void initLayout(UserProfileStorage.TableId tableId, int pageSize) {
List<IColumn<DecisionDto, String>> columns = new ArrayList<IColumn<DecisionDto, String>>();
columns.add(new PropertyColumn(createStringResource("DecisionsPanel.user"), DecisionDto.F_USER));
columns.add(new PropertyColumn(createStringResource("DecisionsPanel.result"), DecisionDto.F_RESULT));
columns.add(new PropertyColumn(createStringResource("DecisionsPanel.comment"), DecisionDto.F_COMMENT));
columns.add(new PropertyColumn(createStringResource("DecisionsPanel.when"), DecisionDto.F_TIME));

ISortableDataProvider provider = new ListDataProvider(this, getModel());
TablePanel decisionsTable = new TablePanel<>(ID_DECISIONS_TABLE, provider, columns);
BoxedTablePanel decisionsTable = new BoxedTablePanel<>(ID_DECISIONS_TABLE, provider, columns, tableId, pageSize);
add(decisionsTable);
}
}
Expand Up @@ -45,12 +45,15 @@
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.jetbrains.annotations.NotNull;

import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;

import static com.evolveum.midpoint.gui.api.util.WebComponentUtil.dispatchToObjectDetailsPage;
import static com.evolveum.midpoint.web.component.wf.WorkItemsTablePanel.View.FULL_LIST;
import static com.evolveum.midpoint.web.component.wf.WorkItemsTablePanel.View.ITEMS_FOR_PROCESS;

/**
* @author lazyman
Expand All @@ -60,63 +63,81 @@ public class WorkItemsTablePanel extends BasePanel {

private static final String ID_WORK_ITEMS_TABLE = "workItemsTable";

public enum View {
FULL_LIST, // selectable, full information
INFO_ONLY, // not selectable (e.g. on dashboard)
ITEMS_FOR_PROCESS // work items for a process
};

private ISortableDataProvider<WorkItemDto, String> provider;

public WorkItemsTablePanel(String id, ISortableDataProvider<WorkItemDto, String> provider,
UserProfileStorage.TableId tableId, int pageSize, boolean showAssigned) {
UserProfileStorage.TableId tableId, int pageSize, View view) {
super(id);
this.provider = provider;
initLayout(tableId, pageSize, showAssigned);
initLayout(tableId, pageSize, view);
}

// this is called locally in order to take showAssigned into account
private void initLayout(UserProfileStorage.TableId tableId, int pageSize, boolean showAssigned) {
private void initLayout(UserProfileStorage.TableId tableId, int pageSize, View view) {
List<IColumn<WorkItemDto, String>> columns = new ArrayList<>();

// TODO configurable
columns.add(new CheckBoxHeaderColumn<WorkItemDto>());

columns.add(createTypeIconColumn(true));
columns.add(createObjectNameColumn("WorkItemsPanel.object"));
columns.add(createTypeIconColumn(false));
columns.add(createTargetNameColumn("WorkItemsPanel.target"));

if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_WORK_ITEMS_ALL_URL,
AuthorizationConstants.AUTZ_UI_WORK_ITEM_URL)) {
columns.add(new LinkColumn<WorkItemDto>(createStringResource("WorkItemsPanel.name"), WorkItemDto.F_NAME, WorkItemDto.F_NAME) {
@Override
public void onClick(AjaxRequestTarget target, IModel<WorkItemDto> rowModel) {
PageParameters parameters = new PageParameters();
parameters.add(OnePageParameterEncoder.PARAMETER, rowModel.getObject().getWorkItemId());
setResponsePage(new PageWorkItem(parameters, (PageBase) WorkItemsTablePanel.this.getPage()));
}
});
} else {
columns.add(new AbstractColumn<WorkItemDto, String>(createStringResource("WorkItemsPanel.name")) {
@Override
public void populateItem(Item<ICellPopulator<WorkItemDto>> item, String componentId,
final IModel<WorkItemDto> rowModel) {
item.add(new Label(componentId, new AbstractReadOnlyModel<Object>() {
@Override
public Object getObject() {
return rowModel.getObject().getName();
}
}));
}
});
}

columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.started"), WorkItemDto.F_PROCESS_STARTED));
columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.created"), WorkItemDto.F_CREATED));
if (showAssigned) {
columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.assigned"), WorkItemDto.F_ASSIGNEE_OR_CANDIDATES));
}
if (view != ITEMS_FOR_PROCESS) {
if (view == FULL_LIST) {
columns.add(new CheckBoxHeaderColumn<WorkItemDto>());
}
columns.add(createTypeIconColumn(true));
columns.add(createObjectNameColumn("WorkItemsPanel.object"));
columns.add(createTypeIconColumn(false));
columns.add(createTargetNameColumn("WorkItemsPanel.target"));
columns.add(createNameColumn());
columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.started"), WorkItemDto.F_PROCESS_STARTED));
columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.created"), WorkItemDto.F_CREATED));
if (view == FULL_LIST) {
columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.assigned"), WorkItemDto.F_ASSIGNEE_OR_CANDIDATES));
}
} else {
columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.assigned"), WorkItemDto.F_ASSIGNEE_OR_CANDIDATES));
columns.add(createNameColumn());
columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.created"), WorkItemDto.F_CREATED));
}

BoxedTablePanel<WorkItemDto> workItemsTable = new BoxedTablePanel<>(ID_WORK_ITEMS_TABLE, provider, columns, tableId, pageSize);
add(workItemsTable);
}

private BoxedTablePanel getWorkItemTable() {
@NotNull
private AbstractColumn<WorkItemDto, String> createNameColumn() {
AbstractColumn<WorkItemDto, String> nameColumn;
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_WORK_ITEMS_ALL_URL,
AuthorizationConstants.AUTZ_UI_WORK_ITEM_URL)) {
nameColumn = new LinkColumn<WorkItemDto>(createStringResource("WorkItemsPanel.name"), WorkItemDto.F_NAME,
WorkItemDto.F_NAME) {
@Override
public void onClick(AjaxRequestTarget target, IModel<WorkItemDto> rowModel) {
PageParameters parameters = new PageParameters();
parameters.add(OnePageParameterEncoder.PARAMETER, rowModel.getObject().getWorkItemId());
setResponsePage(new PageWorkItem(parameters, (PageBase) WorkItemsTablePanel.this.getPage()));
}
};
} else {
nameColumn = new AbstractColumn<WorkItemDto, String>(createStringResource("WorkItemsPanel.name")) {
@Override
public void populateItem(Item<ICellPopulator<WorkItemDto>> item, String componentId,
final IModel<WorkItemDto> rowModel) {
item.add(new Label(componentId, new AbstractReadOnlyModel<Object>() {
@Override
public Object getObject() {
return rowModel.getObject().getName();
}
}));
}
};
}
return nameColumn;
}

private BoxedTablePanel getWorkItemTable() {
return (BoxedTablePanel) get(ID_WORK_ITEMS_TABLE);
}

Expand Down
Expand Up @@ -21,6 +21,7 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.wf.DecisionsPanel;
import com.evolveum.midpoint.web.page.admin.workflow.dto.DecisionDto;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.DecisionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ItemApprovalProcessStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType;
Expand All @@ -39,12 +40,12 @@ public class ItemApprovalHistoryPanel extends BasePanel<WfContextType> {

private static final String ID_DECISIONS_DONE = "decisionsDone";

public ItemApprovalHistoryPanel(String id, IModel<WfContextType> model) {
public ItemApprovalHistoryPanel(String id, IModel<WfContextType> model, UserProfileStorage.TableId tableId, int pageSize) {
super(id, model);
initLayout();
initLayout(tableId, pageSize);
}

private void initLayout() {
private void initLayout(UserProfileStorage.TableId tableId, int pageSize) {

add(new DecisionsPanel(ID_DECISIONS_DONE, new AbstractReadOnlyModel<List<DecisionDto>>() {
@Override
Expand All @@ -64,7 +65,7 @@ public List<DecisionDto> getObject() {
}
return rv;
}
}));
}, tableId, pageSize));

}
}
Expand Up @@ -18,6 +18,7 @@

import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand All @@ -39,6 +40,7 @@
import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoProviderOptions;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;
Expand Down Expand Up @@ -110,7 +112,10 @@ private TaskType loadTaskType(Task operationTask, OperationResult result) {
TaskType taskType = null;

try {
Collection<SelectorOptions<GetOperationOptions>> options = GetOperationOptions.createRetrieveAttributesOptions(TaskType.F_SUBTASK, TaskType.F_NODE_AS_OBSERVED, TaskType.F_NEXT_RUN_START_TIMESTAMP);
Collection<SelectorOptions<GetOperationOptions>> options =
GetOperationOptions.createRetrieveAttributesOptions(
TaskType.F_SUBTASK, TaskType.F_NODE_AS_OBSERVED, TaskType.F_NEXT_RUN_START_TIMESTAMP);
options.add(SelectorOptions.create(new ItemPath(TaskType.F_WORKFLOW_CONTEXT, WfContextType.F_WORK_ITEM), GetOperationOptions.createRetrieve()));
taskType = getModelService().getObject(TaskType.class, taskOid.toString(), options, operationTask, result).asObjectable();
result.computeStatus();
} catch (Exception ex) {
Expand Down
Expand Up @@ -18,22 +18,17 @@
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<div class="box box-success">
<div class="box-body no-padding">
<table class="table table-striped">
<tr>
<td><wicket:message key="pageTaskEdit.recurring"/></td>
<td>
<div class="col-md-6">
<div wicket:id="recurrence"/>
</div>
</td>
</tr>
</table>
</div>
</div>
</wicket:panel>
<wicket:panel>
<h3><wicket:message key="workItemPanel.changesToBeApproved"/></h3>
<div wicket:id="deltasToBeApproved" />

<h3><wicket:message key="workItemPanel.approvalHistory"/></h3>
<div wicket:id="history" />

<h3><wicket:message key="ItemApprovalPanel.currentWorkItems"/></h3>
<div wicket:id="currentWorkItems" />

</wicket:panel>
</body>
</html>

0 comments on commit 1a5e6ce

Please sign in to comment.