enhance table with sort and filter func

This commit is contained in:
Nils Burghardt
2025-07-13 19:09:14 +02:00
parent 2c7dd8c8f2
commit ae83075333

View File

@@ -22,6 +22,7 @@ import jakarta.annotation.security.PermitAll;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List;
@Route(value = "time-entry", layout = MainLayout.class) @Route(value = "time-entry", layout = MainLayout.class)
@PageTitle("Time Entry") @PageTitle("Time Entry")
@@ -47,10 +48,16 @@ public class TimeEntryView extends VerticalLayout {
private final Grid<TimeEntry> entryGrid = new Grid<>(TimeEntry.class, false); private final Grid<TimeEntry> entryGrid = new Grid<>(TimeEntry.class, false);
private TimeEntry selectedEntry = null; 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) { public TimeEntryView(TimeEntryService timeEntryService, UserRepository userRepository) {
this.timeEntryService = timeEntryService; this.timeEntryService = timeEntryService;
this.userRepository = userRepository; this.userRepository = userRepository;
setSizeFull();
initializeUser(); initializeUser();
configureFormFields(); configureFormFields();
configureButtons(); configureButtons();
@@ -58,7 +65,7 @@ public class TimeEntryView extends VerticalLayout {
datePicker.addValueChangeListener(e -> toggleSaveButton()); datePicker.addValueChangeListener(e -> toggleSaveButton());
add(buildFormLayout(), buildButtonLayout(), entryGrid); add(buildFormLayout(), buildButtonLayout(), buildDateRangeFilterLayout(), entryGrid);
refreshGrid(); refreshGrid();
toggleSaveButton(); toggleSaveButton();
} }
@@ -88,6 +95,14 @@ public class TimeEntryView extends VerticalLayout {
return new HorizontalLayout(saveBtn, updateBtn, deleteBtn); 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() { private void configureButtons() {
saveBtn.addClickListener(e -> saveEntry()); saveBtn.addClickListener(e -> saveEntry());
updateBtn.addClickListener(e -> updateEntry()); updateBtn.addClickListener(e -> updateEntry());
@@ -144,21 +159,39 @@ public class TimeEntryView extends VerticalLayout {
} }
private void configureGrid() { private void configureGrid() {
entryGrid.addColumn(TimeEntry::getDate).setHeader("Date"); entryGrid.setSizeFull();
entryGrid.addColumn(TimeEntry::getStartTime).setHeader("Start");
entryGrid.addColumn(TimeEntry::getEndTime).setHeader("End"); entryGrid.addColumn(TimeEntry::getDate).setHeader("Date").setSortable(true);
entryGrid.addColumn(TimeEntry::getPauseMinutes).setHeader("Break (min)"); entryGrid.addColumn(TimeEntry::getStartTime).setHeader("Start").setSortable(true);
entryGrid.addColumn(TimeEntry::getTargetMinutes).setHeader("Target (min)"); entryGrid.addColumn(TimeEntry::getEndTime).setHeader("End").setSortable(true);
entryGrid.addColumn(timeEntryService::calculateNetWorkMinutes).setHeader("Actual (min)"); entryGrid.addColumn(TimeEntry::getPauseMinutes).setHeader("Break (min)").setSortable(true);
entryGrid.addColumn(TimeEntry::getStatus).setHeader("Status"); entryGrid.addColumn(TimeEntry::getTargetMinutes).setHeader("Target (min)").setSortable(true);
entryGrid.addColumn(TimeEntry::getComment).setHeader("Comment"); entryGrid.addColumn(timeEntryService::calculateNetWorkMinutes).setHeader("Actual (min)").setSortable(true);
entryGrid.addColumn(timeEntryService::calculateDeviation).setHeader("Deviation (min)"); 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())); entryGrid.asSingleSelect().addValueChangeListener(event -> populateForm(event.getValue()));
} }
private void refreshGrid() { private void refreshGrid() {
entryGrid.setItems(timeEntryService.getEntriesForUser(currentUser)); List<TimeEntry> 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) { private void populateForm(TimeEntry entry) {