package com.constellio.app.modules.tasks.ui.pages.workflow;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.modules.tasks.TasksPermissionsTo;
import com.constellio.app.modules.tasks.model.wrappers.Workflow;
import com.constellio.app.modules.tasks.model.wrappers.types.TaskType;
import com.constellio.app.modules.tasks.navigation.TaskViews;
import com.constellio.app.modules.tasks.services.WorkflowServices;
import com.constellio.app.modules.tasks.services.WorkflowServicesRuntimeException.WorkflowServicesRuntimeException_UnsupportedAddAtPosition;
import com.constellio.app.modules.tasks.ui.builders.WorkflowToVoBuilder;
import com.constellio.app.modules.tasks.ui.entities.WorkflowTaskVO;
import com.constellio.app.modules.tasks.ui.entities.WorkflowVO;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter;
import com.constellio.app.ui.util.MessageUtils;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.RecordServicesRuntimeException.RecordServicesRuntimeException_CannotLogicallyDeleteRecord;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
public class DisplayWorkflowPresenter extends SingleSchemaBasePresenter<DisplayWorkflowView> {
private WorkflowVO workflowVO;
private List<WorkflowTaskVO> workflowTaskVOs;
private transient WorkflowServices workflowServices;
private WorkflowToVoBuilder workflowToVoBuilder;
public DisplayWorkflowPresenter(DisplayWorkflowView view) {
super(view, Workflow.DEFAULT_SCHEMA);
initTransientObjects();
workflowToVoBuilder = new WorkflowToVoBuilder();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initTransientObjects();
}
private void initTransientObjects() {
workflowServices = new WorkflowServices(collection, appLayerFactory);
}
@Override
protected boolean hasPageAccess(String params, User user) {
return user.has(TasksPermissionsTo.MANAGE_WORKFLOWS).globally();
}
void forParams(String params) {
String id = params;
Record workflowRecord = getRecord(id);
workflowVO = workflowToVoBuilder.build(workflowRecord, VIEW_MODE.DISPLAY, view.getSessionContext());
view.setWorkflowVO(workflowVO);
SessionContext sessionContext = view.getSessionContext();
Workflow workflow = new Workflow(workflowRecord, types());
workflowTaskVOs = workflowServices.getRootModelTaskVOs(workflow, sessionContext);
view.setWorkflowTaskVOs(workflowTaskVOs);
MetadataSchemaToVOBuilder schemaVOBuilder = new MetadataSchemaToVOBuilder();
MetadataSchema taskTypeSchema = schema(TaskType.DEFAULT_SCHEMA);
MetadataSchemaVO taskTypeSchemaVO = schemaVOBuilder.build(taskTypeSchema, VIEW_MODE.TABLE, sessionContext);
view.setTaskTypeDataProvider(new RecordVODataProvider(taskTypeSchemaVO, new RecordToVOBuilder(), view) {
@Override
protected LogicalSearchQuery getQuery() {
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(from(schemaType(TaskType.SCHEMA_TYPE)).returnAll());
query.sortDesc(Schemas.TITLE);
return query;
}
});
}
List<WorkflowTaskVO> getChildren(WorkflowTaskVO parent) {
SessionContext sessionContext = view.getSessionContext();
return workflowServices.getChildModelTasks(parent, sessionContext);
}
void backButtonClicked() {
view.navigate().to(TaskViews.class).listWorkflows();
}
void editButtonClicked() {
view.navigate().to(TaskViews.class).editWorkflow(workflowVO.getId());
}
void deleteButtonClicked() {
try {
delete(toRecord(workflowVO), false);
view.navigate().to(TaskViews.class).listWorkflows();
} catch (RecordServicesRuntimeException_CannotLogicallyDeleteRecord exception) {
view.showErrorMessage(MessageUtils.toMessage(exception));
}
}
public void addTaskButtonClicked() {
String workflowId = workflowVO.getId();
SessionContext sessionContext = view.getSessionContext();
List<WorkflowTaskVO> availableTaskVOs = workflowServices.getAvailableWorkflowTaskVOForNewTask(workflowId, sessionContext);
view.openAddTaskWindow(null, availableTaskVOs);
}
void createTaskSelected(WorkflowTaskVO workflowTaskVOBefore) {
String workflowId = workflowVO.getId();
SessionContext sessionContext = view.getSessionContext();
if (workflowServices.canAddTaskIn(workflowTaskVOBefore, sessionContext)) {
List<WorkflowTaskVO> availableTaskVOs = workflowServices
.getAvailableWorkflowTaskVOForNewTask(workflowId, sessionContext);
if (!availableTaskVOs.isEmpty()) {
view.openAddTaskWindow(workflowTaskVOBefore, availableTaskVOs);
}
}
}
void createExistingTaskSelected(WorkflowTaskVO workflowTaskVOBefore) {
String workflowId = workflowVO.getId();
SessionContext sessionContext = view.getSessionContext();
if (workflowServices.canAddTaskIn(workflowTaskVOBefore, sessionContext)) {
List<WorkflowTaskVO> availableTaskVOs = workflowServices
.getAvailableWorkflowTaskVOForNewTask(workflowId, sessionContext);
if (!availableTaskVOs.isEmpty()) {
// if (availableTaskVOs.contains(workflowTaskVOBefore)) {
availableTaskVOs.remove(workflowTaskVOBefore);
List<WorkflowTaskVO> toDelete = new ArrayList<>();
for (WorkflowTaskVO availableTaskVO : availableTaskVOs) {
if (availableTaskVO.getDecision() != null) {
toDelete.add(availableTaskVO);
}
}
for (WorkflowTaskVO workflowTaskVO : toDelete) {
availableTaskVOs.remove(workflowTaskVO);
}
// }
view.openExistingTasksWindow(workflowTaskVOBefore, availableTaskVOs);
}
}
}
boolean isDecisionField(WorkflowTaskVO workflowTaskVO) {
SessionContext sessionContext = view.getSessionContext();
return workflowServices.canAddDecisionTaskIn(workflowTaskVO, sessionContext);
}
void editTaskSelected(WorkflowTaskVO workflowTaskVO) {
String taskId = workflowTaskVO.getTaskVO().getId();
String workflowId = workflowVO.getId();
view.navigate().to().editTask(taskId, workflowId);
}
void deleteTaskSelected(WorkflowTaskVO workflowTaskVO) {
if (workflowTaskVO.getDecision() != null) {
view.showMessage($("DisplayWorkflowView.cannotDeleteDecisionTask"));
} else {
SessionContext sessionContext = view.getSessionContext();
workflowServices.delete(workflowTaskVO, sessionContext);
view.remove(workflowTaskVO);
}
}
public void saveNewTaskButtonClicked(String taskType, String taskTitle, List<String> decisions,
WorkflowTaskVO workflowTaskVO) {
try {
SessionContext sessionContext = view.getSessionContext();
Record workflowRecord = toRecord(workflowVO);
Workflow workflow = new Workflow(workflowRecord, types());
if (!decisions.isEmpty()) {
workflowServices.createDecisionModelTaskAfter(workflow, workflowTaskVO, taskType, taskTitle, decisions,
sessionContext);
} else {
workflowServices.createModelTaskAfter(workflow, workflowTaskVO, taskType, taskTitle, sessionContext);
}
view.closeAddTaskWindow();
view.navigate().to(TaskViews.class).displayWorkflow(workflow.getId());
} catch (WorkflowServicesRuntimeException_UnsupportedAddAtPosition e) {
e.printStackTrace();
view.showMessage($("DisplayWorkflowView.addTaskWindow.cannotAdd"));
}
}
public void cancelNewTaskButtonClicked() {
view.closeAddTaskWindow();
}
public boolean moveAfter(WorkflowTaskVO droppedItemId, WorkflowTaskVO targetItemId) {
boolean allow;
SessionContext sessionContext = view.getSessionContext();
if (StringUtils.isBlank(droppedItemId.getDecision())) {
allow = workflowServices.canAddTaskIn(targetItemId, sessionContext);
} else {
allow = workflowServices.canAddDecisionTaskIn(targetItemId, sessionContext);
}
if (allow) {
try {
workflowServices.moveAfter(droppedItemId, targetItemId, sessionContext);
} catch (Exception e) {
e.printStackTrace();
allow = false;
}
}
return allow;
}
public boolean addExistingTaskAfter(WorkflowTaskVO existingItemId, WorkflowTaskVO targetItemId) {
boolean allow;
SessionContext sessionContext = view.getSessionContext();
if (StringUtils.isBlank(existingItemId.getDecision())) {
allow = workflowServices.canAddTaskIn(targetItemId, sessionContext);
} else {
allow = workflowServices.canAddDecisionTaskIn(targetItemId, sessionContext);
}
if (allow) {
try {
workflowServices.addAfter(existingItemId, targetItemId, sessionContext);
view.closeAddTaskWindow();
view.navigate().to(TaskViews.class).displayWorkflow(workflowVO.getId());
} catch (Exception e) {
e.printStackTrace();
allow = false;
}
}
return allow;
}
}