Skip to content

Commit

Permalink
WF-specific task summary panel (requester, requested, outcome). New i…
Browse files Browse the repository at this point in the history
…cons for approval outcomes.
  • Loading branch information
mederly committed Apr 6, 2016
1 parent f2f5c46 commit 9c9fc20
Show file tree
Hide file tree
Showing 21 changed files with 422 additions and 209 deletions.
Expand Up @@ -18,15 +18,17 @@

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.data.column.IconColumn;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.SimplePanel;
import com.evolveum.midpoint.web.page.admin.server.dto.ApprovalOutcomeIcon;
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;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -46,14 +48,52 @@ public DecisionsPanel(String id, IModel<List<DecisionDto>> model, UserProfileSto
}

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));
List<IColumn<DecisionDto, String>> columns = new ArrayList<>();
columns.add(new PropertyColumn<DecisionDto, String>(createStringResource("DecisionsPanel.user"), DecisionDto.F_USER));
columns.add(createOutcomeColumn());
columns.add(new PropertyColumn<DecisionDto, String>(createStringResource("DecisionsPanel.comment"), DecisionDto.F_COMMENT));
columns.add(new PropertyColumn<DecisionDto, String>(createStringResource("DecisionsPanel.when"), DecisionDto.F_TIME));

ISortableDataProvider provider = new ListDataProvider(this, getModel());
ISortableDataProvider provider = new ListDataProvider<>(this, getModel());
BoxedTablePanel decisionsTable = new BoxedTablePanel<>(ID_DECISIONS_TABLE, provider, columns, tableId, pageSize);
add(decisionsTable);
}

@NotNull
private IconColumn<DecisionDto> createOutcomeColumn() {
return new IconColumn<DecisionDto>(createStringResource("DecisionsPanel.result")) {
@Override
protected IModel<String> createIconModel(final IModel<DecisionDto> rowModel) {
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
return choose(rowModel, ApprovalOutcomeIcon.IN_PROGRESS.getIcon(), ApprovalOutcomeIcon.APPROVED.getIcon(), ApprovalOutcomeIcon.REJECTED.getIcon());
}
};
}

@Override
protected IModel<String> createTitleModel(final IModel<DecisionDto> 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<DecisionDto> rowModel, String inProgress, String approved, String rejected) {
DecisionDto dto = rowModel.getObject();
if (dto.getOutcome() == null) {
return inProgress;
} else {
return dto.getOutcome() ? approved : rejected;
}
}
};
}

}
Expand Up @@ -142,10 +142,14 @@ TaskType loadTaskType(String taskOid, 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);
options.add(SelectorOptions.create(new ItemPath(TaskType.F_WORKFLOW_CONTEXT, WfContextType.F_WORK_ITEM), GetOperationOptions.createRetrieve()));
Collection<SelectorOptions<GetOperationOptions>> options = GetOperationOptions.retrieveItemsNamed(
TaskType.F_SUBTASK,
TaskType.F_NODE_AS_OBSERVED,
TaskType.F_NEXT_RUN_START_TIMESTAMP,
new ItemPath(TaskType.F_WORKFLOW_CONTEXT, WfContextType.F_WORK_ITEM));
options.addAll(GetOperationOptions.resolveItemsNamed(
new ItemPath(TaskType.F_WORKFLOW_CONTEXT, WfContextType.F_REQUESTER_REF)
));
taskType = getModelService().getObject(TaskType.class, taskOid, options, operationTask, result).asObjectable();
result.computeStatus();
} catch (Exception ex) {
Expand Down Expand Up @@ -348,16 +352,20 @@ boolean isExecuteChanges() {
return TaskCategory.EXECUTE_CHANGES.equals(getTaskDto().getCategory());
}

boolean isWorkflow() {
boolean isWorkflowCategory() {
return TaskCategory.WORKFLOW.equals(getTaskDto().getCategory());
}

boolean isWorkflowChild() {
return isWorkflow() && getTaskDto().getWorkflowContext() != null && getTaskDto().getWorkflowContext().getProcessInstanceId() != null;
return isWorkflowCategory() && getTaskDto().getWorkflowContext() != null && getTaskDto().getWorkflowContext().getProcessInstanceId() != null;
}

boolean isWorkflowParent() {
return isWorkflow() && getTaskDto().getParentTaskOid() == null;
return isWorkflowCategory() && getTaskDto().getParentTaskOid() == null;
}

boolean isWorkflow() {
return isWorkflowChild() || isWorkflowParent(); // "task0" is not among these
}

boolean isLiveSync() {
Expand Down Expand Up @@ -432,10 +440,6 @@ public boolean configuresExecuteInRawMode() {
return isExecuteChanges();
}

public boolean displayProgress() {
return !isWorkflow();
}

public boolean isShowAdvanced() {
return showAdvancedFeaturesModel.getObject();
}
Expand Down
Expand Up @@ -20,6 +20,7 @@
<wicket:extend>
<!--<span wicket:id="summaryTagExecutionStatus"/>-->
<span wicket:id="summaryTagResult"/>
<span wicket:id="wfOutcomeTag"/>
<span wicket:id="emptyTag" style="display: block"/>
<span wicket:id="refreshTag"/>
</wicket:extend>
Expand Down
Expand Up @@ -16,18 +16,22 @@
package com.evolveum.midpoint.web.page.admin.server;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.task.api.TaskExecutionStatus;
import com.evolveum.midpoint.web.component.ObjectSummaryPanel;
import com.evolveum.midpoint.web.component.refresh.AutoRefreshDto;
import com.evolveum.midpoint.web.component.refresh.AutoRefreshPanel;
import com.evolveum.midpoint.web.component.util.SummaryTagSimple;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.server.dto.ApprovalOutcomeIcon;
import com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon;
import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoExecutionStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import org.apache.commons.lang3.time.DurationFormatUtils;
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;
Expand All @@ -45,12 +49,13 @@ public class TaskSummaryPanel extends ObjectSummaryPanel<TaskType> {

//private static final String ID_TAG_EXECUTION_STATUS = "summaryTagExecutionStatus";
private static final String ID_TAG_RESULT = "summaryTagResult";
private static final String ID_TAG_WF_OUTCOME = "wfOutcomeTag";
private static final String ID_TAG_EMPTY = "emptyTag";
private static final String ID_TAG_REFRESH = "refreshTag";

private PageTaskEdit parentPage;

public TaskSummaryPanel(String id, IModel<PrismObject<TaskType>> model, IModel<AutoRefreshDto> refreshModel, PageTaskEdit parentPage) {
public TaskSummaryPanel(String id, IModel<PrismObject<TaskType>> model, IModel<AutoRefreshDto> refreshModel, final PageTaskEdit parentPage) {
super(id, model);
this.parentPage = parentPage;

Expand Down Expand Up @@ -79,7 +84,42 @@ protected void initialize(PrismObject<TaskType> taskObject) {
};
addTag(tagResult);

addTag(new Label(ID_TAG_EMPTY, new Model("<br/>")).setEscapeModelStrings(false));
SummaryTagSimple<TaskType> tagOutcome = new SummaryTagSimple<TaskType>(ID_TAG_WF_OUTCOME, model) {
@Override
protected void initialize(PrismObject<TaskType> object) {
String icon, name;
if (parentPage.getTaskDto().getWorkflowOutcome() == null) {
// shouldn't occur!
return;
}

if (parentPage.getTaskDto().getWorkflowOutcome()) {
icon = ApprovalOutcomeIcon.APPROVED.getIcon();
name = "approved";
} else {
icon = ApprovalOutcomeIcon.REJECTED.getIcon();
name = "rejected";
}
setIconCssClass(icon);
setLabel(PageBase.createStringResourceStatic(TaskSummaryPanel.this, "TaskSummaryPanel." + name).getString());
}
};
tagOutcome.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return parentPage.getTaskDto().getWorkflowOutcome() != null;
}
});
addTag(tagOutcome);

final Component emptyTag = new Label(ID_TAG_EMPTY, new Model("<br/>")).setEscapeModelStrings(false);
emptyTag.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return parentPage.getTaskDto().getWorkflowOutcome() == null;
}
});
addTag(emptyTag);

final AutoRefreshPanel refreshTag = new AutoRefreshPanel(ID_TAG_REFRESH, refreshModel, parentPage);
refreshTag.setOutputMarkupId(true);
Expand Down Expand Up @@ -133,25 +173,26 @@ protected IModel<String> getTitleModel() {
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
if (!parentPage.displayProgress()) {
return "";
}
TaskType taskType = getModelObject().asObjectable();
String rv;
if (taskType.getExpectedTotal() != null) {
rv = createStringResource("TaskSummaryPanel.progressWithTotalKnown", taskType.getProgress(), taskType.getExpectedTotal())
.getString();
if (parentPage.isWorkflow()) {
return getString("TaskSummaryPanel.requestedBy", parentPage.getTaskDto().getRequestedBy());
} else {
rv = createStringResource("TaskSummaryPanel.progressWithTotalUnknown", taskType.getProgress()).getString();
TaskType taskType = getModelObject().asObjectable();
String rv;
if (taskType.getExpectedTotal() != null) {
rv = createStringResource("TaskSummaryPanel.progressWithTotalKnown", taskType.getProgress(), taskType.getExpectedTotal())
.getString();
} else {
rv = createStringResource("TaskSummaryPanel.progressWithTotalUnknown", taskType.getProgress()).getString();
}
if (parentPage.isSuspended()) {
rv += " " + getString("TaskSummaryPanel.progressIfSuspended");
} else if (parentPage.isClosed()) {
rv += " " + getString("TaskSummaryPanel.progressIfClosed");
} else if (parentPage.isWaiting()) {
rv += " " + getString("TaskSummaryPanel.progressIfWaiting");
}
return rv;
}
if (parentPage.isSuspended()) {
rv += " " + getString("TaskSummaryPanel.progressIfSuspended");
} else if (parentPage.isClosed()) {
rv += " " + getString("TaskSummaryPanel.progressIfClosed");
} else if (parentPage.isWaiting()) {
rv += " " + getString("TaskSummaryPanel.progressIfWaiting");
}
return rv;
}
};
}
Expand All @@ -161,12 +202,17 @@ protected IModel<String> getTitle2Model() {
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
TaskType taskType = getModelObject().asObjectable();
if (taskType.getOperationStats() != null && taskType.getOperationStats().getIterativeTaskInformation() != null &&
taskType.getOperationStats().getIterativeTaskInformation().getLastSuccessObjectName() != null) {
return createStringResource("TaskSummaryPanel.lastProcessed", taskType.getOperationStats().getIterativeTaskInformation().getLastSuccessObjectName()).getString();
if (parentPage.isWorkflow()) {
return getString("TaskSummaryPanel.requestedOn", WebComponentUtil.formatDate(parentPage.getTaskDto().getRequestedOn()));
} else {
return "";
TaskType taskType = getModelObject().asObjectable();
if (taskType.getOperationStats() != null && taskType.getOperationStats().getIterativeTaskInformation() != null &&
taskType.getOperationStats().getIterativeTaskInformation().getLastSuccessObjectName() != null) {
return createStringResource("TaskSummaryPanel.lastProcessed",
taskType.getOperationStats().getIterativeTaskInformation().getLastSuccessObjectName()).getString();
} else {
return "";
}
}
}
};
Expand All @@ -177,6 +223,10 @@ protected IModel<String> getTitle3Model() {
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
if (parentPage.isWorkflow()) {
return "";
}

TaskType taskType = getModel().getObject().asObjectable();
if (taskType == null) {
return null;
Expand Down
@@ -0,0 +1,38 @@
/*
* Copyright (c) 2010-2016 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.page.admin.server.dto;

/**
* @author mederly
*/
public enum ApprovalOutcomeIcon {

UNKNOWN("fa fa-fw fa-question fa-lg text-warning"),
APPROVED("fa fa-fw fa-check fa-lg text-success"),
REJECTED("fa fa-fw fa-times fa-lg text-danger"),
IN_PROGRESS("fa fa-fw fa-clock-o fa-lg text-info");

private String icon;

ApprovalOutcomeIcon(String icon){
this.icon = icon;
}

public String getIcon(){
return icon;
}

}

0 comments on commit 9c9fc20

Please sign in to comment.