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 @@