package com.constellio.app.modules.tasks.ui.components; import static com.constellio.app.ui.i18n.i18n.$; import org.vaadin.dialogs.ConfirmDialog; import com.constellio.app.modules.tasks.model.wrappers.Task; import com.constellio.app.modules.tasks.ui.entities.TaskVO; import com.constellio.app.ui.entities.MetadataVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.framework.buttons.DeleteButton; import com.constellio.app.ui.framework.buttons.DisplayButton; import com.constellio.app.ui.framework.buttons.EditButton; import com.constellio.app.ui.framework.components.menuBar.ConfirmDialogMenuBarItemCommand; import com.constellio.app.ui.framework.components.table.RecordVOTable; import com.constellio.app.ui.framework.containers.ButtonsContainer; import com.constellio.app.ui.framework.containers.RecordVOLazyContainer; import com.constellio.app.ui.framework.data.RecordVODataProvider; import com.constellio.app.ui.framework.items.RecordVOItem; import com.vaadin.data.Container; import com.vaadin.server.FontAwesome; import com.vaadin.server.ThemeResource; import com.vaadin.ui.MenuBar; import com.vaadin.ui.MenuBar.Command; import com.vaadin.ui.MenuBar.MenuItem; import com.vaadin.ui.Table; public class TaskTable extends RecordVOTable { public static final String PREFIX = "images/icons/task/"; public static final ThemeResource COMPLETE_ICON = new ThemeResource(PREFIX + "task.png"); public static final ThemeResource CLOSE_ICON = new ThemeResource(PREFIX + "task_complete.png"); private final TaskPresenter presenter; public TaskTable(RecordVODataProvider provider, TaskPresenter presenter) { super($("TaskTable.caption", provider.size())); this.presenter = presenter; setContainerDataSource(buildContainer(provider)); setColumnHeader(ButtonsContainer.DEFAULT_BUTTONS_PROPERTY_ID, ""); setColumnWidth(ButtonsContainer.DEFAULT_BUTTONS_PROPERTY_ID, 200); setCellStyleGenerator(new TaskStyleGenerator()); setPageLength(Math.min(15, provider.size())); setWidth("100%"); } private Container buildContainer(RecordVODataProvider provider) { return addButtons(new RecordVOLazyContainer(provider)); } private Container addButtons(final RecordVOLazyContainer records) { String columnId = "menuBar"; addGeneratedColumn(columnId, new ColumnGenerator() { @Override public Object generateCell(Table source, final Object itemId, Object columnId) { final RecordVO recordVO = records.getRecordVO((int) itemId); MenuBar menuBar = new MenuBar(); MenuItem rootItem = menuBar.addItem("", FontAwesome.BARS, null); rootItem.addItem($("display"), DisplayButton.ICON_RESOURCE, new Command() { @Override public void menuSelected(MenuItem selectedItem) { presenter.displayButtonClicked(recordVO); } }); if (presenter.isEditButtonEnabled(recordVO)) { rootItem.addItem($("edit"), EditButton.ICON_RESOURCE, new Command() { @Override public void menuSelected(MenuItem selectedItem) { presenter.editButtonClicked(recordVO); } }); } if (presenter.isCompleteButtonEnabled(recordVO)) { rootItem.addItem($("TaskTable.complete"), COMPLETE_ICON, new Command() { @Override public void menuSelected(MenuItem selectedItem) { presenter.completeButtonClicked(recordVO); } }); } if (presenter.isCloseButtonEnabled(recordVO)) { rootItem.addItem($("TaskTable.close"), CLOSE_ICON, new Command() { @Override public void menuSelected(MenuItem selectedItem) { presenter.closeButtonClicked(recordVO); } }); } if (presenter.isDeleteButtonVisible(recordVO)) { rootItem.addItem($("delete"), DeleteButton.ICON_RESOURCE, new ConfirmDialogMenuBarItemCommand() { @Override protected String getConfirmDialogMessage() { return $("ConfirmDialog.confirmDelete"); } @Override protected void confirmButtonClick(ConfirmDialog dialog) { presenter.deleteButtonClicked(recordVO); } }).setEnabled(presenter.isDeleteButtonEnabled(recordVO)); } return menuBar; } }); setColumnHeader(columnId, ""); return records; } public interface TaskPresenter { void displayButtonClicked(RecordVO record); void editButtonClicked(RecordVO record); void deleteButtonClicked(RecordVO record); void completeButtonClicked(RecordVO record); void closeButtonClicked(RecordVO record); boolean isTaskOverdue(TaskVO taskVO); boolean isFinished(TaskVO taskVO); void autoAssignButtonClicked(RecordVO recordVO); boolean isAutoAssignButtonEnabled(RecordVO recordVO); boolean isEditButtonEnabled(RecordVO recordVO); boolean isCompleteButtonEnabled(RecordVO recordVO); boolean isCloseButtonEnabled(RecordVO recordVO); boolean isDeleteButtonEnabled(RecordVO recordVO); boolean isDeleteButtonVisible(RecordVO recordVO); } 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 { RecordVOItem item = (RecordVOItem) source.getItem(itemId); TaskVO taskVO = new TaskVO(item.getRecord()); if (presenter.isFinished(taskVO)) { style = FINISHED_TASK_STYLE; } else if (presenter.isTaskOverdue(taskVO)) { 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())); } } }