/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.webui.supervisor; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.data.util.PropertysetItem; import com.vaadin.event.ItemClickEvent; import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalSplitPanel; import com.vaadin.ui.Label; import com.vaadin.ui.Layout; import com.vaadin.ui.Panel; import com.vaadin.ui.Table; import com.vaadin.ui.TextArea; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.Execution; import org.activiti.engine.task.Task; import org.apache.commons.lang.StringUtils; import org.tepi.filtertable.FilterTable; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.adm.database.Bid; import ru.codeinside.adm.database.BidStatus; import ru.codeinside.adm.database.Employee; import ru.codeinside.adm.database.Procedure; import ru.codeinside.adm.database.TaskDates; import ru.codeinside.adm.ui.FilterDecorator_; import ru.codeinside.adm.ui.FilterGenerator_; import ru.codeinside.adm.ui.LazyLoadingContainer2; import ru.codeinside.gses.activiti.ReadOnly; import ru.codeinside.gses.beans.ActivitiBean; import ru.codeinside.gses.cert.NameParts; import ru.codeinside.gses.cert.X509; import ru.codeinside.gses.lazyquerycontainer.LazyQueryContainer; import ru.codeinside.gses.webui.CertificateInvalid; import ru.codeinside.gses.webui.CertificateReader; import ru.codeinside.gses.webui.CertificateVerifier; import ru.codeinside.gses.webui.CertificateVerifyClientProvider; import ru.codeinside.gses.webui.Flash; import ru.codeinside.gses.webui.components.LayoutChanger; import ru.codeinside.gses.webui.components.ProcedureHistoryPanel; import ru.codeinside.gses.webui.components.ShowDiagramComponent; import ru.codeinside.gses.webui.components.ShowDiagramComponentParameterObject; import ru.codeinside.gses.webui.components.api.Changer; import ru.codeinside.gses.webui.components.sign.SignApplet; import ru.codeinside.gses.webui.components.sign.SignAppletListener; import ru.codeinside.gses.webui.data.BatchItemBuilder; import ru.codeinside.gses.webui.data.ControlledTasksQuery; import ru.codeinside.gses.webui.data.Durations; import ru.codeinside.gses.webui.data.ItemBuilder; import ru.codeinside.gses.webui.data.TaskStylist; import ru.codeinside.gses.webui.eventbus.TaskChanged; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.logging.Logger; import static ru.codeinside.gses.webui.utils.Components.stringProperty; public class SupervisorWorkplace extends HorizontalSplitPanel { private Panel filterPanel; private Panel infoPanel; private Panel listPanel; private Changer bidChanger; private Component item2; private Component item3; private ControlledTasksQuery controlledTasksQuery; private ControlledTasksTable controlledTasksTable; private Component item1; private Changer infoChanger; private Component bidComponent; private String taskIdToAssign; private Component infoComponent; private Object filterComponent; public SupervisorWorkplace() { super(); Employee emp = Flash.flash().getAdminService().findEmployeeByLogin(Flash.login()); ItemBuilder<Task> taskItemBuilder = getTaskItemBuilder(); controlledTasksQuery = new ControlledTasksQuery(taskItemBuilder, emp); controlledTasksTable = new ControlledTasksTable(controlledTasksQuery); buildMainLayout(); buildFilterPanel(); buildListPanel(); buildInfoPanel(); } public void onTaskChanged(final TaskChanged event) { final Object source = event.getSource(); if (source != this) { controlledTasksTable.refresh(); controlledTasksTable.select(null); // ставим пустую панель ((VerticalLayout) item1).removeAllComponents(); bidChanger.change(item1); } } @Override public void attach() { super.attach(); Flash.bind(TaskChanged.class, this, "onTaskChanged"); } @Override public void detach() { Flash.unbind(TaskChanged.class, this, "onTaskChanged"); super.detach(); } private void buildInfoPanel() { VerticalLayout layout = new VerticalLayout(); layout.setSizeFull(); infoChanger = new LayoutChanger(layout); infoPanel.addComponent(layout); infoComponent = createInfoComponent(); bidComponent = createBidComponent(); infoChanger.set(infoComponent, "info"); infoChanger.set(bidComponent, "bid"); infoChanger.change(infoComponent); } private Component createBidComponent() { VerticalLayout mainLayout = new VerticalLayout(); mainLayout.setSizeFull(); bidChanger = new LayoutChanger(mainLayout); item1 = createBidChangerItem1(); item2 = createBidChangerItem2(); item3 = createBidChangerItem3(); bidChanger.set(item1, "item1"); bidChanger.set(item2, "item2"); bidChanger.set(item3, "item3"); bidChanger.change(item1); return mainLayout; } private Component createBidChangerItem3() { return new VerticalLayout(); } private Component createBidChangerItem2() { VerticalLayout layout = new VerticalLayout(); layout.setSizeFull(); return layout; } private Component createBidChangerItem1() { VerticalLayout layout = new VerticalLayout(); layout.setSpacing(true); layout.setSizeFull(); return layout; } private Component createInfoComponent() { VerticalLayout layout = new VerticalLayout(); layout.setSizeFull(); return layout; } private void buildListPanel() { controlledTasksTable.setHeight("255px"); controlledTasksTable.setWidth("100%"); controlledTasksTable.setImmediate(true); controlledTasksTable.setSelectable(true); controlledTasksTable.setSortDisabled(true); controlledTasksTable.addContainerProperty("id", Component.class, null); controlledTasksTable.addContainerProperty("dateCreated", String.class, null); controlledTasksTable.addContainerProperty("task", String.class, null); controlledTasksTable.addContainerProperty("procedure", String.class, null); controlledTasksTable.addContainerProperty("declarant", String.class, null); controlledTasksTable.addContainerProperty("version", String.class, null); controlledTasksTable.addContainerProperty("status", String.class, null); controlledTasksTable.addContainerProperty("employee", String.class, null); controlledTasksTable.addContainerProperty("priority", String.class, null); controlledTasksTable.addContainerProperty("bidDays", String.class, null); controlledTasksTable.addContainerProperty("taskDays", String.class, null); controlledTasksTable.setVisibleColumns(new Object[]{"id", "dateCreated", "task", "procedure", "declarant", "version", "status", "employee", "bidDays", "taskDays"}); controlledTasksTable.setColumnHeaders(new String[]{"Номер", "Дата подачи заявки", "Этап", "Процедура", "Заявитель", "Версия", "Статус", "Исполнитель", "Ср.з.", "Ср.эт."}); controlledTasksTable.setColumnExpandRatio("id", 0.05f); controlledTasksTable.setColumnExpandRatio("dateCreated", 0.15f); controlledTasksTable.setColumnExpandRatio("task", 0.2f); controlledTasksTable.setColumnExpandRatio("procedure", 0.25f); controlledTasksTable.setColumnExpandRatio("declarant", 0.1f); controlledTasksTable.setColumnExpandRatio("version", 0.05f); controlledTasksTable.setColumnExpandRatio("status", 0.1f); controlledTasksTable.setColumnExpandRatio("employee", 0.1f); controlledTasksTable.setCellStyleGenerator(new TaskStylist(controlledTasksTable)); listPanel.addComponent(controlledTasksTable); final Button assignButton = new Button("Назначить исполнителя"); controlledTasksTable.addListener(new Property.ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { Table table = (Table) event.getProperty(); Item item = table.getItem(table.getValue()); if (item != null && item.getItemProperty("id") != null) { final String taskId = item.getItemProperty("taskId").getValue().toString(); final Component procedureHistoryPanel = new ProcedureHistoryPanel(taskId); procedureHistoryPanel.addListener(new Listener() { @Override public void componentEvent(Event event) { HistoricTaskInstance historicTaskInstance = ((ProcedureHistoryPanel.HistoryStepClickedEvent) event).getHistoricTaskInstance(); Date endDateTime = historicTaskInstance.getEndTime(); if (endDateTime == null) { taskIdToAssign = findTaskByHistoricInstance(historicTaskInstance); if (taskIdToAssign == null) { alreadyGone(); return; } assignButton.setVisible(true); } else { assignButton.setVisible(false); } } }); ((VerticalLayout) item1).removeAllComponents(); Task task = Flash.flash().getProcessEngine().getTaskService().createTaskQuery().taskId(taskId).singleResult(); Bid bid = Flash.flash().getAdminService().getBidByTask(taskId); String executionId = task.getExecutionId(); final ProcessDefinition def = ActivitiBean.get().getProcessDefinition(task.getProcessDefinitionId(), Flash.login()); final ShowDiagramComponentParameterObject param = new ShowDiagramComponentParameterObject(); param.changer = bidChanger; param.processDefinitionId = def.getId(); param.executionId = executionId; param.height = "300px"; param.width = null; param.windowHeader = bid == null ? "" : bid.getProcedure().getName() + " v. " + bid.getVersion(); Button showDiagram = new Button("Схема"); showDiagram.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { Execution execution = Flash.flash().getProcessEngine().getRuntimeService().createExecutionQuery().executionId(param.executionId).singleResult(); if (execution == null) { alreadyGone(); return; } ShowDiagramComponent showDiagramComponent = new ShowDiagramComponent(param); VerticalLayout layout = new VerticalLayout(); Button back = new Button("Назад"); back.addListener(new Button.ClickListener() { private static final long serialVersionUID = 4154712522487297925L; @Override public void buttonClick(com.vaadin.ui.Button.ClickEvent event) { bidChanger.back(); } }); layout.addComponent(back); layout.setSpacing(true); layout.addComponent(showDiagramComponent); bidChanger.set(layout, "showDiagram"); bidChanger.change(layout); } }); Button deleteBidButton = new Button("Отклонить заявку"); deleteBidButton.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { final Window mainWindow = getWindow(); final Window rejectWindow = new Window(); rejectWindow.setWidth("38%"); rejectWindow.center(); rejectWindow.setCaption("Внимание!"); final VerticalLayout verticalLayout = new VerticalLayout(); verticalLayout.setSpacing(true); verticalLayout.setMargin(true); final Label messageLabel = new Label("Введите причину отклонения заявки"); messageLabel.setStyleName("h2"); final TextArea textArea = new TextArea(); textArea.setSizeFull(); HorizontalLayout buttons = new HorizontalLayout(); buttons.setSpacing(true); buttons.setSizeFull(); final Button ok = new Button("Ok"); Button cancel = new Button("Cancel"); buttons.addComponent(ok); buttons.addComponent(cancel); buttons.setExpandRatio(ok, 0.99f); verticalLayout.addComponent(messageLabel); verticalLayout.addComponent(textArea); verticalLayout.addComponent(buttons); verticalLayout.setExpandRatio(textArea, 0.99f); rejectWindow.setContent(verticalLayout); mainWindow.addWindow(rejectWindow); Button.ClickListener ok1 = new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { ok.setEnabled(false); verticalLayout.removeComponent(messageLabel); verticalLayout.removeComponent(textArea); final byte[] block; final String textAreaValue = (String) textArea.getValue(); if (textAreaValue != null) { block = textAreaValue.getBytes(); } else { block = null; } Label reason = new Label(textAreaValue); reason.setCaption("Причина отказа:"); verticalLayout.addComponent(reason, 0); event.getButton().removeListener(this); SignApplet signApplet = new SignApplet(new SignAppletListener() { @Override public void onLoading(SignApplet signApplet) { } @Override public void onNoJcp(SignApplet signApplet) { verticalLayout.removeComponent(signApplet); ReadOnly field = new ReadOnly("В вашей операционной системе требуется установить КриптоПРО JCP", false); verticalLayout.addComponent(field); } @Override public void onCert(SignApplet signApplet, X509Certificate certificate) { boolean ok = false; String errorClause = null; try { boolean link = AdminServiceProvider.getBoolProperty(CertificateVerifier.LINK_CERTIFICATE); if (link) { byte[] x509 = AdminServiceProvider.get().withEmployee(Flash.login(), new CertificateReader()); ok = Arrays.equals(x509, certificate.getEncoded()); } else { ok = true; } CertificateVerifyClientProvider.getInstance().verifyCertificate(certificate); } catch (CertificateEncodingException e) { } catch (CertificateInvalid err) { errorClause = err.getMessage(); ok = false; } if (ok) { signApplet.block(1, 1); } else { NameParts subject = X509.getSubjectParts(certificate); String fieldValue = (errorClause == null) ? "Сертификат " + subject.getShortName() + " отклонён" : errorClause; ReadOnly field = new ReadOnly(fieldValue, false); verticalLayout.addComponent(field, 0); } } @Override public void onBlockAck(SignApplet signApplet, int i) { logger().fine("AckBlock:" + i); signApplet.chunk(1, 1, block); } @Override public void onChunkAck(SignApplet signApplet, int i) { logger().fine("AckChunk:" + i); } @Override public void onSign(SignApplet signApplet, byte[] sign) { final int i = signApplet.getBlockAck(); logger().fine("done block:" + i); if (i < 1) { signApplet.block(i + 1, 1); } else { verticalLayout.removeComponent(signApplet); NameParts subjectParts = X509.getSubjectParts(signApplet.getCertificate()); Label field2 = new Label(subjectParts.getShortName()); field2.setCaption("Подписано сертификатом:"); verticalLayout.addComponent(field2, 0); ok.setEnabled(true); } } private Logger logger() { return Logger.getLogger(getClass().getName()); } }); byte[] x509 = AdminServiceProvider.get().withEmployee(Flash.login(), new CertificateReader()); if (x509 != null) { signApplet.setSignMode(x509); } else { signApplet.setUnboundSignMode(); } verticalLayout.addComponent(signApplet, 0); ok.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { Task result = Flash.flash().getProcessEngine().getTaskService().createTaskQuery().taskId(taskId).singleResult(); if (result == null) { alreadyGone(); return; } ActivitiBean.get().deleteProcessInstance(taskId, textAreaValue); AdminServiceProvider.get().createLog(Flash.getActor(), "activiti.task", taskId, "remove", "Отклонить заявку", true); fireTaskChangedEvent(taskId, SupervisorWorkplace.this); infoChanger.change(infoComponent); controlledTasksTable.setValue(null); controlledTasksTable.refresh(); mainWindow.removeWindow(rejectWindow); } }); } }; ok.addListener(ok1); cancel.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { controlledTasksTable.refresh(); mainWindow.removeWindow(rejectWindow); } }); } }); HorizontalLayout hl = new HorizontalLayout(); hl.setSizeFull(); hl.setSpacing(true); hl.addComponent(showDiagram); hl.addComponent(deleteBidButton); hl.setExpandRatio(showDiagram, 0.99f); hl.setExpandRatio(deleteBidButton, 0.01f); ((VerticalLayout) item1).addComponent(hl); ((VerticalLayout) item1).addComponent(procedureHistoryPanel); assignButton.setVisible(false); assignButton.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { ((Layout) item3).removeAllComponents(); if (taskIdToAssign != null) { ((Layout) item3).addComponent(createAssignerToTaskComponent(taskIdToAssign, (ProcedureHistoryPanel) procedureHistoryPanel, controlledTasksTable)); bidChanger.change(item3); } else { alreadyGone(); } } }); ((VerticalLayout) item1).addComponent(assignButton); infoChanger.change(bidComponent); bidChanger.change(item1); } else { ((VerticalLayout) item1).removeAllComponents(); } } }); } private String findTaskByHistoricInstance(HistoricTaskInstance historicTaskInstance) { Task task = Flash.flash().getProcessEngine().getTaskService().createTaskQuery().taskId(historicTaskInstance.getId()).singleResult(); if (task == null) { return null; } return task.getId(); } private void alreadyGone() { controlledTasksTable.refresh(); ((Layout) item3).removeAllComponents(); bidChanger.change(item3); getWindow().showNotification("Заявка уже исполнена"); } private Component createAssignerToTaskComponent(final String taskId, final ProcedureHistoryPanel procedureHistoryPanel, final ControlledTasksTable table) { final Task task = Flash.flash().getProcessEngine().getTaskService().createTaskQuery().taskId(taskId).singleResult(); final VerticalLayout verticalLayout = new VerticalLayout(); verticalLayout.setSizeFull(); verticalLayout.setSpacing(true); Button backButton = new Button("Назад"); backButton.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { bidChanger.back(); } }); verticalLayout.addComponent(backButton); HorizontalLayout horizontalLayout = new HorizontalLayout(); horizontalLayout.setSizeFull(); horizontalLayout.setSpacing(true); LazyLoadingContainer2 orgGroupsLazyQueryContainer = new LazyLoadingContainer2(new GroupsQuery(GroupsQueryDefinition.Mode.ORG, Flash.login())); final FilterTable orgGroupsTable = new FilterTable(); orgGroupsTable.setFilterBarVisible(true); orgGroupsTable.setSizeFull(); orgGroupsTable.setImmediate(true); orgGroupsTable.setSelectable(true); orgGroupsTable.setFilterDecorator(new FilterDecorator_()); orgGroupsTable.setFilterGenerator(new FilterGenerator_()); orgGroupsLazyQueryContainer.addContainerProperty("name", String.class, null); orgGroupsLazyQueryContainer.addContainerProperty("title", String.class, null); orgGroupsTable.setContainerDataSource(orgGroupsLazyQueryContainer); orgGroupsTable.setHeight("150px"); orgGroupsTable.setCaption("Доступные группы организаций"); orgGroupsTable.setColumnHeaders(new String[]{"Код группы", "Название группы"}); LazyLoadingContainer2 empGroupsLazyQueryContainer = new LazyLoadingContainer2(new GroupsQuery(GroupsQueryDefinition.Mode.EMP, Flash.login())); final FilterTable empGroupsTable = new FilterTable(); empGroupsTable.setFilterBarVisible(true); empGroupsTable.setSizeFull(); empGroupsTable.setImmediate(true); empGroupsTable.setSelectable(true); empGroupsTable.setFilterDecorator(new FilterDecorator_()); empGroupsTable.setFilterGenerator(new FilterGenerator_()); empGroupsLazyQueryContainer.addContainerProperty("name", String.class, null); empGroupsLazyQueryContainer.addContainerProperty("title", String.class, null); empGroupsTable.setContainerDataSource(empGroupsLazyQueryContainer); empGroupsTable.setCaption("Доступные группы сотрудников"); empGroupsTable.setHeight("150px"); empGroupsTable.setColumnHeaders(new String[]{"Код группы", "Название группы"}); final Table employeesTable = new Table(); employeesTable.setSizeFull(); employeesTable.setSelectable(true); employeesTable.setHeight("150px"); employeesTable.setCaption("Исполнители доступные для назначения, входящие в выбранную группу"); employeesTable.addContainerProperty("login", String.class, null); employeesTable.addContainerProperty("fio", String.class, null); employeesTable.setColumnHeaders(new String[]{"Логин", "ФИО"}); employeesTable.setVisible(false); orgGroupsTable.addListener(new ItemClickEvent.ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { if (task == null) { alreadyGone(); return; } empGroupsTable.select(null); employeesTable.setVisible(true); String groupName = event.getItem().getItemProperty("name") != null ? (String) event.getItem().getItemProperty("name").getValue() : ""; GroupMembersQueryDefinition groupMembersQueryDefinition = new GroupMembersQueryDefinition(groupName, GroupMembersQuery.Mode.ORG); LazyQueryContainer groupMembersContainer = new LazyQueryContainer(groupMembersQueryDefinition, new GroupMembersFactory(task.getId())); employeesTable.setContainerDataSource(groupMembersContainer); } }); empGroupsTable.addListener(new ItemClickEvent.ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { if (task == null) { alreadyGone(); return; } orgGroupsTable.select(null); employeesTable.setVisible(true); String groupName = event.getItem().getItemProperty("name") != null ? (String) event.getItem().getItemProperty("name").getValue() : ""; GroupMembersQueryDefinition groupMembersQueryDefinition = new GroupMembersQueryDefinition(groupName, GroupMembersQuery.Mode.SOC); LazyQueryContainer groupMembersContainer = new LazyQueryContainer(groupMembersQueryDefinition, new GroupMembersFactory(task.getId())); employeesTable.setContainerDataSource(groupMembersContainer); } }); final VerticalLayout assignButtonLayout = new VerticalLayout(); employeesTable.addListener(new ItemClickEvent.ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { if (task == null) { alreadyGone(); return; } final String assigneeLogin = event.getItem().getItemProperty("login").getValue().toString(); final String taskName = task.getName(); Button assignButton = new Button("Назначить"); assignButton.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { final String error = ActivitiBean.get().claim(taskId, assigneeLogin, Flash.login(), true); if (!StringUtils.isEmpty(error)) { getWindow() .showNotification("Нельзя назначить " + assigneeLogin + " на исполнение " + taskName, Window.Notification.TYPE_WARNING_MESSAGE); AdminServiceProvider.get().createLog(Flash.getActor(), "activiti task", taskId, "claim", "Fail claim to =>" + assigneeLogin, false); } else { getWindow() .showNotification("Назначен " + assigneeLogin + " на исполнение " + taskName); AdminServiceProvider.get().createLog(Flash.getActor(), "activiti task", taskId, "claim", "Claim to =>" + assigneeLogin, true); fireTaskChangedEvent(taskId, SupervisorWorkplace.this); } procedureHistoryPanel.refresh(); table.refresh(); bidChanger.change(item1); } }); assignButtonLayout.removeAllComponents(); assignButtonLayout.addComponent(assignButton); } }); horizontalLayout.addComponent(orgGroupsTable); horizontalLayout.addComponent(empGroupsTable); verticalLayout.addComponent(horizontalLayout); verticalLayout.addComponent(employeesTable); verticalLayout.addComponent(assignButtonLayout); return verticalLayout; } private ItemBuilder<Task> getTaskItemBuilder() { return new BatchItemBuilder<Task>() { transient Durations durations; @Override public void batchStart() { durations = new Durations(); } @Override public void batchFinish() { durations = null; } @Override public Item createItem(Task task) { final ProcessDefinition def = ActivitiBean.get().getProcessDefinition(task.getProcessDefinitionId(), Flash.login()); final PropertysetItem item = new PropertysetItem(); Bid bid = Flash.flash().getAdminService().getBidByTask(task.getId()); bid = (bid != null && bid.getId() != null) ? bid : createNullBidObject(); item.addItemProperty("id", stringProperty(bid.getId().toString())); SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm"); item.addItemProperty("dateCreated", stringProperty(formatter.format(bid.getDateCreated()))); item.addItemProperty("task", stringProperty(task.getName())); if (bid.getTag().isEmpty()) { item.addItemProperty("procedure", stringProperty(Flash.flash().getExecutorService().getProcedureNameByDefinitionId(def.getId()))); } else { item.addItemProperty("procedure", stringProperty(bid.getTag() + " - " + Flash.flash().getExecutorService().getProcedureNameByDefinitionId(def.getId()))); } item.addItemProperty("declarant", stringProperty(bid.getDeclarant())); item.addItemProperty("version", stringProperty(bid.getVersion())); item.addItemProperty("status", stringProperty(bid.getStatus().getName())); item.addItemProperty("employee", stringProperty(task.getAssignee())); item.addItemProperty("taskId", stringProperty(task.getId())); item.addItemProperty("priority", stringProperty(String.valueOf(task.getPriority()))); TaskDates td = AdminServiceProvider.get().getTaskDatesByTaskId(task.getId()); durations.fillBidAndTask(bid, td, item); return item; } private Bid createNullBidObject() { Bid bid = new Bid(); bid.setId(0L); bid.setDeclarant(""); bid.setVersion(""); bid.setStatus(BidStatus.Execute); bid.setProcedure(new Procedure()); bid.setTag(""); return bid; } }; } private void buildFilterPanel() { TaskFilter filterForm = new TaskFilter(controlledTasksQuery, controlledTasksTable, TaskFilter.Mode.Supervisor); filterComponent = filterForm; filterPanel.addComponent(filterForm); } private void buildMainLayout() { int mainLayoutWidth = 100; int filterPanelHeight = 100; int filterPanelWidth = 100; int infoPanelWidth = 100; int infoPanelHeight = 100; int listPanelHeight = 100; float listPanelRatio = 0.4f; float infoPanelRatio = 0.6f; setSizeFull(); setMargin(true); VerticalLayout rightLayout = new VerticalLayout(); filterPanel = new Panel(); infoPanel = new Panel(); listPanel = new Panel(); setFirstComponent(filterPanel); setSecondComponent(rightLayout); setSplitPosition(35); rightLayout.addComponent(infoPanel); rightLayout.addComponent(listPanel); infoPanel.setSizeFull(); listPanel.setSizeFull(); rightLayout.setSpacing(true); rightLayout.setSizeFull(); setHeight(mainLayoutWidth, UNITS_PERCENTAGE); filterPanel.setHeight(filterPanelHeight, UNITS_PERCENTAGE); filterPanel.setWidth(filterPanelWidth, UNITS_PERCENTAGE); infoPanel.setWidth(infoPanelWidth, UNITS_PERCENTAGE); infoPanel.setHeight(infoPanelHeight, UNITS_PERCENTAGE); listPanel.setHeight(listPanelHeight, UNITS_PERCENTAGE); listPanel.setWidth(listPanelHeight, UNITS_PERCENTAGE); rightLayout.setExpandRatio(listPanel, listPanelRatio); rightLayout.setExpandRatio(infoPanel, infoPanelRatio); } static private void fireTaskChangedEvent(final String taskId, final Object source) { Flash.fire(new TaskChanged(source, taskId)); } }