Feature 5 enhance table with sort and filter functionality #6

Merged
nilzbu merged 1 commits from feature/5_better_table into master 2025-07-13 17:14:00 +00:00
Showing only changes of commit ae83075333 - Show all commits

View File

@@ -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<TimeEntry> 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<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) {