package com.constellio.app.modules.tasks.ui.pages.tasks;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.services.events.RMEventsSearchServices;
import com.constellio.app.modules.tasks.model.wrappers.Task;
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.ui.builders.TaskToVOBuilder;
import com.constellio.app.modules.tasks.ui.components.TaskTable.TaskPresenter;
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.EventToVOBuilder;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.logging.LoggingServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import java.io.IOException;
import java.util.List;
import static com.constellio.app.modules.tasks.model.wrappers.Task.ASSIGNEE;
import static com.constellio.app.modules.tasks.model.wrappers.Task.DUE_DATE;
import static com.constellio.app.ui.entities.RecordVO.VIEW_MODE.FORM;
import static com.constellio.model.entities.records.wrappers.RecordWrapper.TITLE;
import static java.util.Arrays.asList;
public class DisplayTaskPresenter extends SingleSchemaBasePresenter<DisplayTaskView> implements TaskPresenter {
TaskVO taskVO;
private RecordVODataProvider subTaskDataProvider;
private RecordVODataProvider eventsDataProvider;
transient TasksSearchServices tasksSearchServices;
transient private TasksSchemasRecordsServices tasksSchemas;
transient private TaskPresenterServices taskPresenterServices;
transient Record currentRecord;
transient private LoggingServices loggingServices;
public DisplayTaskPresenter(DisplayTaskView view) {
super(view, Task.DEFAULT_SCHEMA);
initTransientObjects();
}
@Override
protected boolean hasPageAccess(String params, User user) {
return true;
}
@Override
protected boolean hasRestrictedRecordAccess(String params, User user, Record restrictedRecord) {
return user.hasReadAccess().on(restrictedRecord);
}
@Override
protected List<String> getRestrictedRecordIds(String taskId) {
return asList(taskId);
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initTransientObjects();
}
private void initTransientObjects() {
tasksSchemas = new TasksSchemasRecordsServices(collection, appLayerFactory);
tasksSearchServices = new TasksSearchServices(tasksSchemas);
loggingServices = modelLayerFactory.newLoggingServices();
taskPresenterServices = new TaskPresenterServices(tasksSchemas, recordServices(), tasksSearchServices, loggingServices);
}
public RecordVO getTask() {
return taskVO;
}
public void initTaskVO(String id) {
Task task = tasksSchemas.getTask(id);
taskVO = new TaskVO(new TaskToVOBuilder().build(task.getWrappedRecord(), FORM, view.getSessionContext()));
initSubTaskDataProvider();
eventsDataProvider = getEventsDataProvider();
}
@Override
public void displayButtonClicked(RecordVO entity) {
view.navigate().to(TaskViews.class).displayTask(entity.getId());
}
public void editButtonClicked() {
view.navigate().to().editTask(taskVO.getId());
}
@Override
public void editButtonClicked(RecordVO entity) {
view.navigate().to().editTask(entity.getId());
}
public void completeButtonClicked() {
view.navigate().to().editTask(taskVO.getId(), true);
}
@Override
public void completeButtonClicked(RecordVO entity) {
view.navigate().to().editTask(entity.getId(), true);
}
public void closeButtonClicked() {
closeButtonClicked(taskVO);
}
@Override
public void closeButtonClicked(RecordVO entity) {
taskPresenterServices.closeTask(toRecord(entity), getCurrentUser());
reloadCurrentTask();
}
@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());
reloadCurrentTask();
}
@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());
}
public void deleteButtonClicked() {
taskPresenterServices.deleteTask(toRecord(taskVO), getCurrentUser());
// TODO: Properly redirect
view.navigate().to(TaskViews.class).taskManagement();
}
@Override
public void deleteButtonClicked(RecordVO entity) {
taskPresenterServices.deleteTask(toRecord(entity), getCurrentUser());
reloadCurrentTask();
}
void initSubTaskDataProvider() {
MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder()
.build(defaultSchema(), VIEW_MODE.TABLE, asList(TITLE, ASSIGNEE, DUE_DATE), view.getSessionContext());
final String taskId = taskVO.getId();
subTaskDataProvider = new RecordVODataProvider(schemaVO, new TaskToVOBuilder(), modelLayerFactory,
view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return tasksSearchServices.getDirectSubTasks(taskId, getCurrentUser());
}
};
}
private void reloadCurrentTask() {
//TODO proper refresh
view.navigate().to(TaskViews.class).displayTask(taskVO.getId());
}
private boolean hasCurrentUserWriteAccessOnCurrentTask() {
if (taskVO == null) {
return false;
} else {
return getCurrentUser().hasWriteAccess().on(getCurrentRecord());
}
}
public boolean isEditCurrentTaskButtonVisible() {
return hasCurrentUserWriteAccessOnCurrentTask();
}
public Record getCurrentRecord() {
if (currentRecord == null) {
currentRecord = recordServices().getDocumentById(taskVO.getId());
}
return currentRecord;
}
public boolean isCompleteCurrentTaskButtonVisible() {
return isCompleteTaskButtonVisible(taskVO);
}
public boolean isCloseCurrentTaskButtonVisible() {
return isCloseTaskButtonVisible(taskVO);
}
public void createSubTaskButtonClicked() {
view.navigate().to(TaskViews.class).addTask(taskVO.getId());
}
public boolean isCreateCurrentTaskSubTaskButtonVisible() {
return hasCurrentUserWriteAccessOnCurrentTask();
}
public boolean isDeleteCurrentTaskButtonVisible() {
return isDeleteButtonVisible(taskVO);
}
public boolean isCompleteTaskButtonVisible(RecordVO entity) {
return taskPresenterServices.isCompleteTaskButtonVisible(toRecord(entity), getCurrentUser());
}
public boolean isCloseTaskButtonVisible(RecordVO entity) {
return taskPresenterServices.isCloseTaskButtonVisible(toRecord(entity), getCurrentUser());
}
@Override
public boolean isDeleteButtonVisible(RecordVO entity) {
return taskPresenterServices.isDeleteTaskButtonVisible(toRecord(entity), getCurrentUser());
}
public String getTaskTitle() {
return taskVO.getTitle();
}
public void selectInitialTabForUser() {
view.selectMetadataTab();
}
public void viewAssembled() {
view.setSubTasks(subTaskDataProvider);
view.setEvents(eventsDataProvider);
}
public void backButtonClicked() {
view.navigate().to().previousView();
}
public void autoAssignButtonClicked() {
autoAssignButtonClicked(taskVO);
}
public boolean isAutoAssignButtonEnabled() {
return isAutoAssignButtonEnabled(taskVO);
}
public Object getSubTaskCount() {
return subTaskDataProvider.size();
}
public RecordVODataProvider getEventsDataProvider() {
final RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory);
final MetadataSchemaVO eventSchemaVO = new MetadataSchemaToVOBuilder()
.build(rm.eventSchema(), VIEW_MODE.TABLE, view.getSessionContext());
return new RecordVODataProvider(eventSchemaVO, new EventToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
RMEventsSearchServices rmEventsSearchServices = new RMEventsSearchServices(modelLayerFactory, collection);
return rmEventsSearchServices.newFindEventByRecordIDQuery(getCurrentUser(), taskVO.getId());
}
};
}
protected boolean hasCurrentUserPermissionToViewEvents() {
return getCurrentUser().has(CorePermissions.VIEW_EVENTS).on(tasksSchemas.getTask(taskVO.getId()));
}
public void refreshEvents() {
modelLayerFactory.getDataLayerFactory().newEventsDao().flush();
view.setEvents(getEventsDataProvider());
}
}