existingInvoiceNumbers = new ArrayList<>();
+
+ private Button deleteButton;
+
/**
* Initializes the Dialog with an empty {@link Invoice}.
*
@@ -118,18 +126,24 @@ public class InvoiceDialog extends Dialog {
}
});
okButton = new Button(getString(LABEL_STORE), ev -> close());
- Button cancel = new Button(getString(LABEL_CANCEL), ev -> close());
+ deleteButton = new Button("Löschen");
- String caption;
+ String previewCaption;
+ String closeCaption;
if (pdfOpenLabel == InvoiceMode.VIEW_ONLY) {
- caption = getString(LABEL_OPEN);
+ previewCaption = getString(LABEL_OPEN);
+ closeCaption = getString(LABEL_CLOSE);
+ okButton.setVisible(false);
} else {
- caption = getString(LABEL_PREVIEW);
+ previewCaption = getString(LABEL_PREVIEW);
+ closeCaption = getString(LABEL_CANCEL);
+ deleteButton.setVisible(false);
}
- Button previewButton = new Button(caption, this::showPdf);
+ Button cancel = new Button(closeCaption, ev -> close());
+ Button previewButton = new Button(previewCaption, this::showPdf);
HorizontalLayout btnLayout = new HorizontalLayout();
- btnLayout.add(okButton, cancel, previewButton);
+ btnLayout.add(okButton, cancel, previewButton, deleteButton);
VerticalLayout vLayout = new VerticalLayout();
@@ -144,6 +158,14 @@ public class InvoiceDialog extends Dialog {
private void updateInvoiceNo(ValueChangeEvent ev) {
if (invoice != null) {
invoice.setInvoiceId(ev.getValue());
+ if (existingInvoiceNumbers.contains(invoice.getInvoiceId())) {
+ invoiceNo.setErrorMessage("Die Rechnungsnummer existiert bereits. Sie muss eindeutig sein.");
+ invoiceNo.setInvalid(true);
+ okButton.setEnabled(false);
+ } else {
+ invoiceNo.setInvalid(false);
+ okButton.setEnabled(true);
+ }
}
}
@@ -209,9 +231,9 @@ public class InvoiceDialog extends Dialog {
}
}
};
+
new StreamResource("invoice.pdf", inStream);
Anchor link = new Anchor(resourceFrame, "Download PDF");
- // r("Download PDF", new FileResource(outFile));
link.addFocusListener(ev -> LOGGER.debug("Download link clicked."));
link.addAttachListener(ev -> LOGGER.debug("Download link attached."));
@@ -234,8 +256,14 @@ public class InvoiceDialog extends Dialog {
return okButton.addClickListener(listener);
}
- public void setInvoice(Invoice invoice) {
- this.invoice = invoice;
+ public Registration addDeleteClickListener(ComponentEventListener> listener) {
+ return deleteButton.addClickListener(listener);
+ }
+
+ public void setInvoice(Invoice invoice, List existingInvoiceNumbers) {
+ this.invoice = Objects.requireNonNull(invoice);
+ this.existingInvoiceNumbers.clear();
+ this.existingInvoiceNumbers.addAll(existingInvoiceNumbers);
signature = new Signature(invoice.getUser());
invoiceNo.setValue(invoice.getInvoiceId());
invoiceDate.setValue(invoice.getInvoiceDate().toLocalDate());
diff --git a/src/main/java/de/kreth/invoice/views/invoice/InvoiceGrid.java b/src/main/java/de/kreth/invoice/views/invoice/InvoiceGrid.java
index c14faab..90e7772 100644
--- a/src/main/java/de/kreth/invoice/views/invoice/InvoiceGrid.java
+++ b/src/main/java/de/kreth/invoice/views/invoice/InvoiceGrid.java
@@ -8,6 +8,7 @@ import java.util.List;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.data.provider.DataProvider;
+import com.vaadin.flow.data.provider.ListDataProvider;
import com.vaadin.flow.data.renderer.LocalDateTimeRenderer;
import com.vaadin.flow.data.renderer.NumberRenderer;
@@ -41,4 +42,10 @@ public class InvoiceGrid extends Grid {
this.items.addAll(items);
getDataProvider().refreshAll();
}
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public ListDataProvider getDataProvider() {
+ return (ListDataProvider) super.getDataProvider();
+ }
}
diff --git a/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceItemDialog.java b/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceItemDialog.java
index 7df0e4f..60c615c 100644
--- a/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceItemDialog.java
+++ b/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceItemDialog.java
@@ -110,7 +110,7 @@ public class InvoiceItemDialog {
item.setStart(LocalDateTime.of(startDate.getValue(), startTime.getValue()));
item.setEnd(LocalDateTime.of(startDate.getValue(), endTime.getValue()));
item.setParticipants(participants.getValue());
-
+ item.getSumPrice();
}
public interface DialogCloseListener {
diff --git a/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceItemOverviewComponent.java b/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceItemOverviewComponent.java
index fb9d4a2..1a6fef3 100644
--- a/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceItemOverviewComponent.java
+++ b/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceItemOverviewComponent.java
@@ -105,7 +105,9 @@ public class InvoiceItemOverviewComponent extends VerticalLayout {
}
public void refreshData() {
- grid.setItems(invoiceItemRepository.findByInvoiceIsNull(user));
+ List findByInvoiceIsNull = invoiceItemRepository.findByInvoiceIsNull(user);
+ findByInvoiceIsNull.sort((i1, i2) -> i1.getStart().compareTo(i2.getStart()));
+ grid.setItems(findByInvoiceIsNull);
grid.deselectAll();
grid.getDataProvider().refreshAll();
ItemSelectionChangeEvent evt = new ItemSelectionChangeEvent(getAllItems());
diff --git a/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceOverviewComponent.java b/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceOverviewComponent.java
index 5d268ab..d20bdae 100644
--- a/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceOverviewComponent.java
+++ b/src/main/java/de/kreth/invoice/views/invoiceitem/InvoiceOverviewComponent.java
@@ -13,8 +13,6 @@ import com.vaadin.flow.component.ClickEvent;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.confirmdialog.ConfirmDialog;
import com.vaadin.flow.component.formlayout.FormLayout;
-import com.vaadin.flow.component.grid.contextmenu.GridContextMenu;
-import com.vaadin.flow.component.grid.contextmenu.GridContextMenu.GridContextMenuItemClickEvent;
import com.vaadin.flow.component.html.H3;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
@@ -35,7 +33,8 @@ public class InvoiceOverviewComponent extends VerticalLayout {
private final InvoiceBusiness business;
private final User user;
private final List itemsForInvoice;
- private final List creationListener;
+ private final List creationListener;
+ private InvoiceDialog invoiceDialog;
public InvoiceOverviewComponent(InvoiceBusiness business, User user, List itemsForInvoice) {
super();
@@ -51,31 +50,34 @@ public class InvoiceOverviewComponent extends VerticalLayout {
addButton);
add(new VerticalLayout(titleComponent, grid));
grid.addItemClickListener(ev -> openDialog(ev.getItem(), InvoiceMode.VIEW_ONLY));
- GridContextMenu menu = grid.addContextMenu();
- menu.addItem("Löschen", this::delete);
}
- private void delete(GridContextMenuItemClickEvent event) {
- if (event.getItem().isPresent()) {
- ConfirmDialog dlg = new ConfirmDialog();
- dlg.setHeader(getString(Localization_Properties.MESSAGE_DELETE_TITLE));
- dlg.setText(MessageFormat.format(getString(Localization_Properties.MESSAGE_DELETE_TEXT),
- event.getItem().get()));
- dlg.setCancelable(true);
- dlg.setCancelText("Nicht " + getString(Localization_Properties.LABEL_DELETE));
- dlg.setConfirmText(getString(Localization_Properties.LABEL_DELETE));
- dlg.addConfirmListener(ev -> {
- business.delete(event.getItem().get());
- refreshData();
- });
- dlg.open();
- }
+ private void confirmAndExecuteDelete(Invoice item) {
+ ConfirmDialog dlg = new ConfirmDialog();
+ dlg.setHeader(getString(Localization_Properties.MESSAGE_DELETE_TITLE));
+ dlg.setText(MessageFormat.format(getString(Localization_Properties.MESSAGE_DELETE_TEXT),
+ item));
+ dlg.setCancelable(true);
+ dlg.setCancelText("Nicht " + getString(Localization_Properties.LABEL_DELETE));
+ dlg.setConfirmText(getString(Localization_Properties.LABEL_DELETE));
+ dlg.addConfirmListener(ev -> {
+ business.delete(item);
+ if (invoiceDialog != null) {
+ invoiceDialog.close();
+ }
+ refreshData();
+ for (InvoiceCountChangeListener invoiceCreationListener : creationListener) {
+ invoiceCreationListener.invoiceCreated();
+ }
+ });
+ dlg.open();
}
public void refreshData() {
List loadAll = business.loadAll(invoice -> user.equals(invoice.getUser()));
+ loadAll.sort((i1, i2) -> i1.getInvoiceDate().compareTo(i2.getInvoiceDate()));
grid.setItems(loadAll);
grid.getDataProvider().refreshAll();
}
@@ -97,24 +99,35 @@ public class InvoiceOverviewComponent extends VerticalLayout {
}
private void openDialog(Invoice invoice, InvoiceMode mode) {
- InvoiceDialog dlg = new InvoiceDialog(mode);
- dlg.setInvoice(invoice);
- dlg.addOkClickListener(evt -> {
+ invoiceDialog = new InvoiceDialog(mode);
+ List invoiceIds = new ArrayList<>();
+
+ grid.getDataProvider().getItems().forEach(inv -> invoiceIds.add(inv.getInvoiceId().strip()));
+ invoiceDialog.setInvoice(invoice, invoiceIds);
+ invoiceDialog.addOkClickListener(evt -> {
business.save(invoice);
refreshData();
- for (InvoiceCreationListener invoiceCreationListener : creationListener) {
+ for (InvoiceCountChangeListener invoiceCreationListener : creationListener) {
invoiceCreationListener.invoiceCreated();
}
});
- dlg.open();
- dlg.addOpenedChangeListener(evt -> refreshData());
+ invoiceDialog.addDeleteClickListener(evt -> {
+ confirmAndExecuteDelete(invoice);
+ });
+ invoiceDialog.open();
+ invoiceDialog.addOpenedChangeListener(evt -> refreshData());
+ invoiceDialog.addOpenedChangeListener(ev -> {
+ if (ev.isOpened() == false) {
+ invoiceDialog = null;
+ }
+ });
}
- public void addInvoiceCreationListener(InvoiceCreationListener listener) {
+ public void addInvoiceCountChangeListener(InvoiceCountChangeListener listener) {
this.creationListener.add(listener);
}
- public static interface InvoiceCreationListener {
+ public static interface InvoiceCountChangeListener {
void invoiceCreated();
}
}
diff --git a/src/main/java/de/kreth/invoice/views/user/UserDetailsDialog.java b/src/main/java/de/kreth/invoice/views/user/UserDetailsDialog.java
index 12054e3..8eff28a 100644
--- a/src/main/java/de/kreth/invoice/views/user/UserDetailsDialog.java
+++ b/src/main/java/de/kreth/invoice/views/user/UserDetailsDialog.java
@@ -14,6 +14,7 @@ import org.slf4j.LoggerFactory;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.dialog.Dialog;
+import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.component.html.Hr;
import com.vaadin.flow.component.html.Image;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
@@ -62,9 +63,7 @@ public class UserDetailsDialog extends Dialog {
private final Button okButton;
private final Image signatureImage;
-//
-// private final UserBankRepository bankRepository;
-// private final UserAdressRepository adressRepository;
+ private final Upload upload;
private User user;
@@ -127,11 +126,9 @@ public class UserDetailsDialog extends Dialog {
.bind(UserAdress::getCity, UserAdress::setCity);
signatureImage = new Image();
- signatureImage.setWidth("192px");
- signatureImage.setHeight("62px");
signatureImage.setAlt("Keine Unterschrift konfiguriert");
- Upload upload = new Upload(this::receiveUpload);
+ upload = new Upload(this::receiveUpload);
upload.addFinishedListener(ev -> updateSignatureImage());
VerticalLayout layout = new VerticalLayout();
@@ -142,7 +139,7 @@ public class UserDetailsDialog extends Dialog {
HorizontalLayout cityLayout = new HorizontalLayout();
cityLayout.add(zipCode, city);
- layout.add(adress1, adress2, cityLayout, new HorizontalLayout(signatureImage, upload));
+ layout.add(adress1, adress2, cityLayout, new FormLayout(signatureImage, upload));
okButton = new Button("OK", ev -> {
BinderValidationStatus bankValidation = bankBinder.validate();
@@ -191,7 +188,8 @@ public class UserDetailsDialog extends Dialog {
}
private void updateSignatureImage() {
- if (user != null) {
+ if (user != null && user.getId() != null) {
+ upload.setUploadButton(null);
Signature signature = new Signature(user);
if (signature.isSignatureImageExists()) {
File signatureUrl = signature.getSignatureUrl();
@@ -210,8 +208,16 @@ public class UserDetailsDialog extends Dialog {
}
}
});
+ signatureImage.setWidth("192px");
+ signatureImage.setHeight("62px");
signatureImage.setSrc(resource);
}
+ } else {
+ signatureImage.setWidth(null);
+ signatureImage.setHeight(null);
+ upload.setVisible(false);
+ signatureImage.setAlt(
+ "Eine Unterschrift kann konfiguriert werden, nachdem die Benutzerdaten gespeichert wurden.");
}
}
diff --git a/src/main/resources/localization.properties b/src/main/resources/localization.properties
index 3a49bc9..77d8825 100644
--- a/src/main/resources/localization.properties
+++ b/src/main/resources/localization.properties
@@ -62,7 +62,7 @@ label.logout = Abmelden
label.ok = OK
label.store = Speichern
label.preview = Vorschau
-label.open = \u00D6ffnen
+label.open = PDF \u00D6ffnen
label.user.register = Registrieren
message.article.priceerror = Bitte legen Sie den Preis fest.