package com.constellio.app.modules.tasks.ui.pages.workflowInstance;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.joda.time.LocalDate;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.app.modules.tasks.model.wrappers.TaskStatusType;
import com.constellio.app.modules.tasks.ui.entities.WorkflowInstanceVO;
import com.constellio.app.modules.tasks.ui.entities.WorkflowTaskProgressionVO;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.framework.components.RecordDisplay;
import com.constellio.app.ui.framework.components.converters.EnumWithSmallCodeToCaptionConverter;
import com.constellio.app.ui.framework.components.converters.JodaDateToStringConverter;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.app.ui.pages.base.NoDragAndDrop;
import com.vaadin.data.Item;
import com.vaadin.data.util.HierarchicalContainer;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.CellStyleGenerator;
import com.vaadin.ui.Table.TableDragMode;
import com.vaadin.ui.TreeTable;
import com.vaadin.ui.VerticalLayout;
public class DisplayWorkflowInstanceViewImpl extends BaseViewImpl implements DisplayWorkflowInstanceView, NoDragAndDrop {
private WorkflowInstanceVO workflowInstanceVO;
private List<WorkflowTaskProgressionVO> workflowTaskProgressionVOs = new ArrayList<>();
private VerticalLayout mainLayout;
private RecordDisplay workflowInstanceDisplay;
private TreeTable workflowTaskVOTable;
private DisplayWorkflowInstancePresenter presenter;
private JodaDateToStringConverter jodaDateToStringConverter = new JodaDateToStringConverter();
private EnumWithSmallCodeToCaptionConverter taskStatusToCaptionConverter = new EnumWithSmallCodeToCaptionConverter(
TaskStatusType.class);
public DisplayWorkflowInstanceViewImpl() {
presenter = new DisplayWorkflowInstancePresenter(this);
}
@Override
protected void initBeforeCreateComponents(ViewChangeEvent event) {
presenter.forParams(event.getParameters());
}
@Override
public void setWorkflowInstanceVO(WorkflowInstanceVO workflowInstanceVO) {
this.workflowInstanceVO = workflowInstanceVO;
}
@Override
public void setWorkflowTaskProgressionVOs(List<WorkflowTaskProgressionVO> workflowTaskProgressionVOs) {
this.workflowTaskProgressionVOs = workflowTaskProgressionVOs;
}
@Override
protected String getTitle() {
return $("DisplayWorkflowInstanceView.viewTitle");
}
@Override
protected ClickListener getBackButtonClickListener() {
return new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.backButtonClicked();
}
};
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
mainLayout = new VerticalLayout();
mainLayout.setSizeFull();
mainLayout.setSpacing(true);
buildWorkflowDisplay();
buildTasksTable();
mainLayout.addComponents(workflowInstanceDisplay, workflowTaskVOTable);
mainLayout.setExpandRatio(workflowTaskVOTable, 1);
return mainLayout;
}
private void buildWorkflowDisplay() {
workflowInstanceDisplay = new RecordDisplay(workflowInstanceVO);
}
private void buildTasksTable() {
workflowTaskVOTable = new TreeTable($("DisplayWorkflowInstanceView.tableTitle"));
workflowTaskVOTable.setDragMode(TableDragMode.ROW);
workflowTaskVOTable.setWidth("100%");
final HierarchicalContainer container = new HierarchicalContainer();
container.addContainerProperty("title", String.class, "");
container.addContainerProperty("status", String.class, "");
container.addContainerProperty("decision", String.class, "");
container.addContainerProperty("dueDate", String.class, "");
for (WorkflowTaskProgressionVO workflowTaskProgressionVO : workflowTaskProgressionVOs) {
addToTable(workflowTaskProgressionVO, container);
}
workflowTaskVOTable.setColumnHeader("title", $("DisplayWorkflowInstanceView.table.title"));
workflowTaskVOTable.setColumnHeader("status", $("DisplayWorkflowInstanceView.table.status"));
workflowTaskVOTable.setColumnHeader("decision", $("DisplayWorkflowInstanceView.table.decision"));
workflowTaskVOTable.setColumnHeader("dueDate", $("DisplayWorkflowInstanceView.table.dueDate"));
workflowTaskVOTable.setColumnExpandRatio("title", 1);
workflowTaskVOTable.setContainerDataSource(container);
workflowTaskVOTable.setCellStyleGenerator(new TaskStyleGenerator());
}
@SuppressWarnings("unchecked")
private void addToTable(WorkflowTaskProgressionVO workflowTaskProgressionVO, HierarchicalContainer container) {
Item item = container.addItem(workflowTaskProgressionVO);
String title = workflowTaskProgressionVO.getTitle();
TaskStatusType status = workflowTaskProgressionVO.getStatus();
String decision = workflowTaskProgressionVO.getDecision();
LocalDate dueDate = workflowTaskProgressionVO.getDueDate();
Locale locale = getLocale();
String statusStr =
status != null ? taskStatusToCaptionConverter.convertToPresentation(status.getCode(), String.class, locale) : "";
String dueDateStr = jodaDateToStringConverter.convertToPresentation(dueDate, String.class, locale);
item.getItemProperty("title").setValue(title);
item.getItemProperty("status").setValue(statusStr);
item.getItemProperty("decision").setValue(decision);
item.getItemProperty("dueDate").setValue(dueDateStr);
List<WorkflowTaskProgressionVO> children = presenter.getChildren(workflowTaskProgressionVO);
for (WorkflowTaskProgressionVO child : children) {
// Recursive call
addToTable(child, container);
container.setParent(child, workflowTaskProgressionVO);
}
}
public class TaskStyleGenerator implements CellStyleGenerator {
private static final String OVER_DUE_TASK_STYLE = "error";
private static final String FINISHED_TASK_STYLE = "disabled";
@Override
public String getStyle(Table source, Object itemId, Object propertyId) {
String style;
if (!isDueDateColumn(propertyId)) {
style = null;
} else {
WorkflowTaskProgressionVO workflowTaskProgressionVO = (WorkflowTaskProgressionVO) itemId;
if (presenter.isFinished(workflowTaskProgressionVO)) {
style = FINISHED_TASK_STYLE;
} else if (presenter.isTaskOverDue(workflowTaskProgressionVO)) {
style = OVER_DUE_TASK_STYLE;
} else {
style = null;
}
}
return style;
}
private boolean isDueDateColumn(Object propertyId) {
if (!(propertyId instanceof MetadataVO)) {
return false;
}
MetadataVO metadata = (MetadataVO) propertyId;
return Task.DUE_DATE.equals(MetadataVO.getCodeWithoutPrefix(metadata.getCode()));
}
}
}