/*
* 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.adm.ui;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import com.vaadin.ui.*;
import org.tepi.filtertable.FilterTable;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.adm.database.Employee;
import ru.codeinside.adm.database.Group;
import ru.codeinside.adm.database.Organization;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import ru.codeinside.gses.webui.supervisor.ConfirmWindow;
public class GroupEditor extends VerticalLayout {
private static final long serialVersionUID = 1L;
private final Group group;
private String typeGroup;
private final FilterTable table;
GroupEditor(final String typeGroup, String nameGroup, FilterTable table) {
this.table = table;
group = getGroup(nameGroup);
this.typeGroup = typeGroup;
setSpacing(true);
showEditor(nameGroup);
}
private void showEditor(String nameGroup) {
List<Group> groups = AdminServiceProvider.get().findGroupByName(nameGroup);
for (final Group g : groups) {
Label header = new Label("Редактирование группы: " + g.getTitle() + " (" + nameGroup + ")");
header.setStyleName("h2");
addComponent(header);
Button delete = new Button("Удалить", new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
String confirmMessage = "Вы уверены, что хотите удалить группу?";
Window confirmWindow = new ConfirmWindow(confirmMessage);
confirmWindow.addListener(new Listener() {
@Override
public void componentEvent(Event event) {
if(event instanceof ConfirmWindow.ConfirmOkEvent){
AdminServiceProvider.get().deleteGroup(g.getId());
table.removeItem(g.getName());
}
}
});
getWindow().addWindow(confirmWindow);
}
});
addComponent(delete);
}
final FilterTable all = new FilterTable();
all.setCaption("Все доступные " + typeGroup.toLowerCase());
table(all);
final FilterTable current = new FilterTable();
current.setCaption("Выбранные " + typeGroup.toLowerCase());
table(current);
addListener(all, current, current);
addListener(current, all, current);
addTableContent(all, current);
}
private void addTableContent(final FilterTable all, final FilterTable current) {
if (typeGroup == GroupTab.ORGANIZATION) {
List<Organization> allOrganizations = AdminServiceProvider.get().findAllOrganizations();
Set<Organization> groupOrganizations = group.getOrganizations();
for (Organization org : allOrganizations) {
all.addItem(new Object[]{org.getName()}, org.getId());
}
for (Organization org : groupOrganizations) {
all.removeItem(org.getId());
current.addItem(new Object[]{org.getName()}, org.getId());
}
} else if (typeGroup == GroupTab.EMPLOYEE) {
List<Employee> allEmployees = AdminServiceProvider.get().findAllEmployees();
Set<Employee> groupEmployees = group.getEmployees();
for (Employee emp : allEmployees) {
all.addItem(new Object[]{emp.getLogin(), emp.getOrganization().getName()}, emp.getLogin());
}
for (Employee emp : groupEmployees) {
all.removeItem(emp.getLogin());
current.addItem(new Object[]{emp.getLogin(), emp.getOrganization().getName()}, emp.getLogin());
}
}
}
private void addListener(final FilterTable one, final FilterTable two, final FilterTable current) {
one.addListener(new Property.ValueChangeListener() {
private static final long serialVersionUID = 1L;
public void valueChange(ValueChangeEvent event) {
Object value = event.getProperty().getValue();
if (value != null) {
if (typeGroup == GroupTab.ORGANIZATION) {
one.removeItem(value);
Organization org = AdminServiceProvider.get().findOrganizationById((Long) value);
two.addItem(new Object[]{org.getName()}, org.getId());
} else if (typeGroup == GroupTab.EMPLOYEE) {
one.removeItem(value);
Employee emp = AdminServiceProvider.get().findEmployeeByLogin(value.toString());
two.addItem(new Object[]{emp.getLogin(), emp.getOrganization().getName()}, emp.getLogin());
}
saveChangesInDatabase(current);
}
}
});
}
private void saveChangesInDatabase(final FilterTable current) {
Collection<?> ids = current.getItemIds();
TreeSet<String> setString = new TreeSet<String>();
for (Object id : ids) {
setString.add(id.toString());
}
if (typeGroup == GroupTab.ORGANIZATION) {
AdminServiceProvider.get().setOrganizationInGroup(group, setString);
} else if (typeGroup == GroupTab.EMPLOYEE) {
AdminServiceProvider.get().setEmloyeeInGroup(group, setString);
}
}
private void table(FilterTable table) {
if (typeGroup == GroupTab.ORGANIZATION) {
table.addContainerProperty("Организация", String.class, null);
} else if (typeGroup == GroupTab.EMPLOYEE) {
table.addContainerProperty("Логин", String.class, null);
table.addContainerProperty("Организация", String.class, null);
}
table.setSizeFull();
table.setHeight("250px");
table.setSelectable(true);
table.setMultiSelect(false);
table.setImmediate(true);
table.setFilterBarVisible(true);
table.setFilterDecorator(new FilterDecorator_());
addComponent(table);
}
private Group getGroup(String nameGroup) {
List<Group> groups = AdminServiceProvider.get().findGroupByName(nameGroup);
Group group = null;
for (Group g : groups) {
group = g;
}
return group;
}
}