diff --git a/pom.xml b/pom.xml index 6d000cb..08323dc 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,11 @@ com.vaadin vaadin-push + + org.vaadin.teemu + switch + 3.0.0 + org.hibernate hibernate-core diff --git a/src/main/java/META-INF/persistence.xml b/src/main/java/META-INF/persistence.xml index 55b1f46..0c77216 100644 --- a/src/main/java/META-INF/persistence.xml +++ b/src/main/java/META-INF/persistence.xml @@ -1,6 +1,8 @@ - + + org.hibernate.ejb.HibernatePersistence + schema/ClubEvent.hbm.xml de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Adress de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Attendance de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Contact @@ -12,5 +14,12 @@ de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpaesse de.kreth.vaadin.clubhelper.vaadinclubhelper.data.StartpassStartrechte de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Version + + + + + + + diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java index 3df18e3..4c227ce 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java @@ -5,11 +5,14 @@ import java.util.Date; import java.util.List; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @@ -42,8 +45,10 @@ public class GroupDef implements Serializable { private String name; - // bi-directional many-to-one association to Persongroup - @OneToMany(mappedBy = "groupDef") + @ManyToMany(fetch=FetchType.LAZY) + @JoinTable (name = "persongroup", + joinColumns = { @JoinColumn(name = "group_id") }, + inverseJoinColumns = { @JoinColumn(name = "person_id") }) private List persongroups; public GroupDef() { @@ -116,4 +121,32 @@ public class GroupDef implements Serializable { return "GroupDef [id=" + id + ", name=" + name + "]"; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + id; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + GroupDef other = (GroupDef) obj; + if (id != other.id) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + } \ No newline at end of file diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java index a0d83db..d045eae 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java @@ -56,9 +56,12 @@ public class Person implements Serializable { @OneToMany(mappedBy = "person") private List contacts; - // bi-directional many-to-one association to Persongroup - @OneToMany(mappedBy = "person") - private List persongroups; + // bi-directional many-to-many association to Persongroup + @ManyToMany(fetch=FetchType.EAGER) + @JoinTable (name = "persongroup", + joinColumns = { @JoinColumn(name = "person_id") }, + inverseJoinColumns = { @JoinColumn(name = "group_id") }) + private List groups; // bi-directional many-to-one association to Relative @OneToMany(mappedBy = "person1Bean") @@ -72,7 +75,7 @@ public class Person implements Serializable { @OneToMany(mappedBy = "person") private List startpaesses; - @ManyToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY) + @ManyToMany(cascade = { CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.DETACH }, fetch = FetchType.LAZY) @JoinTable( name = "clubevent_has_person", joinColumns = { @JoinColumn(name = "person_id") }, @@ -221,26 +224,20 @@ public class Person implements Serializable { return contact; } - public List getPersongroups() { - return this.persongroups; + public List getPersongroups() { + return this.groups; } - public void setPersongroups(List persongroups) { - this.persongroups = persongroups; + public void setPersongroups(List persongroups) { + this.groups = persongroups; } - public Persongroup addPersongroup(Persongroup persongroup) { + public void addPersongroup(GroupDef persongroup) { getPersongroups().add(persongroup); - persongroup.setPerson(this); - - return persongroup; } - public Persongroup removePersongroup(Persongroup persongroup) { + public void removePersongroup(GroupDef persongroup) { getPersongroups().remove(persongroup); - persongroup.setPerson(null); - - return persongroup; } public List getRelatives1() { diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Persongroup.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Persongroup.java index 2671105..4466b8d 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Persongroup.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Persongroup.java @@ -88,4 +88,44 @@ public class Persongroup implements Serializable { this.groupDef = groupDef; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((deleted == null) ? 0 : deleted.hashCode()); + result = prime * result + ((groupDef == null) ? 0 : groupDef.hashCode()); + result = prime * result + id; + result = prime * result + ((person == null) ? 0 : person.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Persongroup other = (Persongroup) obj; + if (deleted == null) { + if (other.deleted != null) + return false; + } else if (!deleted.equals(other.deleted)) + return false; + if (groupDef == null) { + if (other.groupDef != null) + return false; + } else if (!groupDef.equals(other.groupDef)) + return false; + if (id != other.id) + return false; + if (person == null) { + if (other.person != null) + return false; + } else if (!person.equals(other.person)) + return false; + return true; + } + } \ No newline at end of file diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Relative.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Relative.java index e707166..a241982 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Relative.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Relative.java @@ -111,4 +111,56 @@ public class Relative implements Serializable { this.person2Bean = person2Bean; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((deleted == null) ? 0 : deleted.hashCode()); + result = prime * result + id; + result = prime * result + ((person1Bean == null) ? 0 : person1Bean.hashCode()); + result = prime * result + ((person2Bean == null) ? 0 : person2Bean.hashCode()); + result = prime * result + ((toPerson1Relation == null) ? 0 : toPerson1Relation.hashCode()); + result = prime * result + ((toPerson2Relation == null) ? 0 : toPerson2Relation.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Relative other = (Relative) obj; + if (deleted == null) { + if (other.deleted != null) + return false; + } else if (!deleted.equals(other.deleted)) + return false; + if (id != other.id) + return false; + if (person1Bean == null) { + if (other.person1Bean != null) + return false; + } else if (!person1Bean.equals(other.person1Bean)) + return false; + if (person2Bean == null) { + if (other.person2Bean != null) + return false; + } else if (!person2Bean.equals(other.person2Bean)) + return false; + if (toPerson1Relation == null) { + if (other.toPerson1Relation != null) + return false; + } else if (!toPerson1Relation.equals(other.toPerson1Relation)) + return false; + if (toPerson2Relation == null) { + if (other.toPerson2Relation != null) + return false; + } else if (!toPerson2Relation.equals(other.toPerson2Relation)) + return false; + return true; + } + } \ No newline at end of file diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Startpaesse.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Startpaesse.java index 437f97e..1be213c 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Startpaesse.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Startpaesse.java @@ -113,4 +113,50 @@ public class Startpaesse implements Serializable { return startpassStartrechte; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((deleted == null) ? 0 : deleted.hashCode()); + result = prime * result + id; + result = prime * result + ((person == null) ? 0 : person.hashCode()); + result = prime * result + ((startpassNr == null) ? 0 : startpassNr.hashCode()); + result = prime * result + ((startpassStartrechtes == null) ? 0 : startpassStartrechtes.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Startpaesse other = (Startpaesse) obj; + if (deleted == null) { + if (other.deleted != null) + return false; + } else if (!deleted.equals(other.deleted)) + return false; + if (id != other.id) + return false; + if (person == null) { + if (other.person != null) + return false; + } else if (!person.equals(other.person)) + return false; + if (startpassNr == null) { + if (other.startpassNr != null) + return false; + } else if (!startpassNr.equals(other.startpassNr)) + return false; + if (startpassStartrechtes == null) { + if (other.startpassStartrechtes != null) + return false; + } else if (!startpassStartrechtes.equals(other.startpassStartrechtes)) + return false; + return true; + } + } \ No newline at end of file diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/MainUi.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/MainUi.java index 086575c..72d1891 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/MainUi.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/MainUi.java @@ -16,10 +16,8 @@ import com.vaadin.event.selection.SelectionEvent; import com.vaadin.server.VaadinRequest; import com.vaadin.shared.communication.PushMode; import com.vaadin.spring.annotation.SpringUI; -import com.vaadin.ui.CheckBox; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.UI; -import com.vaadin.ui.VerticalLayout; import de.kreth.vaadin.clubhelper.vaadinclubhelper.business.EventBusiness; import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.GroupDao; @@ -27,6 +25,7 @@ import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.PersonDao; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.CalendarComponent; +import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.PersonEditDialog; import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.PersonGrid; @Theme("vaadin-clubhelpertheme") @@ -57,12 +56,13 @@ public class MainUi extends UI { LOGGER.debug("Starting Vaadin UI with " + getClass().getName()); - List persons = personDao.list(); + List persons = personDao.listAll(); personGrid = new PersonGrid(groupDao); personGrid.setItems(persons); personGrid.setCaption("Personen"); personGrid.onClosedFunction(() -> detailClosed()); personGrid.onPersonSelect(ev -> personSelectionChange(ev)); + personGrid.onPersonEdit(p -> onPersonEdit(p)); this.calendar = new CalendarComponent(); calendar.setHandler(this::onItemClick); @@ -74,16 +74,6 @@ public class MainUi extends UI { setContent(contentLayout); setSizeFull(); -// final List events = eventBusiness.loadEvents(request); -// calendar.setItems(events); -// for (ClubEvent ev : events) { -// if (ev.getPersons() != null && ev.getPersons().size()>0) { -// System.out.println(ev.getCaption()); -// for (Person p: ev.getPersons()) { -// System.out.println("\t" + p.getPrename() + "=" + persons.contains(p)); -// } -// } -// } ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(() -> { @@ -97,11 +87,17 @@ public class MainUi extends UI { }); exec.shutdown(); + LOGGER.info("Loaded UI and started fetch of Events"); } + private void onPersonEdit(Person p) { + PersonEditDialog dlg = new PersonEditDialog(groupDao.listAll(), p, personDao); + getUI().addWindow(dlg); + } + private void personSelectionChange(SelectionEvent ev) { Set selected = ev.getAllSelectedItems(); - System.out.println("Selection changed to: " + selected); + LOGGER.debug("Selection changed to: {}", selected); eventBusiness.changePersons(selected); } @@ -119,8 +115,10 @@ public class MainUi extends UI { personGrid.setCaption(ev.getCaption()); personGrid.setTitle(ev.getCaption()); - personGrid.setVisible(true); + personGrid.setEnabled(false); personGrid.selectItems(ev.getPersons()); + personGrid.setVisible(true); + personGrid.setEnabled(true); eventBusiness.setSelected(ev); } diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDialog.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDialog.java new file mode 100644 index 0000000..b20fa5f --- /dev/null +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDialog.java @@ -0,0 +1,78 @@ +package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; + +import java.util.ArrayList; +import java.util.List; + +import org.vaadin.teemu.switchui.Switch; + +import com.vaadin.data.Binder; +import com.vaadin.data.HasValue.ValueChangeEvent; +import com.vaadin.ui.Button; +import com.vaadin.ui.Panel; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.PersonDao; +import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef; +import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; + +public class PersonEditDialog extends Window { + + private static final long serialVersionUID = 4692332924201974714L; + private final TextField textPrename; + private final TextField textSureName; + private final Person person; + + private final Binder binder; + + public PersonEditDialog(List groups, Person person, PersonDao dao) { + this.person = person; + + textPrename = new TextField(); + textSureName = new TextField(); + Panel groupPanel = new Panel("Gruppen"); + VerticalLayout glay = new VerticalLayout(); + groupPanel.setContent(glay); + List selected = new ArrayList<>(); + for (GroupDef tmp : person.getPersongroups()) { + selected.add(tmp); + } + for (GroupDef g: groups) { + Switch sw = new Switch(g.getName()); + sw.setData(g); + sw.setValue(selected.contains(g)); + sw.addValueChangeListener(ev -> groupChanged(ev)); + glay.addComponent(sw); + } + + binder = new Binder<>(); + binder.forField(textPrename).bind(Person::getPrename, Person::setPrename); + binder.forField(textSureName).bind(Person::getSurname, Person::setSurname); + binder.readBean(person); + + Button close = new Button("Schließen"); + close.addClickListener(ev -> PersonEditDialog.this.close()); + Button ok = new Button("Speichern"); + ok.addClickListener(ev -> { + binder.writeBeanIfValid(person); + dao.update(person); + }); + VerticalLayout layout = new VerticalLayout(); + layout.addComponents(textPrename, textSureName, groupPanel, close, ok); + setContent(layout); + + } + + private void groupChanged(ValueChangeEvent ev) { + GroupDef group = (GroupDef) ((Switch)ev.getComponent()).getData(); + List pg = person.getPersongroups(); + if (ev.getValue()) { + pg.add(group); + } else { + pg.remove(group); + } + } + + +} diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGrid.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGrid.java index e57e0a5..b96226f 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGrid.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGrid.java @@ -3,16 +3,22 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Predicate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.vaadin.data.HasValue.ValueChangeEvent; +import com.vaadin.data.provider.ConfigurableFilterDataProvider; import com.vaadin.data.provider.ListDataProvider; import com.vaadin.event.selection.SelectionListener; import com.vaadin.event.selection.SingleSelectionEvent; +import com.vaadin.icons.VaadinIcons; +import com.vaadin.server.SerializablePredicate; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.ComboBox; @@ -23,11 +29,11 @@ import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.MultiSelect; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.GroupDao; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; -import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Persongroup; public class PersonGrid extends CustomComponent { @@ -44,8 +50,12 @@ public class PersonGrid extends CustomComponent { private final TextField textTitle; - private final ListDataProvider dataProvider; private ClosedFunction closedFunction = null; + private ConfigurableFilterDataProvider> dataProvider; + private Boolean selectedOnlyFilter; + private Set groupMemberFilter; + private List allGroups; + private Consumer onPersonEdit; public PersonGrid(GroupDao groupDao) { @@ -91,14 +101,59 @@ public class PersonGrid extends CustomComponent { setCompositionRoot(panel); } + private Button buildDeleteButton(Person p) { + Button button = new Button(VaadinIcons.EDIT); + button.addStyleName(ValoTheme.BUTTON_SMALL); + button.addClickListener(e -> showPersonDetails(p)); + return button; + } + + private void showPersonDetails(Person p) { + if (onPersonEdit != null) { + onPersonEdit.accept(p); + } + } + public void onClosedFunction(ClosedFunction closedFunction) { this.closedFunction = closedFunction; } private void onSelectedOnly(ValueChangeEvent ev) { - dataProvider.clearFilters(); - Set selected = grid.getSelectedItems(); - dataProvider.addFilter(p -> selected.contains(p)); + this.selectedOnlyFilter = ev.getValue(); + updateFilter(); + } + + private void updateFilter() { + Predicate filter = p -> true; + if (selectedOnlyFilter!= null && selectedOnlyFilter.equals(Boolean.TRUE)) { + Set selected = grid.getSelectedItems(); + filter = p -> selected.contains(p); + } + if (groupMemberFilter != null && groupMemberFilter.isEmpty() == false) { + final Set groupIds = new HashSet<>(); + groupMemberFilter.forEach(gm -> { + groupIds.add(gm.getId()); + }); + + filter = filter.and(p -> { + { + List personGroups = p.getPersongroups(); + for (GroupDef pg : personGroups) { + if (groupIds.contains(pg.getId())) { + return true; + } + } + return false; + } + }); + } + + setFilter(filter); + } + + public void setFilter(Predicate filter) { + dataProvider.setFilter(p -> filter.test(p)); + grid.getDataProvider().refreshAll(); } public void onPersonSelect(SelectionListener listener) throws UnsupportedOperationException { @@ -128,17 +183,9 @@ public class PersonGrid extends CustomComponent { } private void onGroupSelected(SingleSelectionEvent ev) { - dataProvider.clearFilters(); - final Set groups = ev.getAllSelectedItems(); - dataProvider.addFilter(p -> { - List pgs = p.getPersongroups(); - for (Persongroup pg : pgs) { - if (groups.contains(pg.getGroupDef())) { - return true; - } - } - return false; - }); + + groupMemberFilter = ev.getAllSelectedItems(); + updateFilter(); } public void setTitle(String value) { @@ -161,6 +208,12 @@ public class PersonGrid extends CustomComponent { } public void selectItems(Collection persons) { + log.debug("Selecting now: {}" + persons); selectItems(persons.toArray(new Person[0])); } + + public void onPersonEdit(Consumer function) { + this.onPersonEdit = function; + } + } diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml index 3786a5e..45363c8 100644 --- a/src/main/resources/hibernate.cfg.xml +++ b/src/main/resources/hibernate.cfg.xml @@ -17,6 +17,6 @@ org.hibernate.context.internal.ThreadLocalSessionContext - + diff --git a/src/main/resources/schema/ClubEvent.hbm.xml b/src/main/resources/schema/ClubEvent.hbm.xml index 1d63fc5..4633e4b 100644 --- a/src/main/resources/schema/ClubEvent.hbm.xml +++ b/src/main/resources/schema/ClubEvent.hbm.xml @@ -25,7 +25,7 @@ - +