Erweiterungen
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user