/*
* 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.manager;
import com.vaadin.Application;
import com.vaadin.addon.jpacontainer.JPAContainer;
import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
import com.vaadin.data.Item;
import com.vaadin.data.util.PropertysetItem;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomTable;
import com.vaadin.ui.Form;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import org.tepi.filtertable.FilterTable;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.adm.database.Directory;
import ru.codeinside.adm.database.ProcedureType;
import ru.codeinside.adm.ui.FilterDecorator_;
import ru.codeinside.adm.ui.LazyLoadingContainer2;
import ru.codeinside.gses.apservice.ApServiceForm;
import ru.codeinside.gses.apservice.ApServiceTable;
import ru.codeinside.gses.beans.DirectoryBeanProvider;
import ru.codeinside.gses.manager.ProcedureFilter;
import ru.codeinside.gses.manager.ProcedureForm;
import ru.codeinside.gses.manager.ProcedureTable;
import ru.codeinside.gses.service.impl.DeclarantServiceImpl;
import ru.codeinside.jpa.ActivitiEntityManager;
import ru.codeinside.gses.webui.DeclarantTypeChanged;
import ru.codeinside.gses.webui.Flash;
import ru.codeinside.gses.webui.form.FileDownloadResource;
import ru.codeinside.gses.webui.utils.Components;
import java.io.File;
import java.util.List;
public class ManagerWorkplace extends VerticalLayout {
private ApServiceForm ap;
private static final long serialVersionUID = 111L;
private final Component servicePanel;
private final Component procedurePanel;
private final Component directoryPanel;
private ProcedureForm procedureForm;
private ProcedureTable procedureTable;
private ProcedureFilter filter;
public ManagerWorkplace() {
setSizeFull();
servicePanel = createServicePanel();
procedurePanel = createProcedurePanel1();
directoryPanel = DirectoryPanel.createDirectoryPanel();
final MenuBar menu = new MenuBar();
menu.setWidth("100%");
menu.addStyleName("submenu");
MenuBar.MenuItem servicesItem = menu.addItem("Услуги", new MenuBar.Command() {
@Override
public void menuSelected(MenuBar.MenuItem selectedItem) {
chooseTab(selectedItem, menu, servicePanel, procedurePanel, directoryPanel);
}
});
MenuBar.MenuItem administrativeProceduresItem = menu.addItem("Административные процедуры", new MenuBar.Command() {
@Override
public void menuSelected(MenuBar.MenuItem selectedItem) {
chooseTab(selectedItem, menu, procedurePanel, servicePanel, directoryPanel);
activateApInterface();
}
});
menu.addItem("Межведомственные процедуры", new MenuBar.Command() {
@Override
public void menuSelected(MenuBar.MenuItem selectedItem) {
chooseTab(selectedItem, menu, procedurePanel, servicePanel, directoryPanel);
activateMpInterface();
}
});
menu.addItem("Ведение справочников", new MenuBar.Command() {
@Override
public void menuSelected(MenuBar.MenuItem selectedItem) {
chooseTab(selectedItem, menu, directoryPanel, servicePanel, procedurePanel);
activateMpInterface();
}
});
addComponent(menu);
setExpandRatio(menu, 0.01f);
administrativeProceduresItem.getCommand().menuSelected(administrativeProceduresItem);
}
private void activateApInterface() {
filter.setServiceFilterEnabled(true);
procedureTable.bindToDataSource(ProcedureType.Administrative);
procedureForm.clean();
procedureForm.setProcedureType(ProcedureType.Administrative);
}
private void activateMpInterface() {
filter.setServiceFilterEnabled(false);
procedureTable.bindToDataSource(ProcedureType.Interdepartmental);
procedureForm.clean();
procedureForm.setProcedureType(ProcedureType.Interdepartmental);
}
private void chooseTab(MenuBar.MenuItem selectedItem, MenuBar menu, Component componentToShow, Component... componentToHides) {
List<MenuBar.MenuItem> items = menu.getItems();
for (MenuBar.MenuItem i : items) {
i.setEnabled(true);
}
selectedItem.setEnabled(false);
for (Component componentToHide : componentToHides) {
if (components.contains(componentToHide)) {
removeComponent(componentToHide);
}
}
addComponent(componentToShow);
setExpandRatio(componentToShow, 0.99f);
}
private Component createProcedurePanel1() {
HorizontalLayout hl = new HorizontalLayout();
hl.setSpacing(true);
hl.setWidth("100%");
hl.setHeight("100%");
Panel panel00 = new Panel();
panel00.setHeight("100%");
panel00.setWidth("100%");
Panel panel01 = new Panel();
panel01.setWidth("100%");
panel01.setHeight("100%");
Panel panel10 = new Panel();
panel10.setSizeFull();
panel10.setScrollable(false);
hl.addComponent(panel00);
hl.addComponent(panel01);
VerticalLayout vl = new VerticalLayout();
vl.setSizeFull();
vl.setMargin(true);
vl.setSpacing(true);
vl.addComponent(hl);
vl.addComponent(panel10);
hl.setExpandRatio(panel00, 0.33f);
hl.setExpandRatio(panel01, 0.77f);
vl.setExpandRatio(hl, 0.6f);
vl.setExpandRatio(panel10, 0.4f);
procedureForm = new ProcedureForm();
procedureTable = new ProcedureTable(procedureForm);
filter = createFilteringForm(procedureTable);
panel00.addComponent(filter);
panel01.addComponent(procedureForm);
panel10.addComponent(procedureTable);
ap.addItemSetChangeListener(filter);
ap.addItemSetChangeListener(procedureForm);
return vl;
}
static void refreshDirectoryTable(FilterTable directoryTable) {
directoryTable.resetFilters();
((JPAContainer<Directory>) directoryTable.getContainerDataSource()).refresh();
directoryTable.requestRepaint();
}
static Button.ClickListener createDeleteEntryListener(final Table dirMapTable, final String dirName, final String key) {
return new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
DirectoryBeanProvider.get().remove(dirName, key);
AdminServiceProvider.get().createLog(Flash.getActor(), "Directory value", dirName, "remove",
"key => " .concat(key), true);
reloadMap(dirName, dirMapTable);
if (DeclarantServiceImpl.DECLARANT_TYPES.equals(dirName)) {
Flash.fire(new DeclarantTypeChanged(this));
}
}
};
}
static void reloadMap(final String dirName, final Table dirMapTable) {
LazyLoadingContainer2 lazyLoadingContainer2 = new LazyLoadingContainer2(new DictionaryQuery(dirName) {
public Item createItem(String key, String value) {
PropertysetItem item = new PropertysetItem();
item.addItemProperty("key", Components.stringProperty(key));
item.addItemProperty("value", Components.stringProperty(value));
item.addItemProperty("form", Components.buttonProperty("Удалить", createDeleteEntryListener(dirMapTable, dirName, key)));
return item;
}
});
lazyLoadingContainer2.addContainerProperty("key", String.class, null);
lazyLoadingContainer2.addContainerProperty("value", String.class, null);
lazyLoadingContainer2.addContainerProperty("form", Component.class, null);
dirMapTable.setContainerDataSource(lazyLoadingContainer2);
dirMapTable.setVisibleColumns(new Object[]{"key", "value", "form"});
dirMapTable.setColumnHeaders(new String[]{"Ключ", "Значение", ""});
}
static FilterTable createDirectoryTable() {
final FilterTable directoryTable = new FilterTable();
directoryTable.setPageLength(0);
directoryTable.setFilterDecorator(new FilterDecorator_());
directoryTable.setSizeFull();
directoryTable.setFilterBarVisible(true);
directoryTable.setSelectable(true);
directoryTable.setImmediate(true);
directoryTable.setRowHeaderMode(Table.ROW_HEADER_MODE_HIDDEN);
directoryTable.setColumnCollapsingAllowed(true);
directoryTable.setColumnReorderingAllowed(true);
directoryTable.setMultiSelect(false);
return directoryTable;
}
static Table createDirectoryMapTable() {
final Table mapTable = Components.createTable("100%", "100%");
mapTable.setPageLength(0);
mapTable.setCaption("Значения справочника");
mapTable.setSelectable(false);
return mapTable;
}
static void buildContainer(final FilterTable table, final Form createFieldForm, final Table mapTable) {
final JPAContainer<Directory> container = new JPAContainer<Directory>(Directory.class);
container.setReadOnly(true);
container.setEntityProvider(new CachingLocalEntityProvider<Directory>(Directory.class, ActivitiEntityManager.INSTANCE));
table.setContainerDataSource(container);
table.addGeneratedColumn("buttonDelete", new CustomTable.ColumnGenerator() {
private static final long serialVersionUID = 1L;
public Object generateCell(final CustomTable source, final Object itemId, final Object columnId) {
Button button = new Button("Удалить", new Button.ClickListener() {
private static final long serialVersionUID = 1L;
public void buttonClick(Button.ClickEvent event) {
String dirName = table.getItem(itemId).getItemProperty("name").toString();
DirectoryBeanProvider.get().delete(dirName);
AdminServiceProvider.get().createLog(Flash.getActor(), "Directory", dirName, "remove",
"key => " .concat(dirName), true);
refreshDirectoryTable(table);
mapTable.setVisible(false);
createFieldForm.setVisible(false);
if (DeclarantServiceImpl.DECLARANT_TYPES.equals(dirName)) {
Flash.fire(new DeclarantTypeChanged(this));
}
}
});
return button;
}
});
table.addGeneratedColumn("buttonDownload", new CustomTable.ColumnGenerator() {
private static final long serialVersionUID = 1L;
public Object generateCell(final CustomTable source, final Object itemId, final Object columnId) {
Button downloads = new Button("Выгрузить", new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
String dirName = table.getItem(itemId).getItemProperty("name").toString();
File tmpFile = DirectoryBeanProvider.get().createTmpFile(dirName);
final Application appl = event.getButton().getApplication();
AdminServiceProvider.get().createLog(Flash.getActor(), "Directory", dirName, "download",
"key => " .concat(dirName), true);
Window window = event.getButton().getWindow();
window.open(new FileDownloadResource(true, tmpFile, appl), "_top", false);
}
});
return downloads;
}
});
table.setVisibleColumns(new Object[]{"name", "buttonDelete", "buttonDownload"});
}
private ProcedureFilter createFilteringForm(ProcedureTable procedureTable) {
ProcedureFilter filter = new ProcedureFilter("Фильтр");
filter.setProcedureTable(procedureTable);
return filter;
}
private VerticalLayout createServicePanel() {
final VerticalLayout serviceVerticalLayout = new VerticalLayout();
serviceVerticalLayout.setSizeFull();
ap = new ApServiceForm();
Panel apForm = new Panel();
apForm.addComponent(ap);
apForm.setHeight("350px");
Panel importForm = new Panel();
ApServiceTable apServiceTable = new ApServiceTable(ap);
apServiceTable.setSizeFull();
Form form = new Form(new ServiceWidget(apServiceTable));
form.setCaption("Импортировать услуги");
importForm.addComponent(form);
importForm.setHeight("350px");
HorizontalLayout hr = new HorizontalLayout();
hr.setSizeFull();
hr.setSpacing(true);
hr.addComponent(apForm);
hr.addComponent(importForm);
serviceVerticalLayout.addComponent(hr);
Panel apTable = new Panel("Список доступных услуг");
apTable.addComponent(apServiceTable);
apTable.setSizeFull();
serviceVerticalLayout.addComponent(apTable);
serviceVerticalLayout.setSpacing(true);
serviceVerticalLayout.setMargin(true);
return serviceVerticalLayout;
}
}