Person Edit dialog with Group editor

master
Markus Kreth 7 years ago
parent 4c228dc743
commit 0e5e93bb8c
  1. 5
      pom.xml
  2. 11
      src/main/java/META-INF/persistence.xml
  3. 39
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/GroupDef.java
  4. 29
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java
  5. 40
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Persongroup.java
  6. 52
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Relative.java
  7. 46
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Startpaesse.java
  8. 28
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/MainUi.java
  9. 78
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDialog.java
  10. 83
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGrid.java
  11. 2
      src/main/resources/hibernate.cfg.xml
  12. 2
      src/main/resources/schema/ClubEvent.hbm.xml

@ -54,6 +54,11 @@
<groupId>com.vaadin</groupId>
<artifactId>vaadin-push</artifactId>
</dependency>
<dependency>
<groupId>org.vaadin.teemu</groupId>
<artifactId>switch</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>

@ -1,6 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="vaadin-clubhelper">
<persistence-unit name="vaadin-clubhelper" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<mapping-file>schema/ClubEvent.hbm.xml</mapping-file>
<class>de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Adress</class>
<class>de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Attendance</class>
<class>de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Contact</class>
@ -12,5 +14,12 @@
<class>de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpaesse</class>
<class>de.kreth.vaadin.clubhelper.vaadinclubhelper.data.StartpassStartrechte</class>
<class>de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Version</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="localhost:3306"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="07!73"/>
<property name="javax.persistence.schema-generation.scripts.action" value="create"/>
</properties>
</persistence-unit>
</persistence>

@ -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<Persongroup> 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;
}
}

@ -56,9 +56,12 @@ public class Person implements Serializable {
@OneToMany(mappedBy = "person")
private List<Contact> contacts;
// bi-directional many-to-one association to Persongroup
@OneToMany(mappedBy = "person")
private List<Persongroup> 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<GroupDef> 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<Startpaesse> 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<Persongroup> getPersongroups() {
return this.persongroups;
public List<GroupDef> getPersongroups() {
return this.groups;
}
public void setPersongroups(List<Persongroup> persongroups) {
this.persongroups = persongroups;
public void setPersongroups(List<GroupDef> 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<Relative> getRelatives1() {

@ -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;
}
}

@ -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;
}
}

@ -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;
}
}

@ -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<Person> persons = personDao.list();
List<Person> 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<ClubEvent> 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<Person> ev) {
Set<Person> 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);
}

@ -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<Person> binder;
public PersonEditDialog(List<GroupDef> 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<GroupDef> 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<Boolean> ev) {
GroupDef group = (GroupDef) ((Switch)ev.getComponent()).getData();
List<GroupDef> pg = person.getPersongroups();
if (ev.getValue()) {
pg.add(group);
} else {
pg.remove(group);
}
}
}

@ -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<Person> dataProvider;
private ClosedFunction closedFunction = null;
private ConfigurableFilterDataProvider<Person, Void, SerializablePredicate<Person>> dataProvider;
private Boolean selectedOnlyFilter;
private Set<GroupDef> groupMemberFilter;
private List<GroupDef> allGroups;
private Consumer<Person> 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<Boolean> ev) {
dataProvider.clearFilters();
this.selectedOnlyFilter = ev.getValue();
updateFilter();
}
private void updateFilter() {
Predicate<Person> filter = p -> true;
if (selectedOnlyFilter!= null && selectedOnlyFilter.equals(Boolean.TRUE)) {
Set<Person> selected = grid.getSelectedItems();
dataProvider.addFilter(p -> selected.contains(p));
filter = p -> selected.contains(p);
}
if (groupMemberFilter != null && groupMemberFilter.isEmpty() == false) {
final Set<Integer> groupIds = new HashSet<>();
groupMemberFilter.forEach(gm -> {
groupIds.add(gm.getId());
});
filter = filter.and(p -> {
{
List<GroupDef> personGroups = p.getPersongroups();
for (GroupDef pg : personGroups) {
if (groupIds.contains(pg.getId())) {
return true;
}
}
return false;
}
});
}
setFilter(filter);
}
public void setFilter(Predicate<Person> filter) {
dataProvider.setFilter(p -> filter.test(p));
grid.getDataProvider().refreshAll();
}
public void onPersonSelect(SelectionListener<Person> listener) throws UnsupportedOperationException {
@ -128,17 +183,9 @@ public class PersonGrid extends CustomComponent {
}
private void onGroupSelected(SingleSelectionEvent<GroupDef> ev) {
dataProvider.clearFilters();
final Set<GroupDef> groups = ev.getAllSelectedItems();
dataProvider.addFilter(p -> {
List<Persongroup> 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<Person> persons) {
log.debug("Selecting now: {}" + persons);
selectItems(persons.toArray(new Person[0]));
}
public void onPersonEdit(Consumer<Person> function) {
this.onPersonEdit = function;
}
}

@ -17,6 +17,6 @@
<!-- Specifying Session Context -->
<property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property>
<mapping resource="schema/ClubEvent.hbm.xml"></mapping>
<!-- <mapping resource="schema/ClubEvent.hbm.xml"></mapping> -->
</session-factory>
</hibernate-configuration>

@ -25,7 +25,7 @@
<property column="organizerDisplayName" generated="never"
lazy="false" name="organizerDisplayName" type="string" />
<set name="persons" table="clubevent_has_person" cascade="all" lazy="false">
<set name="persons" table="clubevent_has_person" cascade="save-update" lazy="false">
<key column="clubevent_id"/>
<many-to-many column="person_id" class="de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person" />
</set>

Loading…
Cancel
Save