package com.constellio.app.modules.tasks.ui.pages;
import static com.constellio.app.modules.tasks.model.wrappers.Task.ASSIGNEE;
import static com.constellio.app.modules.tasks.model.wrappers.Task.ASSIGNER;
import static com.constellio.app.modules.tasks.model.wrappers.Task.DUE_DATE;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.entities.records.wrappers.RecordWrapper.TITLE;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.constellio.app.modules.rm.RMConfigs;
import com.constellio.app.modules.tasks.TasksPermissionsTo;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.app.modules.tasks.model.wrappers.Workflow;
import com.constellio.app.modules.tasks.model.wrappers.WorkflowInstance;
import com.constellio.app.modules.tasks.navigation.TaskViews;
import com.constellio.app.modules.tasks.services.TaskPresenterServices;
import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices;
import com.constellio.app.modules.tasks.services.TasksSearchServices;
import com.constellio.app.modules.tasks.services.WorkflowServices;
import com.constellio.app.modules.tasks.ui.builders.TaskToVOBuilder;
import com.constellio.app.modules.tasks.ui.components.TaskTable.TaskPresenter;
import com.constellio.app.modules.tasks.ui.components.WorkflowTable.WorkflowPresenter;
import com.constellio.app.modules.tasks.ui.entities.TaskVO;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.RecordVO;
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.SingleSchemaBasePresenter;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
public class TaskManagementPresenter extends SingleSchemaBasePresenter<TaskManagementView>
implements TaskPresenter, WorkflowPresenter {
public static final String TASKS_ASSIGNED_BY_CURRENT_USER = "tasksAssignedByCurrentUser";
public static final String TASKS_NOT_ASSIGNED = "nonAssignedTasks";
public static final String TASKS_ASSIGNED_TO_CURRENT_USER = "tasksAssignedToCurrentUser";
public static final String TASKS_RECENTLY_COMPLETED = "recentlyCompletedTasks";
public static final String WORKFLOWS_STARTED = "startedWorkflows";
private transient TasksSearchServices tasksSearchServices;
private transient TaskPresenterServices taskPresenterServices;
private transient WorkflowServices workflowServices;
public TaskManagementPresenter(TaskManagementView view) {
super(view, Task.DEFAULT_SCHEMA);
initTransientObjects();
}
@Override
protected boolean hasPageAccess(String params, User user) {
return true;
}
public List<String> getTabs() {
List<String> tabs = new ArrayList<>();
tabs.add(TASKS_ASSIGNED_TO_CURRENT_USER);
tabs.add(TASKS_ASSIGNED_BY_CURRENT_USER);
tabs.add(TASKS_NOT_ASSIGNED);
tabs.add(TASKS_RECENTLY_COMPLETED);
if (areWorkflowsEnabled() && getCurrentUser().has(TasksPermissionsTo.MANAGE_WORKFLOWS).globally()) {
tabs.add(WORKFLOWS_STARTED);
}
return tabs;
}
public void tabSelected(String tabId) {
if (isWorkflowTab(tabId)) {
RecordVODataProvider provider = getWorkflowInstances(tabId);
view.displayWorkflows(provider);
} else {
RecordVODataProvider provider = getTasks(tabId);
view.displayTasks(provider);
}
}
public void addTaskButtonClicked() {
view.navigate().to(TaskViews.class).addTask();
}
public String getTabCaption(String tabId) {
return $("TasksManagementView.tab." + tabId);
}
private void refreshCurrentTab() {
view.reloadCurrentTab();
}
@Override
public void displayButtonClicked(RecordVO record) {
view.navigate().to(TaskViews.class).displayTask(record.getId());
}
@Override
public void editButtonClicked(RecordVO record) {
view.navigate().to().editTask(record.getId());
}
@Override
public void deleteButtonClicked(RecordVO record) {
taskPresenterServices.deleteTask(toRecord(record), getCurrentUser());
view.reloadCurrentTab();
}
@Override
public void completeButtonClicked(RecordVO record) {
view.navigate().to().editTask(record.getId(), true);
}
@Override
public void closeButtonClicked(RecordVO record) {
taskPresenterServices.closeTask(toRecord(record), getCurrentUser());
refreshCurrentTab();
}
@Override
public boolean isTaskOverdue(TaskVO taskVO) {
return taskPresenterServices.isTaskOverdue(taskVO);
}
@Override
public boolean isFinished(TaskVO taskVO) {
return taskPresenterServices.isFinished(taskVO);
}
@Override
public void autoAssignButtonClicked(RecordVO recordVO) {
taskPresenterServices.autoAssignTask(toRecord(recordVO), getCurrentUser());
refreshCurrentTab();
}
@Override
public boolean isAutoAssignButtonEnabled(RecordVO recordVO) {
return taskPresenterServices.isAutoAssignButtonEnabled(toRecord(recordVO), getCurrentUser());
}
@Override
public boolean isEditButtonEnabled(RecordVO recordVO) {
return taskPresenterServices.isEditTaskButtonVisible(toRecord(recordVO), getCurrentUser());
}
@Override
public boolean isCompleteButtonEnabled(RecordVO recordVO) {
return taskPresenterServices.isCompleteTaskButtonVisible(toRecord(recordVO), getCurrentUser());
}
@Override
public boolean isCloseButtonEnabled(RecordVO recordVO) {
return taskPresenterServices.isCloseTaskButtonVisible(toRecord(recordVO), getCurrentUser());
}
@Override
public boolean isDeleteButtonEnabled(RecordVO recordVO) {
return taskPresenterServices.isDeleteTaskButtonVisible(toRecord(recordVO), getCurrentUser());
}
@Override
public boolean isDeleteButtonVisible(RecordVO entity) {
return taskPresenterServices.isDeleteTaskButtonVisible(toRecord(entity), getCurrentUser());
}
@Override
public void displayWorkflowInstanceRequested(RecordVO recordVO) {
view.navigate().to(TaskViews.class).displayWorkflowInstance(recordVO.getId());
}
@Override
public void cancelWorkflowInstanceRequested(RecordVO record) {
WorkflowInstance instance = new TasksSchemasRecordsServices(view.getCollection(), appLayerFactory)
.getWorkflowInstance(record.getId());
workflowServices.cancel(instance);
refreshCurrentTab();
}
public RecordVODataProvider getWorkflows() {
MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder().build(
schema(Workflow.DEFAULT_SCHEMA), VIEW_MODE.TABLE, view.getSessionContext());
return new RecordVODataProvider(schemaVO, new RecordToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return workflowServices.getWorkflowsQuery();
}
};
}
public void workflowStartRequested(RecordVO record) {
Workflow workflow = new TasksSchemasRecordsServices(view.getCollection(), appLayerFactory).getWorkflow(record.getId());
Map<String, List<String>> parameters = new HashMap<>();
workflowServices.start(workflow, getCurrentUser(), parameters);
refreshCurrentTab();
}
private RecordVODataProvider getTasks(String tabId) {
MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder()
.build(defaultSchema(), VIEW_MODE.TABLE, getMetadataForTab(tabId), view.getSessionContext());
switch (tabId) {
case TASKS_ASSIGNED_TO_CURRENT_USER:
return new RecordVODataProvider(schemaVO, new TaskToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return tasksSearchServices.getTasksAssignedToUserQuery(getCurrentUser());
}
};
case TASKS_ASSIGNED_BY_CURRENT_USER:
return new RecordVODataProvider(schemaVO, new TaskToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return tasksSearchServices.getTasksAssignedByUserQuery(getCurrentUser());
}
};
case TASKS_NOT_ASSIGNED:
return new RecordVODataProvider(schemaVO, new TaskToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return tasksSearchServices.getUnassignedTasksQuery(getCurrentUser());
}
};
case TASKS_RECENTLY_COMPLETED:
return new RecordVODataProvider(schemaVO, new TaskToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return tasksSearchServices.getRecentlyCompletedTasks(getCurrentUser());
}
};
default:
throw new RuntimeException("BUG: Unknown tabId + " + tabId);
}
}
private RecordVODataProvider getWorkflowInstances(String tabId) {
MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder()
.build(schema(WorkflowInstance.DEFAULT_SCHEMA), VIEW_MODE.TABLE, view.getSessionContext());
switch (tabId) {
case WORKFLOWS_STARTED:
return new RecordVODataProvider(schemaVO, new RecordToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return workflowServices.getCurrentWorkflowInstancesQuery();
}
};
default:
throw new RuntimeException("BUG: Unknown tabId + " + tabId);
}
}
private List<String> getMetadataForTab(String tabId) {
switch (tabId) {
case TASKS_ASSIGNED_TO_CURRENT_USER:
return Arrays.asList(TITLE, ASSIGNER, DUE_DATE);
case TASKS_ASSIGNED_BY_CURRENT_USER:
return Arrays.asList(TITLE, ASSIGNEE, DUE_DATE);
case TASKS_NOT_ASSIGNED:
return Arrays.asList(TITLE, DUE_DATE);
default:
return Arrays.asList(TITLE, ASSIGNER, ASSIGNEE, DUE_DATE);
}
}
private boolean isWorkflowTab(String tabId) {
return WORKFLOWS_STARTED.equals(tabId);
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initTransientObjects();
}
private void initTransientObjects() {
TasksSchemasRecordsServices schemas = new TasksSchemasRecordsServices(collection, appLayerFactory);
workflowServices = new WorkflowServices(collection, appLayerFactory);
tasksSearchServices = new TasksSearchServices(schemas);
taskPresenterServices = new TaskPresenterServices(
schemas, recordServices(), tasksSearchServices, modelLayerFactory.newLoggingServices());
}
public boolean areWorkflowsEnabled() {
RMConfigs configs = new RMConfigs(modelLayerFactory.getSystemConfigurationsManager());
return configs.areWorkflowsEnabled();
}
public boolean hasPermissionToStartWorkflow() {
return getCurrentUser().has(TasksPermissionsTo.START_WORKFLOWS).globally();
}
}