diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ConfirmDialog.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ConfirmDialog.java new file mode 100644 index 0000000..9f1b2c8 --- /dev/null +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ConfirmDialog.java @@ -0,0 +1,92 @@ +package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components; + +import java.util.EnumSet; +import java.util.function.Consumer; + +import com.vaadin.ui.Button; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class ConfirmDialog extends Window { + + private static final long serialVersionUID = -3043842684692296495L; + + private Label message; + + private ConfirmDialog(Builder builder) { + super(builder.caption); + setModal(true); + setClosable(false); + + this.message = new Label(builder.message); + + HorizontalLayout buttonLayout = new HorizontalLayout(); + for (Buttons button : builder.buttons) { + + Button b = new Button(button.caption); + b.addClickListener(ev -> { + ConfirmDialog.this.close(); + if (builder.resultHandler != null) { + builder.resultHandler.accept(button); + } + }); + buttonLayout.addComponent(b); + } + VerticalLayout layout = new VerticalLayout(); + layout.addComponents(message, buttonLayout); + setContent(layout); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private String caption; + private String message; + private EnumSet buttons; + private Consumer resultHandler; + + private Builder() { + buttons = EnumSet.noneOf(Buttons.class); + } + + public Builder setCaption(String caption) { + this.caption = caption; + return this; + } + + public Builder setMessage(String message) { + this.message = message; + return this; + } + + public Builder setResultHandler(Consumer resultHandler) { + this.resultHandler = resultHandler; + return this; + } + + public Builder saveDiscardCancel() { + buttons = EnumSet.of(Buttons.CANCEL, Buttons.DISCARD, Buttons.SAVE); + return this; + } + + public ConfirmDialog build() { + return new ConfirmDialog(this); + } + + } + + public enum Buttons { + YES("JA"), NO("NEIN"), OK("OK"), SAVE("Speichern"), DISCARD("Verwerfen"), CANCEL("Abbrechen"); + + final String caption; + + private Buttons(String caption) { + this.caption = caption; + } + } +} 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 0c1893c..7bdfb2d 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,12 +2,10 @@ 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; import com.vaadin.data.Binder; -import com.vaadin.data.HasValue.ValueChangeEvent; import com.vaadin.ui.Button; import com.vaadin.ui.DateField; import com.vaadin.ui.Panel; @@ -37,6 +35,13 @@ public class PersonEditDialog extends Window { birthday = new DateField(); birthday.setCaption("Geburtstag"); + binder = new Binder<>(); + 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); + Panel groupPanel = new Panel("Gruppen"); VerticalLayout glay = new VerticalLayout(); groupPanel.setContent(glay); @@ -48,19 +53,20 @@ public class PersonEditDialog extends Window { Switch sw = new Switch(g.getName()); sw.setData(g); sw.setValue(selected.contains(g)); - sw.addValueChangeListener(ev -> groupChanged(ev)); +// 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.forField(birthday).bind(Person::getBirth, Person::setBirth); - binder.readBean(person); + binder.forField(sw).bind(p -> p.getGroups().contains(g), (bean, fieldvalue) -> { + if (fieldvalue) { + bean.getGroups().add(g); + } else { + bean.getGroups().remove(g); + } + }); + } Button close = new Button("Schließen"); - close.addClickListener(ev -> PersonEditDialog.this.close()); + close.addClickListener(ev -> closeWithoutSave(dao)); Button ok = new Button("Speichern"); ok.addClickListener(ev -> { binder.writeBeanIfValid(person); @@ -73,14 +79,35 @@ public class PersonEditDialog extends Window { center(); } - private void groupChanged(ValueChangeEvent ev) { - GroupDef group = (GroupDef) ((Switch) ev.getComponent()).getData(); - Set pg = person.getPersongroups(); - if (ev.getValue()) { - pg.add(group); + private void closeWithoutSave(PersonDao dao) { + if (binder.hasChanges()) { + + ConfirmDialog dlg = ConfirmDialog.builder().setCaption("Ungespeicherte Änderungen") + .setMessage("Die Daten wurden geändert. Sollen die Änderungen gespeichert werden?") + .saveDiscardCancel().setResultHandler(button -> { + if (button == ConfirmDialog.Buttons.SAVE) { + binder.writeBeanIfValid(person); + dao.update(person); + PersonEditDialog.this.close(); + } else if (button == ConfirmDialog.Buttons.DISCARD) { + PersonEditDialog.this.close(); + } + }).build(); + + getUI().addWindow(dlg); } else { - pg.remove(group); + close(); } } +// private void groupChanged(ValueChangeEvent ev) { +// GroupDef group = (GroupDef) ((Switch) ev.getComponent()).getData(); +// Set pg = person.getPersongroups(); +// if (ev.getValue()) { +// pg.add(group); +// } else { +// pg.remove(group); +// } +// } + }