From 3ea935bc96a522c039814afd6ecea450dee83164 Mon Sep 17 00:00:00 2001 From: unknown <89336274+huanis@users.noreply.github.com> Date: Sun, 15 May 2022 23:31:40 +0700 Subject: [PATCH] add controller for project pending list --- .../controller/ProjectsController.java | 38 +++++ .../project-page/pending_members.html | 132 ++++++++++++++++++ 2 files changed, 170 insertions(+) create mode 100644 src/main/resources/templates/project-page/pending_members.html diff --git a/src/main/java/com/id/ui/cs/deadliners/projects/controller/ProjectsController.java b/src/main/java/com/id/ui/cs/deadliners/projects/controller/ProjectsController.java index a08915f..1dd4ee6 100644 --- a/src/main/java/com/id/ui/cs/deadliners/projects/controller/ProjectsController.java +++ b/src/main/java/com/id/ui/cs/deadliners/projects/controller/ProjectsController.java @@ -60,4 +60,42 @@ public class ProjectsController { return "redirect:/projects"; } + @RequestMapping(path = "/project-pending-list/{id}") + public String projectPendingMembers(@AuthenticationPrincipal AppUserDetails appUserDetails, + @PathVariable("id") Long id, + Model model){ + var user = appUserDetails.getAppUser(); + var project = projectService.getProject(id); + + if (project.isAdmin(user)){ + model.addAttribute("project", project); + model.addAttribute("admin", user); + return "project-page/pending_members"; + } + + return "redirect:/projects"; + } + + @RequestMapping(path = "/accept") + public String acceptUser(@AuthenticationPrincipal AppUserDetails appUserDetails, + @RequestParam(value = "email") String email, + @RequestParam(value = "projectId") Long projectId) { + var admin = appUserDetails.getAppUser(); + var user = appUserService.getUser(email); + projectService.acceptUser(projectId, admin, user); + + return "redirect:/projects/project-pending-list/" + projectId; + } + + @RequestMapping(path = "/reject") + public String rejectUser(@AuthenticationPrincipal AppUserDetails appUserDetails, + @RequestParam(value = "email") String email, + @RequestParam(value = "projectId") Long projectId) { + var admin = appUserDetails.getAppUser(); + var user = appUserService.getUser(email); + projectService.rejectUser(projectId, admin, user); + + return "redirect:/projects/project-pending-list/" + projectId; + } + } diff --git a/src/main/resources/templates/project-page/pending_members.html b/src/main/resources/templates/project-page/pending_members.html new file mode 100644 index 0000000..bfbdb42 --- /dev/null +++ b/src/main/resources/templates/project-page/pending_members.html @@ -0,0 +1,132 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Deadlines</title> + + <!-- CSS only --> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css"> + <link href='https://fonts.googleapis.com/css?family=Poppins' rel='stylesheet'> + <link rel="stylesheet" th:href="@{/css/projects/projects.css}"> + <script src="https://cdn.tailwindcss.com"></script> + + <style> + .content { + margin: auto; + margin-top: 70px !important; + margin-bottom: 30px; + display: flex; + flex-direction: column; + justify-content: flex-start; + width: 90%; + } + + .title-section { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + } + + .card { + margin-top: 5px; + } + + div.project-name { + width: 35% !important; + } + + div.project-name p { + font-weight: 500; + text-decoration-line: none; + } + + div.project-author { + white-space: nowrap; + width: 25% !important; + overflow: hidden; + text-overflow: ellipsis; + } + + div.project-description { + white-space: nowrap; + width: 40% !important; + overflow: hidden; + text-overflow: ellipsis; + } + + .row { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: wrap; + } + + .empty { + text-align: center; + margin-top: 5px; + } + + </style> + +</head> +<body> +<header> + <div th:replace="fragment/navbar :: navbar"></div> +</header> + +<div class="content"> + + <div class="title-section"> + <h1>Pending Members</h1> + <a href="/projects/new-project"><button class="btn btn-primary btn-sm" style="margin-left: 10px">New Project</button></a> + </div> + <hr> + + <div th:if="${project.getPendingMembers().size()} > 0"> + + <div th:each="user: ${project.getPendingMembers()}"> + <div class="card"> + <div class="card-body"> + + <div class="row"> + <div class="project-name"> + <p th:text="${user.getFirstName() + ' ' + user.getLastName()} "></p> + </div> + <form class="form-group" th:action="@{projects/accept}" method="GET"> + <input type="hidden" name="email" th:value="${user.getEmail()}" /> + <input type="hidden" name="projectId" th:value="${project.getId()}" /> + <button + class="bg-gray-500 text-white rounded px-4 py-1 font-bold uppercase text-sm hover:bg-gray-600" + type="submit" + > + Accept + </button> + </form> + <form class="form-group" th:action="@{projects/reject}" method="GET"> + <input type="hidden" name="email" th:value="${user.getEmail()}" /> + <input type="hidden" name="projectId" th:value="${project.getId()}" /> + <button + class="bg-gray-500 text-white rounded px-4 py-1 font-bold uppercase text-sm hover:bg-gray-600" + type="submit" + > + Reject + </button> + </form> + + </div> + </div> + </div> + </div> + + </div> + <div th:unless="${project.getPendingMembers().size() > 0}"> + <h4 class="empty">No one is waiting right now :D</h4> + </div> +</div> + +</body> \ No newline at end of file -- GitLab