diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java new file mode 100644 index 0000000000000000000000000000000000000000..8f33114b89c7b24dcb2edc09e7d3d756f3a38d2f --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java @@ -0,0 +1,46 @@ +package id.ac.ui.cs.advprog.tutorial0.controller; + +import id.ac.ui.cs.advprog.tutorial0.exception.DuplicateCourseNameException; +import id.ac.ui.cs.advprog.tutorial0.model.Course; +import id.ac.ui.cs.advprog.tutorial0.service.CourseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequestMapping("/course") +public class CourseController { + + @Autowired + private CourseService service; + + @GetMapping("/list") + public String CourseListPage(Model model) { + List<Course> allCourses = service.findAll(); + model.addAttribute("courses", allCourses); + return "courseList"; + } + + @GetMapping("/create") + public String createCoursePage(Model model) { + Course Course = new Course(); + model.addAttribute("course", Course); + return "createCourse"; + } + + @PostMapping("/create") + public String createCoursePost(@ModelAttribute Course course,Model templateVariables){ + try{ + service.create(course); + }catch (DuplicateCourseNameException e){ + templateVariables.addAttribute("error", e); + templateVariables.addAttribute("course", course); + return "createCourse"; + } + return "redirect:list"; + } + +} \ No newline at end of file diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/exception/DuplicateCourseNameException.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/exception/DuplicateCourseNameException.java new file mode 100644 index 0000000000000000000000000000000000000000..d20abaad7fa12485230f0da503f541e80337ab0f --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/exception/DuplicateCourseNameException.java @@ -0,0 +1,9 @@ +package id.ac.ui.cs.advprog.tutorial0.exception; + +public class DuplicateCourseNameException extends RuntimeException { + public DuplicateCourseNameException(String course) { + super(String.format("Course %s already exists", course)); + } + +} + diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..4b40f83997bb631f1a4d68d6a0db942a4c5839e1 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java @@ -0,0 +1,24 @@ +package id.ac.ui.cs.advprog.tutorial0.repository; + +import id.ac.ui.cs.advprog.tutorial0.model.Course; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +@Repository +public class CourseRepository { + + private final List<Course> courseInMemory = new ArrayList<>(); + + public Course create(Course course) { + courseInMemory.add(course); + return course; + } + + public Iterator<Course> findAll(){ + return courseInMemory.iterator(); + } + +} \ No newline at end of file diff --git a/src/main/resources/templates/courseList.html b/src/main/resources/templates/courseList.html new file mode 100644 index 0000000000000000000000000000000000000000..dc913ab10f30c1d504bc878a9108803f80609bd4 --- /dev/null +++ b/src/main/resources/templates/courseList.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <title>Course's List</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> +</head> +<body> + <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> + <div class="container-fluid"> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarNav"> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link active" aria-current="page" th:href="@{../}">Home</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/student/list}">Student</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/course/list}">Course</a> + </li> + </ul> + </div> + </div> + </nav> +<h2>Course's List</h2> +<a th:href="@{/course/create}" class="btn btn-primary btn-sm mb-3" >Create course</a> + +<table class="table"> + <thead> + <tr> + <th scope="col">Course ID</th> + <th scope="col">Course Name</th> + <th scope="col">Vacancy Status</th> + </tr> + </thead> + <tbody th:each="course: ${courses}"> + <tr> + <td th:text="${course.courseId}"></td> + <td th:text="${course.name}"></td> + <td th:text="${course.vacancyStatus}"></td> + </tr> + + </tbody> +</table> + + +<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/createCourse.html b/src/main/resources/templates/createCourse.html new file mode 100644 index 0000000000000000000000000000000000000000..b6e8eacd194b099a40d523c53f90e584fd4d681c --- /dev/null +++ b/src/main/resources/templates/createCourse.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <title>Create new Course</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> +</head> +<body> + <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> + <div class="container-fluid"> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarNav"> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link active" aria-current="page" th:href="@{../}">Home</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/student/list}">Student</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/course/list}">Course</a> + </li> + </ul> + </div> + </div> + </nav> +<h3>Create new Course</h3> +<div th:if="${error!=null}" class="alert alert-danger" role="alert"> + Duplicate course name +</div> +<form th:action="@{/course/create}" th:object="${course}" method="post"> + <div class="form-group"> + <label for="nameInput">Name</label> + <input th:field="*{name}" type="text" class="form-control" id="nameInput" aria-describedby="nameHelp" placeholder="Enter course's name"> + <small id="nameHelp" class="form-text text-muted">Please enter course name.</small> + </div> + + <div class="form-group"> + <div class="form-group"> + <label for="vacancyCheck">Vacancy Status</label> + <input type="checkbox" th:field="*{vacancyStatus}" id="vacancyCheck"/> + </div> + </div> + + <button type="submit" class="btn btn-primary">Submit</button> +</form> +<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/createStudent.html b/src/main/resources/templates/createStudent.html index 2f89459b85bcb6154c8afd33db3cd5a410b49038..a3e9fea7f4c6925388781b0a2d1303ba088ecd4e 100644 --- a/src/main/resources/templates/createStudent.html +++ b/src/main/resources/templates/createStudent.html @@ -6,6 +6,26 @@ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> </head> <body> + <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> + <div class="container-fluid"> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarNav"> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link active" aria-current="page" th:href="@{../}">Home</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/student/list}">Student</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/course/list}">Course</a> + </li> + </ul> + </div> + </div> + </nav> <h3>Create new Student</h3> <div th:if="${error!=null}" class="alert alert-danger" role="alert"> Duplicate student name diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index f4270d833140d4301340e4fa1beeedf7d8a92ad2..e0251720f75eb91c4595b67f5a2f026dd512bf21 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -5,7 +5,26 @@ <title>Home</title> </head> <body> - +<nav class="navbar navbar-expand-lg navbar-dark bg-dark"> + <div class="container-fluid"> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarNav"> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link active" aria-current="page" th:href="@{../}">Home</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/student/list}">Student</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/course/list}">Course</a> + </li> + </ul> + </div> + </div> +</nav> <h3 th:if="${name!=null}" th:text="${'Welcome home, ' + name}"></h3> <h3 th:unless="${name!=null}">Welcome</h3> diff --git a/src/main/resources/templates/studentList.html b/src/main/resources/templates/studentList.html index 84ab6ad54e0980ae984cb2585ad00f446513b60c..74985c107c336abc32455599b44246accfc1d0c7 100644 --- a/src/main/resources/templates/studentList.html +++ b/src/main/resources/templates/studentList.html @@ -6,8 +6,27 @@ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> </head> <body> - -<h2>Student' List</h2> + <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> + <div class="container-fluid"> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarNav"> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link active" aria-current="page" th:href="@{../}">Home</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/student/list}">Student</a> + </li> + <li class="nav-item"> + <a class="nav-link" th:href="@{/course/list}">Course</a> + </li> + </ul> + </div> + </div> + </nav> +<h2>Student's List</h2> <a th:href="@{/student/create}" class="btn btn-primary btn-sm mb-3" >Create student</a> <table class="table">