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..a42cedb 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 @@ -7,10 +7,7 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.*; import jp.ac.kobe_u.cs.itspecialist.todoapp.dto.LoginForm; import jp.ac.kobe_u.cs.itspecialist.todoapp.dto.ToDoForm; @@ -100,4 +97,14 @@ public class ToDoController { tService.done(mid, seq); return "redirect:/" + mid + "/todos"; } + + /** + * 背景色の更新.更新終了後,ユーザページへリダイレクト. + */ + @PutMapping("/{mid}/todos/{seq}/background") + String updateBackground(@PathVariable String mid, @PathVariable Long seq, + @Validated @ModelAttribute(name="ToDoForm") ToDoForm form, Model model) { + tService.updateBackground(mid, seq, form.getBackground()); + return "redirect:/" + mid + "/todos"; + } } diff --git a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/dto/ToDoForm.java b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/dto/ToDoForm.java index b2f6fc4..cd0c2f9 100644 --- a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/dto/ToDoForm.java +++ b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/dto/ToDoForm.java @@ -17,11 +17,16 @@ public class ToDoForm { @Size(min=1, max=64) String title; //ToDo題目 + @NotBlank + @Size(min=6, max=8) + String background; // 背景色 + public ToDo toEntity() { ToDo t = new ToDo(); t.setTitle(title); t.setCreatedAt(new Date()); t.setDone(false); + t.setBackground(background); return t; } } diff --git a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/entity/ToDo.java b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/entity/ToDo.java index c0f901f..637ed8c 100644 --- a/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/entity/ToDo.java +++ b/src/main/java/jp/ac/kobe_u/cs/itspecialist/todoapp/entity/ToDo.java @@ -31,4 +31,5 @@ public class ToDo { Date createdAt; //作成日時 @Temporal(TemporalType.TIMESTAMP) Date doneAt; //完了日時 + String background; //背景色 } 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..ace1243 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 @@ -106,13 +106,31 @@ public class ToDoService { ToDo todo = getToDo(seq); //Doneの認可を確認する.他人のToDoを更新したらダメ. if (!mid.equals(todo.getMid())) { - throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, mid - + ": Cannot update other's todo of " + todo.getMid()); + throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, mid + + ": Cannot update other's todo of " + todo.getMid()); } todo.setTitle(form.getTitle()); //タイトルを更新 return tRepo.save(todo); } + /** + * 背景色を更新する. + * @param mid 更新者 + * @param seq 更新するToDo番号 + * @param background 新しい背景色 + * @return + */ + public ToDo updateBackground(String mid, Long seq, String background) { + ToDo todo = getToDo(seq); + //Doneの認可を確認する.他人のToDoを更新したらダメ. + if (!mid.equals(todo.getMid())) { + throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, mid + + ": Cannot update other's todo of " + todo.getMid()); + } + todo.setBackground(background); + return tRepo.save(todo); + } + /** * ToDoを削除する * @param mid 削除者 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e07c446..fcc0913 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,3 +9,7 @@ spring.datasource.password=todotodo # Spring-JPA: DBのテーブルを自動作成してくれる機能 # create: 新規作成, update: なければ新規作成, create-drop: 新規作成し終了時に削除 spring.jpa.hibernate.ddl-auto=update +# HTML から PUT, DELETE リクエスを投げるために必要. +# ただし,MultipartFileがリクエストに含まれると時間がかかるらしい. +# https://qiita.com/kazuhiro1982/items/b8b9965fddf9c5507517 +spring.mvc.hiddenmethod.filter.enabled=true diff --git a/src/main/resources/templates/alllist.html b/src/main/resources/templates/alllist.html index 8580517..3a7d4ca 100644 --- a/src/main/resources/templates/alllist.html +++ b/src/main/resources/templates/alllist.html @@ -21,7 +21,7 @@ <th>作成日時</th> </tr> <tr th:each="todo: ${todos}"> - <td>[[${todo.seq}]]</td> + <td th:style="'background-color: ' + ${todo.background}">[[${todo.seq}]]</td> <td>[[${todo.title}]]</td> <td>[[${todo.mid}]]</td> <td>[[${todo.createdAt}]]</td> @@ -37,7 +37,7 @@ <th>完了日時</th> </tr> <tr th:each="done: ${dones}"> - <td>[[${done.seq}]]</td> + <td th:style="'background-color: ' + ${done.background}">[[${done.seq}]]</td> <td>[[${done.title}]]</td> <td>[[${done.mid}]]</td> <td>[[${done.doneAt}]]</td> diff --git a/src/main/resources/templates/list.html b/src/main/resources/templates/list.html index a2939b9..c4e90bc 100644 --- a/src/main/resources/templates/list.html +++ b/src/main/resources/templates/list.html @@ -21,10 +21,15 @@ <th>コマンド</th> </tr> <tr th:each="todo: ${todos}"> - <td>[[${todo.seq}]]</td> + <td th:style="'background-color: ' + ${todo.background}">[[${todo.seq}]]</td> <td>[[${todo.title}]]</td> <td>[[${todo.createdAt}]]</td> <td> + <form th:object="${ToDoForm}" th:action="@{/{mid}/todos/{seq}/background(mid=${member.mid},seq=${todo.seq})}" th:method="put"> + <input type="hidden" name="title" th:value="${todo.title}"/> + <input type="color" name="background" th:value="${todo.background}" /> + <input type="submit" value="更新" /> + </form> <a th:href="@{/{mid}/todos/{seq}/done(mid=${member.mid},seq=${todo.seq})}">完了</a> </td> </tr> @@ -35,6 +40,7 @@ <td colspan="3"> <form role="form" th:action="@{/{mid}/todos(mid=${member.mid})}" th:object="${ToDoForm}" method="post"> <input type="text" required th:field="*{title}" /> + <input type="color" required name="background" th:value="*{background == null ? '#ffffff': background}" /> <input type="submit" value="新規作成" /> <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}" style="color: red"></div> </form> @@ -51,7 +57,7 @@ <th>完了日時</th> </tr> <tr th:each="done: ${dones}"> - <td>[[${done.seq}]]</td> + <td th:style="'background-color: ' + ${done.background}">[[${done.seq}]]</td> <td>[[${done.title}]]</td> <td>[[${done.createdAt}]]</td> <td>[[${done.doneAt}]]</td>