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 43b129a..e6299cb 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 @@ -2,6 +2,7 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.data; import java.io.Serializable; import java.time.LocalDate; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -57,7 +58,7 @@ public class Person extends BaseEntity implements Serializable { @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "persongroup", joinColumns = { @JoinColumn(name = "person_id") }, inverseJoinColumns = { @JoinColumn(name = "group_id") }) - private List groups; + private Set groups; // bi-directional many-to-one association to Relative @OneToMany(mappedBy = "person1Bean") @@ -114,16 +115,19 @@ public class Person extends BaseEntity implements Serializable { this.username = username; } - public List getGroups() { + public Set getGroups() { return groups; } - public void setGroups(List groups) { + public void setGroups(Set groups) { this.groups = groups; } public void add(GroupDef group) { - + if (this.groups == null) { + this.groups = new HashSet<>(); + } + this.groups.add(group); } public Set getEvents() { @@ -211,20 +215,29 @@ public class Person extends BaseEntity implements Serializable { return contact; } - public List getPersongroups() { + public Set getPersongroups() { return this.groups; } - public void setPersongroups(List persongroups) { - this.groups = persongroups; + public void setPersongroups(Collection persongroups) { + if (persongroups instanceof Set) { + this.groups = (Set) persongroups; + } else { + this.groups = new HashSet<>(persongroups); + } } public void addPersongroup(GroupDef persongroup) { - getPersongroups().add(persongroup); + if (this.groups == null) { + this.groups = new HashSet<>(); + } + this.groups.add(persongroup); } public void removePersongroup(GroupDef persongroup) { - getPersongroups().remove(persongroup); + if (this.groups == null) { + this.groups.remove(persongroup); + } } public List getRelatives1() { 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 index de9b2de..0c1893c 100644 --- 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 @@ -2,6 +2,7 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; import java.util.ArrayList; import java.util.List; +import java.util.Set; import org.vaadin.teemu.switchui.Switch; @@ -35,7 +36,7 @@ public class PersonEditDialog extends Window { textSureName = new TextField(); birthday = new DateField(); birthday.setCaption("Geburtstag"); - + Panel groupPanel = new Panel("Gruppen"); VerticalLayout glay = new VerticalLayout(); groupPanel.setContent(glay); @@ -43,7 +44,7 @@ public class PersonEditDialog extends Window { for (GroupDef tmp : person.getPersongroups()) { selected.add(tmp); } - for (GroupDef g: groups) { + for (GroupDef g : groups) { Switch sw = new Switch(g.getName()); sw.setData(g); sw.setValue(selected.contains(g)); @@ -55,9 +56,9 @@ public class PersonEditDialog extends Window { binder.forField(textPrename).bind(Person::getPrename, Person::setPrename); binder.forField(textSureName).bind(Person::getSurname, Person::setSurname); binder.forField(birthday).bind(Person::getBirth, Person::setBirth); - + binder.readBean(person); - + Button close = new Button("Schließen"); close.addClickListener(ev -> PersonEditDialog.this.close()); Button ok = new Button("Speichern"); @@ -73,14 +74,13 @@ public class PersonEditDialog extends Window { } private void groupChanged(ValueChangeEvent ev) { - GroupDef group = (GroupDef) ((Switch)ev.getComponent()).getData(); - List pg = person.getPersongroups(); + GroupDef group = (GroupDef) ((Switch) ev.getComponent()).getData(); + Set 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/PersonFilter.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilter.java index 66d7f92..57908c1 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilter.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilter.java @@ -1,5 +1,6 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -23,14 +24,17 @@ public class PersonFilter implements SerializablePredicate { if (personSelected(t) == false) { return false; } -// if (personInGroup(t) == false) { -// return false; -// } + if (personInGroup(t) == false) { + return false; + } return true; } private boolean personInGroup(Person t) { - return selectedGroups != null; + if (selectedGroups != null) { + return t.getGroups() != null && !Collections.disjoint(t.getGroups(), selectedGroups); + } + return true; } private boolean personSelected(Person t) { @@ -42,7 +46,7 @@ public class PersonFilter implements SerializablePredicate { return true; } - public void setSelected(Set selected) { + public void setSelectedPersons(Set selected) { if (selected == null) { selectedPersons = null; return; @@ -53,4 +57,8 @@ public class PersonFilter implements SerializablePredicate { } } + public void setSelectedGroups(Set selected) { + this.selectedGroups = selected; + } + } 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 6157cff..f9efa47 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 @@ -141,7 +141,7 @@ public class PersonGrid extends CustomComponent { }); filter = filter.and(p -> { - List personGroups = p.getPersongroups(); + Set personGroups = p.getPersongroups(); for (GroupDef pg : personGroups) { if (groupIds.contains(pg.getId())) { return true; diff --git a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java index 51b119b..1a859ff 100644 --- a/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java +++ b/src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -13,54 +14,100 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.AbstractDatabaseTest; +import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; class PersonFilterTest { private PersonFilter filter; private List persons; + private final List groups; + + public PersonFilterTest() { + GroupDef adminGroup = new GroupDef(); + adminGroup.setId(1); + adminGroup.setName("ADMIN"); + + GroupDef competitorGroup = new GroupDef(); + competitorGroup.setName("Wettkämpfer"); + competitorGroup.setId(2); + + GroupDef participantGroup = new GroupDef(); + participantGroup.setName("ACTIVE"); + participantGroup.setId(3); + + GroupDef judgesGroup = new GroupDef(); + judgesGroup.setName("Kampfrichter"); + judgesGroup.setId(4); + + groups = Collections + .unmodifiableList(Arrays.asList(adminGroup, competitorGroup, participantGroup, judgesGroup)); + + } @BeforeEach void setUp() throws Exception { filter = new PersonFilter(); persons = AbstractDatabaseTest.createPersons(5); assertEquals(5, persons.size()); + + for (int i = 0; i < groups.size(); i++) { + persons.get(i).add(groups.get(i)); + persons.get(0).add(groups.get(i)); // Person1 has all Rights. + } + + assertEquals(groups.size(), persons.get(0).getGroups().size()); } @Test void testNoFilterSet() { - allAccepted(); + allPersonsAccepted(); assertTrue(filter.test(null)); } @Test - void testSelectionFilter() { + void testPersonSelectionFilter() { Set selected = new HashSet<>(persons.subList(2, 4)); - filter.setSelected(selected); + filter.setSelectedPersons(selected); assertFalse(filter.test(persons.get(0))); assertFalse(filter.test(persons.get(1))); assertFalse(filter.test(persons.get(4))); assertTrue(filter.test(persons.get(2))); assertTrue(filter.test(persons.get(3))); - filter.setSelected(null); + filter.setSelectedPersons(null); testNoFilterSet(); - filter.setSelected(Collections.emptySet()); - allFiltered(); + filter.setSelectedPersons(Collections.emptySet()); + allPersonsFiltered(); + + filter.setSelectedPersons(new HashSet<>(persons)); + allPersonsAccepted(); + } + + @Test + void testGroupSelection() { + Set selected = new HashSet<>(); + selected.add(groups.get(2)); + filter.setSelectedGroups(selected); + + assertTrue(filter.test(persons.get(0))); + assertTrue(filter.test(persons.get(2))); + + assertFalse(filter.test(persons.get(1))); + assertFalse(filter.test(persons.get(3))); + assertFalse(filter.test(persons.get(4))); - filter.setSelected(new HashSet<>(persons)); - allAccepted(); } - public void allAccepted() { + public void allPersonsAccepted() { for (Person p : persons) { assertTrue(filter.test(p)); } } - public void allFiltered() { + public void allPersonsFiltered() { for (Person p : persons) { assertFalse(filter.test(p)); }