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 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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user