From 730138d42b9d07c1f01ca16e58b1ace43f8ccbde Mon Sep 17 00:00:00 2001 From: Markus Kreth Date: Mon, 28 Jan 2019 01:58:09 +0100 Subject: [PATCH] Contact can be added. --- .../vaadinclubhelper/data/Person.java | 6 + .../ui/components/AbstractDataGrid.java | 120 ++++++++++++++++-- .../ui/components/ContactGrid.java | 5 + .../ui/components/PersonEditDetails.java | 2 +- .../ui/components/RelationComponent.java | 7 +- 5 files changed, 126 insertions(+), 14 deletions(-) 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 3ee92fb..0f314dc 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 @@ -147,6 +147,7 @@ public class Person extends BaseEntity implements Serializable { if (this.groups == null) { this.groups = new HashSet<>(); } + group.addPersongroup(this); this.groups.add(group); } @@ -165,6 +166,11 @@ public class Person extends BaseEntity implements Serializable { this.events.add(ev); } + public void add(Contact contact) { + contact.setPerson(this); + contacts.add(contact); + } + public void remove(ClubEvent clubEvent) { events.remove(clubEvent); } diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/AbstractDataGrid.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/AbstractDataGrid.java index 6c0bf6c..f4b5aad 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/AbstractDataGrid.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/AbstractDataGrid.java @@ -6,48 +6,97 @@ import java.util.List; import java.util.function.Consumer; import com.vaadin.data.Binder; +import com.vaadin.data.ValueProvider; 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.Grid.Column; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.components.grid.Editor; +import com.vaadin.ui.components.grid.EditorCancelEvent; +import com.vaadin.ui.components.grid.EditorCancelListener; +import com.vaadin.ui.renderers.AbstractRenderer; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; -public abstract class AbstractDataGrid extends Grid { +public abstract class AbstractDataGrid extends VerticalLayout { private static final long serialVersionUID = -3404971410481135696L; - private final List contactSource; - private final ListDataProvider contactDataProvider; + + private final Grid grid; + private final List source; + private final ListDataProvider dataProvider; private boolean hasChanges; private Column deleteButtonColumn; private Consumer deleteConsumer; + private final List> successConsumers; + + private final HorizontalLayout buttonLayout; + private final Button addButton; public AbstractDataGrid() { + this.grid = new Grid<>(); + this.source = new ArrayList<>(); + successConsumers = new ArrayList<>(); + this.dataProvider = DataProvider.ofCollection(source); + grid.setDataProvider(dataProvider); - this.contactSource = new ArrayList<>(); - this.contactDataProvider = DataProvider.ofCollection(contactSource); - setDataProvider(contactDataProvider); + EditedListener editedListener = new EditedListener(); - Editor editor = getEditor(); + Editor editor = grid.getEditor(); editor.setEnabled(true); + grid.addSelectionListener(ev -> editedListener.editObject = null); Binder binder = editor.getBinder(); - editor.addSaveListener(ev -> hasChanges = true); + editor.addSaveListener(ev -> { + hasChanges = true; + for (Consumer consumer : successConsumers) { + consumer.accept(ev.getBean()); + } + dataProvider.refreshAll(); + }); + editor.addCancelListener(editedListener); createColumnAndBinding(binder); - deleteButtonColumn = addComponentColumn(c -> { + deleteButtonColumn = grid.addComponentColumn(c -> { Button deleteButton = new Button(VaadinIcons.TRASH); deleteButton.addClickListener(ev -> deleteConsumer.accept(c)); return deleteButton; }); + deleteButtonColumn.setSortable(false); deleteButtonColumn.setHidden(true); + + buttonLayout = new HorizontalLayout(); + addButton = new Button("Hinzufügen"); + addButton.addClickListener(ev -> { + T newItem = createNewItem(); + source.add(newItem); + editedListener.editObject = newItem; + dataProvider.refreshAll(); + grid.getEditor().editRow(source.size() - 1); + }); + buttonLayout.addComponent(addButton); + + addComponents(buttonLayout, grid); + } + + public void addSuccessConsumer(Consumer consumer) { + this.successConsumers.add(consumer); } + protected abstract T createNewItem(); + protected abstract void createColumnAndBinding(Binder binder); + protected void setEditorEnabled(boolean visible) { + grid.getEditor().setEnabled(visible); + buttonLayout.setVisible(visible); + } + public void setDeleteConsumer(Consumer deleteConsumer) { this.deleteConsumer = deleteConsumer; if (deleteConsumer != null) { @@ -59,11 +108,11 @@ public abstract class AbstractDataGrid extends Grid { public final void setPerson(Person person) { hasChanges = false; - contactSource.clear(); + source.clear(); if (person != null) { - contactSource.addAll(readValues(person)); + source.addAll(readValues(person)); } - contactDataProvider.refreshAll(); + dataProvider.refreshAll(); } protected abstract Collection readValues(Person person); @@ -72,4 +121,51 @@ public abstract class AbstractDataGrid extends Grid { return hasChanges; } + class EditedListener implements EditorCancelListener { + + private static final long serialVersionUID = -884798775149504135L; + + private T editObject; + + @Override + public void onEditorCancel(EditorCancelEvent event) { + if (editObject != null) { + source.remove(editObject); + dataProvider.refreshAll(); + } + } + + } + + public Column addColumn(String propertyName) { + return grid.addColumn(propertyName); + } + + public Column addColumn(String propertyName, AbstractRenderer renderer) { + return grid.addColumn(propertyName, renderer); + } + + public Column addColumn(ValueProvider valueProvider) { + return grid.addColumn(valueProvider); + } + + public Column addColumn(ValueProvider valueProvider, + AbstractRenderer renderer) { + return grid.addColumn(valueProvider, renderer); + } + + public Column addColumn(ValueProvider valueProvider, + ValueProvider presentationProvider) { + return grid.addColumn(valueProvider, presentationProvider); + } + + public Column addColumn(ValueProvider valueProvider, ValueProvider presentationProvider, + AbstractRenderer renderer) { + return grid.addColumn(valueProvider, presentationProvider, renderer); + } + + public Column addComponentColumn(ValueProvider componentProvider) { + return grid.addComponentColumn(componentProvider); + } + } diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ContactGrid.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ContactGrid.java index 1dba196..6be3252 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ContactGrid.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/ContactGrid.java @@ -32,4 +32,9 @@ public class ContactGrid extends AbstractDataGrid { return person.getContacts().stream().filter(e -> e.getDeleted() == null).collect(Collectors.toList()); } + @Override + protected Contact createNewItem() { + return new Contact(); + } + } \ No newline at end of file diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java index 8e4c1eb..1c1b71a 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonEditDetails.java @@ -125,7 +125,7 @@ public class PersonEditDetails extends HorizontalLayout { getUI().addWindow(dlg); }); - + contactLayout.addSuccessConsumer(newContact -> binder.getBean().add(newContact)); relationshipLayout = new RelationComponent(dao); TabSheet sheet = new TabSheet(); sheet.addTab(groupLayout, "Gruppen"); diff --git a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/RelationComponent.java b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/RelationComponent.java index 644552c..23e4df5 100644 --- a/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/RelationComponent.java +++ b/src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/RelationComponent.java @@ -15,7 +15,7 @@ public class RelationComponent extends AbstractDataGrid { public RelationComponent(PersonDao dao) { this.dao = dao; - getEditor().setEnabled(false); + setEditorEnabled(false); } @Override @@ -30,4 +30,9 @@ public class RelationComponent extends AbstractDataGrid { return dao.findRelationsFor(person); } + @Override + protected Relation createNewItem() { + return null; + } + }