Vacaciones #54
@ -3,7 +3,9 @@ package com.primefactorsolutions.repositories;
|
||||
import com.primefactorsolutions.model.TimeOffRequest;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public interface TimeOffRequestRepository extends JpaRepository<TimeOffRequest, UUID> {
|
||||
List<TimeOffRequest> findByEmployee_Id(UUID id_employee);
|
||||
}
|
||||
|
@ -85,4 +85,8 @@ public class TimeOffRequestService {
|
||||
int end = Math.min(start + pageSize, timeOffRequests.size());
|
||||
return timeOffRequests.subList(start, end);
|
||||
}
|
||||
|
||||
public List<TimeOffRequest> findRequestsByEmployeeId(UUID id_employee) {
|
||||
return timeOffRequestRepository.findByEmployee_Id(id_employee);
|
||||
}
|
||||
}
|
193
src/main/java/com/primefactorsolutions/views/RequestView.java
Normal file
193
src/main/java/com/primefactorsolutions/views/RequestView.java
Normal file
@ -0,0 +1,193 @@
|
||||
package com.primefactorsolutions.views;
|
||||
|
||||
import com.primefactorsolutions.model.Employee;
|
||||
import com.primefactorsolutions.model.TimeOffRequest;
|
||||
import com.primefactorsolutions.model.TimeOffRequestType;
|
||||
import com.primefactorsolutions.service.EmployeeService;
|
||||
import com.primefactorsolutions.service.TimeOffRequestService;
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
import com.vaadin.flow.component.combobox.ComboBox;
|
||||
import com.vaadin.flow.component.grid.GridSortOrder;
|
||||
import com.vaadin.flow.component.html.Div;
|
||||
import com.vaadin.flow.component.html.H3;
|
||||
import com.vaadin.flow.component.html.Span;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||
import com.vaadin.flow.data.provider.SortDirection;
|
||||
import com.vaadin.flow.router.BeforeEvent;
|
||||
import com.vaadin.flow.router.HasUrlParameter;
|
||||
import com.vaadin.flow.router.PageTitle;
|
||||
import com.vaadin.flow.router.Route;
|
||||
import com.vaadin.flow.spring.annotation.SpringComponent;
|
||||
import jakarta.annotation.security.PermitAll;
|
||||
import org.apache.commons.beanutils.BeanComparator;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.vaadin.firitin.components.grid.PagingGrid;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@SpringComponent
|
||||
@PermitAll
|
||||
@Scope("prototype")
|
||||
@PageTitle("Request")
|
||||
@Route(value = "/requests", layout = MainLayout.class)
|
||||
public class RequestView extends Div implements HasUrlParameter<String> {
|
||||
|
||||
private final TimeOffRequestService requestService;
|
||||
private final EmployeeService employeeService;
|
||||
private final PagingGrid<TimeOffRequest> requestGrid = new PagingGrid<>(TimeOffRequest.class);
|
||||
private List<TimeOffRequest> requests;
|
||||
private ComboBox<TimeOffRequestType> categoryFilter;
|
||||
private ComboBox<TimeOffRequest.Status> stateFilter;
|
||||
private UUID employeeId;
|
||||
|
||||
public RequestView(TimeOffRequestService requestService, EmployeeService employeeService) {
|
||||
this.requestService = requestService;
|
||||
this.employeeService = employeeService;
|
||||
this.requests = Collections.emptyList();
|
||||
setupFilters();
|
||||
setupGrid();
|
||||
add(requestGrid);
|
||||
add(createSummaryLayout());
|
||||
add(createActionButtons());
|
||||
refreshRequestGrid(null, null);
|
||||
}
|
||||
|
||||
private void setupFilters() {
|
||||
categoryFilter = createCategoryFilter();
|
||||
stateFilter = createStateFilter();
|
||||
add(categoryFilter, stateFilter);
|
||||
}
|
||||
|
||||
private ComboBox<TimeOffRequestType> createCategoryFilter() {
|
||||
categoryFilter = new ComboBox<>("Category");
|
||||
categoryFilter.setItems(TimeOffRequestType.values());
|
||||
categoryFilter.setValue(TimeOffRequestType.values()[0]);
|
||||
categoryFilter.addValueChangeListener(event -> refreshRequestGrid(event.getValue(), stateFilter.getValue()));
|
||||
return categoryFilter;
|
||||
}
|
||||
|
||||
private ComboBox<TimeOffRequest.Status> createStateFilter() {
|
||||
stateFilter = new ComboBox<>("State");
|
||||
stateFilter.setItems(TimeOffRequest.Status.values());
|
||||
stateFilter.setValue(TimeOffRequest.Status.values()[0]);
|
||||
stateFilter.addValueChangeListener(event -> refreshRequestGrid(categoryFilter.getValue(), event.getValue()));
|
||||
return stateFilter;
|
||||
}
|
||||
|
||||
private void setupGrid() {
|
||||
requestGrid.setColumns(
|
||||
"category",
|
||||
"state",
|
||||
"availableDays",
|
||||
"expiration",
|
||||
"startDate",
|
||||
"endDate",
|
||||
"daysToBeTake",
|
||||
"daysBalance"
|
||||
);
|
||||
}
|
||||
|
||||
private VerticalLayout createSummaryLayout() {
|
||||
int totalVacations = 15;
|
||||
int totalTimeOff = 2;
|
||||
int totalAvailableDays = totalVacations + totalTimeOff;
|
||||
Span holidaysLabel = new Span("TOTAL HOLIDAYS: " + totalVacations);
|
||||
Span timeOffLabel = new Span("TOTAL TIME OFF: " + totalTimeOff);
|
||||
Span availableDaysLabel = new Span("TOTAL AVAILABLE DAYS: " + totalAvailableDays);
|
||||
return new VerticalLayout(holidaysLabel, timeOffLabel, availableDaysLabel);
|
||||
}
|
||||
|
||||
private HorizontalLayout createActionButtons() {
|
||||
Button viewButton = new Button("View");
|
||||
Button editButton = new Button("Edit");
|
||||
Button saveButton = new Button("Save");
|
||||
Button closeButton = new Button("Close", event -> navigateToRequestsListView());
|
||||
return new HorizontalLayout(viewButton, editButton, saveButton, closeButton);
|
||||
}
|
||||
|
||||
private void navigateToRequestsListView() {
|
||||
getUI().ifPresent(ui -> ui.navigate(RequestsListView.class));
|
||||
|
||||
}
|
||||
|
||||
private void refreshRequestGrid(final TimeOffRequestType category,
|
||||
final TimeOffRequest.Status state) {
|
||||
requestGrid.setPagingDataProvider((page, pageSize) -> {
|
||||
if (allFiltersAreNull(category, state)) {
|
||||
return fetchTimeOffRequests((int) page, pageSize);
|
||||
} else {
|
||||
return fetchFilteredTimeOffRequests((int) page, pageSize,category, state);
|
||||
}
|
||||
});
|
||||
requestGrid.getDataProvider().refreshAll();
|
||||
}
|
||||
|
||||
private boolean allFiltersAreNull(TimeOffRequestType category, TimeOffRequest.Status state) {
|
||||
return category == null && state == null;
|
||||
}
|
||||
|
||||
private List<TimeOffRequest> fetchTimeOffRequests(int page, int pageSize) {
|
||||
int start = page * pageSize;
|
||||
if (requestGrid.getSortOrder().isEmpty()) {
|
||||
int end = Math.min(start + pageSize, requests.size());
|
||||
return requests.subList(start, end);
|
||||
} else {
|
||||
return fetchSortedTimeOffRequests(start, pageSize);
|
||||
}
|
||||
}
|
||||
|
||||
private List<TimeOffRequest> fetchSortedTimeOffRequests(int start, int pageSize) {
|
||||
GridSortOrder<TimeOffRequest> sortOrder = requestGrid.getSortOrder().getFirst();
|
||||
int end = Math.min(start + pageSize, requests.size());
|
||||
requests.sort(new BeanComparator<>(sortOrder.getSorted().getKey()));
|
||||
|
||||
if (sortOrder.getDirection() != SortDirection.ASCENDING) {
|
||||
Collections.reverse(requests);
|
||||
}
|
||||
return requests.subList(start, end);
|
||||
}
|
||||
|
||||
private List<TimeOffRequest> fetchFilteredTimeOffRequests(int page, int pageSize, TimeOffRequestType category, TimeOffRequest.Status state) {
|
||||
requests = requestService.findRequestsByEmployeeId(employeeId);
|
||||
if (category != null && !"ALL".equals(category.name())) {
|
||||
requests = requests.stream()
|
||||
.filter(req -> req.getCategory().equals(category))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
if (state != null && !"ALL".equals(state.name())) {
|
||||
requests = requests.stream()
|
||||
.filter(req -> req.getState().equals(state))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
int end = Math.min(page + pageSize, requests.size());
|
||||
return requests.subList(page, end);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setParameter(BeforeEvent event, String parameter) {
|
||||
try {
|
||||
employeeId = UUID.fromString(parameter);
|
||||
Employee employee = employeeService.getEmployee(employeeId);
|
||||
|
||||
String employeeName = employee.getFirstName() + " " + employee.getLastName();
|
||||
String employeeTeam = employee.getTeam();
|
||||
setViewTitle(employeeName, employeeTeam);
|
||||
|
||||
requests = requestService.findRequestsByEmployeeId(employeeId);
|
||||
requestGrid.setItems(requests);
|
||||
} catch (IllegalArgumentException e) {
|
||||
requestGrid.setItems();
|
||||
}
|
||||
}
|
||||
|
||||
private void setViewTitle(String employeeName, String employeeTeam) {
|
||||
H3 employeeTitle = new H3("Name: " + employeeName);
|
||||
H3 teamTitle = new H3("Team: " + employeeTeam);
|
||||
addComponentAsFirst(employeeTitle);
|
||||
addComponentAtIndex(1, teamTitle);
|
||||
}
|
||||
}
|
@ -9,6 +9,7 @@ import com.vaadin.flow.component.combobox.ComboBox;
|
||||
import com.vaadin.flow.component.grid.GridSortOrder;
|
||||
import com.vaadin.flow.component.html.Main;
|
||||
import com.vaadin.flow.component.html.Span;
|
||||
import com.vaadin.flow.component.notification.Notification;
|
||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||
import com.vaadin.flow.data.provider.SortDirection;
|
||||
import com.vaadin.flow.router.PageTitle;
|
||||
@ -19,6 +20,7 @@ import org.springframework.context.annotation.Scope;
|
||||
import org.vaadin.firitin.components.grid.PagingGrid;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@SpringComponent
|
||||
@Scope("prototype")
|
||||
@ -35,6 +37,7 @@ public class RequestsListView extends Main {
|
||||
private ComboBox<Team> teamFilter;
|
||||
private ComboBox<TimeOffRequestType> categoryFilter;
|
||||
private ComboBox<TimeOffRequest.Status> stateFilter;
|
||||
private UUID selectedEmployeeId;
|
||||
|
||||
public RequestsListView(final TimeOffRequestService requestService,
|
||||
final EmployeeService employeeService,
|
||||
@ -76,13 +79,25 @@ public class RequestsListView extends Main {
|
||||
requestGrid.addComponentColumn(this::createTeamSpan).setHeader("Team");
|
||||
requestGrid.setPaginationBarMode(PagingGrid.PaginationBarMode.BOTTOM);
|
||||
requestGrid.setPageSize(5);
|
||||
requestGrid.asSingleSelect().addValueChangeListener(event -> {
|
||||
TimeOffRequest selectedRequest = event.getValue();
|
||||
if (selectedRequest != null) {
|
||||
selectedEmployeeId = selectedRequest.getEmployee().getId();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private HorizontalLayout createActionButtons() {
|
||||
Button viewButton = new Button("View");
|
||||
Button viewButton = new Button("View", event -> {
|
||||
if (selectedEmployeeId != null) {
|
||||
navigateToTimeOffRequestView(selectedEmployeeId);
|
||||
} else {
|
||||
Notification.show("Please select a request to view.", 3000, Notification.Position.MIDDLE);
|
||||
}
|
||||
});
|
||||
Button editButton = new Button("Edit");
|
||||
Button saveButton = new Button("Save");
|
||||
Button closeButton = new Button("Close", event -> closeView());
|
||||
Button closeButton = new Button("Close", event -> navigateToMainView());
|
||||
return new HorizontalLayout(viewButton, editButton, saveButton, closeButton);
|
||||
}
|
||||
|
||||
@ -230,7 +245,11 @@ public class RequestsListView extends Main {
|
||||
return "ALL".equals(team.getName()) ? "ALL" : team.getName();
|
||||
}
|
||||
|
||||
private void closeView() {
|
||||
private void navigateToMainView() {
|
||||
getUI().ifPresent(ui -> ui.navigate(MainView.class));
|
||||
}
|
||||
|
||||
private void navigateToTimeOffRequestView(final UUID id_employee) {
|
||||
getUI().ifPresent(ui -> ui.navigate("requests/" + id_employee.toString()));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user