From ae830753332e2ee3b668eb561e098a55b14a5c79 Mon Sep 17 00:00:00 2001 From: Nils Burghardt Date: Sun, 13 Jul 2025 19:09:14 +0200 Subject: [PATCH] enhance table with sort and filter func --- .../mytimetracker/ui/view/TimeEntryView.java | 55 +++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/nilzbu/mytimetracker/ui/view/TimeEntryView.java b/src/main/java/de/nilzbu/mytimetracker/ui/view/TimeEntryView.java index e1043f7..6ff60ca 100644 --- a/src/main/java/de/nilzbu/mytimetracker/ui/view/TimeEntryView.java +++ b/src/main/java/de/nilzbu/mytimetracker/ui/view/TimeEntryView.java @@ -22,6 +22,7 @@ import jakarta.annotation.security.PermitAll; import org.springframework.security.core.context.SecurityContextHolder; import java.time.LocalDate; +import java.util.List; @Route(value = "time-entry", layout = MainLayout.class) @PageTitle("Time Entry") @@ -47,10 +48,16 @@ public class TimeEntryView extends VerticalLayout { private final Grid entryGrid = new Grid<>(TimeEntry.class, false); private TimeEntry selectedEntry = null; + private final DatePicker fromDate = new DatePicker("From"); + private final DatePicker toDate = new DatePicker("To"); + private final Button applyFilterBtn = new Button("Apply Filter"); + public TimeEntryView(TimeEntryService timeEntryService, UserRepository userRepository) { this.timeEntryService = timeEntryService; this.userRepository = userRepository; + setSizeFull(); + initializeUser(); configureFormFields(); configureButtons(); @@ -58,7 +65,7 @@ public class TimeEntryView extends VerticalLayout { datePicker.addValueChangeListener(e -> toggleSaveButton()); - add(buildFormLayout(), buildButtonLayout(), entryGrid); + add(buildFormLayout(), buildButtonLayout(), buildDateRangeFilterLayout(), entryGrid); refreshGrid(); toggleSaveButton(); } @@ -88,6 +95,14 @@ public class TimeEntryView extends VerticalLayout { return new HorizontalLayout(saveBtn, updateBtn, deleteBtn); } + private HorizontalLayout buildDateRangeFilterLayout() { + applyFilterBtn.addClickListener(e -> refreshGrid()); + + HorizontalLayout filterLayout = new HorizontalLayout(fromDate, toDate, applyFilterBtn); + filterLayout.setAlignItems(Alignment.END); + return filterLayout; + } + private void configureButtons() { saveBtn.addClickListener(e -> saveEntry()); updateBtn.addClickListener(e -> updateEntry()); @@ -144,21 +159,39 @@ public class TimeEntryView extends VerticalLayout { } private void configureGrid() { - entryGrid.addColumn(TimeEntry::getDate).setHeader("Date"); - entryGrid.addColumn(TimeEntry::getStartTime).setHeader("Start"); - entryGrid.addColumn(TimeEntry::getEndTime).setHeader("End"); - entryGrid.addColumn(TimeEntry::getPauseMinutes).setHeader("Break (min)"); - entryGrid.addColumn(TimeEntry::getTargetMinutes).setHeader("Target (min)"); - entryGrid.addColumn(timeEntryService::calculateNetWorkMinutes).setHeader("Actual (min)"); - entryGrid.addColumn(TimeEntry::getStatus).setHeader("Status"); - entryGrid.addColumn(TimeEntry::getComment).setHeader("Comment"); - entryGrid.addColumn(timeEntryService::calculateDeviation).setHeader("Deviation (min)"); + entryGrid.setSizeFull(); + + entryGrid.addColumn(TimeEntry::getDate).setHeader("Date").setSortable(true); + entryGrid.addColumn(TimeEntry::getStartTime).setHeader("Start").setSortable(true); + entryGrid.addColumn(TimeEntry::getEndTime).setHeader("End").setSortable(true); + entryGrid.addColumn(TimeEntry::getPauseMinutes).setHeader("Break (min)").setSortable(true); + entryGrid.addColumn(TimeEntry::getTargetMinutes).setHeader("Target (min)").setSortable(true); + entryGrid.addColumn(timeEntryService::calculateNetWorkMinutes).setHeader("Actual (min)").setSortable(true); + entryGrid.addColumn(TimeEntry::getStatus).setHeader("Status").setSortable(true); + entryGrid.addColumn(TimeEntry::getComment).setHeader("Comment").setSortable(true); + entryGrid.addColumn(timeEntryService::calculateDeviation).setHeader("Deviation (min)").setSortable(true); + + entryGrid.getColumns().forEach(col -> col.setAutoWidth(true)); entryGrid.asSingleSelect().addValueChangeListener(event -> populateForm(event.getValue())); } private void refreshGrid() { - entryGrid.setItems(timeEntryService.getEntriesForUser(currentUser)); + List entries = timeEntryService.getEntriesForUser(currentUser); + + if (fromDate.getValue() != null) { + entries = entries.stream() + .filter(entry -> !entry.getDate().isBefore(fromDate.getValue())) + .toList(); + } + + if (toDate.getValue() != null) { + entries = entries.stream() + .filter(entry -> !entry.getDate().isAfter(toDate.getValue())) + .toList(); + } + + entryGrid.setItems(entries); } private void populateForm(TimeEntry entry) { -- 2.49.1