diff --git a/docker-compose.yml b/docker-compose.yml index 340584ed27aa521e1598ee559ac324e4cee48a29..a8aa8a7a7305b76b3adc7e288a429029801dc937 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,10 +17,11 @@ services: wad: build: . container_name: 'corporate_wad' + restart: always volumes: - .:/app/ - deploy_app:/tomcat_wars - - m2:/root/.m2 + - /home/s3rius/.m2:/root/.m2 depends_on: - tomcat working_dir: '/app/' @@ -42,7 +43,6 @@ services: adminer: image: adminer container_name: 'corporate_adminer' - restart: always depends_on: - db ports: diff --git a/src/main/java/com/s3ai/controllers/cinemas/CinemaEdit.java b/src/main/java/com/s3ai/controllers/cinemas/CinemaEdit.java index c5e677854a952b74a6d0778be9315df9950e6725..1625e14a40cf0eef1c01e374002d1b4f1c2e31fd 100644 --- a/src/main/java/com/s3ai/controllers/cinemas/CinemaEdit.java +++ b/src/main/java/com/s3ai/controllers/cinemas/CinemaEdit.java @@ -22,7 +22,7 @@ public class CinemaEdit extends HttpServlet { String name = req.getParameter("name") == null ? "" : req.getParameter("name"); Integer seatsCount = Integer.parseInt(req.getParameter("seatsCount") == null ? "" : req.getParameter("seatsCount")); String location = req.getParameter("location") == null ? "" : req.getParameter("location"); - if (null == id) { + if (null == id || "".equals(id)) { cinema = new Cinema(); cinema.setId(UUID.randomUUID()); cinemaService.fillCinemaFields(cinema, name, location, seatsCount); diff --git a/src/main/java/com/s3ai/controllers/cinemas/CinemaFill.java b/src/main/java/com/s3ai/controllers/cinemas/CinemaFill.java index 587787ad5ec24283fa5f048be6a104ccebbb1b13..8611f436748b4feec77decde1f71a99d3ed5e38c 100644 --- a/src/main/java/com/s3ai/controllers/cinemas/CinemaFill.java +++ b/src/main/java/com/s3ai/controllers/cinemas/CinemaFill.java @@ -8,9 +8,9 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.Arrays; import java.util.List; import java.util.Random; -import java.util.stream.Collectors; public class CinemaFill extends HttpServlet { CinemaService cinemaService = CinemaService.getInstance(); @@ -20,14 +20,15 @@ public class CinemaFill extends HttpServlet { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - List<String> locations = cinemaService.getAllCinemas().stream().map(Cinema::getLocation).distinct().collect(Collectors.toList()); + List<String> locations = Arrays.asList("Samara", "Izhevsk", "NeoTokyo", "Bangladesh", "Moscow", "Grozny"); + List<String> names = Arrays.asList("Nol", "Tcelkoviy", "Polushka", "Chekushka", "Osmushka", "Pudovichok", "Mediachok", "Silverchok", "Goldenchok", "Deviatichek", "Desatichek"); System.out.println(locations); var writer = response.getWriter(); writer.println("FILLED Instances:"); var random = new Random(); for (int i = 0; i < 300; i++) { var cinema = new Cinema(); - cinemaService.fillCinemaFields(cinema, "Test" + (i + 7), locations.get(random.nextInt(locations.size())), Math.abs(random.nextInt())); + cinemaService.fillCinemaFields(cinema, names.get(random.nextInt(names.size())), locations.get(random.nextInt(locations.size())), Math.abs(random.nextInt())); cinemaService.saveCinema(cinema); writer.println(cinema); } diff --git a/src/main/java/com/s3ai/controllers/tickets/TicketsEdit.java b/src/main/java/com/s3ai/controllers/tickets/TicketsEdit.java index e5e32546579bcbace3b29feb5b8c8446268c2660..1adbf19125430048b4f2a5ff80d7742d2a2a21c2 100644 --- a/src/main/java/com/s3ai/controllers/tickets/TicketsEdit.java +++ b/src/main/java/com/s3ai/controllers/tickets/TicketsEdit.java @@ -1,6 +1,8 @@ package com.s3ai.controllers.tickets; +import com.s3ai.entities.Cinema; import com.s3ai.entities.Ticket; +import com.s3ai.entities.User; import com.s3ai.services.CinemaService; import com.s3ai.services.TicketService; import com.s3ai.services.UserService; @@ -12,6 +14,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; +import java.util.List; import java.util.UUID; public class TicketsEdit extends HttpServlet { @@ -29,15 +32,15 @@ public class TicketsEdit extends HttpServlet { var user = userService.getUserById(UUID.fromString(userId)); var cinema = cinemaService.getCinemaById(UUID.fromString(cinemaId)); - if (null == user){ + if (null == user) { resp.sendError(500, "Invalid userId"); } - if (null == cinema){ + if (null == cinema) { resp.sendError(500, "Invalid cinemaId"); } - if (null == id) { + if (null == id || "".equals(id)) { ticket = new Ticket(); ticket.setId(UUID.randomUUID()); ticketService.fillTicketFields(ticket, user, cinema, movie); @@ -45,7 +48,7 @@ public class TicketsEdit extends HttpServlet { } else { ticket = ticketService.getTicketById(UUID.fromString(id)); ticketService.fillTicketFields(ticket, user, cinema, movie); - ticketService.saveTicket(ticket); + ticketService.updateTicket(ticket); } resp.sendRedirect("/tickets"); } @@ -60,6 +63,10 @@ public class TicketsEdit extends HttpServlet { } else { ticket = new Ticket(); } + List<User> users = userService.getAllUsers(); + List<Cinema> cinemas = cinemaService.getAllCinemas(); + session.setAttribute("users", users); + session.setAttribute("cinemas", cinemas); session.setAttribute("ticket", ticket); dispatcher.forward(req, resp); } diff --git a/src/main/java/com/s3ai/controllers/tickets/TicketsList.java b/src/main/java/com/s3ai/controllers/tickets/TicketsList.java index 7fd92494b7b091e11c14fb85eb3ab934202ab853..50964bae34e8184dc33bfd83d2bdec0ce9ba7819 100644 --- a/src/main/java/com/s3ai/controllers/tickets/TicketsList.java +++ b/src/main/java/com/s3ai/controllers/tickets/TicketsList.java @@ -5,12 +5,13 @@ import com.s3ai.services.TicketService; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.UUID; -public class TicketsList { +public class TicketsList extends HttpServlet { private TicketService ticketService = TicketService.getInstance(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { diff --git a/src/main/java/com/s3ai/controllers/users/UsersEdit.java b/src/main/java/com/s3ai/controllers/users/UsersEdit.java index 3b6ebce11cd2ecba63b635b78ed5fea3c423db86..e3dd648ea815c5304e3b9ccf6133a7b62cd823c9 100644 --- a/src/main/java/com/s3ai/controllers/users/UsersEdit.java +++ b/src/main/java/com/s3ai/controllers/users/UsersEdit.java @@ -20,7 +20,7 @@ public class UsersEdit extends HttpServlet { User user = null; String name = req.getParameter("name") == null ? "" : req.getParameter("name"); Integer age = Integer.parseInt(req.getParameter("age") == null ? "" : req.getParameter("age")); - if (null == id) { + if (null == id || "".equals(id)) { user = new User(); user.setId(UUID.randomUUID()); userService.fillUserFields(user, name, age); @@ -28,7 +28,7 @@ public class UsersEdit extends HttpServlet { } else { user = userService.getUserById(UUID.fromString(id)); userService.fillUserFields(user, name, age); - userService.saveUser(user); + userService.updateUser(user); } resp.sendRedirect("/users"); } diff --git a/src/main/java/com/s3ai/entities/User.java b/src/main/java/com/s3ai/entities/User.java index 2f05187193b28d5b1b88b8f53cd4c44b647ba000..f891c3f3c599e5b43400910d40e5c22181a913f4 100644 --- a/src/main/java/com/s3ai/entities/User.java +++ b/src/main/java/com/s3ai/entities/User.java @@ -2,13 +2,11 @@ package com.s3ai.entities; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import javax.persistence.*; import java.util.UUID; @Entity +@Table(name="cinema_user") public @Data class User { @Id @@ -17,6 +15,15 @@ class User { private UUID id; @Column(name = "name") private String name; - @Column(name="age") + @Column(name = "age") private Integer age; + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + '}'; + } } diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml index 95cfed294ea44a4a21ee75ea35f806bc8afe0cf8..ae07f9d2c62209e62b2bac5815f23aedc04021da 100644 --- a/src/main/resources/hibernate.cfg.xml +++ b/src/main/resources/hibernate.cfg.xml @@ -9,9 +9,9 @@ <property name="connection.driver_class">org.postgresql.Driver</property> <property name="connection.username">postgres</property> <property name="connection.password">postgres</property> - <property name="hbm2ddl.auto">update</property> - <mapping class="com.s3ai.entities.Cinema"/> + <property name="hibernate.hbm2ddl.auto">update</property> <mapping class="com.s3ai.entities.User"/> + <mapping class="com.s3ai.entities.Cinema"/> <mapping class="com.s3ai.entities.Ticket"/> <!-- DB schema will be updated if needed --> </session-factory> diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 2638cdb964e8114a55b9690e195b581dc5804964..a2c76034cbbd23d0cf73353c481554cacdd2fdf2 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -64,12 +64,76 @@ </servlet-mapping> <servlet> - <servlet-name>CinemaUpdateServlet</servlet-name> + <servlet-name>CinemaEditServlet</servlet-name> <servlet-class>com.s3ai.controllers.cinemas.CinemaEdit</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> - <servlet-name>CinemaUpdateServlet</servlet-name> + <servlet-name>CinemaEditServlet</servlet-name> <url-pattern>/cinema/*</url-pattern> </servlet-mapping> + + <servlet> + <servlet-name>UserFillServlet</servlet-name> + <servlet-class>com.s3ai.controllers.users.UsersFill</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <servlet-mapping> + <servlet-name>UserFillServlet</servlet-name> + <url-pattern>/users/fill</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>UserListServlet</servlet-name> + <servlet-class>com.s3ai.controllers.users.UsersList</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <servlet-mapping> + <servlet-name>UserListServlet</servlet-name> + <url-pattern>/users</url-pattern> + </servlet-mapping> + + + <servlet> + <servlet-name>UserEditServlet</servlet-name> + <servlet-class>com.s3ai.controllers.users.UsersEdit</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <servlet-mapping> + <servlet-name>UserEditServlet</servlet-name> + <url-pattern>/user/*</url-pattern> + </servlet-mapping> + + + <servlet> + <servlet-name>TicketFillServlet</servlet-name> + <servlet-class>com.s3ai.controllers.tickets.TicketsFill</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <servlet-mapping> + <servlet-name>TicketFillServlet</servlet-name> + <url-pattern>/tickets/fill</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>TicketListServlet</servlet-name> + <servlet-class>com.s3ai.controllers.tickets.TicketsList</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <servlet-mapping> + <servlet-name>TicketListServlet</servlet-name> + <url-pattern>/tickets</url-pattern> + </servlet-mapping> + + + <servlet> + <servlet-name>TicketEditServlet</servlet-name> + <servlet-class>com.s3ai.controllers.tickets.TicketsEdit</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <servlet-mapping> + <servlet-name>TicketEditServlet</servlet-name> + <url-pattern>/ticket/*</url-pattern> + </servlet-mapping> + </web-app> diff --git a/src/main/webapp/pages/cinemas/edit.jsp b/src/main/webapp/pages/cinemas/edit.jsp index 36391529335d644531d480d4dd5d14006ade0617..7cda0880796b2ec3b5033557df0119135378ece6 100644 --- a/src/main/webapp/pages/cinemas/edit.jsp +++ b/src/main/webapp/pages/cinemas/edit.jsp @@ -17,10 +17,12 @@ <body class="themed-gradient"> <% Cinema cinema = (Cinema) request.getSession().getAttribute("cinema"); - UUID id = cinema.getId(); + String id = cinema.getId() == null ? "" : cinema.getId().toString(); String name = cinema.getName() == null ? "" : cinema.getName(); Integer seatsCount = cinema.getSeatsCount() == null ? 0 : cinema.getSeatsCount(); String location = cinema.getLocation() == null ? "" : cinema.getLocation(); + String action = id == null ? "Create" : "Update"; + %> <!-- Navigation --> @@ -28,14 +30,14 @@ <div class="editing"> <div class="container justify-content-center"> - <form id="cinemaForm" class="d-flex justify-content-center" method="post" action="${pageContext.request.contextPath}/cinema/edit"> + <form id="cinemaForm" class="d-flex justify-content-center" method="post" action="${pageContext.request.contextPath}/cinema"> <fieldset> <legend> - <div class="text-center"><h2><b class="white">Cinema edit</b></h2></div> + <div class="text-center"><h2><b class="white"><%out.print(action);%> cinema</b></h2></div> </legend> <br> - <input type="hidden" value="<%out.println(id);%>"> + <input type="hidden" name="id" value="<%out.print(id);%>"> <div class="form-group"> <div class="inputGroupContainer"> diff --git a/src/main/webapp/pages/cinemas/list.jsp b/src/main/webapp/pages/cinemas/list.jsp index fc4caa4abbdd6ad277637ba46d58b5ec5c72b1fe..548741587203a0a3de086f36593d74a69b29c1e1 100644 --- a/src/main/webapp/pages/cinemas/list.jsp +++ b/src/main/webapp/pages/cinemas/list.jsp @@ -19,7 +19,7 @@ <div class="container-fluid"> <div class="row table-padding justify-content-center"> - <table class="table col-6 table-striped table-dark"> + <table class="table shadow col-6 table-striped table-dark"> <thead> <tr> <th scope="col">#</th> diff --git a/src/main/webapp/pages/index.jsp b/src/main/webapp/pages/index.jsp index 1acfa9d2e0a5cbc973aa6bcc3f50cf6a458414af..2e3bb8b73ddee2a3f59ff208c7f0368309ef02cb 100644 --- a/src/main/webapp/pages/index.jsp +++ b/src/main/webapp/pages/index.jsp @@ -12,7 +12,7 @@ <%@include file='templates/imports.jsp' %> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/css/index.css"> </head> -<body id="page-top"> +<body> <!-- Navigation --> <%@include file='templates/header.jsp' %> @@ -187,10 +187,5 @@ Copyright © Your Website 2019 </div> </footer> - -<!-- Bootstrap core JavaScript --> -<script src="${pageContext.request.contextPath}/static/js/jquery-3.4.1.min.js"></script> </body> - -<script src="${pageContext.request.contextPath}/static/js/bootstrap.min.js"></script> </html> diff --git a/src/main/webapp/pages/templates/header.jsp b/src/main/webapp/pages/templates/header.jsp index 8e03579198cc183ae20b1c3a4a88806320c4f1eb..3434dd1c6d0956ec2d30308416502c67747706e7 100644 --- a/src/main/webapp/pages/templates/header.jsp +++ b/src/main/webapp/pages/templates/header.jsp @@ -6,7 +6,7 @@ To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> -<nav class="navbar navbar-expand-lg navbar-light fixed-top mainNavigationHeader" id="mainNav"> +<nav class="navbar navbar-expand-lg shadow navbar-light fixed-top mainNavigationHeader" id="mainNav"> <div class="container"> <a class="navbar-brand js-scroll-trigger" href="${pageContext.request.contextPath}/">Cinema Management System</a> @@ -18,14 +18,34 @@ </button> <div class="collapse navbar-collapse" id="navbarResponsive"> <ul class="navbar-nav ml-auto"> - <li class="nav-item"> - <a class="nav-link js-scroll-trigger" href="${pageContext.request.contextPath}/cinemas">Cinemas</a> + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownCinema" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Cinemas + </a> + <div class="dropdown-menu" aria-labelledby="navbarDropdownCinema"> + <a class="dropdown-item" href="${pageContext.request.contextPath}/cinema">Create</a> + <a class="dropdown-item" href="${pageContext.request.contextPath}/cinemas">View</a> + </div> </li> - <li class="nav-item"> - <a class="nav-link js-scroll-trigger" href="${pageContext.request.contextPath}/tickets">Tickets</a> + + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownTicket" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Tickets + </a> + <div class="dropdown-menu" aria-labelledby="navbarDropdownTicket"> + <a class="dropdown-item" href="${pageContext.request.contextPath}/ticket">Create</a> + <a class="dropdown-item" href="${pageContext.request.contextPath}/tickets">View</a> + </div> </li> - <li class="nav-item"> - <a class="nav-link js-scroll-trigger" href="${pageContext.request.contextPath}/users">Users</a> + + <li class="nav-item dropdown"> + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownUser" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Users + </a> + <div class="dropdown-menu" aria-labelledby="navbarDropdownUser"> + <a class="dropdown-item" href="${pageContext.request.contextPath}/user">Create</a> + <a class="dropdown-item" href="${pageContext.request.contextPath}/users">View</a> + </div> </li> </ul> </div> diff --git a/src/main/webapp/pages/tickets/edit.jsp b/src/main/webapp/pages/tickets/edit.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d626839f9c29c28d97f1364c864fcb127ba60939 --- /dev/null +++ b/src/main/webapp/pages/tickets/edit.jsp @@ -0,0 +1,114 @@ +<%@ page import="com.s3ai.entities.Cinema" %> +<%@ page import="com.s3ai.entities.Ticket" %> +<%@ page import="com.s3ai.entities.User" %> +<%@ page import="java.util.List" %> +<%@ page import="java.util.UUID" %><%-- + Created by IntelliJ IDEA. + User: s3rius + Date: 08.12.2019 + Time: 22:04 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<html> +<head> + <title>Edit ticket</title> + <%@include file='../templates/imports.jsp' %> + <link rel="stylesheet" href="${pageContext.request.contextPath}/static/css/tickets.css"> + <script src="${pageContext.request.contextPath}/static/js/tickets.js"></script> +</head> +<body class="themed-gradient"> +<% + Ticket ticket = (Ticket) request.getSession().getAttribute("ticket"); + String id = ticket.getId() == null ? "" : ticket.getId().toString(); + String movie = ticket.getMovie() == null ? "" : ticket.getMovie(); + String userId = ticket.getUser() == null ? "" : ticket.getUser().getId().toString(); + String cinemaId = ticket.getCinema() == null ? "" : ticket.getCinema().getId().toString(); + String action = id == null ? "Create" : "Update"; + List<Cinema> cinemas = (List<Cinema>) request.getSession().getAttribute("cinemas"); + List<User> users = (List<User>) request.getSession().getAttribute("users"); +%> + +<!-- Navigation --> +<%@include file='../templates/header.jsp' %> +<div class="editing"> + <div class="container justify-content-center"> + + <form id="ticketForm" class="d-flex justify-content-center" method="post" + action="${pageContext.request.contextPath}/ticket"> + <fieldset> + + <legend> + <div class="text-center"><h2><b class="white"><%out.print(action);%> ticket</b></h2></div> + </legend> + <br> + <input type="hidden" name="id" value="<%out.print(id);%>"> + + <div class="form-group"> + <div class="inputGroupContainer"> + <div class="input-group"> + <div class="input-group-prepend"> + <div class="input-group-text"><i class="fas fa-film"></i></div> + </div> + <input type="text" + class="form-control validate" + id="ticketMovie" + name="movie" + placeholder="Movie" value="<%out.println(movie);%>" required> + </div> + </div> + </div> + <div class="form-group"> + <div class="inputGroupContainer"> + <div class="input-group"> + <div class="input-group-prepend"> + <div class="input-group-text"><i class="fas fa-kaaba"></i></div> + </div> + <select class="form-control" id="exampleFormControlSelect2" name="cinemaId" required> + <option value="">Cinema</option> + <% + for (Cinema cinema : cinemas) { + if (cinema.getId().toString().equals(cinemaId)) { + out.println("<option value=\"" + cinema.getId().toString() + "\" selected>" + cinema.getName() + " in " + cinema.getLocation() + "</option>"); + + } else { + out.println("<option value=\"" + cinema.getId().toString() + "\">" + cinema.getName() + " in " + cinema.getLocation() + "</option>"); + } + } + %> + </select> + </div> + </div> + </div> + <div class="form-group"> + <div class="inputGroupContainer"> + <div class="input-group"> + <div class="input-group-prepend"> + <div class="input-group-text"><i class="fas fa-user-circle"></i></div> + </div> + <select class="form-control" id="userSelect" name="userId" required> + <option value="">User</option> + <% + for (User user : users) { + if (user.getId().toString().equals(userId)) { + out.println("<option value=\"" + user.getId().toString() + "\" selected>" + user.getName() + " aged " + user.getAge() + "</option>"); + + } else { + out.println("<option value=\"" + user.getId().toString() + "\">" + user.getName() + " at " + user.getAge() + "</option>"); + } + } + %> + </select> + </div> + </div> + </div> + + <div class="justify-content-center"> + <button type="submit" class="btn btn-primary w-100"><i class="fas fa-check"></i>Submit</button> + </div> + </fieldset> + </form> + </div> +</div> +</body> +</html> diff --git a/src/main/webapp/pages/tickets/list.jsp b/src/main/webapp/pages/tickets/list.jsp new file mode 100644 index 0000000000000000000000000000000000000000..745e4991510e9c6fb1b4da530f04f2920c4bb93a --- /dev/null +++ b/src/main/webapp/pages/tickets/list.jsp @@ -0,0 +1,98 @@ +<%@ page import="com.s3ai.entities.Cinema" %> +<%@ page import="java.util.List" %> +<%@ page import="com.s3ai.entities.Ticket" %> +<%-- + Created by IntelliJ IDEA. + User: s3rius + Date: 08.12.2019 + Time: 20:34 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<html> +<head> + <title>Cinemas list</title> + <%@include file='../templates/imports.jsp' %> + <link rel="stylesheet" href="${pageContext.request.contextPath}/static/css/tickets.css"> +</head> +<body class="themed-gradient"> +<%@include file='../templates/header.jsp' %> + +<div class="container-fluid"> + <div class="row table-padding justify-content-center"> + <table class="table shadow col-6 table-striped table-dark"> + <thead> + <tr> + <th scope="col">#</th> + <th scope="col">Movie</th> + <th scope="col">Cinema</th> + <th scope="col">User</th> + </tr> + </thead> + <tbody> + <% + List<Ticket> tickets = (List<Ticket>) request.getSession().getAttribute("tickets"); + for (int i = 0; i < tickets.size(); i++) { + Ticket ticket = tickets.get(i); + out.println("<tr ticket_id='" + ticket.getId().toString() + "'>"); + out.println("<td scope=\"col\">" + (i + 1) + "</td>"); + out.println("<td attr_name=\"movie\">" + (ticket.getMovie() == null ? "" : ticket.getMovie()) + "</td>"); + out.println("<td attr_name=\"cinema\">" + (ticket.getCinema() == null ? "" : ticket.getCinema().getName() + " in " + ticket.getCinema().getLocation()) + "</td>"); + out.println("<td attr_name=\"user\">" + (ticket.getUser() == null ? "" : ticket.getUser().getName() + " aged " + ticket.getUser().getAge()) + "</td>"); + out.println("</tr>"); + } + %> + </tbody> + </table> + </div> + <div class="modal fade" id="ticketModal" tabindex="-1" role="dialog" + aria-labelledby="ticketModalTitle" aria-hidden="true"> + <div class="modal-dialog modal-dialog-centered" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title" id="exampleModalLongTitle">Cinema info</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body"> + <div class="d-flex flex-column"> + <div class="d-flex flex-row justify-content-between"> + <p>ID:</p> + <p id="modal_id"></p> + </div> + <div class="d-flex flex-row justify-content-between"> + <p>Name:</p> + <p id="modal_name"></p> + </div> + <div class="d-flex flex-row justify-content-between"> + <p>Location:</p> + <p id="modal_location">value</p> + </div> + <div class="d-flex flex-row justify-content-between"> + <p>Seats count:</p> + <p id="modal_seats">value</p> + </div> + </div> + </div> + <div class="modal-footer"> + <button type="button" id="edit_ticket" class="btn btn-primary"><i class="fas fa-edit"></i> Edit + ticket + </button> + <button type="button" id="delete_ticket" class="btn btn-danger"><i class="fas fa-trash-alt"></i> + Delete ticket + </button> + <button type="button" class="btn btn-secondary" data-dismiss="modal"><i class="fas fa-times"></i> + Close + </button> + </div> + </div> + </div> + </div> +</div> +</body> +<script> + let context_url = "${pageContext.request.contextPath}" +</script> +<script src="${pageContext.request.contextPath}/static/js/tickets.js"></script> +</html> diff --git a/src/main/webapp/pages/users/edit.jsp b/src/main/webapp/pages/users/edit.jsp new file mode 100644 index 0000000000000000000000000000000000000000..8db564e1e043ae9255e81f1beae96557859370f7 --- /dev/null +++ b/src/main/webapp/pages/users/edit.jsp @@ -0,0 +1,79 @@ +<%@ page import="com.s3ai.entities.User" %> +<%@ page import="java.util.UUID" %> +<%-- + Created by IntelliJ IDEA. + User: s3rius + Date: 08.12.2019 + Time: 22:04 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<html> +<head> + <title>Edit ticket</title> + <%@include file='../templates/imports.jsp' %> + <link rel="stylesheet" href="${pageContext.request.contextPath}/static/css/tickets.css"> + <script src="${pageContext.request.contextPath}/static/js/tickets.js"></script> +</head> +<body class="themed-gradient"> +<% + User user = (User) request.getSession().getAttribute("user"); + String id = user.getId() == null ? "" : user.getId().toString(); + String name = user.getName() == null ? "" : user.getName(); + Integer age = user.getAge() == null ? 0 : user.getAge(); + String action = id == null ? "Create" : "Update"; +%> + +<!-- Navigation --> +<%@include file='../templates/header.jsp' %> +<div class="editing"> + <div class="container justify-content-center"> + + <form id="ticketForm" class="d-flex justify-content-center" method="post" + action="${pageContext.request.contextPath}/user"> + <fieldset> + + <legend> + <div class="text-center"><h2><b class="white"><%out.print(action);%> user</b></h2></div> + </legend> + <br> + <input type="hidden" name="id" value="<%out.print(id);%>"> + + <div class="form-group"> + <div class="inputGroupContainer"> + <div class="input-group"> + <div class="input-group-prepend"> + <div class="input-group-text"><i class="fas fa-user-circle"></i></div> + </div> + <input type="text" + class="form-control validate" + id="userName" + name="name" + placeholder="Users's name" value="<%out.println(name);%>" required> + </div> + </div> + </div> + <div class="form-group"> + <div class="inputGroupContainer"> + <div class="input-group"> + <div class="input-group-prepend"> + <div class="input-group-text"><i class="far fa-calendar"></i></div> + </div> + <input type="number" + class="form-control validate" + id="userAge" + name="age" + placeholder="User's age" + value="<%out.print(age);%>" required> + </div> + </div> + </div> + <div class="justify-content-center"> + <button type="submit" class="btn btn-primary w-100"><i class="fas fa-check"></i>Submit</button> + </div> + </fieldset> + </form> + </div> +</div> +</body> +</html> diff --git a/src/main/webapp/pages/users/list.jsp b/src/main/webapp/pages/users/list.jsp new file mode 100644 index 0000000000000000000000000000000000000000..c9b2fa0c06f4df077860d7b9b30864503e19be10 --- /dev/null +++ b/src/main/webapp/pages/users/list.jsp @@ -0,0 +1,91 @@ +<%@ page import="java.util.List" %> +<%@ page import="com.s3ai.entities.User" %> +<%-- + Created by IntelliJ IDEA. + User: s3rius + Date: 08.12.2019 + Time: 20:34 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<html> +<head> + <title>Cinemas list</title> + <%@include file='../templates/imports.jsp' %> + <link rel="stylesheet" href="${pageContext.request.contextPath}/static/css/users.css"> +</head> +<body class="themed-gradient"> +<%@include file='../templates/header.jsp' %> + +<div class="container-fluid"> + <div class="row table-padding justify-content-center"> + <table class="table col-4 table-striped table-dark"> + <thead> + <tr> + <th scope="col">#</th> + <th scope="col">Name</th> + <th scope="col">Age</th> + </tr> + </thead> + <tbody> + <% + List<User> cinemaUsers = (List<User>) request.getSession().getAttribute("users"); + for (int i = 0; i < cinemaUsers.size(); i++) { + User cinemaUser = cinemaUsers.get(i); + out.println("<tr user_id='" + cinemaUser.getId().toString() + "'>"); + out.println("<td scope=\"col\">" + (i + 1) + "</td>"); + out.println("<td attr_name=\"name\">" + (cinemaUser.getName() == null ? "" : cinemaUser.getName()) + "</td>"); + out.println("<td attr_name=\"age\">" + (cinemaUser.getAge() == null ? "" : cinemaUser.getAge()) + "</td>"); + out.println("</tr>"); + } + %> + </tbody> + </table> + </div> + <div class="modal fade" id="userModal" tabindex="-1" role="dialog" + aria-labelledby="userModalTitle" aria-hidden="true"> + <div class="modal-dialog modal-dialog-centered" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title" id="exampleModalLongTitle">Cinema info</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body"> + <div class="d-flex flex-column"> + <div class="d-flex flex-row justify-content-between"> + <p>ID:</p> + <p id="modal_id"></p> + </div> + <div class="d-flex flex-row justify-content-between"> + <p>Name:</p> + <p id="modal_name"></p> + </div> + <div class="d-flex flex-row justify-content-between"> + <p>Age:</p> + <p id="modal_age"></p> + </div> + </div> + </div> + <div class="modal-footer"> + <button type="button" id="edit_user" class="btn btn-primary"><i class="fas fa-edit"></i> + Edit User + </button> + <button type="button" id="delete_user" class="btn btn-danger"><i class="fas fa-trash-alt"></i> + Delete User + </button> + <button type="button" class="btn btn-secondary" data-dismiss="modal"><i class="fas fa-times"></i> + Close + </button> + </div> + </div> + </div> + </div> +</div> +</body> +<script> + let context_url = "${pageContext.request.contextPath}" +</script> +<script src="${pageContext.request.contextPath}/static/js/users.js"></script> +</html> diff --git a/src/main/webapp/static/coffee/users.coffee b/src/main/webapp/static/coffee/users.coffee new file mode 100644 index 0000000000000000000000000000000000000000..fb94baab59719ba3595ae0589893b349314f50ce --- /dev/null +++ b/src/main/webapp/static/coffee/users.coffee @@ -0,0 +1,34 @@ +fill_modal = (event) -> + target = $(this) + user_id = target.attr 'user_id' + if undefined != user_id and "" != user_id + $("#modal_id").text user_id + $("#modal_name").text target.find("[attr_name='name']").text() + $("#modal_age").text target.find("[attr_name='age']").text() + $("#userModal").modal('toggle') + +hrefToEdit = (event) -> + user_id = $("#modal_id").text() + window.location.replace "#{context_url}/user/?id=#{user_id}" + +removeCinema = (event) -> + user_id = $("#modal_id").text() + $.ajax + url: "#{context_url}/user/?id=#{user_id}", + type: 'DELETE' + error: (jqXHR, textStatus, errorThrown) -> + $.toast + icon: 'error', + hideAfter: 5000, + heading: "Cannot delete user", + text: "#{jqXHR.responseText}" + success: (data, textStatus, jqXHR) -> + $("tr[user_id='#{user_id}").remove() + $("#userModal").modal('toggle') + +addListeners = -> + $('tr').on 'click', fill_modal + $('#edit_user').on 'click', hrefToEdit + $('#delete_user').on 'click', removeCinema + +$(document).ready(addListeners) \ No newline at end of file diff --git a/src/main/webapp/static/css/cinemas.css b/src/main/webapp/static/css/cinemas.css index f304d1dad9abb10ae436586960c3d0110014a81b..d8769c9267f63a9e26d4f199727b93b3b1f74549 100644 --- a/src/main/webapp/static/css/cinemas.css +++ b/src/main/webapp/static/css/cinemas.css @@ -1 +1 @@ -.editing .white{color:#fff}.editing .container{height:100%;display:flex;justify-content:center;align-items:center}.table-padding{padding-top:56px}/*# sourceMappingURL=cinemas.css.map */ +.editing .container{height:100%;display:flex;justify-content:center;align-items:center}.table-padding{padding-top:56px}/*# sourceMappingURL=cinemas.css.map */ diff --git a/src/main/webapp/static/css/cinemas.css.map b/src/main/webapp/static/css/cinemas.css.map index 037218ecab05f8fd448dd6b9fd1f9de981d8ddf8..54986d349793e89e42c890888859f7ac1699cc12 100644 --- a/src/main/webapp/static/css/cinemas.css.map +++ b/src/main/webapp/static/css/cinemas.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../scss/cinemas.scss"],"names":[],"mappings":"AACE,gBACE,WAGF,oBACE,YACA,aACA,uBACA,mBAIJ,eACE","file":"cinemas.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../scss/cinemas.scss"],"names":[],"mappings":"AAEE,oBACE,YACA,aACA,uBACA,mBAIJ,eACE","file":"cinemas.css"} \ No newline at end of file diff --git a/src/main/webapp/static/css/project.css b/src/main/webapp/static/css/project.css index 335baee5f2737a6b156b7d705d091b51b2add952..02f7cb5c152119aa239e30167cb184c59bfe5c04 100644 --- a/src/main/webapp/static/css/project.css +++ b/src/main/webapp/static/css/project.css @@ -1 +1 @@ -.mainNavigationHeader{background-color:#5a5a5a95}.mainNavigationHeader .navbar-brand{color:#fff}.mainNavigationHeader .navbar-brand:hover{text-decoration:underline;color:#fff}.mainNavigationHeader .nav-link{color:#fff !important}.mainNavigationHeader .nav-link:hover{text-decoration:underline;color:#fff}.themed-gradient{background:#c94b4b;background:-webkit-linear-gradient(to right, #4b134f, #c94b4b);background:linear-gradient(to right, #4b134f, #c94b4b)}/*# sourceMappingURL=project.css.map */ +.mainNavigationHeader{background-color:#5a5a5a95}.mainNavigationHeader .navbar-brand{color:#fff}.mainNavigationHeader .navbar-brand:hover{text-decoration:underline;color:#fff}.mainNavigationHeader .dropdown-item:hover{background-color:#b7c1cc}.mainNavigationHeader .white{color:#fff}.mainNavigationHeader .nav-link{color:#fff !important}.mainNavigationHeader .nav-link:hover{text-decoration:underline;color:#fff}.themed-gradient{background:#c94b4b;background:-webkit-linear-gradient(to right, #4b134f, #c94b4b);background:linear-gradient(to right, #4b134f, #c94b4b)}.float{position:fixed;width:60px;height:60px;bottom:40px;right:40px;background-color:#0c9;color:#fff;border-radius:50px;text-align:center;box-shadow:2px 2px 3px #999}.float .my-float{margin-top:22px}/*# sourceMappingURL=project.css.map */ diff --git a/src/main/webapp/static/css/project.css.map b/src/main/webapp/static/css/project.css.map index 9741ddb9488a8dff01c3ce9088168194fcf5925e..ab20d84c4469553a38897f41885772114768bf8d 100644 --- a/src/main/webapp/static/css/project.css.map +++ b/src/main/webapp/static/css/project.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../scss/project.scss"],"names":[],"mappings":"AAAA,sBACE,2BAEA,oCAME,WALA,0CACE,0BACA,WAMJ,gCAME,sBALA,sCACE,0BACA,WAON,iBACE,mBACA,+DACA","file":"project.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../scss/project.scss"],"names":[],"mappings":"AAAA,sBACE,2BAEA,oCAME,WALA,0CACE,0BACA,WAOF,2CACE,yBAIJ,6BACE,WAIF,gCAME,sBALA,sCACE,0BACA,WAON,iBACE,mBACA,+DACA,uDAGF,OACE,eACA,WACA,YACA,YACA,WACA,sBACA,WACA,mBACA,kBACA,4BAEA,iBACE","file":"project.css"} \ No newline at end of file diff --git a/src/main/webapp/static/css/tickets.css b/src/main/webapp/static/css/tickets.css new file mode 100644 index 0000000000000000000000000000000000000000..5e32142d0f7de3edd18dbc387af43356f34b2586 --- /dev/null +++ b/src/main/webapp/static/css/tickets.css @@ -0,0 +1 @@ +.editing .container{height:100%;display:flex;justify-content:center;align-items:center}.table-padding{padding-top:56px}/*# sourceMappingURL=tickets.css.map */ diff --git a/src/main/webapp/static/css/tickets.css.map b/src/main/webapp/static/css/tickets.css.map new file mode 100644 index 0000000000000000000000000000000000000000..2488c9346c9f41d1ff89fbb31ff31405b0a04b61 --- /dev/null +++ b/src/main/webapp/static/css/tickets.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/cinemas.scss"],"names":[],"mappings":"AAEE,oBACE,YACA,aACA,uBACA,mBAIJ,eACE","file":"tickets.css"} \ No newline at end of file diff --git a/src/main/webapp/static/css/users.css b/src/main/webapp/static/css/users.css new file mode 100644 index 0000000000000000000000000000000000000000..04834bfeddeed4c2d13badeee9856c4f66850f28 --- /dev/null +++ b/src/main/webapp/static/css/users.css @@ -0,0 +1 @@ +.editing .container{height:100%;display:flex;justify-content:center;align-items:center}.table-padding{padding-top:56px}/*# sourceMappingURL=users.css.map */ diff --git a/src/main/webapp/static/css/users.css.map b/src/main/webapp/static/css/users.css.map new file mode 100644 index 0000000000000000000000000000000000000000..d81b65c1393443994b32d62191d78cef3a244bf1 --- /dev/null +++ b/src/main/webapp/static/css/users.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/cinemas.scss"],"names":[],"mappings":"AAEE,oBACE,YACA,aACA,uBACA,mBAIJ,eACE","file":"users.css"} \ No newline at end of file diff --git a/src/main/webapp/static/js/users.js b/src/main/webapp/static/js/users.js new file mode 100644 index 0000000000000000000000000000000000000000..6bc7f754a0d4a2def305abe22354942902baf284 --- /dev/null +++ b/src/main/webapp/static/js/users.js @@ -0,0 +1,52 @@ +// Generated by CoffeeScript 2.4.1 +(function() { + var addListeners, fill_modal, hrefToEdit, removeCinema; + + fill_modal = function(event) { + var target, user_id; + target = $(this); + user_id = target.attr('user_id'); + if (void 0 !== user_id && "" !== user_id) { + $("#modal_id").text(user_id); + $("#modal_name").text(target.find("[attr_name='name']").text()); + $("#modal_age").text(target.find("[attr_name='age']").text()); + return $("#userModal").modal('toggle'); + } + }; + + hrefToEdit = function(event) { + var user_id; + user_id = $("#modal_id").text(); + return window.location.replace(`${context_url}/user/?id=${user_id}`); + }; + + removeCinema = function(event) { + var user_id; + user_id = $("#modal_id").text(); + return $.ajax({ + url: `${context_url}/user/?id=${user_id}`, + type: 'DELETE', + error: function(jqXHR, textStatus, errorThrown) { + return $.toast({ + icon: 'error', + hideAfter: 5000, + heading: "Cannot delete user", + text: `${jqXHR.responseText}` + }); + }, + success: function(data, textStatus, jqXHR) { + $(`tr[user_id='${user_id}`).remove(); + return $("#userModal").modal('toggle'); + } + }); + }; + + addListeners = function() { + $('tr').on('click', fill_modal); + $('#edit_user').on('click', hrefToEdit); + return $('#delete_user').on('click', removeCinema); + }; + + $(document).ready(addListeners); + +}).call(this); diff --git a/src/main/webapp/static/scss/cinemas.scss b/src/main/webapp/static/scss/cinemas.scss index 606768c82b589b37328ae7ddce21bc242c9e8d3a..53ba888d14911aa575d3ab850356b05809e78efe 100644 --- a/src/main/webapp/static/scss/cinemas.scss +++ b/src/main/webapp/static/scss/cinemas.scss @@ -1,7 +1,4 @@ .editing { - .white { - color: white; - } .container { height: 100%; diff --git a/src/main/webapp/static/scss/project.scss b/src/main/webapp/static/scss/project.scss index 98f9288650bb9e907cebf7e4cc2617f12aab57cd..ebd8940edbf30f0ac52074062a1cbd7eb7a8f39a 100644 --- a/src/main/webapp/static/scss/project.scss +++ b/src/main/webapp/static/scss/project.scss @@ -10,6 +10,17 @@ color: white; } + .dropdown-item { + &:hover{ + background-color: #b7c1cc; + } + } + + .white { + color: white; + } + + .nav-link { &:hover { text-decoration: underline; @@ -24,4 +35,21 @@ background: #c94b4b; /* fallback for old browsers */ background: -webkit-linear-gradient(to right, #4b134f, #c94b4b); /* Chrome 10-25, Safari 5.1-6 */ background: linear-gradient(to right, #4b134f, #c94b4b); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */ +} + +.float { + position: fixed; + width: 60px; + height: 60px; + bottom: 40px; + right: 40px; + background-color: #0C9; + color: #FFF; + border-radius: 50px; + text-align: center; + box-shadow: 2px 2px 3px #999; + + .my-float { + margin-top: 22px; + } } \ No newline at end of file diff --git a/src/main/webapp/static/scss/tickets.scss b/src/main/webapp/static/scss/tickets.scss new file mode 100644 index 0000000000000000000000000000000000000000..72d7c01bb198c5a1e5a553aa5aa106dc342f5edb --- /dev/null +++ b/src/main/webapp/static/scss/tickets.scss @@ -0,0 +1 @@ +@import 'cinemas'; \ No newline at end of file diff --git a/src/main/webapp/static/scss/users.scss b/src/main/webapp/static/scss/users.scss new file mode 100644 index 0000000000000000000000000000000000000000..72d7c01bb198c5a1e5a553aa5aa106dc342f5edb --- /dev/null +++ b/src/main/webapp/static/scss/users.scss @@ -0,0 +1 @@ +@import 'cinemas'; \ No newline at end of file diff --git a/tomcat/Dockerfile b/tomcat/Dockerfile index e0f74b75b36aa15b3799f4304b59993e769e59d7..8306c7b88a4abc2ec85ee4645ec40f3a5efaa1f9 100644 --- a/tomcat/Dockerfile +++ b/tomcat/Dockerfile @@ -7,7 +7,7 @@ EXPOSE 8080 RUN echo "export JAVA_OPTS=\"-Dapp.env=staging\"" > /usr/local/tomcat/bin/setenv.sh # RUN rm -rf /usr/local/tomcat/webapps/* -COPY ./tomcat-users.xml /usr/local/tomcat/conf/ +COPY ./tomcat-cinemaUsers.xml /usr/local/tomcat/conf/ COPY ./context.xml /usr/local/tomcat/webapps/manager/META-INF/context.xml RUN echo "org.apache.jasper.level = FINEST" >> /usr/local/tomcat/conf/logging.properties diff --git a/tomcat/tomcat-users.xml b/tomcat/tomcat-users.xml index 15a917a7847c5b2828a2effcfd626fe15b2a5eb4..84049114251b68f47faded399538d5697b8bb612 100644 --- a/tomcat/tomcat-users.xml +++ b/tomcat/tomcat-users.xml @@ -1,10 +1,10 @@ <?xml version='1.0' encoding='utf-8'?> -<tomcat-users xmlns="http://tomcat.apache.org/xml" +<tomcat-cinemaUsers xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" + xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-cinemaUsers.xsd" version="1.0"> <role rolename="manager-gui"/> <role rolename="manager-script"/> - <user username="admin" password="password" roles="manager-gui,manager-script"/> -</tomcat-users> \ No newline at end of file + <cinemaUser username="admin" password="password" roles="manager-gui,manager-script"/> +</tomcat-cinemaUsers> \ No newline at end of file