diff --git a/TugasBesar2_2017/WebApp/build.gradle b/TugasBesar2_2017/WebApp/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..f215937448fd7e66bc4c00b190f0a3aa0b7a27b2 --- /dev/null +++ b/TugasBesar2_2017/WebApp/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' + id 'war' + id 'org.akhikhl.gretty' +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + + compile project(':SharedLibrary') + + // https://mvnrepository.com/artifact/junit/junit + testCompile 'junit:junit:4.12' + // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api + providedCompile 'javax.servlet:javax.servlet-api:4.0.0' + // https://mvnrepository.com/artifact/com.google.code.gson/gson + compile 'com.google.code.gson:gson:2.8.2' +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/middlewares/CookieCheck.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/middlewares/CookieCheck.java new file mode 100644 index 0000000000000000000000000000000000000000..362415cc505a584c8920f51b9faec787813e8616 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/middlewares/CookieCheck.java @@ -0,0 +1,37 @@ +package com.adaapa.adaojek.middlewares; + +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.google.gson.Gson; +import java.io.IOException; +import java.util.Base64; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class CookieCheck { + public static ApplicationCookie getCookie(HttpServletRequest req) { + ApplicationCookie cookie = null; + Gson gson = new Gson(); + for(Cookie item : req.getCookies()) { + if(item.getName().equals("adaapa")) { + cookie = gson.fromJson(new String(Base64.getDecoder().decode(item.getValue())),ApplicationCookie.class); + break; + } + } + return cookie; + } + public static Boolean redirectIfTokenNotFound(HttpServletRequest req, HttpServletResponse resp, String redirectTo) throws IOException { + if(getCookie(req) == null) { + resp.sendRedirect(redirectTo); + return true; + } + return false; + } + public static Boolean redirectIfTokenFound(HttpServletRequest req, HttpServletResponse resp, String redirectTo) throws IOException{ + if(getCookie(req) != null) { + resp.sendRedirect(redirectTo); + return true; + } + return false; + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/DomainConfig.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/DomainConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..2ef8aa9a11cbebee04726c267f62ad9bb776c72e --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/DomainConfig.java @@ -0,0 +1,38 @@ +package com.adaapa.adaojek.services; + +import java.io.InputStream; +import java.util.Properties; + +public class DomainConfig { + private static final String file_name = "/config/domain.properties"; + private static DomainConfig _instance = null; + private String is_domain; + private String ws_domain; + + public DomainConfig () { + try { + Properties prop = new Properties(); + InputStream inp = this.getClass().getResourceAsStream(file_name); + prop.load(inp); + is_domain = prop.getProperty("IDSERVICE_DOMAIN"); + ws_domain = prop.getProperty("WEBSERVICE_DOMAIN"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static DomainConfig getInstance() { + if(_instance == null) { + _instance = new DomainConfig(); + } + return _instance; + } + + public String getISDomain() { + return is_domain; + } + public String getWSDomain() { + return ws_domain; + } + +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/RequestSender.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/RequestSender.java new file mode 100644 index 0000000000000000000000000000000000000000..16b5969281272347c0ef38386b92176cb6aafb2f --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/RequestSender.java @@ -0,0 +1,36 @@ +package com.adaapa.adaojek.services; + +import java.awt.color.ProfileDataException; +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +public class RequestSender { + + public static String sendRequest(String url, String method, String contentType, String payload) + throws IOException, ProfileDataException { + URL obj = new URL(url); + HttpURLConnection con = (HttpURLConnection) obj.openConnection(); + con.setRequestProperty("User-Agent", "JavaServlet"); + con.setRequestProperty("Content-Type", contentType); + con.setDoOutput(true); + con.setRequestMethod(method); + DataOutputStream wr = new DataOutputStream( + con.getOutputStream()); + wr.writeBytes(payload); + wr.flush(); + wr.close(); + con.connect(); + StringBuffer response = new StringBuffer(); + BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + return response.toString(); + } +} \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/ServiceConnector.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/ServiceConnector.java new file mode 100644 index 0000000000000000000000000000000000000000..175cd3f7eb6dc498046187a85bc4362e2da1a3e8 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/services/ServiceConnector.java @@ -0,0 +1,25 @@ +package com.adaapa.adaojek.services; + +import com.adaapa.ojekservice.OjekOnline; +import com.adaapa.ojekservice.OjekOnlineService; +import java.net.MalformedURLException; + +public class ServiceConnector { + private static ServiceConnector instance; + private static String CONTEXT_PATH = "/OjekOnline"; + private static String WSDL_PATH = "?wsdl"; + private static String SERVICE_NAMESPACE = "http://ojekservice.adaapa.com/"; + private static String LOCAL_PATH = "OjekOnlineService"; + private static OjekOnline serviceClass; + public ServiceConnector() throws MalformedURLException{ + OjekOnlineService service = new OjekOnlineService(); + serviceClass = service.getOjekOnlinePort(); + } + + public static OjekOnline getServiceClass() throws MalformedURLException { + if(serviceClass == null) { + instance = new ServiceConnector(); + } + return serviceClass; + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/CompleteOrderServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/CompleteOrderServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..a68a1e7c0a803add2050e3d5f11c0992209ba3e8 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/CompleteOrderServlet.java @@ -0,0 +1,64 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.OrderBean; +import com.adaapa.bean.UserBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class CompleteOrderServlet extends HttpServlet{ + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"logout")) { + String pickup = req.getParameter("pickUp"); + String destination = req.getParameter("destination"); + req.setAttribute("pickup", pickup); + req.setAttribute("destination", destination); + ApplicationCookie cookie = CookieCheck.getCookie(req); + req.setAttribute("user", cookie.getUsername()); + Gson gson = new Gson(); + String response = ServiceConnector.getServiceClass(). + findDriverByUsername(cookie.getToken(),req.getParameter("driverId")); + WebServiceBean wsBean = gson.fromJson(response,WebServiceBean.class); + if(wsBean.getStatus().equals(WebServiceBean.STATUS_INVALID)) { + resp.sendRedirect("logout"); + } else { + UserBean ubean = gson.fromJson(wsBean.getBody(),UserBean.class); + req.setAttribute("driverProfile", ubean); + req.getRequestDispatcher("WEB-INF/complete_order.jsp").forward(req, resp); + } + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")) { + OrderBean orderBean = new OrderBean(); + orderBean.setDriverId(Integer.parseInt(req.getParameter("driverId"))); + orderBean.setPickup(req.getParameter("pickUp")); + orderBean.setComment(req.getParameter("comment")); + orderBean.setDestination(req.getParameter("destination")); + orderBean.setRating(Double.parseDouble(req.getParameter("rating"))); + Gson gson = new Gson(); + ApplicationCookie cookie = CookieCheck.getCookie(req); + OjekOnline service = ServiceConnector.getServiceClass(); + WebServiceBean wsBean = gson.fromJson(service.completeOrder(cookie.getToken(),gson.toJson(orderBean)), WebServiceBean.class); + if(wsBean.getStatus().equals(WebServiceBean.STATUS_VALID)) { + resp.sendRedirect("history"); + } else { + resp.sendRedirect("logout"); + } + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DeletePreferredLocationServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DeletePreferredLocationServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..17a796f9b85363884456cdc189e910375e065b49 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DeletePreferredLocationServlet.java @@ -0,0 +1,33 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class DeletePreferredLocationServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + Integer position = Integer.parseInt(req.getParameter("position")); + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")){ + OjekOnline service = ServiceConnector.getServiceClass(); + ApplicationCookie cookie = CookieCheck.getCookie(req); + WebServiceBean response = new Gson().fromJson(service.deletePreferredLocation(cookie.getToken(),position), WebServiceBean.class); + if(response.getStatus().equals(WebServiceBean.STATUS_INVALID)) { + resp.sendRedirect("logout"); + } else { + resp.sendRedirect("preferred_location"); + } + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DriverHideHistoryServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DriverHideHistoryServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..46d500c1ae0d5cca8585b6a3b31b2872da6513e3 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DriverHideHistoryServlet.java @@ -0,0 +1,33 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class DriverHideHistoryServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")) { + Integer orderId = Integer.parseInt(req.getParameter("orderId")); + ApplicationCookie cookie = CookieCheck.getCookie(req); + OjekOnline service = ServiceConnector.getServiceClass(); + WebServiceBean webServiceBean = new Gson().fromJson(service.hideDriverHistory(cookie.getToken(),orderId),WebServiceBean.class); + if(webServiceBean.getStatus().equals(WebServiceBean.STATUS_VALID)) { + resp.sendRedirect("driver_history"); + } else { + resp.sendRedirect("logout"); + } + + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DriverHistoryServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DriverHistoryServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..a7a34d44389c357faa84c2b834b6302b8450fe7c --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/DriverHistoryServlet.java @@ -0,0 +1,41 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.OrderBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class DriverHistoryServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")) { + ApplicationCookie cookie = CookieCheck.getCookie(req); + req.setAttribute("user", cookie.getUsername()); + String access_token = cookie.getToken(); + OjekOnline service = ServiceConnector.getServiceClass(); + Gson gson = new Gson(); + WebServiceBean wsResponse = gson.fromJson(service.getDriverHistory(access_token),WebServiceBean.class); + PrintWriter out = resp.getWriter(); + if(wsResponse.getStatus().equals(WebServiceBean.STATUS_VALID)) { + if(wsResponse.getBody() != null) { + OrderBean[] orderBeans = gson.fromJson(wsResponse.getBody(), OrderBean[].class); + req.setAttribute("orderBeans", orderBeans); + } + + req.getRequestDispatcher("WEB-INF/driver_history.jsp").forward(req, resp); + } else + resp.sendRedirect("logout"); + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/EditPreferredLocationServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/EditPreferredLocationServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..2ca5b6b8b799c174d3018261a73ff3079b884674 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/EditPreferredLocationServlet.java @@ -0,0 +1,35 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class EditPreferredLocationServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")) { + OjekOnline service = ServiceConnector.getServiceClass(); + ApplicationCookie cookie = CookieCheck.getCookie(req); + Integer position = Integer.parseInt(req.getParameter("position")); + String location = req.getParameter("location"); + WebServiceBean wsBean = new Gson().fromJson(service.editPreferredLocation(cookie.getToken(), position, location),WebServiceBean.class); + if(wsBean.getStatus().equals(WebServiceBean.STATUS_INVALID)) { + resp.sendRedirect("logout"); + + } else { + resp.sendRedirect("preferred_location"); + } + } + + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/EditProfileServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/EditProfileServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..0b88f8386405c1524f7618f02b4e703907ac601b --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/EditProfileServlet.java @@ -0,0 +1,69 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.UserBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.util.Base64; +import javax.servlet.ServletException; +import javax.servlet.annotation.MultipartConfig; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@MultipartConfig +public class EditProfileServlet extends HttpServlet{ + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + OjekOnline service = ServiceConnector.getServiceClass(); + ApplicationCookie cookie = CookieCheck.getCookie(req); + WebServiceBean wsBean = new Gson().fromJson(service.getProfile(cookie.getToken()), WebServiceBean.class); + if(wsBean.getStatus().equals(WebServiceBean.STATUS_INVALID)) { + resp.sendRedirect("/login"); + } else { + UserBean ubean = new Gson().fromJson(wsBean.getBody(),UserBean.class); + req.setAttribute("userProfile",ubean); + req.getRequestDispatcher("WEB-INF/edit_profile.jsp").forward(req,resp); + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + CookieCheck.redirectIfTokenNotFound(req, resp,"/login"); + PrintWriter out = resp.getWriter(); + // out.println(req.getParameter("name")); + UserBean userBean = new UserBean(); + userBean.name = req.getParameter("name"); + userBean.phoneNumber = req.getParameter("phoneNumber"); + String contentType = req.getPart("image").getContentType(); + userBean.isDriver = req.getParameter("isDriver") != null; + if(contentType.equals("image/jpg") || contentType.equals("image/jpeg") || contentType.equals("image/png")) { + InputStream filecontent = req.getPart("image").getInputStream(); + byte[] buffer = new byte[8192]; + int bytesRead; + ByteArrayOutputStream output = new ByteArrayOutputStream(); + while ((bytesRead = filecontent.read(buffer)) != -1) + { + output.write(buffer, 0, bytesRead); + } + userBean.image = Base64.getEncoder().encodeToString(output.toByteArray()); + } + OjekOnline service = ServiceConnector.getServiceClass(); + ApplicationCookie cookie = CookieCheck.getCookie(req); + + Gson gson = new Gson(); + service.editProfile(cookie.getToken(),gson.toJson(userBean)); + resp.sendRedirect("/profile"); + + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/FindDriverServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/FindDriverServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..ecb787bcd8668bc82440956594bbd4164cfb8d6f --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/FindDriverServlet.java @@ -0,0 +1,61 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.DriverBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class FindDriverServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")) { + ApplicationCookie cookie = CookieCheck.getCookie(req); + req.setAttribute("user", cookie.getUsername()); + OjekOnline service = ServiceConnector.getServiceClass(); + PrintWriter out = resp.getWriter(); + String token = CookieCheck.getCookie(req).getToken(); + Gson gson = new Gson(); + String pickup = req.getParameter("pickUp"); + String destination = req.getParameter("destination"); + req.setAttribute("pickup",pickup); + req.setAttribute("destination",destination); + String preferredDriver = req.getParameter("preferredDriver"); + if(!preferredDriver.equals("")) { + WebServiceBean webServiceBean = gson + .fromJson(service.findDriver(token, preferredDriver), WebServiceBean.class); + if (webServiceBean.getStatus().equals(WebServiceBean.STATUS_INVALID)) { + resp.sendRedirect("logout"); + } else { + DriverBean[] driverBeans = gson.fromJson(webServiceBean.getBody(),DriverBean[].class); + req.setAttribute("preferredDrivers", driverBeans); + req.setAttribute("preferredDriversLength", driverBeans.length); + + } + } else { + req.setAttribute("preferredDriversLength", 0); + } + WebServiceBean wsBean = gson. + fromJson(service.findDriverByPreferredLocation(cookie.getToken(),pickup,destination), + WebServiceBean.class); + if(wsBean.getStatus().equals(WebServiceBean.STATUS_INVALID)) { + resp.sendRedirect("logout"); + } else { + DriverBean[] driverBeans= gson.fromJson(wsBean.getBody(),DriverBean[].class); + req.setAttribute("foundDrivers", driverBeans); + req.setAttribute("foundDriversLength", driverBeans.length); + req.getRequestDispatcher("WEB-INF/find_driver.jsp").forward(req,resp); + } + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/HistoryServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/HistoryServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..fc4958ebbd99a415ef493c256d8c5e1732c3d439 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/HistoryServlet.java @@ -0,0 +1,43 @@ +package com.adaapa.adaojek.servlets; + +/** + * Created by ireneedriadr on 11/5/17. + */ + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.OrderBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +public class HistoryServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")) { + ApplicationCookie cookie = CookieCheck.getCookie(req); + req.setAttribute("user", cookie.getUsername()); + String access_token = cookie.getToken(); + OjekOnline service = ServiceConnector.getServiceClass(); + Gson gson = new Gson(); + WebServiceBean wsResponse = gson.fromJson(service.getUserHistory(access_token),WebServiceBean.class); + PrintWriter out = resp.getWriter(); + if(wsResponse.getStatus().equals(WebServiceBean.STATUS_VALID)) { + OrderBean[] orderBeans = gson.fromJson(wsResponse.getBody(), OrderBean[].class); + req.setAttribute("orderBeans", orderBeans); + req.getRequestDispatcher("WEB-INF/history.jsp").forward(req, resp); + } else + resp.sendRedirect("logout"); + } + } +} \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/IndexServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/IndexServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..3beb45769d835784ec0f9993cd2fc83a041e96fd --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/IndexServlet.java @@ -0,0 +1,16 @@ +package com.adaapa.adaojek.servlets; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class IndexServlet extends HttpServlet{ + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.sendRedirect("login"); + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/LoginServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/LoginServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..416078e25c8126f1c595b072b433262981b1a6dd --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/LoginServlet.java @@ -0,0 +1,58 @@ +package com.adaapa.adaojek.servlets; + + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.DomainConfig; +import com.adaapa.adaojek.services.RequestSender; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.LoginRequestBean; +import com.adaapa.bean.LoginResponseBean; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Base64; +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class LoginServlet extends HttpServlet{ + private final String LOGIN_URL = "/login"; + private final String STATUS_ACCEPTED = "accepted"; + private final String STATUS_FAILED = "failed"; + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenFound(req,resp,"order")) { + req.getRequestDispatcher("WEB-INF/login.jsp").forward(req, resp); + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + DomainConfig domain = DomainConfig.getInstance(); + Gson gson = new Gson(); + //Send request to identity services + PrintWriter out = resp.getWriter(); + String username = req.getParameter("username"); + String password = req.getParameter("password"); + LoginRequestBean loginBean = new LoginRequestBean(username, password); + LoginResponseBean loginResponse = gson.fromJson(RequestSender.sendRequest(domain.getISDomain()+LOGIN_URL, + "POST","application/x-www-form-urlencoded", + loginBean.getURLParameter()), LoginResponseBean.class); + if (loginResponse.getStatus().equals(STATUS_ACCEPTED)) { + Cookie cookie = + new Cookie("adaapa", Base64.getEncoder().encodeToString(gson.toJson(new ApplicationCookie(loginResponse.getAccessToken(),loginResponse.getUserBean().getUsername())).getBytes())); + cookie.setMaxAge(loginResponse.getAge()); + resp.addCookie(cookie); + resp.sendRedirect("index"); + } else { + req.setAttribute("errorMessage","Login Gagal"); + req.getRequestDispatcher("WEB-INF/login.jsp").forward(req,resp); + } + } + +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/LogoutServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/LogoutServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..274cf609acd1a1296b442b472f3a4e6a17cac8f8 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/LogoutServlet.java @@ -0,0 +1,46 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.DomainConfig; +import com.adaapa.adaojek.services.RequestSender; +import com.adaapa.bean.LogoutResponseBean; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URLEncoder; +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +public class LogoutServlet extends HttpServlet { + private final String LOGOUT_URL = "/logout"; + private final String STATUS_ACCEPTED = "accepted"; + private final String STATUS_FAILED = "FAILED"; + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"/login")) { + DomainConfig domain = DomainConfig.getInstance(); + Gson gson = new Gson(); + String response = RequestSender.sendRequest( + domain.getISDomain() + LOGOUT_URL, + "POST", + "application/x-www-form-urlencoded", + String.format("access_token=%s", URLEncoder.encode(CookieCheck.getCookie(req).getToken(), "UTF-8")) + ); + PrintWriter out = resp.getWriter(); + LogoutResponseBean responseBean = gson.fromJson(response, LogoutResponseBean.class); + if (responseBean.getStatus().equals(STATUS_ACCEPTED)) { + Cookie cookie = new Cookie("adaapa", ""); + cookie.setMaxAge(0); + resp.addCookie(cookie); + } else { + //Do nothing + } + resp.sendRedirect("/login"); + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/OrderServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/OrderServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..bf97f15209efa3c7e21a2babf01da8f6c46ee373 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/OrderServlet.java @@ -0,0 +1,20 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class OrderServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"/login")) { + req.setAttribute("user", CookieCheck.getCookie(req).getUsername()); + req.getRequestDispatcher("WEB-INF/order.jsp").forward(req, resp); + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/PreferredLocationServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/PreferredLocationServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..2b4e93b2ce70f8f886e011ecec5f718484bb5b0e --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/PreferredLocationServlet.java @@ -0,0 +1,52 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.PreferredLocationBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class PreferredLocationServlet extends HttpServlet{ + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"/login")) { + OjekOnline service = ServiceConnector.getServiceClass(); + ApplicationCookie cookie = CookieCheck.getCookie(req); + Gson gson = new Gson(); + WebServiceBean wsBean = gson.fromJson(service.getPreferredLocation(cookie.getToken()),WebServiceBean.class); + if(wsBean.getStatus().equals(WebServiceBean.STATUS_VALID)) { + PreferredLocationBean[] preferredLocationArray = gson.fromJson(wsBean.getBody(), PreferredLocationBean[].class); + req.setAttribute("preferredLocations",preferredLocationArray); + } else { + resp.sendRedirect("login"); + } + req.getRequestDispatcher("WEB-INF/edit_preferences.jsp").forward(req, resp); + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")) { + OjekOnline service = ServiceConnector.getServiceClass(); + ApplicationCookie cookie = CookieCheck.getCookie(req); + String location = req.getParameter("location"); + Gson gson = new Gson(); + WebServiceBean wsBean = gson.fromJson(service.addPreferredLocation(cookie.getToken(), location),WebServiceBean.class); + if(wsBean.getStatus().equals(WebServiceBean.STATUS_INVALID)) { + resp.sendRedirect("logout"); + } else{ + resp.sendRedirect("/preferred_location"); + } + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/ProfileServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/ProfileServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..4b850df7cd10115ad535b88a5fb614c6927fa027 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/ProfileServlet.java @@ -0,0 +1,62 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.bean.DriverBean; +import com.adaapa.bean.PreferredLocationBean; +import com.adaapa.bean.UserBean; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ProfileServlet extends HttpServlet { + Gson gson = new Gson(); + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"/login")) { + OjekOnline service = ServiceConnector.getServiceClass(); + PrintWriter out = resp.getWriter(); + String token = CookieCheck.getCookie(req).getToken(); + // out.println(service.getProfile(CookieCheck.getCookie(req).getToken())); + WebServiceBean webServiceBean = gson + .fromJson(service.getProfile(token), + WebServiceBean.class); + + if (webServiceBean.getStatus().equals(WebServiceBean.STATUS_INVALID)) { + resp.sendRedirect("/logout"); + } else { + // out.println(webServiceBean.getBody()); + UserBean ubean = gson.fromJson(webServiceBean.getBody(), UserBean.class); + if(ubean.getIsDriver()) { + WebServiceBean getDriverResponse = gson.fromJson(service.getDriverProfile(token), WebServiceBean.class); + if (getDriverResponse.getStatus().equals(WebServiceBean.STATUS_VALID)) { + DriverBean driverBean = gson.fromJson(getDriverResponse.getBody(),DriverBean.class); + req.setAttribute("driverProfile",driverBean); + } else { + throw new ServletException(); + } + WebServiceBean getPreferredLocationResponse = gson.fromJson(service.getPreferredLocation(token), WebServiceBean.class); + if(getPreferredLocationResponse.getStatus().equals(WebServiceBean.STATUS_VALID)) { + PreferredLocationBean[] preferredLocationBeanArray = gson.fromJson(getPreferredLocationResponse.getBody(), + PreferredLocationBean[].class); + req.setAttribute("preferredLocations", preferredLocationBeanArray); + } else { + throw new ServletException(); + } + } + req.setAttribute("user", CookieCheck.getCookie(req).getUsername()); + req.setAttribute("userProfile", ubean); + req.getRequestDispatcher("WEB-INF/profile.jsp").forward(req, resp); + } + } + + } + +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/RegisterServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/RegisterServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..00eb30c6803ef584a885f1af6e4b377dc2b81a70 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/RegisterServlet.java @@ -0,0 +1,80 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.DomainConfig; +import com.adaapa.adaojek.services.RequestSender; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.LoginResponseBean; +import com.adaapa.bean.UserBean; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URLEncoder; +import java.util.Base64; +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class RegisterServlet extends HttpServlet{ + private final String REGISTER_URL = "/register"; + private final String STATUS_ACCEPTED = "accepted"; + private final String STATUS_FAILED = "failed"; + DomainConfig domain = DomainConfig.getInstance(); + Gson gson = new Gson(); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenFound(req,resp,"/order")) { + req.getRequestDispatcher("WEB-INF/signup.jsp").forward(req,resp); + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + PrintWriter out = resp.getWriter(); + String name = req.getParameter("name"); + String username = req.getParameter("username"); + String email = req.getParameter("email"); + String password = req.getParameter("password"); + String confirmpassword = req.getParameter("confirm-password"); + String phoneNumber = req.getParameter("phoneNumber"); + Boolean isDriver = req.getParameter("isDriver") != null; + UserBean wsUser = new UserBean(); + wsUser.name = name; + wsUser.username = username; + wsUser.email = email; + wsUser.phoneNumber = phoneNumber; + wsUser.isDriver = isDriver; + String payload = String.format("name=%s&username=%s&email=%s&password=%s&confirmpassword=%s&phoneNumber=%s&isDriver=%b", + URLEncoder.encode(name,"UTF-8"),URLEncoder.encode(username,"UTF-8"),URLEncoder.encode(email, "UTF-8"), + URLEncoder.encode(password,"UTF-8"), URLEncoder.encode(confirmpassword,"UTF-8"), + URLEncoder.encode(phoneNumber,"UTF-8"),isDriver); + LoginResponseBean loginResponse = gson.fromJson(RequestSender.sendRequest( + domain.getISDomain()+REGISTER_URL, "POST","application/x-www-form-urlencoded", + payload + ),LoginResponseBean.class); + + + if (loginResponse.getStatus().equals(STATUS_ACCEPTED)) { + Cookie cookie = + new Cookie("adaapa", Base64.getEncoder().encodeToString(gson.toJson(new ApplicationCookie(loginResponse.getAccessToken(),loginResponse.getUserBean().getUsername())).getBytes())); + cookie.setMaxAge(loginResponse.getAge()); + ServiceConnector.getServiceClass().addUser(loginResponse.getAccessToken(), gson.toJson(wsUser)); + resp.addCookie(cookie); + if(isDriver) { + resp.sendRedirect("/profile"); + } + else { + resp.sendRedirect("/index"); + } + } else { + req.setAttribute("errorMessage","Registrasi Gagal"); + req.getRequestDispatcher("WEB-INF/signup.jsp").forward(req,resp); + } + + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/UserHideHistoryServlet.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/UserHideHistoryServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..e7d53327bab62b5d4e9ddf7d352655c5a40ab2ad --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/servlets/UserHideHistoryServlet.java @@ -0,0 +1,32 @@ +package com.adaapa.adaojek.servlets; + +import com.adaapa.adaojek.middlewares.CookieCheck; +import com.adaapa.adaojek.services.ServiceConnector; +import com.adaapa.adaojek.stub.ApplicationCookie; +import com.adaapa.bean.WebServiceBean; +import com.adaapa.ojekservice.OjekOnline; +import com.google.gson.Gson; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class UserHideHistoryServlet extends HttpServlet{ + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if(!CookieCheck.redirectIfTokenNotFound(req,resp,"login")) { + Integer orderId = Integer.parseInt(req.getParameter("orderId")); + ApplicationCookie cookie = CookieCheck.getCookie(req); + OjekOnline service = ServiceConnector.getServiceClass(); + WebServiceBean webServiceBean = new Gson().fromJson(service.hideUserHistory(cookie.getToken(),orderId),WebServiceBean.class); + if(webServiceBean.getStatus().equals(WebServiceBean.STATUS_VALID)) { + resp.sendRedirect("history"); + } else { + resp.sendRedirect("logout"); + } + + } + } +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/stub/ApplicationCookie.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/stub/ApplicationCookie.java new file mode 100644 index 0000000000000000000000000000000000000000..039d8c42951497e0bb2891bc4e7c32250493d57e --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/adaojek/stub/ApplicationCookie.java @@ -0,0 +1,21 @@ +package com.adaapa.adaojek.stub; + +public class ApplicationCookie { + + private String access_token; + private String username; + + public ApplicationCookie(String access_token, String username){ + this.access_token = access_token; + this.username = username; + } + + public String getUsername() { + return username; + } + + public String getToken() { + return access_token; + } + +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/ojekservice/OjekOnline.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/ojekservice/OjekOnline.java new file mode 100644 index 0000000000000000000000000000000000000000..0b48186bba6f5384e0b05b1dbe5ce3c7c79fc8fd --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/ojekservice/OjekOnline.java @@ -0,0 +1,270 @@ + +package com.adaapa.ojekservice; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebResult; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; +import javax.xml.ws.Action; + + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.2.9-b130926.1035 + * Generated source version: 2.2 + * + */ +@WebService(name = "OjekOnline", targetNamespace = "http://ojekservice.adaapa.com/") +@SOAPBinding(style = SOAPBinding.Style.RPC) +public interface OjekOnline { + + + /** + * + * @param accessToken + * @param user + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/addUserRequest", output = "http://ojekservice.adaapa.com/OjekOnline/addUserResponse") + public String addUser( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "user", partName = "user") + String user); + + /** + * + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/getDriverProfileRequest", output = "http://ojekservice.adaapa.com/OjekOnline/getDriverProfileResponse") + public String getDriverProfile( + @WebParam(name = "access_token", partName = "access_token") + String accessToken); + + /** + * + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/getProfileRequest", output = "http://ojekservice.adaapa.com/OjekOnline/getProfileResponse") + public String getProfile( + @WebParam(name = "access_token", partName = "access_token") + String accessToken); + + /** + * + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/getPreferredLocationRequest", output = "http://ojekservice.adaapa.com/OjekOnline/getPreferredLocationResponse") + public String getPreferredLocation( + @WebParam(name = "access_token", partName = "access_token") + String accessToken); + + /** + * + * @param location + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/addPreferredLocationRequest", output = "http://ojekservice.adaapa.com/OjekOnline/addPreferredLocationResponse") + public String addPreferredLocation( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "location", partName = "location") + String location); + + /** + * + * @param accessToken + * @param user + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/editProfileRequest", output = "http://ojekservice.adaapa.com/OjekOnline/editProfileResponse") + public String editProfile( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "user", partName = "user") + String user); + + /** + * + * @param driverName + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/findDriverRequest", output = "http://ojekservice.adaapa.com/OjekOnline/findDriverResponse") + public String findDriver( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "driver_name", partName = "driver_name") + String driverName); + + /** + * + * @param destination + * @param pickup + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/findDriverByPreferredLocationRequest", output = "http://ojekservice.adaapa.com/OjekOnline/findDriverByPreferredLocationResponse") + public String findDriverByPreferredLocation( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "pickup", partName = "pickup") + String pickup, + @WebParam(name = "destination", partName = "destination") + String destination); + + /** + * + * @param accessToken + * @param order + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/completeOrderRequest", output = "http://ojekservice.adaapa.com/OjekOnline/completeOrderResponse") + public String completeOrder( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "order", partName = "order") + String order); + + /** + * + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/getUserHistoryRequest", output = "http://ojekservice.adaapa.com/OjekOnline/getUserHistoryResponse") + public String getUserHistory( + @WebParam(name = "access_token", partName = "access_token") + String accessToken); + + /** + * + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/getDriverHistoryRequest", output = "http://ojekservice.adaapa.com/OjekOnline/getDriverHistoryResponse") + public String getDriverHistory( + @WebParam(name = "access_token", partName = "access_token") + String accessToken); + + /** + * + * @param orderId + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/hideDriverHistoryRequest", output = "http://ojekservice.adaapa.com/OjekOnline/hideDriverHistoryResponse") + public String hideDriverHistory( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "order_id", partName = "order_id") + int orderId); + + /** + * + * @param orderId + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/hideUserHistoryRequest", output = "http://ojekservice.adaapa.com/OjekOnline/hideUserHistoryResponse") + public String hideUserHistory( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "order_id", partName = "order_id") + int orderId); + + /** + * + * @param position + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/deletePreferredLocationRequest", output = "http://ojekservice.adaapa.com/OjekOnline/deletePreferredLocationResponse") + public String deletePreferredLocation( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "position", partName = "position") + int position); + + /** + * + * @param location + * @param position + * @param accessToken + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/editPreferredLocationRequest", output = "http://ojekservice.adaapa.com/OjekOnline/editPreferredLocationResponse") + public String editPreferredLocation( + @WebParam(name = "access_token", partName = "access_token") + String accessToken, + @WebParam(name = "position", partName = "position") + int position, + @WebParam(name = "location", partName = "location") + String location); + + /** + * + * @param arg1 + * @param arg0 + * @return + * returns java.lang.String + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://ojekservice.adaapa.com/OjekOnline/findDriverByUsernameRequest", output = "http://ojekservice.adaapa.com/OjekOnline/findDriverByUsernameResponse") + public String findDriverByUsername( + @WebParam(name = "arg0", partName = "arg0") + String arg0, + @WebParam(name = "arg1", partName = "arg1") + String arg1); + +} diff --git a/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/ojekservice/OjekOnlineService.java b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/ojekservice/OjekOnlineService.java new file mode 100644 index 0000000000000000000000000000000000000000..01c2dd61edeb07c76c9fff066c075e0aedb9b7b0 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/java/com/adaapa/ojekservice/OjekOnlineService.java @@ -0,0 +1,94 @@ + +package com.adaapa.ojekservice; + +import java.net.MalformedURLException; +import java.net.URL; +import javax.xml.namespace.QName; +import javax.xml.ws.Service; +import javax.xml.ws.WebEndpoint; +import javax.xml.ws.WebServiceClient; +import javax.xml.ws.WebServiceException; +import javax.xml.ws.WebServiceFeature; + + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.2.9-b130926.1035 + * Generated source version: 2.2 + * + */ +@WebServiceClient(name = "OjekOnlineService", targetNamespace = "http://ojekservice.adaapa.com/", wsdlLocation = "localhost:8080/WebService/soap/ojekonline?wsdl") +public class OjekOnlineService + extends Service +{ + + private final static URL OJEKONLINESERVICE_WSDL_LOCATION; + private final static WebServiceException OJEKONLINESERVICE_EXCEPTION; + private final static QName OJEKONLINESERVICE_QNAME = new QName("http://ojekservice.adaapa.com/", "OjekOnlineService"); + + static { + URL url = null; + WebServiceException e = null; + try { + url = new URL("http://localhost:8080/WebService/soap/ojekonline?wsdl"); + } catch (MalformedURLException ex) { + e = new WebServiceException(ex); + } + OJEKONLINESERVICE_WSDL_LOCATION = url; + OJEKONLINESERVICE_EXCEPTION = e; + } + + public OjekOnlineService() { + super(__getWsdlLocation(), OJEKONLINESERVICE_QNAME); + } + + public OjekOnlineService(WebServiceFeature... features) { + super(__getWsdlLocation(), OJEKONLINESERVICE_QNAME, features); + } + + public OjekOnlineService(URL wsdlLocation) { + super(wsdlLocation, OJEKONLINESERVICE_QNAME); + } + + public OjekOnlineService(URL wsdlLocation, WebServiceFeature... features) { + super(wsdlLocation, OJEKONLINESERVICE_QNAME, features); + } + + public OjekOnlineService(URL wsdlLocation, QName serviceName) { + super(wsdlLocation, serviceName); + } + + public OjekOnlineService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) { + super(wsdlLocation, serviceName, features); + } + + /** + * + * @return + * returns OjekOnline + */ + @WebEndpoint(name = "OjekOnlinePort") + public OjekOnline getOjekOnlinePort() { + return super.getPort(new QName("http://ojekservice.adaapa.com/", "OjekOnlinePort"), OjekOnline.class); + } + + /** + * + * @param features + * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values. + * @return + * returns OjekOnline + */ + @WebEndpoint(name = "OjekOnlinePort") + public OjekOnline getOjekOnlinePort(WebServiceFeature... features) { + return super.getPort(new QName("http://ojekservice.adaapa.com/", "OjekOnlinePort"), OjekOnline.class, features); + } + + private static URL __getWsdlLocation() { + if (OJEKONLINESERVICE_EXCEPTION!= null) { + throw OJEKONLINESERVICE_EXCEPTION; + } + return OJEKONLINESERVICE_WSDL_LOCATION; + } + +} diff --git a/TugasBesar2_2017/WebApp/src/main/resources/config/domain.properties.example b/TugasBesar2_2017/WebApp/src/main/resources/config/domain.properties.example new file mode 100644 index 0000000000000000000000000000000000000000..a9f9de817b8de59219b13c6065f2382b3b7e07be --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/resources/config/domain.properties.example @@ -0,0 +1,2 @@ +IDSERVICE_DOMAIN = "localhost:8001"; +WEBSERVICE_DOMAIN = "localhost:8002"; diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/complete_order.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/complete_order.jsp new file mode 100644 index 0000000000000000000000000000000000000000..1368dbe9ee26dd947730d4a2f436b41cf96bd85d --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/complete_order.jsp @@ -0,0 +1,70 @@ + +<%@ include file="/component/header.html"%> +<%@ include file="/component/nav.html"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<div class="container"> + <div class="wrapper row"> + <div> + <div class="page-title row txt-center height-fit float-container"> + <div class="float-left"> + <h1 class="inline-block">MAKE AN ORDER</h1> + </div> + </div> + </div> + <div class="order-menu"> + <ul class="order-ul"> + <li class="order-item"> + <div class="order-number">1</div> + <div class="order-number-desc">Select Destination</div> + </li> + <li class="order-item"> + <div class="order-number">2</div> + <div class="order-number-desc">Select a Driver</div> + </li> + <li class="order-item active"> + <div class="order-number">3</div> + <div class="order-number-desc"><span>Complete your order</div> + </li> + </ul> + </div> + <div class="order-panel no-border"> + <div class="panel-heading"> + <h3>HOW WAS IT?</h3> + </div> + <div class="panel-body txt-center"> + <c:choose> + <c:when test="${driverProfile.getImage() != null}"> + <img src='${driverProfile.getImage()}' class='profile-image' height='80' alt='profile-image'> + </c:when> + <c:otherwise> + <img src='img/default-profile.png' class='profile-image' height='80' alt='profile-image'> + </c:otherwise> + </c:choose> + <h3>@${driverProfile.getUsername()}</h3> + <h3>${driverProfile.getName()}</h3> + <form method="post" onsubmit="return validateForm(this)" action="complete_order"> + <input type="hidden" value="${pickup}" name="pickUp"> + <input type="hidden" value="${destination}" name="destination"> + <input type="hidden" value="${driverProfile.getId()}" name="driverId"> + + + <div id="rating-system"> + <input type="number" id="rating-value" min="1" max="5" hidden name="rating"> + <c:forEach var="iter" begin="1" end="5" > + <span class='grey-star' onclick='renderStar(${iter})'> </span> + </c:forEach> + </div> + <textarea name="comment" placeholder="Comment" class="form-input" id="comment-area" rows="5"></textarea> + <div class="txt-right"> + <button type="submit" class="submit-button height-auto"> Complete Order</button> + </div> + </form> + </div> + </div> + + <%@include file="/component/footer.html"%> + <script> + window.onload = toggleActive("nav-order"); + </script> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/driver_history.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/driver_history.jsp new file mode 100644 index 0000000000000000000000000000000000000000..ef796b7ce024f9e383037b3ce2f7f6ba9f96928a --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/driver_history.jsp @@ -0,0 +1,83 @@ +<%-- + Created by IntelliJ IDEA. + User: ireneedriadr + Date: 11/3/17 + Time: 3:45 PM + To change this template use File | Settings | File Templates. +--%> +<%@ include file="/component/header.html"%> +<%@ include file="/component/nav.html"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<div class="container"> + <div class="wrapper row"> + <div> + <div class="page-title row txt-center height-fit float-container"> + <div class="float-left"> + <h1 class="inline-block">TRANSACTION HISTORY</h1> + </div> + </div> + <div class="row inline-flex history-menu"> + <a href="/history"> + + <div> + My Previous Order + + </div> + </a> + <a href="/driver_history"> + <div class="active"> + Driver History + </div> + </a> + </div> + <div class="row txt-center"> + <div class="history-list-group"> + <form action="driver_hide_history" method="post"> + <c:forEach var="item" items="${orderBeans}"> + <div class="history-list-item"> + <c:choose> + <c:when test="${item.getImage() != null}"> + <img src='${item.getImage()}' class='driver-profile' alt='profile-image'> + </c:when> + <c:otherwise> + <img src='img/default-profile.png' class='driver-profile' alt='profile-image'> + </c:otherwise> + </c:choose> + <span class="color-grey date"> + <fmt:formatDate value="${item.getTimestamp()}" var="formattedDate" type="date" pattern="EEEE, MMMM dd YYYY"/> + ${formattedDate} + </span> + <button class="submit-button button-red" type="submit" name="orderId" value="${item.getId()}"> + HIDE + </button> + <span>${item.getName()}</span> + <span class="location"> + <div> + ${item.getPickup()} + <img src="img/right-arrow.svg" alt=">" height="1" class="arrow-icon"> + ${item.getDestination()} + </div> + </span> + <span class="rating"> + gave <span>${item.getRating()}</span> stars for this order + </span> + + <span class="comment"> + and left comment: <br> + <span>${item.getComment()}</span> + </span> + </div> + </c:forEach> + </form> + </div> + </div> + </div> + </div> + +<%@include file="/component/footer.html" %> + +<script> + window.onload = toggleActive("nav-history"); +</script> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/edit_preferences.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/edit_preferences.jsp new file mode 100644 index 0000000000000000000000000000000000000000..e5eead9f4a6724d6b79862f2ed53e2c8aa869643 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/edit_preferences.jsp @@ -0,0 +1,70 @@ +<%-- + Created by IntelliJ IDEA. + User: kennethhalim + Date: 11/5/17 + Time: 3:44 PM + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +<%@include file="/component/header.html"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + +<div class="container"> + <div class="wrapper row"> + <div> + <div class="page-title row txt-center height-fit float-container"> + <div class="float-left"> + <h1 class="inline-block">EDIT PREFERENCES</h1> + </div> + </div> + </div> + <div class="row"> + <table class="edit-table txt-center preferences-edit"> + <thead> + <th>No.</th> + <th>Location</th> + <th>Actions</th> + </thead> + <tbody> + <% int i = 1; %> + <c:forEach items="${preferredLocations}" var="item"> + + <tr> + <td><%= i %></td> + <td> + <form action="/edit_preferred_location" method="post" id="form-update-${item.getPosition()}"> + <input type="hidden" value="${item.getPosition()}" name="position"> + <input value="${item.getLocation()}" class="form-input" id="edit-input-${item.getPosition()}" disabled name="location"> + </form> + </td> + <td> + <span><button class="edit-button inline-block" type="button" onclick=toggleEdit(${item.getPosition()}) + id="edit-button-${item.getPosition()}"></button></span> + <form action="/delete_location" class="display-inline-block" onsubmit="return confirm('Are You Sure')" method="post"> + <input type="hidden" value="${item.getPosition()}" name="position"> + <span><button class="delete-button inline-block" type="submit"></button></span> + </form> + </td> + </tr> + <% i++; %> + </c:forEach> + </tbody> + </table> + </div> +<div class="row"> + <h2>ADD NEW LOCATION</h2> + <div> + <form action="add_location" class="location-input" method="POST" onsubmit="return validateForm(this)"> + <input type="text" class="form-input" name="location"> + <button type="submit" class="submit-button"> Submit </button> + </form> + </div> + </div> + <a href="/profile"> + <button id="back-button" type="button" class="submit-button">Back</button> + </a> + </div> +</div> + +<%@include file="/component/footer.html"%> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/edit_profile.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/edit_profile.jsp new file mode 100644 index 0000000000000000000000000000000000000000..609962e9043d9ba403737deee9c3666aedf5b603 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/edit_profile.jsp @@ -0,0 +1,87 @@ +<%-- + Created by IntelliJ IDEA. + User: kennethhalim + Date: 11/4/17 + Time: 10:12 AM + To change this template use File | Settings | File Templates. +--%> +<%@ include file="/component/header.html"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + +<div class="container"> + <div class="wrapper"> + <div class="page-title"> + <h1>EDIT PROFILE INFORMATION</h1> + </div> + <div id="editprofile-body"> + <form action="edit_profile" id="edit-form" method="post" enctype="multipart/form-data" onsubmit="return validateForm(this)"> + <table class="edit-table"> + <tr> + <td> + <c:choose> + <c:when test="${userProfile.getImage() != null}"> + <img src='${userProfile.getImage()}' class='square-image' height='80' alt='profile-image'> + </c:when> + <c:otherwise> + <img src='img/default-profile.png' class='square-image' height='80' alt='profile-image'> + </c:otherwise> + </c:choose> + </td> + <td> + <label for="upload-profpic" class="txt-right">Update profile picture</label> + <br> + <div class="uploader-container"> + + </div> + <input type="file" name="image" id="upload-profpic" accept="image/jpg, image/png" placeholder="Image Path" optional> + + </td> + </tr> + <tr> + <td> + <label for="update-name" class="txt-right">Your Name</label> + </td> + <td> + <input type="text" name="name" id="update-name" placeholder="Edit Name" class="form-input" + value="${userProfile.getName()}"> + </td> + </tr> + <tr> + <td> + <label for="update-phone-number" class="txt-right">Phone</label> + </td> + <td> + <input type="text" name="phoneNumber" id="update-phone-number" placeholder="Edit Phone Number" class="form-input" + value="${userProfile.getPhoneNumber()}"> + </td> + </tr> + <tr> + <td> + <label for="update-driver-status" class="txt-right nowrap">Status Driver</label> + </td> + <td class="txt-right" id="slider-toggle"> + <label class="switch"> + <input type="checkbox" name="isDriver" value="1" id="update-driver-status" + <c:if test="${userProfile.getIsDriver()}"> checked </c:if> + > + <span class="slider round"></span> + </label> + </td> + </tr> + <tr> + <td> + <a href="/profile"> + <button id="back-button" type="button" class="submit-button">Back</button> + </a> + </td> + <td class="txt-right"> + <button type="submit" class="form-input submit-button" id="save-changes-button">Save</button> + </td> + </tr> + </table> + </form> + </div> + </div> +</div> +</div> +<%@ include file="/component/footer.html"%> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/find_driver.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/find_driver.jsp new file mode 100644 index 0000000000000000000000000000000000000000..3efce5b04e7f9f0d7a23dd6f172b6e965569540a --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/find_driver.jsp @@ -0,0 +1,123 @@ +<%@ include file="/component/header.html"%> +<%@ include file="/component/nav.html"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<div class="container"> + <div class="wrapper row"> + <div> + <div class="page-title row txt-center height-fit float-container"> + <div class="float-left"> + <h1 class="inline-block">MAKE AN ORDER</h1> + </div> + </div> + </div> + <div class="order-menu"> + <ul class="order-ul"> + <li class="order-item"> + <div class="order-number">1</div> + <div class="order-number-desc">Select Destination</div> + </li> + <li class="order-item active"> + <div class="order-number">2</div> + <div class="order-number-desc">Select a Driver</div> + </li> + <li class="order-item"> + <div class="order-number">3</div> + <div class="order-number-desc"><span>Complete your order</div> + </li> + </ul> + </div> + <form action="/complete_order" method="get"> + <input type="hidden" name="pickUp" value="${pickup}"> + <input type="hidden" name="destination" value="${destination}"> + <div class="order-panel"> + <div class="panel-heading"> + <h3>PREFERRED DRIVERS:</h3> + </div> + <div class="panel-body txt-center"> + <c:forEach items="${preferredDrivers}" var="item"> + <div class="driver-list-item"> + <div class="first"> + <c:choose> + <c:when test="${item.getImage() != null}"> + <img src='${item.getImage()}' class='driver-profile' alt='profile-image'> + </c:when> + <c:otherwise> + <img src='img/default-profile.png' class='driver-profile' alt='profile-image'> + </c:otherwise> + </c:choose> + </div> + <div class="second"> + <span class="name-text">${item.getName()}</span> + </div> + <div> + <span class="rating-value"> + <img src="img/gold-star.svg" alt=""> + <fmt:formatNumber type = "number" maxFractionDigits = "1" value = "${item.getRating()}" /> + </span> + <span> + (${item.getVote()} votes) + </span> + </div> + <div> + <button name="driverId" value="${item.getUsername()}" class="submit-button"> + I Choose You + </button> + </div> + </div> + </c:forEach> + <c:if test="${preferredDriversLength == 0}"> + <span class="color-grey">NOTHING TO DISPLAY :(</span> + </c:if> + </div> + </div> + <div class="order-panel"> + <div class="panel-heading"> + <h3>OTHER DRIVER:</h3> + </div> + <div class="panel-body txt-center"> + <c:forEach items="${foundDrivers}" var="item"> + <div class="driver-list-item"> + <div class="first"> + <c:choose> + <c:when test="${item.getImage() != null}"> + <img src='${item.getImage()}' class='driver-profile' alt='profile-image'> + </c:when> + <c:otherwise> + <img src='img/default-profile.png' class='driver-profile' alt='profile-image'> + </c:otherwise> + </c:choose> + </div> + <div class="second"> + <span class="name-text">${item.getName()}</span> + </div> + <div> + <span class="rating-value"> + <img src="img/gold-star.svg" alt=""> + <fmt:formatNumber type = "number" maxFractionDigits = "1" value = "${item.getRating()}" /> + </span> + <span> + (${item.getVote()} votes) + </span> + </div> + <div> + <button name="driverId" value="${item.getUsername()}" class="submit-button"> + I Choose You + </button> + </div> + </div> + </c:forEach> + <c:if test="${foundDriversLength == 0}"> + <span class="color-grey">NOTHING TO DISPLAY :(</span> + </c:if> + </div> + </div> + </form> + </div> +</div> + +<%@ include file="/component/footer.html"%> +<script> + window.onload = toggleActive("nav-order"); +</script> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/history.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/history.jsp new file mode 100644 index 0000000000000000000000000000000000000000..f50876aaffd0adc3e303cc1501aa1bc58eb6cd8f --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/history.jsp @@ -0,0 +1,87 @@ +<%-- + Created by IntelliJ IDEA. + User: ireneedriadr + Date: 11/3/17 + Time: 3:45 PM + To change this template use File | Settings | File Templates. +--%> +<%@ include file="/component/header.html"%> +<%@ include file="/component/nav.html"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<div class="container"> + <div class="wrapper row"> + <div> + <div class="page-title row txt-center height-fit float-container"> + <div class="float-left"> + <h1 class="inline-block">TRANSACTION HISTORY</h1> + </div> + </div> + <div class="row inline-flex history-menu"> + <a href="/history"> + + <div class="active"> + My Previous Order + + </div> + </a> + <a href="/driver_history"> + <div> + Driver History + </div> + </a> + </div> + <div class="row txt-center"> + <div class="history-list-group"> + <form action="hide_history" method="post"> + <c:forEach var="item" items="${orderBeans}"> + <div class="history-list-item"> + <c:choose> + <c:when test="${item.getImage() != null}"> + <img src='${item.getImage()}' class='driver-profile' alt='profile-image'> + </c:when> + <c:otherwise> + <img src='img/default-profile.png' class='driver-profile' alt='profile-image'> + </c:otherwise> + </c:choose> + <span class="color-grey date"> + <fmt:formatDate value="${item.getTimestamp()}" var="formattedDate" type="date" pattern="EEEE, MMMM dd YYYY"/> + ${formattedDate} + </span> + <button type="submit" name="orderId" value="${item.getId()}" class="submit-button button-red"> + HIDE + </button> + <span>${item.getName()}</span> + <span class="location"> + <div> + ${item.getPickup()} + <img src="img/right-arrow.svg" alt=">" height="1" class="arrow-icon"> + ${item.getDestination()} + </div> + </span> + <span class="rating"> + You rated: + <c:forEach begin="1" end="${item.getRating()}" > + <img src="img/gold-star.svg" alt="" class="gold-star"> + </c:forEach> + </span> + + <span class="comment"> + You commented: <br> + <span>${item.getComment()}</span> + </span> + </div> + </c:forEach> + </form> + </div> + </div> + </div> + </div> +</div> + +<%@include file="/component/footer.html" %> + +<script> + window.onload = toggleActive("nav-history"); +</script> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/index.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..4a48ed08d9b387b8e2a391216beb3968589b0a9b --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/index.jsp @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: ireneedriadr + Date: 11/3/17 + Time: 5:24 PM + To change this template use File | Settings | File Templates. +--%> +<%@ include file="/component/header.html"%> +<%@ include file="/component/nav.html"%> +<% + String site = new String("login.jsp"); + response.setStatus(response.SC_MOVED_TEMPORARILY); + response.setHeader("Location", site); +%> + + +<%@include file="/component/footer.html" %> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/login.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/login.jsp new file mode 100644 index 0000000000000000000000000000000000000000..5dad6ee94c957e4c79951deea82f5daf6a455bd6 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/login.jsp @@ -0,0 +1,50 @@ +<%@ include file="/component/header.html"%> +<div class="container"> + <div id="login-box" class="form-box"> + <div id="login-heading" class="form-box-heading"> + <div class="form-box-heading-wrapper"> + <hr> + <h1 class="txt-center">LOGIN</h1> + <hr> + </div> + </div> + <div class="form-box-body" id="login-box-body"> + <span class="color-red">${errorMessage}</span> + <form action="login" method="post" onsubmit="return validateForm(this)"> + <div class="form-box-body-wrapper"> + <table border="0" class="form-box-table"> + <tr> + <td class="table-label"> + <label for="username" class="txt-right color-darkgreen">Username</label> + </td> + <td> + <input type="text" name="username" id="username" placeholder="Username" class="form-input"> + </td> + </tr> + <tr> + <td class="table-label"> + <label for="password" class="txt-right color-darkgreen">Password</label> + + </td> + <td> + <input type="password" name="password" id="password" placeholder="Password" class="form-input"> + + </td> + </tr> + <tr> + </tr> + </table> + <div class="form-box-body-footer"> + <div> + <a href="register"><small>Don't have an account?</small></a> + </div> + <div class="txt-right button-container"> + <button type="submit" class="submit-button">Go!</button> + </div> + </div> + </div> + </form> + </div> + </div> +</div> +<%@include file="/component/footer.html" %> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/order.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/order.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d5a1f4f0543701c46d9dd3ea3b7fd2bf1c3659c0 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/order.jsp @@ -0,0 +1,55 @@ +<%@ include file="/component/header.html"%> +<%@ include file="/component/nav.html"%> +<div class="container"> + <div class="wrapper row"> + <div> + <div class="page-title row txt-center height-fit float-container"> + <div class="float-left"> + <h1 class="inline-block">MAKE AN ORDER</h1> + </div> + </div> + </div> + <div class="order-menu"> + <ul class="order-ul"> + <li class="order-item active"> + <div class="order-number">1</div> + <div class="order-number-desc">Select Destination</div> + </li> + <li class="order-item"> + <div class="order-number">2</div> + <div class="order-number-desc">Select a Driver</div> + </li> + <li class="order-item"> + <div class="order-number">3</div> + <div class="order-number-desc"><span>Complete your order</div> + </li> + </ul> + </div> + <div class="order-form"> + <form action="/find_driver" onsubmit="return validateForm(this)" method="get"> + <table> + <tr> + <td>Picking Point</td> + <td><input type="text" name="pickUp" class="form-input" placeholder="Required"></td> + </tr> + <tr> + <td>Destination</td> + <td><input type="text" name="destination" class="form-input" placeholder="Required"></td> + </tr> + <tr> + <td>Preferred Driver</td> + <td><input type="text" name="preferredDriver" class="form-input" placeholder="Optional" optional></td> + </tr> + </table> + <div class="txt-center"> + <button type="submit" class="form-input submit-button">OK</button> + </div> + </form> + </div> + </div> +</div> + +<%@ include file="/component/footer.html"%> +<script> + window.onload = toggleActive("nav-order"); +</script> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/profile.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/profile.jsp new file mode 100644 index 0000000000000000000000000000000000000000..7414e3ced983a69fc0cdfb21f0b0335f2c07d836 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/profile.jsp @@ -0,0 +1,83 @@ +<%-- + Created by IntelliJ IDEA. + User: ireneedriadr + Date: 11/3/17 + Time: 3:23 PM + To change this template use File | Settings | File Templates. +--%> + +<%@ include file="/component/header.html"%> +<%@ include file="/component/nav.html"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %> + +<div class="container"> + <div class="wrapper row"> + <div> + <div class="page-title row txt-center height-fit float-container"> + <div class="float-left"> + <h1 class="inline-block">MY PROFILE</h1> + </div> + <div class="float-right txt-right height-100"> + <a href="edit_profile"> + <img src='img/edit-orange.svg' class='edit-icon inline-block'> + </a> + </div> + </div> + <div id="profile-body" class="row txt-center"> + <c:choose> + <c:when test="${userProfile.getImage() != null}"> + <img src='${userProfile.getImage()}' class='profile-image' height='80' alt='profile-image'> + </c:when> + <c:otherwise> + <img src='img/default-profile.png' class='profile-image' height='80' alt='profile-image'> + </c:otherwise> + </c:choose> + <br> + <h3>@${userProfile.getUsername()}</h3> + + ${userProfile.getName()} + <br> + <span class="profile-rating"> + <c:if test="${userProfile.getIsDriver()}"> + Driver | <img src='img/gold-star.svg' height='15'> + <span class="color-orange"> + <fmt:formatNumber type = "number" maxFractionDigits = "1" value = "${driverProfile.getRating()}" /> + </span> + (${driverProfile.getVote()} votes) + </c:if> + <c:if test="${!userProfile.getIsDriver()}"> + Non-Driver + </c:if> + </span> + <br> + <span> <img src="img/mail.svg" alt=" " >${userProfile.getEmail()}</span> + <br> + <span> <img src="img/phone.svg" alt=" ">${userProfile.getPhoneNumber()}</span> + </div> + + <c:if test="${userProfile.getIsDriver()}"> + <div id='preferred-loc' class='row txt-center'> + <div class='page-title row txt-center float-container'> + <h2 class='inline-block float-left'>PREFERRED LOCATIONS:</h2> + <span class='float-right'> + <a href="preferred_location"> + <img src='img/edit-orange.svg' class='edit-icon inline-block'> + </a> + </span> + </div> + </div> + <ul class='preferred-list'> + <% int tab = 0; %> + <c:forEach items="${preferredLocations}" var="item"> + <li style="margin-left: <%= tab%>px">${item.getLocation()} + <% tab = tab + 20;%> + </c:forEach> + </c:if> + </div> + </div> +</div> +<%@ include file="/component/footer.html"%> +<script> + window.onload = toggleActive("nav-profile"); +</script> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/signup.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/signup.jsp new file mode 100644 index 0000000000000000000000000000000000000000..7ab3b5304a8de904ed28c90bfb2ea41c036f8c8e --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/signup.jsp @@ -0,0 +1,98 @@ +<%@ include file="/component/header.html"%> + +<div class="container"> + <div id="signup-box" class="form-box"> + <div id="signup-heading" class="form-box-heading"> + <div class="form-box-heading-wrapper"> + <hr> + <h1 class="txt-center">SIGN UP</h1> + <hr> + </div> + </div> + <div class="form-box-body" id="signup-box-body"> + <span class="color-red">${errorMessage}</span> + <% if (request.getParameter("status") != null) { + out.println("<span class='color-red'>SignUp Gagal</span>"); + } + %> + <form action="/register" method="post" onsubmit="return validateForm(this)"> + <div class="form-box-body-wrapper"> + <table border="0" class="form-box-table"> + <tr> + <td class="table-label"> + + <label for="name" class="txt-right">Your Name</label> + <td> + <input type="text" name="name" id="name" placeholder="Name" class="form-input"> </td> + </td> + <span class="error-text"> + + </span> + + </tr> + <tr> + <td class="table-label"> + <label for="username-form" class="txt-right">Username</label> + + </td> + <td> + <input type="text" name="username" id="username-form" class="form-input width-90" placeholder="Username" onblur="usernameAJAX()"> + <div id="username-check-status" class="ajax-status"> + </div> + </td> + </tr> + <tr> + <td class="table-label"> + <label for="email-form" class="txt-right">E-mail</label> + </td> + <td> + <input type="text" name="email" class="form-input width-90" placeholder="E-Mail" id="email-form" onblur="emailAJAX()"> + <div id="email-check-status" class="ajax-status"> + <span></span> + </div> + </td> + </tr> + + <tr> + <td class="table-label"> + <label for="password-register" class="txt-right">Password</label> + </td> + <td> + <input type="password" name="password" class="form-input" id="password-register" placeholder="Password"> + </td> + </tr> + <tr> + <td class="table-label"> + <label for="confirm-password" class="txt-right">Confirm Password</label> + </td> + <td> + <input type="password" name="confirm-password" id="confirm-password" placeholder="Re-type Password" class="form-input"> + </td> + </tr> + <tr> + <td class="table-label"> + <label for="phone-number" class="txt-right">Phone Number</label> + </td> + <td> + <input type="text" name="phoneNumber" id="phone-number" placeholder="Phone Number" class="form-input"> + </td> + </tr> + </table> + <div class="form-box-body-footer"> + <div class="row"> + <input type="checkbox" name="isDriver" id="is-driver" value="1"> + <label for="is-driver"><small>Also sign me up as a driver!</small></label> + </div> + <div> + <a href="login"><small>Already have an account?</small></a> + </div> + <div class="txt-right button-container"> + <button type="submit" class="form-input submit-button" id="register-submit-button">Register</button> + </div> + </div> + </div> + </form> + </div> + </div> + +</div> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/web.xml b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..25fd7702552bed217e6fcb37f5272611ab1ab5e2 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,152 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" + version="3.1"> + + <servlet> + <servlet-name>Login</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.LoginServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>Login</servlet-name> + <url-pattern>/login</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>Register</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.RegisterServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>Register</servlet-name> + <url-pattern>/register</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>Index</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.IndexServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>Index</servlet-name> + <url-pattern>/index</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>Order</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.OrderServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>Order</servlet-name> + <url-pattern>/order</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>Logout</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.LogoutServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>Logout</servlet-name> + <url-pattern>/logout</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>Profile</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.ProfileServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>Profile</servlet-name> + <url-pattern>/profile</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>History</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.HistoryServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>History</servlet-name> + <url-pattern>/history</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>EditProfile</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.EditProfileServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>EditProfile</servlet-name> + <url-pattern>/edit_profile</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>PreferredLocation</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.PreferredLocationServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>PreferredLocation</servlet-name> + <url-pattern>/preferred_location</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>PreferredLocation</servlet-name> + <url-pattern>/add_location</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>DeletePreferredLocation</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.DeletePreferredLocationServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>DeletePreferredLocation</servlet-name> + <url-pattern>/delete_location</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>EditPreferredLocation</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.EditPreferredLocationServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>EditPreferredLocation</servlet-name> + <url-pattern>/edit_preferred_location</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>FindDriver</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.FindDriverServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>FindDriver</servlet-name> + <url-pattern>/find_driver</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>DriverHistory</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.DriverHistoryServlet</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>DriverHistory</servlet-name> + <url-pattern>/driver_history</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>CompleteOrder</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.CompleteOrderServlet</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>CompleteOrder</servlet-name> + <url-pattern>/complete_order</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>UserHideHistory</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.UserHideHistoryServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>UserHideHistory</servlet-name> + <url-pattern>/hide_history</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>DriverHideHistory</servlet-name> + <servlet-class>com.adaapa.adaojek.servlets.DriverHideHistoryServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>DriverHideHistory</servlet-name> + <url-pattern>/driver_hide_history</url-pattern> + </servlet-mapping> + +</web-app> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/component/footer.html b/TugasBesar2_2017/WebApp/src/main/webapp/component/footer.html new file mode 100644 index 0000000000000000000000000000000000000000..724ae4ee320e90577b69974f66204be0e0d065b0 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/component/footer.html @@ -0,0 +1,3 @@ +<script src="../js/app.js"></script> +</body> +</html> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/component/header.html b/TugasBesar2_2017/WebApp/src/main/webapp/component/header.html new file mode 100644 index 0000000000000000000000000000000000000000..210f69818235d63b42d4644972d640af1e50d7b5 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/component/header.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html> + <head> + <title>AdaApa?</title> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="stylesheet" href="css/app.css"> + <link rel="icon" href="img/logo.png"> + </head> +<body> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/component/nav.html b/TugasBesar2_2017/WebApp/src/main/webapp/component/nav.html new file mode 100644 index 0000000000000000000000000000000000000000..be980a8f012898e1fab7964521367766cd7a81bf --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/component/nav.html @@ -0,0 +1,32 @@ +<nav class="navbar"> + <div class="row navbar-top"> + <div class="inline-block float-left txt-left"> + <img src="../img/logo.png" class="margin-auto height-100"> + </div> + <div class="inline-block float-right txt-right"> + Hi,${user}! + <br> + <a href="/logout">Logout</a> + </div> + </div> + + <br> + <div class="inline-flex" id="navbar-menu"> + + <a href="/order"> + <div id="nav-order"> + <span>ORDER</span> + </div> + </a> + <a href="/history"> + <div id="nav-history"> + <span>HISTORY</span> + </div> + </a> + <a href="/profile"> + <div id="nav-profile"> + <span> MY PROFILE</span> + </div> + </a> + </div> +</nav> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/css/app.css b/TugasBesar2_2017/WebApp/src/main/webapp/css/app.css new file mode 100644 index 0000000000000000000000000000000000000000..73e0d9be7e177a491d02024011c00802d28dc74f --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/css/app.css @@ -0,0 +1,751 @@ +body { + font-family: sans-serif; +} +.wrapper { + width: 100%; + height: 100%; +} + + +.container { + display: flex; + justify-content: center; + align-content: center; +} + +.row { + width: 100% !important; +} + +.txt-center { + text-align: center; +} +.txt-right { + text-align: right; +} +.txt-left { + text-align: left; +} + +.color-darkgreen { + color: #00782d; +} + +.color-red { + color: #ed2c31; +} +.color-grey { + color: #777; +} + +.inline-flex { + display: inline-flex; +} + +.form-input { + height: 26px; + border-radius: 3px; + border: 1px solid #00782d; + width: 100%; +} +.ajax-status { + display: inline-block; + +} +.ajax-status>*{ + content: ''; + height: 15px; + width: 15px; + transition: 1s; + background-size: cover; + background-repeat: no-repeat; +} +.ajax-validator-ok { + + background-image: url('../img/checked-green.svg'); +} + +.ajax-validator-not-ok { + background-image: url('../img/cancel-red.svg'); +} + +.ajax-validator-loading { + background-image: url('../img/loading.svg'); + -webkit-animation: rotate 5s infinite; /* Safari 4.0 - 8.0 */ + animation: rotate 2s infinite; + animation-timing-function: linear; + -webkit-animation-timing-function: linear; + +} + +/* Safari 4.0 - 8.0 */ +@-webkit-keyframes rotate { + from {transform: rotate(0deg);} + to {transform: rotate(360deg);} +} + +@keyframes rotate { + from {transform: rotate(0deg);} + to {transform: rotate(360deg);} +} + +.form-box { + display: block; + justify-content: center; + background: #8bbd3c; + border: 10px solid #00782d; + border-radius: 50px; + margin: auto; + width: 60vh; + height: 60vh; +} + +.form-box .form-box-heading { + display: block; + align-content: center; + margin: auto; + width: 100%; + height: 20%; +} +.form-box .form-box-heading .form-box-heading-wrapper { + margin: 10px 0; + display: inline-flex; + width: 100%; + height: auto; + white-space: nowrap + +} + +.form-box .form-box-heading hr { + width: 80%; + margin: auto 5%; + border: 1px solid #00782d; + height: 0px; +} + +.form-box .form-box-heading h1 { + width: fit-content; + transform: scaleY(1.3); + color: #00782d; + word-break: keep-all; +} + +.form-box form { + width: 100%; +} +.form-box .form-box-body { + display: block; + width: 75%; + height: 80%; + justify-content: center; + margin: auto; +} + +.form-box .form-box-table { + width: 100%; + margin: auto; +} +.form-box .form-box-table td { + padding: 0 5px; +} + +.form-box .form-box-table .table-label { + width: 100px; +} + +.form-box .form-box-body .form-box-body-footer { + width: 100%; + padding: 0 5px; +} + +.form-box .form-box-body .form-box-body-footer div{ + width: 60%; + display: inline-block; + margin: 0px; + position: relative; +} +.form-box .form-box-body .form-box-body-footer .button-container{ + width: 34%; + display: inline-block; + margin: 0px; + position: relative; +} + +.submit-button { + width: 100px; + height: 40px; + border: 1px solid #00782d; + background: #57e500; + font-size: 1.25em; +} + +.submit-button:hover { + background: #75FF33; + font-size: 1.25em; +} + +#login-box-body { + margin-top: 10vh; +} + +#signup-box .form-box-body { + width: 90%; +} +#signup-box .form-box-table .table-label { + width: 120px; + white-space: nowrap; +} + +#login-box .form-box-table .table-label label { + font-size: 16pt; +} +#signup-box .form-box-table .table-label label { + font-size: 12pt; + color: #00782d; +} + +.width-90 { + width: 88%; +} + +.error-text { + font-size: 0.7rem; + color: #CC0000; + display: block; +} + +.page-title { + font-size: 10pt; +} +.inline-block { + display: inline-block; +} +.page-title .edit-icon { + margin-top: 18px; + height: 25px; +} + +.switch { + position: relative; + display: inline-block; + width: 60px; + height: 34px; +} + +.switch input {display:none;} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked + .slider { + background-color: #00782d; +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196F3; +} + +input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} + +.navbar { + margin: auto; + width: 80vh; +} +.container { + width: 80vh; + margin: auto; +} +.float-left { + float: left; +} + +.float-right { + float: right; +} +.nav { + height: 14vh; +} +.navbar-top { + height: 5vh; +} +.margin-auto { + margin: auto; +} + +.height-fit { + height: fit-content; +} +.height-100 { + height: 100%; +} +.navbar-top>* { + height: 100%; +} +#navbar-menu { + justify-content: center; + display: flex; +} +#navbar-menu>a { + width: 33%; + text-decoration: none; + color: #000000; +} +#navbar-menu>a:hover { + width: 33%; + text-decoration: none; + background: #AAAAAA; + color: #00782d; +} +#navbar-menu>*>*{ + width: 100%; + height: 5vh; + border: 1px solid black; + display: flex; + justify-content: center; + align-content: center; +} +#navbar-menu>*>*>*{ + height: fit-content; + margin:auto; + font-size: 1.5rem; +} +#navbar-menu>*>*.active { + background: #00782d; + color: white; +} +.float-container { + overflow: auto; + clear: both; +} +.profile-image { + height: 120px; + border-radius: 50%; + border: 3px solid #151515; + width: 120px; + overflow: hidden; + object-fit: cover; +} +span img { + vertical-align: middle; + height: 1.2rem; +} +h3{ + margin: 8px; +} + +.preferred-list li { + position:relative; + width:20%; + list-style-type: none; + text-transform: uppercase; + font-family: Arial; + font-size: .875em; + line-height: 1.75em; +} + +.preferred-list li::before{ + position:absolute; + content:""; + top:50%; + -webkit-transform:translateY(-50%); + -moz-transform:translateY(-50%); + -o-transform:translateY(-50%); + -ms-transform:translateY(-50%); + transform:translateY(-50%); + margin-left:-10px; + width: 0; + height: 0; + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + border-left: 7px solid black; +} +.order-menu { + width: 100%; +} + +.order-menu .order-item { + display: inline-block; + width: 30%; + margin: 5px; + border: 1px solid black; + height: 8vh; + position: relative; +} +.order-menu .order-item.active { + background: #fbff9a; +} + +.order-menu .order-number { + display: inline-grid; + margin: 1vh 2px; + height: 6vh; + width: 6vh; + background: lightgrey; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + border-radius: 50%; + justify-content: center; + align-content: center; +} + +.order-menu .order-number-desc { + position: absolute; + width: 60%; + height: 100%; + height: auto; + display: inline-block; + font-size: 0.8em; + wrap-option: nowrap; + top: 50%; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -ms-transform: translateY(-50%); + -o-transform: translateY(-50%); + transform: translateY(-50%); +} + +.order-form { + width: 80%; + margin: auto; +} +.order-form table { + width: 100%; + font-size: 1.3rem; + border-spacing: 10px 20px; + +} +.order-form table tr td input { + height: 40px; + font-size: 1.2rem; + padding: 2px 5px; +} +.order-form table tr td:nth-child(1) { + width: 35%; +} +.order-ul { + -webkit-padding-start: 20px; +} +.order-panel { + width: 100%; + border: 1px solid black; + min-height: 100px; + border-radius: 10px; + margin: 10px 0; +} +.order-panel .panel-heading { + +} +.order-panel .panel-body { + width: 100%; + margin: auto; + +} +.no-border { + border: none; +} +.height-auto { + height: auto; +} + +#rating-system span { + display: inline-block; + width: 40px; + height: 40px; + margin: 5px; + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + cursor: hand; +} + +#rating-system .grey-star { + background-image: url('../img/grey-star.svg'); +} + +#rating-system .gold-star { + background-image: url('../img/gold-star.svg'); +} + +#comment-area { + height: 60px; + font-size: 1.2rem; + margin-bottom: 1vh; +} + +.square-image { + width: 150px; + height: 150px; + border: 1px solid black; + object-fit: cover; +} + +#save-changes-button { + height: 30px; +} + +#back-button { + height: 30px; + color: #000; + background-color: #D50000; +} + +#back-button:hover { + height: 30px; + color: #000; + background-color: #FF2222; +} + +.edit-table { + border-spacing: 10px 10px; +} + + +.edit-table { + width: 60vh; +} + +.edit-table tr td:nth-child(1) { + width: 10vh; +} + +.nowrap { + white-space: nowrap; +} + +.preferences-edit { + border-collapse: collapse; +} +.preferences-edit th, .preferences-edit td{ + border: 1px solid lightgrey; + padding: 5px; +} +.preferences-edit button{ + background-size: cover; + background-position: center; + background-repeat: no-repeat; + height: 18px; + width: 18px; + border: none; + margin: 2px 5px; + border-radius: 0; +} +.preferences-edit input { + border: 1px solid gray; + text-align: center; + font-size: 1rem; +} +.preferences-edit input[disabled] { + border: 0; +} + + +.edit-button { + background: url('../img/edit-orange.svg'); +} +.save-button { + background: url('../img/save.svg'); +} +.delete-button { + background: url('../img/delete.svg'); +} +.location-input { + width: 80%; + display: flex; + margin-bottom: 5px; +} +.location-input input[type='text'] { + width: 75%; + height: 32px; +} +.location-input button { + height: 30px; + margin: auto; +} + +.driver-list-item { + text-align: left; + margin: 20px auto; + width: 80%; + display: grid; + grid-template-columns: 1fr 2fr 1fr; + grid-template-rows: 1fr 1fr; +} +.driver-list-item .first { + grid-row: 1/3; +} +.driver-list-item .second { + grid-column: 2/4; +} +.driver-profile { + border: 1px solid black; + width: 6rem; + height: 6rem; + object-fit: cover; + margin: 0 2rem; +} + +.driver-list-item .rating-value { + color: orange; +} + +.driver-list-item img { + vertical-align: top; +} +.driver-list-item .name-text { + font-size: 1.4rem; +} + +.driver-list-item .submit-button { + font-size: 0.8rem; +} + +.history-menu a { + width: 50%; + text-decoration: none; + color: black; +} + +.history-menu a:hover { + width: 50%; + text-decoration: none; + color: #34d56b; +} + +.history-menu div { + display: inline-flex; + width: 100%; + height: 40px; + border: 1px solid black; + justify-content: center; + flex-direction: column; + text-align: center; + border-collapse: inherit; +} + +.history-menu *.active { + color: #000000; + background: #34d56b; + flex-direction: column; +} + +.history-list-item { + margin: 15px 0; + display: grid; + grid-template-columns: 1fr 2fr 1fr; + grid-template-rows: repeat(5,minmax(1fr,200px)); +} + +.history-list-item>img { + grid-row: 1/6; + grid-column: 1/2; + margin:auto; +} + +.history-list-item { + align-content: center; + justify-content: center; +} + +.history-list-item .date { + font-size: 0.8rem; +} + +.history-list-item>* { + display: inline-flex; + align-items: center; + justify-content: left; + text-align: left; +} +.arrow-icon { + height: 10px; + width: 10px; +} +.history-list-item .submit-button { + width: 60px; + height: 30px; + grid-column: 3; + grid-row: 1/3; + +} +.history-list-item .location { + font-size: 0.8rem; +} +.history-list-item .gold-star { + width: 10px; + height: 10px; +} + +.button-red { + background: #BB0000; + border-color: #000; +} + +.history-list-item .location { + grid-row: 3; + grid-column: 2/4; +} +.history-list-item .rating { + font-size: 0.7rem; + grid-row: 4; +} + +.history-list-item .rating span { + color: orange; +} + +.history-list-item .comment { + display: inline-block; + grid-row: 5; + font-size: 0.7rem; +} +.history-list-item .comment span { + margin-left: 10px; + display: block; +} + +.profile-rating img { + height: 15px; + vertical-align: middle; +} + +.color-orange { + color: orange; +} + +.display-inline-block{ + display: inline-block !important; +} \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/1.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/1.png new file mode 100644 index 0000000000000000000000000000000000000000..e131ffda5b0d165cd013548dff6d3cd285cdcc06 Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/1.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/2.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/2.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaac5d20069f96ef151afe337454da27ec6a1b9 Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/2.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/3.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/3.png new file mode 100644 index 0000000000000000000000000000000000000000..9840a67ec80d309ba8ead6ce0b119ab105e273a4 Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/3.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/4.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/4.png new file mode 100644 index 0000000000000000000000000000000000000000..a7cdf4af7b1b705c17ab3575479b7bdc40170a1b Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/4.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/5.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/5.png new file mode 100644 index 0000000000000000000000000000000000000000..abd070cea61f55df0950b9593f777c6e66514f8f Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/5.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/6.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/6.png new file mode 100644 index 0000000000000000000000000000000000000000..65829d13acce793f943ed5c80831e28cbb7dff50 Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/6.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/cancel-red.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/cancel-red.svg new file mode 100644 index 0000000000000000000000000000000000000000..4464025ed1f72828f18eb5c611638eda2fae0db7 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/cancel-red.svg @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" + viewBox="0 0 426.667 426.667" style="enable-background:new 0 0 426.667 426.667;" xml:space="preserve"> +<path style="fill:#F05228;" d="M213.333,0C95.514,0,0,95.514,0,213.333s95.514,213.333,213.333,213.333 + s213.333-95.514,213.333-213.333S331.153,0,213.333,0z M330.995,276.689l-54.302,54.306l-63.36-63.356l-63.36,63.36l-54.302-54.31 + l63.356-63.356l-63.356-63.36l54.302-54.302l63.36,63.356l63.36-63.356l54.302,54.302l-63.356,63.36L330.995,276.689z"/> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/checked-green.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/checked-green.svg new file mode 100644 index 0000000000000000000000000000000000000000..80694b9becc3140f410a61a324a0b924654140e0 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/checked-green.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" + viewBox="0 0 426.7 426.7" style="enable-background:new 0 0 426.7 426.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#00782D;} +</style> +<path class="st0" d="M213.3,0C95.5,0,0,95.5,0,213.3s95.5,213.3,213.3,213.3c117.8,0,213.3-95.5,213.3-213.3S331.2,0,213.3,0z + M174.2,322.9L80.3,229l31.3-31.3l62.6,62.6l140.9-140.9l31.3,31.3L174.2,322.9z"/> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/default-profile.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/default-profile.png new file mode 100644 index 0000000000000000000000000000000000000000..281266e26ba87856ab43a724ab9684949a06133f Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/default-profile.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/delete.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/delete.svg new file mode 100644 index 0000000000000000000000000000000000000000..96938a55315e31f829766aa9abf58929c63651d2 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/delete.svg @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="Capa_1" x="0px" y="0px" width="512px" height="512px" viewBox="0 0 348.333 348.334" style="enable-background:new 0 0 348.333 348.334;" xml:space="preserve"> +<g> + <path d="M336.559,68.611L231.016,174.165l105.543,105.549c15.699,15.705,15.699,41.145,0,56.85 c-7.844,7.844-18.128,11.769-28.407,11.769c-10.296,0-20.581-3.919-28.419-11.769L174.167,231.003L68.609,336.563 c-7.843,7.844-18.128,11.769-28.416,11.769c-10.285,0-20.563-3.919-28.413-11.769c-15.699-15.698-15.699-41.139,0-56.85 l105.54-105.549L11.774,68.611c-15.699-15.699-15.699-41.145,0-56.844c15.696-15.687,41.127-15.687,56.829,0l105.563,105.554 L279.721,11.767c15.705-15.687,41.139-15.687,56.832,0C352.258,27.466,352.258,52.912,336.559,68.611z" fill="#D80027"/> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/edit-orange.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/edit-orange.svg new file mode 100644 index 0000000000000000000000000000000000000000..15fd48d6826cb8a5c107f4bc05866eb4c96f3750 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/edit-orange.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18"><defs><style>.cls-1{fill:#ff7e00;}</style></defs><title>Asset 1</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M0,14.2V18H3.8l11-11.1L11,3.1ZM17.7,4a1,1,0,0,0,0-1.4L15.4.3A1,1,0,0,0,14,.3L12.2,2.1,16,5.9C15.9,5.9,17.7,4,17.7,4Z"/></g></g></svg> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/gold-star.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/gold-star.svg new file mode 100644 index 0000000000000000000000000000000000000000..439de32f91da3ede3e23f836f7ec10373c61ed81 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/gold-star.svg @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" + viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#FFDA44;} +</style> +<g> + <g id="star"> + <polygon class="st0" points="256,403.8 414.2,499.2 372.4,319.3 512,198.2 327.9,182.5 256,12.8 184.1,182.5 0,198.2 139.6,319.3 + 97.8,499.2 "/> + </g> +</g> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/grey-star.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/grey-star.svg new file mode 100644 index 0000000000000000000000000000000000000000..6efa821c92a83159cb894f268da52e6b2b4cd3ad --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/grey-star.svg @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="Capa_1" x="0px" y="0px" width="512px" height="512px" viewBox="0 0 510 510" style="enable-background:new 0 0 510 510;" xml:space="preserve"> +<g> + <g id="star"> + <polygon points="255,402.212 412.59,497.25 370.897,318.011 510,197.472 326.63,181.738 255,12.75 183.371,181.738 0,197.472 139.103,318.011 97.41,497.25 " fill="#c7c7c7"/> + </g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/loading.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/loading.svg new file mode 100644 index 0000000000000000000000000000000000000000..8b4b70963f8c96de78ab6c62f22a729059579068 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/loading.svg @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500;" xml:space="preserve" width="512px" height="512px"> +<g> + <path d="M250,0c14,0,24,10,24,24v94c0,14-10,25-24,25s-25-11-25-25V24C225,10,236,0,250,0z" fill="#FFDA44"/> + <path d="M137,53l55,76c12,16,0,39-20,39c-8,0-14-3-19-10L98,82c-8-11-6-26,5-34S129,42,137,53z" fill="#FFDA44"/> + <path d="M28,204c-13-4-20-18-16-31s18-20,31-16l89,29c13,4,20,18,16,31c-3,10-14,17-24,17c-3,0-4-1-7-2 L28,204z" fill="#FFDA44"/> + <path d="M148,283c4,13-3,27-16,31l-89,29c-3,1-5,1-8,1c-10,0-20-7-23-17c-4-13,3-27,16-31l89-29 C130,263,144,270,148,283z" fill="#FFDA44"/> + <path d="M187,337c11,8,13,23,5,34l-55,76c-5,7-12,10-20,10c-20,0-31-23-19-39l55-76C161,331,176,329,187,337 z" fill="#FFDA44"/> + <path d="M250,357c14,0,24,11,24,25v93c0,14-10,25-24,25s-25-11-25-25v-93C225,368,236,357,250,357z" fill="#FFDA44"/> + <path d="M347,342l55,76c12,16,0,39-20,39c-8,0-14-3-19-10l-55-76c-8-11-6-26,5-34S339,331,347,342z" fill="#FFDA44"/> + <path d="M472,296c13,4,20,18,16,31c-3,10-14,17-24,17c-3,0-4,0-7-1l-89-29c-13-4-20-18-16-31s18-20,31-16 L472,296z" fill="#FFDA44"/> + <path d="M352,217c-4-13,3-27,16-31l89-29c13-4,27,3,31,16s-3,27-16,31l-89,28c-3,1-5,2-8,2 C365,234,355,227,352,217z" fill="#FFDA44"/> + <path d="M327,168c-20,0-31-23-19-39l55-76c8-11,23-13,34-5s13,23,5,34l-55,76C342,165,335,168,327,168z" fill="#FFDA44"/> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/logo.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6f82a84c21e87cfcf7a59d9caa90a48ffd0fa817 Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/logo.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/mail.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/mail.svg new file mode 100644 index 0000000000000000000000000000000000000000..8728151cbe12f5453d89a257368bd7de5e301e3f --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/mail.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" width="114" height="114"> +<path stroke="#000" stroke-width="7" fill="none" d="m7,20h98v72H7zl44,44q5,4 10,0l44-44M7,92l36-36m26,0 36,36"/> +</svg> \ No newline at end of file diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/phone.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/phone.svg new file mode 100644 index 0000000000000000000000000000000000000000..82f09da990790733c954a0045b7c2ea9960c4ecf --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/phone.svg @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 -256 1792 1792" + id="svg3013" + version="1.1" + inkscape:version="0.48.3.1 r9886" + width="100%" + height="100%" + sodipodi:docname="phone_font_awesome.svg"> + <metadata + id="metadata3023"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs3021" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="480" + id="namedview3019" + showgrid="false" + inkscape:zoom="0.13169643" + inkscape:cx="896" + inkscape:cy="896" + inkscape:window-x="0" + inkscape:window-y="25" + inkscape:window-maximized="0" + inkscape:current-layer="svg3013" /> + <g + transform="matrix(1,0,0,-1,159.45763,1293.0169)" + id="g3015"> + <path + d="m 1408,296 q 0,-27 -10,-70.5 Q 1388,182 1377,157 1356,107 1255,51 1161,0 1069,0 1042,0 1016.5,3.5 991,7 959,16 927,25 911.5,30.5 896,36 856,51 816,66 807,69 709,104 632,152 504,231 367.5,367.5 231,504 152,632 104,709 69,807 66,816 51,856 36,896 30.5,911.5 25,927 16,959 7,991 3.5,1016.5 0,1042 0,1069 q 0,92 51,186 56,101 106,122 25,11 68.5,21 43.5,10 70.5,10 14,0 21,-3 18,-6 53,-76 11,-19 30,-54 19,-35 35,-63.5 16,-28.5 31,-53.5 3,-4 17.5,-25 14.5,-21 21.5,-35.5 7,-14.5 7,-28.5 0,-20 -28.5,-50 -28.5,-30 -62,-55 -33.5,-25 -62,-53 -28.5,-28 -28.5,-46 0,-9 5,-22.5 5,-13.5 8.5,-20.5 3.5,-7 14,-24 10.5,-17 11.5,-19 76,-137 174,-235 98,-98 235,-174 2,-1 19,-11.5 17,-10.5 24,-14 7,-3.5 20.5,-8.5 13.5,-5 22.5,-5 18,0 46,28.5 28,28.5 53,62 25,33.5 55,62 30,28.5 50,28.5 14,0 28.5,-7 14.5,-7 35.5,-21.5 21,-14.5 25,-17.5 25,-15 53.5,-31 28.5,-16 63.5,-35 35,-19 54,-30 70,-35 76,-53 3,-7 3,-21 z" + id="path3017" + inkscape:connector-curvature="0" + style="fill:currentColor" /> + </g> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/right-arrow.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/right-arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..67a1c4fd6ee7d14611cce8277d6fe3c1368d5b4a --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/right-arrow.svg @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" + viewBox="0 0 31.49 31.49" style="enable-background:new 0 0 31.49 31.49;" xml:space="preserve"> +<path style="fill:#1E201D;" d="M21.205,5.007c-0.429-0.444-1.143-0.444-1.587,0c-0.429,0.429-0.429,1.143,0,1.571l8.047,8.047H1.111 + C0.492,14.626,0,15.118,0,15.737c0,0.619,0.492,1.127,1.111,1.127h26.554l-8.047,8.032c-0.429,0.444-0.429,1.159,0,1.587 + c0.444,0.444,1.159,0.444,1.587,0l9.952-9.952c0.444-0.429,0.444-1.143,0-1.571L21.205,5.007z"/> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/run.png b/TugasBesar2_2017/WebApp/src/main/webapp/img/run.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c5f4c5b54038626525a6e0557d541d85df8069 Binary files /dev/null and b/TugasBesar2_2017/WebApp/src/main/webapp/img/run.png differ diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/img/save.svg b/TugasBesar2_2017/WebApp/src/main/webapp/img/save.svg new file mode 100644 index 0000000000000000000000000000000000000000..6c74d890d4d7f90c49438b539595ba9081c57a63 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/img/save.svg @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 49 49" style="enable-background:new 0 0 49 49;" xml:space="preserve" width="512px" height="512px"> +<g> + <rect x="27.5" y="5" width="6" height="10" fill="#0f3b99"/> + <path d="M39.914,0H0.5v49h48V8.586L39.914,0z M10.5,2h26v16h-26V2z M39.5,47h-31V26h31V47z" fill="#0f3b99"/> + <path d="M13.5,32h7c0.553,0,1-0.447,1-1s-0.447-1-1-1h-7c-0.553,0-1,0.447-1,1S12.947,32,13.5,32z" fill="#0f3b99"/> + <path d="M13.5,36h10c0.553,0,1-0.447,1-1s-0.447-1-1-1h-10c-0.553,0-1,0.447-1,1S12.947,36,13.5,36z" fill="#0f3b99"/> + <path d="M26.5,36c0.27,0,0.52-0.11,0.71-0.29c0.18-0.19,0.29-0.45,0.29-0.71s-0.11-0.521-0.29-0.71c-0.37-0.37-1.04-0.37-1.41,0 c-0.19,0.189-0.3,0.439-0.3,0.71c0,0.27,0.109,0.52,0.29,0.71C25.979,35.89,26.229,36,26.5,36z" fill="#0f3b99"/> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/index.jsp b/TugasBesar2_2017/WebApp/src/main/webapp/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..adca211ac673508e27694acd9539a1ebb1c5f98e --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/index.jsp @@ -0,0 +1,10 @@ +<%-- + Created by IntelliJ IDEA. + User: kennethhalim + Date: 11/2/17 + Time: 6:46 PM + To change this template use File | Settings | File Templates. +--%> +<% + request.getRequestDispatcher("/index").forward(request,response); +%> diff --git a/TugasBesar2_2017/WebApp/src/main/webapp/js/app.js b/TugasBesar2_2017/WebApp/src/main/webapp/js/app.js new file mode 100644 index 0000000000000000000000000000000000000000..a4d70f89e35cf4896034d395db04747770cf88a8 --- /dev/null +++ b/TugasBesar2_2017/WebApp/src/main/webapp/js/app.js @@ -0,0 +1,305 @@ +var ajaxFlag =false; + +function sendRequest(url, method, data, callbackFunction) { + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function () { + if(this.readyState == 4 && this.status == 200) { + callbackFunction; + } + }; + xhttp.open(method, url, true); + xhttp.send(data); + +} + +function callBackReload() { + location.reload(); +} + +function usernameAJAX() { + var status = document.getElementById("username-check-status"); + status.innerHTML = "<div class='ajax-validator-loading'></div>"; + var username = document.getElementById('username-form').value; + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + if(validateUsername() && (xhttp.responseText)) { + status.innerHTML = "<div class='ajax-validator-ok'></div>"; + ajaxFlag = true; + } else { + status.innerHTML = "<div class='ajax-validator-not-ok'></div>"; + ajaxFlag = false; + } + } else { + status.innerHTML = "<div class='ajax-validator-not-ok'></div>"; + ajaxFlag = false; + + } + }; + xhttp.open("GET", "app/username_check.php?username="+username, true); + xhttp.send(); +} + + +function emailAJAX() { + var status = document.getElementById("email-check-status"); + status.innerHTML = "<div class='ajax-validator-loading'></div>" + var email = document.getElementById('email-form').value; + var xhttp = new XMLHttpRequest(); + xhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + if(validateEmail() && xhttp.responseText) { + status.innerHTML = "<div class='ajax-validator-ok'></div>"; + ajaxFlag = true; + } else { + status.innerHTML = "<div class='ajax-validator-not-ok'></div>"; + ajaxFlag = false; + } + } else { + status.innerHTML = "<div class='ajax-validator-not-ok'></div>"; + ajaxFlag = false; + } + }; + xhttp.open("GET", "app/email_check.php?email="+email, true); + xhttp.send(); + if (validateEmail() && (xhttp.responseText)) { + return true; + } else { + return false; + } +} + +function addErrorText(element, errorText) { + var childs= element.getElementsByClassName('error-text'); + if(!childs.length) { + element.innerHTML = element.innerHTML + "<span class=error-text>" + errorText + "</span>"; + } else { + childs[0].innerHTML= errorText; + } + +} + +function deleteErrorText(element) { + var childs= element.getElementsByClassName('error-text'); + if(childs.length) { + childs[0].innerHTML=""; + } + +} + +function validateName() { + var input = document.getElementsByName('name')[0]; + var str = input.value; + var parent = input.parentElement; + input.style.border = "1px solid #CC0000"; + if(!str.length) { + addErrorText(parent, "Nama harus diisi"); + return false; + } else if(str.length >20) { + addErrorText(parent, "Nama tidak boleh lebih dari 20 karakter"); + return false; + } + input.style.border = "1px solid #00782d"; + deleteErrorText(parent); + + return true; +} + + +function validateUsername() { + var input = document.getElementsByName('username')[0]; + var str = input.value; + var parent = input.parentElement; + if(!str.length) { + input.style.border = "1px solid #CC0000"; + addErrorText(parent, "Username harus diisi") + return false; + } + input.style.border = "1px solid #00782d"; + deleteErrorText(parent); + + return true; +} + +function validateEmail() { + var input = document.getElementsByName('email')[0]; + var str = input.value; + var parent = input.parentElement; + input.style.border = "1px solid #CC0000"; + var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + if(!str.length ) { + addErrorText(parent, "Email harus diisi") + return false; + } else if(!re.test(str)){ + addErrorText(parent, "Email tidak sesuai format"); + return false; + } + input.style.border = "1px solid #00782d"; + deleteErrorText(parent); + + return true; +} + +function validatePassword() { + var input = document.getElementsByName('password')[0]; + var confirm = document.getElementById('confirm-password'); + var str1 = input.value; + var str2 = confirm.value; + var parent = input.parentElement; + var cparent = confirm.parentElement; + input.style.border = "1px solid #CC0000"; + confirm.style.border = "1px solid #CC0000"; + if(!str1.length) { + addErrorText(parent, "Password harus diisi"); + return false; + } else if(!str2.length){ + addErrorText(cparent, "Confirm Password harus diisi"); + return false; + } else if(str1 != str2) { + addErrorText(cparent, "Confirm Password harus sama dengan Password"); + return false; + } + input.style.border = "1px solid #00782d"; + confirm.style.border = "1px solid #00782d"; + deleteErrorText(parent); + + return true; +} + +function validatePhone() { + var input = document.getElementsByName('phoneNumber')[0]; + var str = input.value; + var parent = input.parentElement; + input.style.border = "1px solid #CC0000"; + if(!str.length) { + addErrorText(parent, "Phone Number harus diisi") + return false; + } else if(str.length < 9 && str.length >12 ) { + addErrorText(parent, "Phone Number harus antara 9-12 digit"); + return false; + } + input.style.border = "1px solid #00782d"; + deleteErrorText(parent); + return true; +} + +function validateSignUpForm() { + var f=true; + f = !!validateEmail() && f; + f = !!validateName() && f; + f = !!validatePassword() && f; + f = !!validatePhone() && f; + f = !!validateUsername() && f; + f = f && ajaxFlag; + if(f) + return true; + else + return false; +} + +function toggleActive(tagId) { + document.getElementById(tagId).classList.toggle("active"); +} + +function renderStar(rate) { + document.getElementById('rating-value').value = rate; + var parent = document.getElementById('rating-system'); + var childs = parent.getElementsByTagName('span'); + for(var i = 0;i<rate;i++) { + childs[i].className = 'gold-star'; + } + for(var j = rate; j<5; j++) { + childs[j].className = 'grey-star'; + } +} + +function toggleEdit(id) { + button = document.getElementById("edit-button-"+id); + input = document.getElementById("edit-input-"+id); + newbutton = document.createElement("button"); + newbutton.setAttribute("type","submit"); + newbutton.setAttribute("form","form-update-"+id) + newbutton.classList.add("save-button"); + //newbutton.setAttribute("onclick", "savePreferences("+id+")"); + input.removeAttribute("disabled"); + button.parentElement.appendChild(newbutton); + button.parentElement.removeChild(button); +} + +function savePreferences(id) { + if(confirm("Are You Sure?")) { + input = document.getElementById("edit-input-"+id); + var data = {}; + data.position = id; + data.location = input.value; + var payload = "position="+id+"&"+"location="+input.value; + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function () { + if(this.status == 200 && this.readyState == 4) { + console.log(this.responseText) + //location.reload(); + } + } + xhr.open("PUT","/preferred_location",true); + xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xhr.send(payload); + } else { + + } +} + +function deletePreferences(id) { + if(confirm("Are You Sure?")) { + input = document.getElementById("edit-input-"+id); + var data = {}; + data.position = id; + data.location = input.value; + var payload = "position="+id+"&"+"location="+input.value; + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function () { + if(this.status == 200 && this.readyState == 4) { + console.log(this.responseText) + //location.reload(); + } + } + xhr.open("DELETE","http://httpbin.org/put",true); + xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xhr.send(payload); + } else { + + } +} + +function userHide(id) { + orderId = id; + var json = JSON.stringify(orderId); + sendRequest("app/user_hide_history.php", "PATCH", json, callBackReload()); +} + +function driverHide(id) { + orderId = id; + var json = JSON.stringify(orderId); + sendRequest("app/driver_hide_history.php", "PATCH", json, callBackReload()); +} + +function validateForm(form) { + inputs = form.querySelectorAll("input , textarea"); + f=true; + for(i=0;i<inputs.length;i++) { + if(inputs[i].getAttribute("optional") == null) { + if(!inputs[i].value) { + f= false; + inputs[i].style.border = "1px solid #CC0000"; + } else if(inputs[i].name == "phoneNumber") { + inputs[i].style.border = "1px solid #CC0000"; + f= !isNaN(inputs[i].value) + } + else { + inputs[i].style.border = "1px solid #00782d"; + } + } else { + inputs[i].style.border = "1px solid #00782d"; + } + } + return f; +}