Feature 5 enhance table with sort and filter functionality #6
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user