diff --git a/pom.xml b/pom.xml index e716569..8dc9bbb 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.2.RELEASE + 2.1.3.RELEASE com.github.prominence @@ -50,6 +50,7 @@ mysql mysql-connector-java + 8.0.16 runtime diff --git a/src/main/java/com/github/prominence/carrepair/controller/ClientController.java b/src/main/java/com/github/prominence/carrepair/controller/ClientController.java index 74ca59a..f66f198 100644 --- a/src/main/java/com/github/prominence/carrepair/controller/ClientController.java +++ b/src/main/java/com/github/prominence/carrepair/controller/ClientController.java @@ -4,6 +4,7 @@ import com.github.prominence.carrepair.model.Client; import com.github.prominence.carrepair.service.ClientService; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -25,8 +26,8 @@ public class ClientController { } @GetMapping - public String index(ModelMap modelMap) { - Page clientList = clientService.findAll((Pageable) modelMap.get("pagination")); + public String index(@PageableDefault Pageable pageable, ModelMap modelMap) { + Page clientList = clientService.findAll(pageable); modelMap.addAttribute("clientList", clientList.getContent()); modelMap.addAttribute("totalPages", clientList.getTotalPages()); diff --git a/src/main/java/com/github/prominence/carrepair/controller/MechanicController.java b/src/main/java/com/github/prominence/carrepair/controller/MechanicController.java index b129f68..525f56f 100644 --- a/src/main/java/com/github/prominence/carrepair/controller/MechanicController.java +++ b/src/main/java/com/github/prominence/carrepair/controller/MechanicController.java @@ -5,6 +5,7 @@ import com.github.prominence.carrepair.model.Mechanic; import com.github.prominence.carrepair.service.MechanicService; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -27,8 +28,8 @@ public class MechanicController { } @GetMapping - public String index(ModelMap modelMap) { - Page clientList = mechanicService.findAll((Pageable) modelMap.get("pagination")); + public String index(@PageableDefault Pageable pageable, ModelMap modelMap) { + Page clientList = mechanicService.findAll(pageable); modelMap.addAttribute("mechanicList", clientList.getContent()); modelMap.addAttribute("totalPages", clientList.getTotalPages()); diff --git a/src/main/java/com/github/prominence/carrepair/controller/OrderController.java b/src/main/java/com/github/prominence/carrepair/controller/OrderController.java index 7b2d8e4..a6aac95 100644 --- a/src/main/java/com/github/prominence/carrepair/controller/OrderController.java +++ b/src/main/java/com/github/prominence/carrepair/controller/OrderController.java @@ -2,11 +2,13 @@ package com.github.prominence.carrepair.controller; import com.github.prominence.carrepair.enums.OrderStatus; import com.github.prominence.carrepair.model.Order; +import com.github.prominence.carrepair.repository.spec.OrderSpecifications; import com.github.prominence.carrepair.service.ClientService; import com.github.prominence.carrepair.service.MechanicService; import com.github.prominence.carrepair.service.OrderService; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -32,11 +34,14 @@ public class OrderController { } @GetMapping - public String index(ModelMap modelMap) { - Page orderList = orderService.findAll((Pageable) modelMap.get("pagination")); + public String index(@PageableDefault Pageable pageable, @RequestParam(required = false) String client, @RequestParam(required = false) String description, + @RequestParam(required = false) OrderStatus orderStatus, ModelMap modelMap) { + + Page orderList = orderService.findAll(OrderSpecifications.search(client, description, orderStatus), pageable); modelMap.addAttribute("orderList", orderList.getContent()); modelMap.addAttribute("totalPages", orderList.getTotalPages()); + modelMap.addAttribute("orderStatuses", OrderStatus.values()); return "order/index"; } diff --git a/src/main/java/com/github/prominence/carrepair/controller/advice/PaginationAdvice.java b/src/main/java/com/github/prominence/carrepair/controller/advice/PaginationAdvice.java deleted file mode 100644 index 5d9d482..0000000 --- a/src/main/java/com/github/prominence/carrepair/controller/advice/PaginationAdvice.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.prominence.carrepair.controller.advice; - -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestParam; - -@ControllerAdvice -public class PaginationAdvice { - - private static final int DEFAULT_PAGE_SIZE = 10; - - @ModelAttribute("pagination") - public void addPagination(@RequestParam(required = false) Integer size, @RequestParam(required = false) Integer page, Model model) { - final int pageValue = page == null ? 0 : page; - final int sizeValue = size == null ? DEFAULT_PAGE_SIZE : size; - Pageable pagination = PageRequest.of(pageValue, sizeValue); - - model.addAttribute("pagination", pagination); - model.addAttribute("page", pageValue); - } -} diff --git a/src/main/java/com/github/prominence/carrepair/repository/OrderRepository.java b/src/main/java/com/github/prominence/carrepair/repository/OrderRepository.java index 49c0d95..1134062 100644 --- a/src/main/java/com/github/prominence/carrepair/repository/OrderRepository.java +++ b/src/main/java/com/github/prominence/carrepair/repository/OrderRepository.java @@ -2,12 +2,13 @@ package com.github.prominence.carrepair.repository; import com.github.prominence.carrepair.model.Order; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; import java.util.List; @Repository -public interface OrderRepository extends JpaRepository { +public interface OrderRepository extends JpaRepository, JpaSpecificationExecutor { public List findAllByMechanic_Id(Long id); } diff --git a/src/main/java/com/github/prominence/carrepair/repository/spec/OrderSpecifications.java b/src/main/java/com/github/prominence/carrepair/repository/spec/OrderSpecifications.java new file mode 100644 index 0000000..4200397 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/repository/spec/OrderSpecifications.java @@ -0,0 +1,39 @@ +package com.github.prominence.carrepair.repository.spec; + +import com.github.prominence.carrepair.enums.OrderStatus; +import com.github.prominence.carrepair.model.Client; +import com.github.prominence.carrepair.model.Order; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.lang.Nullable; + +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Predicate; +import java.util.ArrayList; +import java.util.List; + +public class OrderSpecifications { + + public static Specification search(@Nullable String clientQuery, @Nullable String orderDescriptionQuery, @Nullable OrderStatus orderStatusQuery) { + return (root, criteriaQuery, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + if (!StringUtils.isEmpty(clientQuery)) { + Join clientJoin = root.join("client"); + predicates.add( + criteriaBuilder.or( + criteriaBuilder.like(clientJoin.get("firstName"), "%" + clientQuery + "%"), + criteriaBuilder.like(clientJoin.get("middleName"), "%" + clientQuery + "%"), + criteriaBuilder.like(clientJoin.get("lastName"), "%" + clientQuery + "%") + ) + ); + } + if (!StringUtils.isEmpty(orderDescriptionQuery)) { + predicates.add(criteriaBuilder.like(root.get("description"), "%" + orderDescriptionQuery + "%")); + } + if (orderStatusQuery != null) { + predicates.add(criteriaBuilder.equal(root.get("orderStatus"), orderStatusQuery.toString())); + } + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } +} diff --git a/src/main/java/com/github/prominence/carrepair/service/OrderService.java b/src/main/java/com/github/prominence/carrepair/service/OrderService.java index f87f2c0..fb4c50b 100644 --- a/src/main/java/com/github/prominence/carrepair/service/OrderService.java +++ b/src/main/java/com/github/prominence/carrepair/service/OrderService.java @@ -4,6 +4,7 @@ import com.github.prominence.carrepair.model.Order; import com.github.prominence.carrepair.repository.OrderRepository; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import java.util.Optional; @@ -21,6 +22,10 @@ public class OrderService { return orderRepository.findAll(pageable); } + public Page findAll(Specification specification, Pageable pageable) { + return orderRepository.findAll(specification, pageable); + } + public Optional findById(Long id) { return orderRepository.findById(id); } diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 20d903e..1925142 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -35,3 +35,7 @@ common.delete.button = Delete common.save.button = Save common.edit.button = Edit common.back.button = Back +common.search.button = Search + +common.nothingFound.label = Nothing was found. +common.deleteConfirmation.label = Are you sure to delete? diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 20d903e..1925142 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -35,3 +35,7 @@ common.delete.button = Delete common.save.button = Save common.edit.button = Edit common.back.button = Back +common.search.button = Search + +common.nothingFound.label = Nothing was found. +common.deleteConfirmation.label = Are you sure to delete? diff --git a/src/main/resources/messages_ru.properties b/src/main/resources/messages_ru.properties index 94f0837..280a42e 100644 --- a/src/main/resources/messages_ru.properties +++ b/src/main/resources/messages_ru.properties @@ -35,3 +35,7 @@ common.delete.button = Удалить common.save.button = Сохранить common.edit.button = Редактировать common.back.button = Назад +common.search.button = Поиск + +common.nothingFound.label = Ничего не найдено. +common.deleteConfirmation.label = Вы действительно хотите удалить? diff --git a/src/main/resources/templates/client/index.html b/src/main/resources/templates/client/index.html index 0fc9589..cf31b2b 100644 --- a/src/main/resources/templates/client/index.html +++ b/src/main/resources/templates/client/index.html @@ -6,7 +6,7 @@