diff --git a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/ToDoConfig.java b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/ToDoConfig.java new file mode 100644 index 0000000..677f5fa --- /dev/null +++ b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/ToDoConfig.java @@ -0,0 +1,22 @@ +package jp.ac.kobe_u.cs.itspecialist.todoapp; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.web.PageableHandlerMethodArgumentResolver; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +public class ToDoConfig implements WebMvcConfigurer { + + @Override + public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { + PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); + //ページ単位に表示する件数 + resolver.setFallbackPageable(PageRequest.of(0, 5)); + argumentResolvers.add(resolver); + } + +} \ No newline at end of file diff --git a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoController.java b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoController.java index 6b20956..7d41716 100644 --- a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoController.java +++ b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoController.java @@ -3,6 +3,8 @@ package jp.ac.kobe_u.cs.itspecialist.todoapp.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; @@ -54,13 +56,14 @@ public class ToDoController { * ユーザのToDoリストのページ */ @GetMapping("/{mid}/todos") - String showToDoList(@PathVariable String mid, @ModelAttribute(name = "ToDoForm") ToDoForm form, Model model) { + String showToDoList(@PathVariable String mid, @ModelAttribute(name = "ToDoForm") ToDoForm form, + Model model, Pageable pageable) { Member m = mService.getMember(mid); model.addAttribute("member", m); model.addAttribute("ToDoForm", form); - List<ToDo> todos = tService.getToDoList(mid); + Page<ToDo> todos = tService.getToDoList(mid, pageable); model.addAttribute("todos", todos); - List<ToDo> dones = tService.getDoneList(mid); + Page<ToDo> dones = tService.getDoneList(mid, pageable); model.addAttribute("dones", dones); return "list"; } @@ -69,12 +72,12 @@ public class ToDoController { * 全員のToDoリストのページ */ @GetMapping("/{mid}/todos/all") - String showAllToDoList(@PathVariable String mid, Model model) { + String showAllToDoList(@PathVariable String mid, Model model, Pageable pageable) { Member m = mService.getMember(mid); model.addAttribute("member", m); - List<ToDo> todos = tService.getToDoList(); + Page<ToDo> todos = tService.getToDoList(pageable); model.addAttribute("todos", todos); - List<ToDo> dones = tService.getDoneList(); + Page<ToDo> dones = tService.getDoneList(pageable); model.addAttribute("dones", dones); return "alllist"; } @@ -85,10 +88,9 @@ public class ToDoController { @PostMapping("/{mid}/todos") String createToDo(@PathVariable String mid, @Validated @ModelAttribute(name = "ToDoForm") ToDoForm form, BindingResult bindingResult, Model model) { - if (bindingResult.hasErrors()) { - return showToDoList(mid, form, model); + if (!bindingResult.hasErrors()) { + tService.createToDo(mid, form); } - tService.createToDo(mid, form); return "redirect:/" + mid + "/todos"; } diff --git a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoRestController.java b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoRestController.java index 1862695..4142359 100644 --- a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoRestController.java +++ b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoRestController.java @@ -49,13 +49,13 @@ public class ToDoRestController { /* --- R: ToDoを取得する (リスト) --- */ @GetMapping("/{mid}/todos") List<ToDo> getToDoList(@PathVariable String mid) { - return todoService.getToDoList(mid); + return todoService.getToDoAllList(mid); } /* --- R: Doneを取得する (リスト) --- */ @GetMapping("/{mid}/dones") List<ToDo> getDoneList(@PathVariable String mid) { - return todoService.getDoneList(mid); + return todoService.getDoneAllList(mid); } /* --- U: ToDoを完了する --- */ diff --git a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/repository/ToDoRepository.java b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/repository/ToDoRepository.java index 4d7767c..d1b4a20 100644 --- a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/repository/ToDoRepository.java +++ b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/repository/ToDoRepository.java @@ -2,6 +2,8 @@ package jp.ac.kobe_u.cs.itspecialist.todoapp.repository; import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @@ -9,8 +11,9 @@ import jp.ac.kobe_u.cs.itspecialist.todoapp.entity.ToDo; @Repository public interface ToDoRepository extends CrudRepository<ToDo, Long> { - List<ToDo> findAll(); - List<ToDo> findByDone(boolean done); - List<ToDo> findByMid(String mid); + Page<ToDo> findAll(Pageable pageable); + Page<ToDo> findByDone(boolean done, Pageable pageable); + Page<ToDo> findByMid(String mid, Pageable pageable); + Page<ToDo> findByMidAndDone(String mid, boolean done, Pageable pageable); List<ToDo> findByMidAndDone(String mid, boolean done); } diff --git a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/service/ToDoService.java b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/service/ToDoService.java index 57a6371..5814047 100644 --- a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/service/ToDoService.java +++ b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/service/ToDoService.java @@ -4,6 +4,8 @@ import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import jp.ac.kobe_u.cs.itspecialist.todoapp.dto.ToDoForm; @@ -43,37 +45,46 @@ public class ToDoService { return todo; } + public List<ToDo> getToDoAllList(String mid) { + return tRepo.findByMidAndDone(mid, false); + } + /** * あるメンバーのToDoリストを取得する (R) * @param mid * @return */ - public List<ToDo> getToDoList(String mid) { - return tRepo.findByMidAndDone(mid, false); + public Page<ToDo> getToDoList(String mid, Pageable pageable) { + return tRepo.findByMidAndDone(mid, false, pageable); } + + public List<ToDo> getDoneAllList(String mid) { + return tRepo.findByMidAndDone(mid, true); + } + /** * あるメンバーのDoneリストを取得する (R) * @param mid * @return */ - public List<ToDo> getDoneList(String mid) { - return tRepo.findByMidAndDone(mid, true); + public Page<ToDo> getDoneList(String mid, Pageable pageable) { + return tRepo.findByMidAndDone(mid, true, pageable); } /** * 全員のToDoリストを取得する (R) * @return */ - public List<ToDo> getToDoList() { - return tRepo.findByDone(false); + public Page<ToDo> getToDoList(Pageable pageable) { + return tRepo.findByDone(false, pageable); } /** * 全員のDoneリストを取得する (R) * @return */ - public List<ToDo> getDoneList() { - return tRepo.findByDone(true); + public Page<ToDo> getDoneList(Pageable pageable) { + return tRepo.findByDone(true, pageable); } diff --git a/src/main/resources/templates/alllist.html b/src/main/resources/templates/alllist.html index 8580517..c27c2b9 100644 --- a/src/main/resources/templates/alllist.html +++ b/src/main/resources/templates/alllist.html @@ -27,6 +27,24 @@ <td>[[${todo.createdAt}]]</td> </tr> </table> + <div th:fragment="paginationbar"> + <ul> + <li th:class="${todos.first}? 'disabled': ''" style="display:inline"> + <span th:if="${todos.first}"><<</span> + <a th:if="${not todos.first}" th:href="@{${url}(page=0)}"><<</a> + </li> + <li th:if="${todos.totalPages} > 0" th:each="i: ${#numbers.sequence(0, todos.totalPages-1)}" th:class="(${i}==${todos.number})?'active': ''" style="display:inline"> + <span th:if="${i} == ${todos.number}" th:text="${i+1}">1</span> + <a th:if="${i}!=${todos.number}" th:href="@{${url}(page=${i})}"> + <span th:text="${i+1}">1</span> + </a> + </li> + <li th:class="${todos.last}? 'disabled': ''" style="display:inline"> + <span th:if="${todos.last}">>></span> + <a th:if="${not todos.last}" th:href="@{${url}(page=(${todos.totalPages}-1))}">>></a> + </li> + </ul> + </div> <h2>Done</h2> <table border="1"> @@ -43,7 +61,24 @@ <td>[[${done.doneAt}]]</td> </tr> </table> - + <div th:fragment="paginationbar"> + <ul> + <li th:class="${dones.first}? 'disabled': ''" style="display:inline"> + <span th:if="${dones.first}"><<</span> + <a th:if="${not dones.first}" th:href="@{${url}(page=0)}"><<</a> + </li> + <li th:if="${dones.totalPages} > 0" th:each="i: ${#numbers.sequence(0, dones.totalPages-1)}" th:class="(${i}==${dones.number})?'active': ''" style="display:inline"> + <span th:if="${i} == ${dones.number}" th:text="${i+1}">1</span> + <a th:if="${i}!=${dones.number}" th:href="@{${url}(page=${i})}"> + <span th:text="${i+1}">1</span> + </a> + </li> + <li th:class="${dones.last}? 'disabled': ''" style="display:inline"> + <span th:if="${dones.last}">>></span> + <a th:if="${not dones.last}" th:href="@{${url}(page=(${dones.totalPages}-1))}">>></a> + </li> + </ul> + </div> </body> </html> \ No newline at end of file diff --git a/src/main/resources/templates/list.html b/src/main/resources/templates/list.html index a2939b9..4a21f1a 100644 --- a/src/main/resources/templates/list.html +++ b/src/main/resources/templates/list.html @@ -41,6 +41,24 @@ </td> </tr> </table> + <div th:fragment="paginationbar"> + <ul> + <li th:class="${todos.first}? 'disabled': ''" style="display:inline"> + <span th:if="${todos.first}"><<</span> + <a th:if="${not todos.first}" th:href="@{${url}(page=0)}"><<</a> + </li> + <li th:if="${todos.totalPages} > 0" th:each="i: ${#numbers.sequence(0, todos.totalPages-1)}" th:class="(${i}==${todos.number})?'active': ''" style="display:inline"> + <span th:if="${i} == ${todos.number}" th:text="${i+1}">1</span> + <a th:if="${i}!=${todos.number}" th:href="@{${url}(page=${i})}"> + <span th:text="${i+1}">1</span> + </a> + </li> + <li th:class="${todos.last}? 'disabled': ''" style="display:inline"> + <span th:if="${todos.last}">>></span> + <a th:if="${not todos.last}" th:href="@{${url}(page=(${todos.totalPages}-1))}">>></a> + </li> + </ul> + </div> <h2>Done</h2> <table border="1"> @@ -57,7 +75,24 @@ <td>[[${done.doneAt}]]</td> </tr> </table> - + <div th:fragment="paginationbar"> + <ul> + <li th:class="${dones.first}? 'disabled': ''" style="display:inline"> + <span th:if="${dones.first}"><<</span> + <a th:if="${not dones.first}" th:href="@{${url}(page=0)}"><<</a> + </li> + <li th:if="${dones.totalPages} > 0" th:each="i: ${#numbers.sequence(0, dones.totalPages-1)}" th:class="(${i}==${dones.number})?'active': ''" style="display:inline"> + <span th:if="${i} == ${dones.number}" th:text="${i+1}">1</span> + <a th:if="${i}!=${dones.number}" th:href="@{${url}(page=${i})}"> + <span th:text="${i+1}">1</span> + </a> + </li> + <li th:class="${dones.last}? 'disabled': ''" style="display:inline"> + <span th:if="${dones.last}">>></span> + <a th:if="${not dones.last}" th:href="@{${url}(page=(${dones.totalPages}-1))}">>></a> + </li> + </ul> + </div> </body> </html> \ No newline at end of file