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