From b4c6416934197f3dffa8ee46b80d0e35c6aa9ef3 Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Thu, 14 Aug 2025 15:21:20 +0200 Subject: [PATCH] Erweiterungen --- .../pages/jobs/ui/view/ShowJobsView.java | 71 +++++++++++++++++-- 1 file changed, 65 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/assecutor/votianlt/pages/jobs/ui/view/ShowJobsView.java b/src/main/java/de/assecutor/votianlt/pages/jobs/ui/view/ShowJobsView.java index 943c7e5..11efb2e 100644 --- a/src/main/java/de/assecutor/votianlt/pages/jobs/ui/view/ShowJobsView.java +++ b/src/main/java/de/assecutor/votianlt/pages/jobs/ui/view/ShowJobsView.java @@ -3,9 +3,11 @@ package de.assecutor.votianlt.pages.jobs.ui.view; import com.vaadin.flow.component.datepicker.DatePicker; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.html.Anchor; import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.server.StreamResource; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import de.assecutor.votianlt.model.Job; @@ -22,6 +24,7 @@ public class ShowJobsView extends VerticalLayout { private final DatePicker startDate = new DatePicker("Startdatum"); private final DatePicker endDate = new DatePicker("Enddatum"); private final Button applyFilter = new Button("Anwenden"); + private final Button exportButton = new Button("CSV Export"); private final JobRepository jobRepository; private final Grid grid = new Grid<>(Job.class, false); @@ -31,8 +34,15 @@ public class ShowJobsView extends VerticalLayout { setSizeFull(); setPadding(true); setSpacing(true); - // Filterleiste - HorizontalLayout filterBar = new HorizontalLayout(startDate, endDate, applyFilter); + // Filterleiste mit Export-Button am rechten Rand + HorizontalLayout leftFilters = new HorizontalLayout(startDate, endDate, applyFilter); + leftFilters.setAlignItems(Alignment.END); + + HorizontalLayout filterBar = new HorizontalLayout(); + filterBar.setWidthFull(); + filterBar.add(leftFilters); + filterBar.add(exportButton); + filterBar.setJustifyContentMode(JustifyContentMode.BETWEEN); filterBar.setAlignItems(Alignment.END); add(filterBar); @@ -43,14 +53,16 @@ public class ShowJobsView extends VerticalLayout { startDate.setValue(today.minusDays(30)); endDate.setValue(today); applyFilter.addClickListener(e -> loadData()); + exportButton.addClickListener(e -> exportToCsv()); // Configure grid columns: Kunde, Auftragsnummer, Auftragsdatum, Zielort - grid.addColumn(Job::getDeliveryCompany).setHeader("Kunde").setAutoWidth(true).setFlexGrow(1); - grid.addColumn(Job::getJobNumber).setHeader("Auftragsnummer").setAutoWidth(true); - grid.addColumn(Job::getCreatedAt).setHeader("Auftragsdatum").setAutoWidth(true); - grid.addColumn(Job::getDeliveryCity).setHeader("Zielort").setAutoWidth(true).setFlexGrow(1); + grid.addColumn(Job::getDeliveryCompany).setHeader("Kunde").setAutoWidth(true).setFlexGrow(1).setSortable(true); + grid.addColumn(Job::getJobNumber).setHeader("Auftragsnummer").setAutoWidth(true).setSortable(true); + grid.addColumn(Job::getCreatedAt).setHeader("Auftragsdatum").setAutoWidth(true).setSortable(true); + grid.addColumn(Job::getDeliveryCity).setHeader("Zielort").setAutoWidth(true).setFlexGrow(1).setSortable(true); + grid.setMultiSort(true); grid.setSizeFull(); add(grid); @@ -74,5 +86,52 @@ public class ShowJobsView extends VerticalLayout { .toList(); grid.setItems(open); } + + private void exportToCsv() { + var items = grid.getListDataView().getItems().toList(); + + StreamResource resource = new StreamResource("auftraege.csv", () -> { + java.io.ByteArrayInputStream stream = new java.io.ByteArrayInputStream(generateCsv(items).getBytes(java.nio.charset.StandardCharsets.UTF_8)); + return stream; + }); + resource.setContentType("text/csv"); + resource.setCacheTime(0); + + // Create download anchor and trigger immediately + Anchor downloadAnchor = new Anchor(resource, "Download CSV"); + downloadAnchor.getElement().setAttribute("download", "auftraege.csv"); + downloadAnchor.setTarget("_blank"); + + // Add to UI and trigger download via JavaScript + add(downloadAnchor); + getUI().ifPresent(ui -> ui.getPage().executeJs( + "const link = arguments[0]; link.click(); setTimeout(() => link.remove(), 100);", + downloadAnchor.getElement() + )); + } + + private String generateCsv(java.util.List jobs) { + StringBuilder csv = new StringBuilder(); + // CSV Header + csv.append("Kunde,Auftragsnummer,Auftragsdatum,Zielort\n"); + + // CSV Data + for (Job job : jobs) { + csv.append(escapeCsv(job.getDeliveryCompany())).append(","); + csv.append(escapeCsv(job.getJobNumber())).append(","); + csv.append(job.getCreatedAt() != null ? job.getCreatedAt().toString() : "").append(","); + csv.append(escapeCsv(job.getDeliveryCity())).append("\n"); + } + + return csv.toString(); + } + + private String escapeCsv(String value) { + if (value == null) return ""; + if (value.contains(",") || value.contains("\"") || value.contains("\n")) { + return "\"" + value.replace("\"", "\"\"") + "\""; + } + return value; + } }