Erweiterungen

This commit is contained in:
2025-08-14 15:21:20 +02:00
parent 9e2ce1fffe
commit b4c6416934

View File

@@ -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<Job> 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<Job> 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;
}
}