Person and Contact delete able.

master
Markus Kreth 7 years ago
parent 922c1fd143
commit f6cf18ce31
  1. 5
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/PersonDao.java
  2. 38
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/PersonDaoImpl.java
  3. 41
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/BaseEntity.java
  4. 58
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Contact.java
  5. 5
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/Person.java
  6. 4
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/LoginUI.java
  7. 4
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/MainUi.java
  8. 1
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/PersonEditView.java
  9. 75
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/AbstractDataGrid.java
  10. 10
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ConfirmDialog.java
  11. 35
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ContactGrid.java
  12. 101
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java
  13. 96
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonGrid.java
  14. 33
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/RelationComponent.java
  15. BIN
      src/main/webapp/VAADIN/themes/vaadin-clubhelpertheme/favicon.ico
  16. BIN
      src/main/webapp/VAADIN/themes/vaadin-clubhelpertheme/images/arrowLeft.png
  17. BIN
      src/main/webapp/VAADIN/themes/vaadin-clubhelpertheme/images/arrowRight.png

@ -4,6 +4,7 @@ import java.util.List;
import javax.persistence.NoResultException; import javax.persistence.NoResultException;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Contact;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Relation; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Relation;
@ -20,4 +21,8 @@ public interface PersonDao extends IDao<Person> {
Person findLoginUser(String username, String password) throws NoResultException; Person findLoginUser(String username, String password) throws NoResultException;
List<Relation> findRelationsFor(Person p); List<Relation> findRelationsFor(Person p);
void delete(Contact c);
void delete(Person p);
} }

@ -1,6 +1,7 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao; package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import javax.persistence.Query; import javax.persistence.Query;
@ -45,10 +46,13 @@ public class PersonDaoImpl extends AbstractDaoImpl<Person> implements PersonDao
@Transactional @Transactional
public void persistOrUpdate(EntityAccessor c) { public void persistOrUpdate(EntityAccessor c) {
if (c.hasValidId() == false) { Date now = new Date();
entityManager.persist(c); c.setChanged(now);
} else { if (entityManager.contains(c) || c.hasValidId()) {
entityManager.merge(c); entityManager.merge(c);
} else {
c.setCreated(now);
entityManager.persist(c);
} }
} }
@ -78,12 +82,34 @@ public class PersonDaoImpl extends AbstractDaoImpl<Person> implements PersonDao
} }
private Relation toRelative(Object[] r, int ignoring) { private Relation toRelative(Object[] r, int ignoring) {
Person p = null;
String relation = null;
if (r[1].equals(ignoring)) { if (r[1].equals(ignoring)) {
return new Relation(entityManager.find(Person.class, r[2]), r[3].toString()); p = entityManager.find(Person.class, r[2]);
relation = r[3].toString();
} else if (r[2].equals(ignoring)) { } else if (r[2].equals(ignoring)) {
return new Relation(entityManager.find(Person.class, r[1]), r[4].toString()); p = entityManager.find(Person.class, r[1]);
relation = r[4].toString();
}
if (p != null && p.getDeleted() == null) {
return new Relation(p, relation);
} }
return null; return null;
} }
@Override
@Transactional
public void delete(Contact c) {
c.setDeleted(new Date());
entityManager.merge(c);
Person person = c.getPerson();
person.getContacts().remove(c);
}
@Override
@Transactional
public void delete(Person p) {
p.setDeleted(new Date());
entityManager.merge(p);
}
} }

@ -34,22 +34,33 @@ public abstract class BaseEntity implements EntityAccessor {
} }
public Date getChanged() { public Date getChanged() {
if (changed == null) {
return null;
}
return new Date(this.changed.getTime()); return new Date(this.changed.getTime());
} }
@Override
public void setChanged(Date changed) { public void setChanged(Date changed) {
this.changed = new Date(changed.getTime()); this.changed = new Date(changed.getTime());
} }
public Date getCreated() { public Date getCreated() {
if (created == null) {
return null;
}
return new Date(this.created.getTime()); return new Date(this.created.getTime());
} }
@Override
public void setCreated(Date created) { public void setCreated(Date created) {
this.created = new Date(created.getTime()); this.created = new Date(created.getTime());
} }
public Date getDeleted() { public Date getDeleted() {
if (deleted == null) {
return null;
}
return new Date(this.deleted.getTime()); return new Date(this.deleted.getTime());
} }
@ -66,39 +77,33 @@ public abstract class BaseEntity implements EntityAccessor {
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ((changed == null) ? 0 : changed.hashCode());
result = prime * result + ((created == null) ? 0 : created.hashCode()); result = prime * result + ((created == null) ? 0 : created.hashCode());
result = prime * result + ((deleted == null) ? 0 : deleted.hashCode());
result = prime * result + id; result = prime * result + id;
return result; return result;
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj) {
return true; return true;
if (obj == null) }
if (obj == null) {
return false; return false;
if (getClass() != obj.getClass()) }
if (getClass() != obj.getClass()) {
return false; return false;
}
BaseEntity other = (BaseEntity) obj; BaseEntity other = (BaseEntity) obj;
if (changed == null) {
if (other.changed != null)
return false;
} else if (!changed.equals(other.changed))
return false;
if (created == null) { if (created == null) {
if (other.created != null) if (other.created != null) {
return false;
} else if (!created.equals(other.created))
return false; return false;
if (deleted == null) { }
if (other.deleted != null) } else if (!created.equals(other.created)) {
return false;
} else if (!deleted.equals(other.deleted))
return false; return false;
if (id != other.id) }
if (id != other.id) {
return false; return false;
}
return true; return true;
} }

@ -9,15 +9,14 @@ import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery; import javax.persistence.NamedQuery;
import javax.persistence.Table; import javax.persistence.Table;
/** /**
* The persistent class for the contact database table. * The persistent class for the contact database table.
* *
*/ */
@Entity @Entity
@Table(name="contact") @Table(name = "contact")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@NamedQuery(name="Contact.findAll", query="SELECT c FROM Contact c") @NamedQuery(name = "Contact.findAll", query = "SELECT c FROM Contact c WHERE c.deleted is not null")
public class Contact extends BaseEntity implements Serializable { public class Contact extends BaseEntity implements Serializable {
private static final long serialVersionUID = -7631864028095077913L; private static final long serialVersionUID = -7631864028095077913L;
@ -26,7 +25,7 @@ public class Contact extends BaseEntity implements Serializable {
private String value; private String value;
//bi-directional many-to-one association to Person // bi-directional many-to-one association to Person
@ManyToOne @ManyToOne
private Person person; private Person person;
@ -57,4 +56,55 @@ public class Contact extends BaseEntity implements Serializable {
this.person = person; this.person = person;
} }
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((person == null) ? 0 : person.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Contact other = (Contact) obj;
if (person == null) {
if (other.person != null) {
return false;
}
} else if (!person.equals(other.person)) {
return false;
}
if (type == null) {
if (other.type != null) {
return false;
}
} else if (!type.equals(other.type)) {
return false;
}
if (value == null) {
if (other.value != null) {
return false;
}
} else if (!value.equals(other.value)) {
return false;
}
return true;
}
@Override
public String toString() {
return "Contact [type=" + type + ", value=" + value + "]";
}
} }

@ -26,8 +26,9 @@ import javax.persistence.Table;
@Entity @Entity
@Table(name = "person") @Table(name = "person")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@NamedQuery(name = Person.QUERY_FINDALL, query = "SELECT p FROM Person p") @NamedQuery(name = Person.QUERY_FINDALL, query = "SELECT p FROM Person p WHERE p.deleted is null")
@NamedQuery(name = Person.QUERY_FINDLOGIN, query = "FROM Person WHERE username = :username AND password = :password") @NamedQuery(name = Person.QUERY_FINDLOGIN, query = "FROM Person WHERE username = :username AND password = :password AND deleted is"
+ " null")
public class Person extends BaseEntity implements Serializable { public class Person extends BaseEntity implements Serializable {
public static final String SESSION_LOGIN = "SESSION_LOGIN_USER"; public static final String SESSION_LOGIN = "SESSION_LOGIN_USER";

@ -38,8 +38,8 @@ public class LoginUI extends VerticalLayout implements NamedView {
} catch (final Exception ex) { } catch (final Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
logger.error("Error on login for User={}", e.getLoginParameter("username"), ex); logger.error("Error on login for User={}", e.getLoginParameter("username"), ex);
String message = "Incorrect user or password:" + ex.getMessage() + e.getLoginParameter("username") + ":" String message = "Incorrect user or password for " + e.getLoginParameter("username") + "\n"
+ e.getLoginParameter("password"); + ex.getMessage();
Notification.show(message, Notification.Type.ERROR_MESSAGE); Notification.show(message, Notification.Type.ERROR_MESSAGE);
} }
}); });

@ -8,6 +8,7 @@ import com.vaadin.annotations.PreserveOnRefresh;
import com.vaadin.annotations.Push; import com.vaadin.annotations.Push;
import com.vaadin.annotations.Theme; import com.vaadin.annotations.Theme;
import com.vaadin.navigator.Navigator; import com.vaadin.navigator.Navigator;
import com.vaadin.server.ThemeResource;
import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.communication.PushMode; import com.vaadin.shared.communication.PushMode;
import com.vaadin.spring.annotation.SpringUI; import com.vaadin.spring.annotation.SpringUI;
@ -56,8 +57,7 @@ public class MainUi extends UI {
navigator.addView(MainView.VIEW_NAME, new MainView(personDao, groupDao, eventBusiness, securityGroupVerifier)); navigator.addView(MainView.VIEW_NAME, new MainView(personDao, groupDao, eventBusiness, securityGroupVerifier));
navigator.addView(LoginUI.VIEW_NAME, new LoginUI(personDao, securityGroupVerifier)); navigator.addView(LoginUI.VIEW_NAME, new LoginUI(personDao, securityGroupVerifier));
navigator.addView(PersonEditView.VIEW_NAME, new PersonEditView(groupDao, personDao)); navigator.addView(PersonEditView.VIEW_NAME, new PersonEditView(groupDao, personDao));
navigator.addView(EventDetails.VIEW_NAME, navigator.addView(EventDetails.VIEW_NAME, new EventDetails(personDao, groupDao, eventBusiness, pflichtenDao));
new EventDetails(personDao, groupDao, eventBusiness, pflichtenDao, securityGroupVerifier));
navigator.navigateTo(MainView.VIEW_NAME); navigator.navigateTo(MainView.VIEW_NAME);
} }

@ -34,6 +34,7 @@ public class PersonEditView extends VerticalLayout implements NamedView {
personGrid.setSizeFull(); personGrid.setSizeFull();
personGrid.onPersonEdit(); personGrid.onPersonEdit();
personGrid.onPersonSelect(ev -> selectedPerson(ev)); personGrid.onPersonSelect(ev -> selectedPerson(ev));
personGrid.enableDeleteColumn(true);
personDetails = new PersonEditDetails(groupDao.listAll(), personDao, false); personDetails = new PersonEditDetails(groupDao.listAll(), personDao, false);
personDetails.setSizeFull(); personDetails.setSizeFull();

@ -0,0 +1,75 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import com.vaadin.data.Binder;
import com.vaadin.data.provider.DataProvider;
import com.vaadin.data.provider.ListDataProvider;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.Grid;
import com.vaadin.ui.components.grid.Editor;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
public abstract class AbstractDataGrid<T> extends Grid<T> {
private static final long serialVersionUID = -3404971410481135696L;
private final List<T> contactSource;
private final ListDataProvider<T> contactDataProvider;
private boolean hasChanges;
private Column<T, Component> deleteButtonColumn;
private Consumer<T> deleteConsumer;
public AbstractDataGrid() {
this.contactSource = new ArrayList<>();
this.contactDataProvider = DataProvider.ofCollection(contactSource);
setDataProvider(contactDataProvider);
Editor<T> editor = getEditor();
editor.setEnabled(true);
Binder<T> binder = editor.getBinder();
editor.addSaveListener(ev -> hasChanges = true);
createColumnAndBinding(binder);
deleteButtonColumn = addComponentColumn(c -> {
Button deleteButton = new Button(VaadinIcons.TRASH);
deleteButton.addClickListener(ev -> deleteConsumer.accept(c));
return deleteButton;
});
deleteButtonColumn.setHidden(true);
}
protected abstract void createColumnAndBinding(Binder<T> binder);
public void setDeleteConsumer(Consumer<T> deleteConsumer) {
this.deleteConsumer = deleteConsumer;
if (deleteConsumer != null) {
deleteButtonColumn.setHidden(false);
} else {
deleteButtonColumn.setHidden(true);
}
}
public final void setPerson(Person person) {
hasChanges = false;
contactSource.clear();
if (person != null) {
contactSource.addAll(readValues(person));
}
contactDataProvider.refreshAll();
}
protected abstract Collection<? extends T> readValues(Person person);
public final boolean hasChanges() {
return hasChanges;
}
}

@ -74,6 +74,16 @@ public class ConfirmDialog extends Window {
return this; return this;
} }
public Builder yesNo() {
buttons = EnumSet.of(Buttons.YES, Buttons.NO);
return this;
}
public Builder yesCancel() {
buttons = EnumSet.of(Buttons.YES, Buttons.CANCEL);
return this;
}
public ConfirmDialog build() { public ConfirmDialog build() {
return new ConfirmDialog(this); return new ConfirmDialog(this);
} }

@ -0,0 +1,35 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.util.Collection;
import java.util.stream.Collectors;
import com.vaadin.data.Binder;
import com.vaadin.data.Binder.Binding;
import com.vaadin.ui.TextField;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Contact;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
public class ContactGrid extends AbstractDataGrid<Contact> {
/**
*
*/
private static final long serialVersionUID = -2573761302198992085L;
@Override
public void createColumnAndBinding(Binder<Contact> binder) {
Binding<Contact, String> typeBinding = binder.bind(new ContactTypeComponent(), Contact::getType,
Contact::setType);
Binding<Contact, String> valueBinding = binder.bind(new TextField(), Contact::getValue, Contact::setValue);
addColumn(Contact::getType).setCaption("Kontaktart").setEditorBinding(typeBinding);
addColumn(Contact::getValue).setCaption("Wert").setEditorBinding(valueBinding);
}
@Override
protected Collection<? extends Contact> readValues(Person person) {
return person.getContacts().stream().filter(e -> e.getDeleted() == null).collect(Collectors.toList());
}
}

@ -1,22 +1,17 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.vaadin.teemu.switchui.Switch; import org.vaadin.teemu.switchui.Switch;
import com.vaadin.data.Binder; import com.vaadin.data.Binder;
import com.vaadin.data.Binder.Binding;
import com.vaadin.data.BinderValidationStatus; import com.vaadin.data.BinderValidationStatus;
import com.vaadin.data.ValidationResult; import com.vaadin.data.ValidationResult;
import com.vaadin.data.provider.DataProvider;
import com.vaadin.data.provider.ListDataProvider;
import com.vaadin.ui.Button; import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox; import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component; import com.vaadin.ui.Component;
import com.vaadin.ui.DateField; import com.vaadin.ui.DateField;
import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Notification; import com.vaadin.ui.Notification;
import com.vaadin.ui.TabSheet; import com.vaadin.ui.TabSheet;
@ -24,11 +19,9 @@ import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.VerticalLayout;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.PersonDao; import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.PersonDao;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Contact;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Gender; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Gender;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Relation;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpass; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpass;
public class PersonEditDetails extends HorizontalLayout { public class PersonEditDetails extends HorizontalLayout {
@ -44,9 +37,8 @@ public class PersonEditDetails extends HorizontalLayout {
private Consumer<Person> personChangeHandler; private Consumer<Person> personChangeHandler;
private Button okButton; private Button okButton;
private VerticalLayout relationshipLayout; private ContactGrid contactLayout;
private List<Contact> contactSource; private RelationComponent relationshipLayout;
private ListDataProvider<Contact> contactDataProvider;
public PersonEditDetails(List<GroupDef> groups, PersonDao dao) { public PersonEditDetails(List<GroupDef> groups, PersonDao dao) {
this(groups, dao, true); this(groups, dao, true);
@ -117,8 +109,24 @@ public class PersonEditDetails extends HorizontalLayout {
okButton); okButton);
Component groupLayout = createGroupPanel(groups); Component groupLayout = createGroupPanel(groups);
Component contactLayout = createContactLayout(); contactLayout = new ContactGrid();
Component relationshipLayout = createRelationshipLayout(); contactLayout.setDeleteConsumer(c -> {
ConfirmDialog dlg = ConfirmDialog
.builder().setCaption("Kontakt löschen").setMessage(c.getPerson().getPrename() + " "
+ c.getPerson().getSurname() + " \"" + c + "\" wirklich löschen?")
.yesCancel().setResultHandler(button -> {
if (button == ConfirmDialog.Buttons.YES) {
if (binder.validate().isOk()) {
dao.delete(c);
}
}
}).build();
getUI().addWindow(dlg);
});
relationshipLayout = new RelationComponent(dao);
TabSheet sheet = new TabSheet(); TabSheet sheet = new TabSheet();
sheet.addTab(groupLayout, "Gruppen"); sheet.addTab(groupLayout, "Gruppen");
sheet.addTab(contactLayout, "Kontakte"); sheet.addTab(contactLayout, "Kontakte");
@ -129,32 +137,6 @@ public class PersonEditDetails extends HorizontalLayout {
} }
private Component createRelationshipLayout() {
relationshipLayout = new VerticalLayout();
return relationshipLayout;
}
private Component createContactLayout() {
Grid<Contact> contactLayout = new Grid<>();
contactSource = new ArrayList<>();
contactDataProvider = DataProvider.ofCollection(contactSource);
contactLayout.setDataProvider(contactDataProvider);
contactLayout.getEditor().setEnabled(true);
Binder<Contact> contactBinder = contactLayout.getEditor().getBinder();
ContactTypeComponent comp = new ContactTypeComponent();
Binding<Contact, String> typeBinding = contactBinder.bind(comp, Contact::getType, Contact::setType);
Binding<Contact, String> valueBinding = contactBinder.bind(new TextField(), Contact::getValue,
Contact::setValue);
contactLayout.addColumn(Contact::getType).setCaption("Kontaktart").setEditorBinding(typeBinding);
contactLayout.addColumn(Contact::getValue).setCaption("Wert").setEditorBinding(valueBinding);
return contactLayout;
}
public Component createGroupPanel(List<GroupDef> groups) { public Component createGroupPanel(List<GroupDef> groups) {
VerticalLayout layout = new VerticalLayout(); VerticalLayout layout = new VerticalLayout();
@ -180,56 +162,39 @@ public class PersonEditDetails extends HorizontalLayout {
} }
public void setBean(Person person) { public void setBean(Person person) {
closeWithoutSave();
binder.setBean(person); binder.setBean(person);
contactLayout.setPerson(person);
relationshipLayout.setPerson(person);
if (person != null) { if (person != null) {
okButton.setEnabled(true); okButton.setEnabled(true);
updateRelationshipBinding();
updateContactBinding();
} else { } else {
okButton.setEnabled(false); okButton.setEnabled(false);
contactSource.clear();
contactDataProvider.refreshAll();
relationshipLayout.removeAllComponents();
} }
} }
private void updateContactBinding() { void closeWithoutSave() {
contactSource.clear(); if (hasChanges()) {
contactSource.addAll(binder.getBean().getContacts());
contactDataProvider.refreshAll();
}
private void updateRelationshipBinding() {
relationshipLayout.removeAllComponents();
Person current = binder.getBean();
List<Relation> related = dao.findRelationsFor(current);
for (Relation relation : related) {
TextField textField = new TextField(relation.getRelation().getLocalized());
textField.setValue(relation.getPerson().getPrename() + " " + relation.getPerson().getSurname());
textField.setEnabled(false);
relationshipLayout.addComponent(textField);
}
}
private void closeWithoutSave() {
if (binder.hasChanges()) {
final Person current = binder.getBean();
ConfirmDialog dlg = ConfirmDialog.builder().setCaption("Ungespeicherte Änderungen") ConfirmDialog dlg = ConfirmDialog.builder().setCaption("Ungespeicherte Änderungen")
.setMessage("Die Daten wurden geändert. Sollen die Änderungen gespeichert werden?") .setMessage(current.getPrename() + " " + current.getSurname()
+ " wurde geändert. Sollen die Änderungen gespeichert werden?")
.saveDiscardCancel().setResultHandler(button -> { .saveDiscardCancel().setResultHandler(button -> {
if (button == ConfirmDialog.Buttons.SAVE) { if (button == ConfirmDialog.Buttons.SAVE) {
if (binder.validate().isOk()) { if (binder.validate().isOk()) {
dao.save(binder.getBean()); dao.save(current);
} }
} else if (button == ConfirmDialog.Buttons.DISCARD) {
binder.removeBean();
} }
}).build(); }).build();
getUI().addWindow(dlg); getUI().addWindow(dlg);
} else {
} }
} }
public boolean hasChanges() {
return binder.hasChanges() || contactLayout.hasChanges() || relationshipLayout.hasChanges();
}
} }

@ -15,12 +15,17 @@ import com.vaadin.data.provider.DataProvider;
import com.vaadin.data.provider.ListDataProvider; import com.vaadin.data.provider.ListDataProvider;
import com.vaadin.event.selection.SelectionListener; import com.vaadin.event.selection.SelectionListener;
import com.vaadin.event.selection.SingleSelectionEvent; import com.vaadin.event.selection.SingleSelectionEvent;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.shared.ui.ContentMode;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox; import com.vaadin.ui.CheckBox;
import com.vaadin.ui.ComboBox; import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.Grid; import com.vaadin.ui.Grid;
import com.vaadin.ui.Grid.Column; import com.vaadin.ui.Grid.Column;
import com.vaadin.ui.Grid.SelectionMode; import com.vaadin.ui.Grid.SelectionMode;
import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Layout; import com.vaadin.ui.Layout;
import com.vaadin.ui.TextField; import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.VerticalLayout;
@ -47,13 +52,17 @@ public class PersonGrid extends VerticalLayout {
private final ComboBox<GroupDef> comboGroups; private final ComboBox<GroupDef> comboGroups;
private final TextField textFilter; private final TextField textFilter;
private final PersonDao personDao;
private List<GroupDef> allGroups; private List<GroupDef> allGroups;
private PersonFilter filter; private PersonFilter filter;
private ClubEvent currentEvent; private ClubEvent currentEvent;
private Column<Person, String> startpassColumn; private Column<Person, String> startpassColumn;
private Layout filters; private Layout filters;
private SelectionMode currentSelectionMode; private SelectionMode currentSelectionMode;
private Column<Person, String> genderColumn; private Column<Person, ?> genderColumn;
private Column<Person, ? extends Component> deleteButtonColumn;
public PersonGrid(GroupDao groupDao, PersonDao personDao) { public PersonGrid(GroupDao groupDao, PersonDao personDao) {
@ -61,9 +70,12 @@ public class PersonGrid extends VerticalLayout {
setCaption("Teilnehmer"); setCaption("Teilnehmer");
addStyleName("bold-caption"); addStyleName("bold-caption");
this.personDao = personDao;
checkIncluded = new CheckBox("Nur gemeldete"); checkIncluded = new CheckBox("Nur gemeldete");
comboGroups = new ComboBox<>("Gruppenfilter"); comboGroups = new ComboBox<>("Gruppenfilter");
textFilter = new TextField("Namenfilter"); textFilter = new TextField("Namenfilter");
textFilter.setIcon(VaadinIcons.SEARCH);
filters = setupFilterComponents(); filters = setupFilterComponents();
allGroups = groupDao.listAll(); allGroups = groupDao.listAll();
@ -74,13 +86,13 @@ public class PersonGrid extends VerticalLayout {
dataProvider = DataProvider.ofCollection(filter.asCollection()); dataProvider = DataProvider.ofCollection(filter.asCollection());
grid = new Grid<>(); grid = new Grid<>();
setupPersonGrid(personDao); setupPersonGrid();
setMargin(false); setMargin(false);
addComponents(filters, grid); addComponents(filters, grid);
} }
public void setupPersonGrid(PersonDao personDao) { void setupPersonGrid() {
filter.add(() -> { filter.add(() -> {
setEvent(currentEvent); setEvent(currentEvent);
}); });
@ -92,7 +104,8 @@ public class PersonGrid extends VerticalLayout {
grid.addColumn(Person::getPrename).setCaption("Vorname"); grid.addColumn(Person::getPrename).setCaption("Vorname");
grid.addColumn(Person::getSurname).setCaption("Nachname"); grid.addColumn(Person::getSurname).setCaption("Nachname");
grid.addColumn(Person::getBirth, b -> b != null ? birthFormat.format(b) : "").setCaption("Geburtstag"); grid.addColumn(Person::getBirth, b -> b != null ? birthFormat.format(b) : "").setCaption("Geburtstag")
.setHidable(true);
startpassColumn = grid.addColumn(p -> { startpassColumn = grid.addColumn(p -> {
Startpass startpass = p.getStartpass(); Startpass startpass = p.getStartpass();
@ -102,18 +115,85 @@ public class PersonGrid extends VerticalLayout {
return null; return null;
} }
}).setCaption("Startpass Nr."); }).setCaption("Startpass Nr.");
startpassColumn.setHidable(true);
genderColumn = grid.addColumn(p -> { genderColumn = grid.addComponentColumn(p -> {
Gender gender = p.getGender(); Gender gender = p.getGender();
VaadinIcons icon;
if (gender == null) { if (gender == null) {
return ""; icon = VaadinIcons.QUESTION;
} else {
switch (gender) {
case FEMALE:
icon = VaadinIcons.FEMALE;
break;
case MALE:
icon = VaadinIcons.MALE;
break;
default:
icon = VaadinIcons.QUESTION;
break;
}
} }
return gender.localized();
}).setCaption("Geschlecht"); return new Label(icon.getHtml(), ContentMode.HTML);
});
genderColumn.setHidable(true);
startpassColumn.setHidden(false); startpassColumn.setHidden(false);
genderColumn.setHidden(true); genderColumn.setHidden(true);
deleteButtonColumn = grid.addComponentColumn(c -> {
Button deleteButton = new Button(VaadinIcons.TRASH);
deleteButton.addClickListener(ev -> delete(c));
deleteButton.setWidthUndefined();
return deleteButton;
}).setCaption("Löschen");
deleteButtonColumn.setHidden(true);
}
public VaadinIcons genderToImage(Gender gender) {
VaadinIcons icon;
if (gender == null) {
icon = VaadinIcons.QUESTION;
} else {
switch (gender) {
case FEMALE:
icon = VaadinIcons.FEMALE;
break;
case MALE:
icon = VaadinIcons.MALE;
break;
default:
icon = VaadinIcons.QUESTION;
break;
}
}
return icon;
}
public void enableDeleteColumn(boolean enable) {
deleteButtonColumn.setHidden(!enable);
}
private void delete(Person c) {
ConfirmDialog dlg = ConfirmDialog.builder().setCaption("Person löschen")
.setMessage(c.getPrename() + " " + c.getSurname() + " wirklich löschen?").yesCancel()
.setResultHandler(button -> {
if (button == ConfirmDialog.Buttons.YES) {
personDao.delete(c);
dataProvider.refreshAll();
}
}).build();
getUI().addWindow(dlg);
} }
public void setSelectionMode(SelectionMode selectionMode) { public void setSelectionMode(SelectionMode selectionMode) {

@ -0,0 +1,33 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.util.Collection;
import com.vaadin.data.Binder;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.PersonDao;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Relation;
public class RelationComponent extends AbstractDataGrid<Relation> {
private static final long serialVersionUID = 7813969695936351799L;
private PersonDao dao;
public RelationComponent(PersonDao dao) {
this.dao = dao;
getEditor().setEnabled(false);
}
@Override
protected void createColumnAndBinding(Binder<Relation> binder) {
addColumn(r -> r.getRelation().getLocalized()).setCaption("Beiehung");
addColumn(r -> r.getPerson().getPrename() + " " + r.getPerson().getSurname());
}
@Override
protected Collection<? extends Relation> readValues(Person person) {
return dao.findRelationsFor(person);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Loading…
Cancel
Save