package pl.net.bluesoft.rnd.processtool.ui.admin; import java.util.Collection; import pl.net.bluesoft.rnd.processtool.ProcessToolContext; import pl.net.bluesoft.rnd.processtool.bpm.ProcessToolBpmSession; import pl.net.bluesoft.rnd.processtool.model.BpmTask; import pl.net.bluesoft.rnd.util.i18n.I18NSource; import org.aperteworkflow.util.vaadin.VaadinUtility; import org.aperteworkflow.util.vaadin.VaadinUtility.Refreshable; import org.aperteworkflow.util.vaadin.ui.table.LocalizedPagedTable; import pl.net.bluesoft.util.lang.Strings; import com.vaadin.Application; import com.vaadin.data.util.BeanItem; import com.vaadin.data.util.BeanItemContainer; import com.vaadin.event.ItemClickEvent; import com.vaadin.terminal.gwt.client.ui.AlignmentInfo.Bits; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.ComponentContainer; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Window.CloseEvent; import com.vaadin.ui.Window.CloseListener; public class AdminMainPane extends VerticalLayout implements Refreshable { private Application application; private I18NSource i18NSource; private ProcessToolBpmSession bpmSession; private TextField creatorSearchField = new TextField(); private TextField assigneeSearchField = new TextField(); private TextField taskNameSearchField = new TextField(); private TextField executionIdSearchField = new TextField(); private TextField externalIdSearchField = new TextField(); private static final String FIELD_WIDTH = "150px"; private BeanItemContainer<AdminTaskTableItem> bic = new BeanItemContainer<AdminTaskTableItem>(AdminTaskTableItem.class); private Window modalWindow; private LocalizedPagedTable table; public AdminMainPane(Application application, I18NSource i18NSource, final ProcessToolBpmSession bpmSession) { this.application = application; this.i18NSource = i18NSource; this.bpmSession = bpmSession; setWidth("100%"); setSpacing(true); removeAllComponents(); HorizontalLayout hLay = new HorizontalLayout(); creatorSearchField.setCaption(getMessage("admin.creator")); creatorSearchField.setWidth(FIELD_WIDTH); hLay.addComponent(creatorSearchField); assigneeSearchField.setCaption(getMessage("admin.assignee")); assigneeSearchField.setWidth(FIELD_WIDTH); hLay.addComponent(assigneeSearchField); taskNameSearchField.setCaption(getMessage("admin.taskName")); taskNameSearchField.setWidth(FIELD_WIDTH); hLay.addComponent(taskNameSearchField); executionIdSearchField.setCaption(getMessage("admin.executionId")); executionIdSearchField.setWidth(FIELD_WIDTH); hLay.addComponent(executionIdSearchField); externalIdSearchField.setCaption(getMessage("admin.externalId")); externalIdSearchField.setWidth(FIELD_WIDTH); hLay.addComponent(externalIdSearchField); Button searchBtn = VaadinUtility.button(getMessage("admin.search"), null, null, new ClickListener() { @Override public void buttonClick(ClickEvent event) { refreshTable(); } }); hLay.addComponent(searchBtn); hLay.setComponentAlignment(searchBtn, new Alignment(Bits.ALIGNMENT_BOTTOM)); hLay.setSpacing(true); addComponent(hLay); createTaskTable(); VerticalLayout tableCarrier = new VerticalLayout(); tableCarrier.setWidth("100%"); tableCarrier.addComponent(table); tableCarrier.addComponent(table.createControls(getMessage("admin.itemsPerPage"), getMessage("admin.page"))); addComponent(tableCarrier); } private void fillTableContainer() { ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext(); Collection<BpmTask> taskList = bpmSession.getAllTasks(ctx); for (BpmTask bpmTask : taskList) { String assignee = bpmTask.getOwner() == null ? "" : defaultString(bpmTask.getOwner().getLogin()); String creator = defaultString(bpmTask.getCreator()); String id = defaultString(bpmTask.getInternalTaskId()); String taskName = defaultString(bpmTask.getTaskName()); String executionId = defaultString(bpmTask.getExecutionId()); String externalId = defaultString(bpmTask.getProcessInstance().getExternalKey()); String assigneeField = defaultString((String)assigneeSearchField.getValue()); String creatorField = defaultString((String)creatorSearchField.getValue()); String taskNameField = defaultString((String)taskNameSearchField.getValue()); String executionIdField = defaultString((String)executionIdSearchField.getValue()); String externalIdField = defaultString((String)externalIdSearchField.getValue()); boolean include = true; if (Strings.hasText(assigneeField) && !assignee.toUpperCase().contains(assigneeField.toUpperCase())) { include = false; } if (include && Strings.hasText(creatorField) && !creator.toUpperCase().contains(creatorField.toUpperCase())) { include = false; } if (include && Strings.hasText(taskNameField) && !taskName.toUpperCase().contains(taskNameField.toUpperCase())) { include = false; } if (include && Strings.hasText(executionIdField) && !executionId.toUpperCase().contains(executionIdField.toUpperCase())) { include = false; } if (include && Strings.hasText(externalIdField) && !externalId.toUpperCase().contains(externalIdField.toUpperCase())) { include = false; } if (include) { AdminTaskTableItem atti = new AdminTaskTableItem(); atti.setAssignee(assignee); atti.setCreator(creator); atti.setId(id); atti.setTaskName(taskName); atti.setExecutionId(executionId); atti.setExternalId(externalId); bic.addBean(atti); } } } private void createTaskTable() { table = new LocalizedPagedTable(); table.setSizeFull(); table.setSortAscending(true); table.setSortContainerPropertyId("creator"); table.setWidth("100%"); //table.setHeight("300px"); table.setImmediate(true); // react at once when something is selected table.setSelectable(true); fillTableContainer(); table.setContainerDataSource(bic); setTableColumns(); table.addListener(new ItemClickEvent.ItemClickListener() { public void itemClick(final ItemClickEvent event) { BeanItem<AdminTaskTableItem> item = (BeanItem<AdminTaskTableItem>)event.getItem(); openModalWindow(item.getBean()); } }); table.setPageLength(25); } private void setTableColumns() { table.setVisibleColumns(new Object[] { "creator", "assignee", "taskName", "executionId", "externalId" }); for (Object o : table.getVisibleColumns()) { table.setColumnHeader(o, getMessage("admin.tasks." + o)); } } private void openModalWindow(AdminTaskTableItem item) { UserSearchForm userSearchForm = new UserSearchForm(application, bpmSession, i18NSource, item, this); userSearchForm.setWidth("800px"); userSearchForm.setMargin(true); modalWindow = createModalWindow(getMessage("admin.selectUser"), userSearchForm); application.getMainWindow().addWindow(modalWindow); } public void closeModalWindow() { if (modalWindow != null) { application.getMainWindow().removeWindow(modalWindow); modalWindow = null; refreshTable(); } } private String getMessage(String key) { return i18NSource.getMessage(key); } public void refreshData() { } public void refreshTable() { bic.removeAllItems(); fillTableContainer(); table.setContainerDataSource(bic); setTableColumns(); } public Window createModalWindow(String title, ComponentContainer content) { Window window = new Window(title, content); window.setClosable(true); window.setModal(true); window.setSizeUndefined(); window.setResizable(false); window.addListener(new CloseListener() { @Override public void windowClose(CloseEvent e) { modalWindow = null; refreshTable(); } }); return window; } private static String defaultString(String str) { return str == null ? "" : str; } }