1 | <!DOCTYPE html>
|
---|
2 | <html lang="en" xmlns:th="http://www.thymeleaf.org">
|
---|
3 | <head>
|
---|
4 | <meta charset="UTF-8">
|
---|
5 | <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
---|
6 | <title>Product Page</title>
|
---|
7 | <!-- Tailwind CSS from CDN for development purposes -->
|
---|
8 | <script src="https://cdn.tailwindcss.com"></script>
|
---|
9 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
|
---|
10 | <link href="./output.css" rel="stylesheet">
|
---|
11 | </head>
|
---|
12 |
|
---|
13 | <body class="font-sans antialiased bg-gray-100 flex flex-col min-h-screen">
|
---|
14 |
|
---|
15 | <nav class="bg-gray-800 text-white p-4 text-lg sm:text-xl"> <!-- Responsive font size -->
|
---|
16 | <div class="container mx-auto flex justify-between items-center">
|
---|
17 | <div class="flex items-center">
|
---|
18 | <img src="/images/logoWhite.png" alt="Logo" class="object-cover h-32 w-32 rounded-lg">
|
---|
19 | <h1 class="text-2xl font-semibold ml-4 sm:text-3xl">Tech Harbor</h1> <!-- Responsive font size -->
|
---|
20 | </div>
|
---|
21 | <ul class="flex space-x-8">
|
---|
22 | <li><a href="/" class="text-emerald-500 hover:text-emerald-500">Home</a></li>
|
---|
23 | <li><a th:href="@{'/aboutUs'}" class="hover:text-emerald-500">About Us</a></li>
|
---|
24 | <li th:if="${user != null}">
|
---|
25 | <a th:href="@{'/orders/{id}' (id=${user.userId})}" class="hover:text-emerald-500">My Orders</a>
|
---|
26 | </li>
|
---|
27 | <li th:if="${user != null}">
|
---|
28 | <a th:href="@{'/reviews/{id}' (id=${user.userId})}" class="hover:text-emerald-500">My Reviews</a>
|
---|
29 | </li>
|
---|
30 | <li th:if="${deliveryMan != null}">
|
---|
31 | <a th:href="@{'/myDeliveries/{id}' (id=${deliveryMan.userId})}" class="hover:text-emerald-500">My
|
---|
32 | Deliveries</a>
|
---|
33 | </li>
|
---|
34 | </ul>
|
---|
35 | <ul class="flex space-x-4">
|
---|
36 | <li th:if="${user != null}">
|
---|
37 | <span>Welcome <span th:text="${user.nameUser}"></span></span>
|
---|
38 | </li>
|
---|
39 | <li th:if="${deliveryMan != null}">
|
---|
40 | <span>Welcome Delivery Man <span th:text="${deliveryMan.nameUser}"></span></span>
|
---|
41 | </li>
|
---|
42 | <li th:if="${user != null}">
|
---|
43 | <a th:href="@{'/shoppingCart'}"><i class="fa-solid fa-cart-shopping"></i></a>
|
---|
44 | </li>
|
---|
45 | <li th:if="${user != null || deliveryMan != null}">
|
---|
46 | <a class="hover:text-emerald-500" th:href="@{/logout}">Log out</a>
|
---|
47 | </li>
|
---|
48 | <li th:if="${user == null && deliveryMan == null}">
|
---|
49 | <a th:href="@{/login}" class="hover:text-emerald-500">Sign In</a>
|
---|
50 | </li>
|
---|
51 | <li th:if="${user == null && deliveryMan == null}">
|
---|
52 | <a th:href="@{/register}" class="hover:text-emerald-500">Register</a>
|
---|
53 | </li>
|
---|
54 | </ul>
|
---|
55 |
|
---|
56 | </div>
|
---|
57 | </nav>
|
---|
58 |
|
---|
59 |
|
---|
60 | <main class="container mx-auto mt-8 flex-grow">
|
---|
61 |
|
---|
62 |
|
---|
63 | <div class="max-w-7xl mx-auto px-4 py-8 sm:px-6 lg:px-8 bg-gray-800 rounded-lg mt-16 flex-grow">
|
---|
64 | <div class="grid grid-cols-1 lg:grid-cols-3 gap-4">
|
---|
65 | <div class="lg:col-span-1 rounded-lg">
|
---|
66 | <img th:src="${product.productImage}" src="../static/images/intel_core_i7.jpg" alt="Image of product"
|
---|
67 | class="object-cover h-96 w-96 rounded-lg">
|
---|
68 | </div>
|
---|
69 | <div class="lg:col-span-2">
|
---|
70 | <h1 th:text="${product.productName}" class="text-2xl font-bold tracking-tight text-white text-center">
|
---|
71 | Product Name</h1>
|
---|
72 | <p th:text="${product.productDescription}" class="mt-2 text-base text-gray-300">Product description</p>
|
---|
73 | <div class="mt-4">
|
---|
74 | <div class="flex items-center justify-between">
|
---|
75 | <div>
|
---|
76 | <span th:text="${product.productPrice + ' ден.'}"
|
---|
77 | class="text-xl font-semibold text-white mr-2">Price:</span>
|
---|
78 | </div>
|
---|
79 | <div th:unless="${deliveryMan != null}">
|
---|
80 | <span class="text-lg font-semibold text-white mr-2">Quantity:</span>
|
---|
81 | <label for="quantity"><input type="number" id="quantity" name="quantity" min="1" value="1"
|
---|
82 | class="w-16 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500"></label>
|
---|
83 | <a th:href="${user != null} ? @{'/shoppingCart/' + ${product.productId}} : '/login'"
|
---|
84 | class="px-4 py-2 bg-indigo-500 text-white font-bold rounded-md shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 ml-5">
|
---|
85 | Add to cart
|
---|
86 | </a>
|
---|
87 | </div>
|
---|
88 | </div>
|
---|
89 | </div>
|
---|
90 | <!-- Review Section -->
|
---|
91 | <div class="mt-8">
|
---|
92 | <div class="mt-16 flex items-center justify-between">
|
---|
93 | <h2 class="text-xl font-semibold text-white">Product Reviews</h2>
|
---|
94 | <button type="button" id="addReviewBtn"
|
---|
95 | class="px-4 py-2 bg-indigo-500 text-white font-bold rounded-md shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 ml-5">
|
---|
96 | Add a Review
|
---|
97 | </button>
|
---|
98 | </div>
|
---|
99 |
|
---|
100 | <!-- Popup for the review form -->
|
---|
101 | <div id="reviewPopup"
|
---|
102 | class="fixed top-0 left-0 w-full h-full bg-gray-900 bg-opacity-50 flex justify-center items-center"
|
---|
103 | style="display: none;">
|
---|
104 | <div class="bg-white rounded-lg p-8 max-w-6xl">
|
---|
105 | <button class="absolute top-0 right-0 mt-2 mr-2 text-gray-600" onclick="closePopup()">
|
---|
106 | <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
|
---|
107 | xmlns="http://www.w3.org/2000/svg">
|
---|
108 | <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
---|
109 | d="M6 18L18 6M6 6l12 12"></path>
|
---|
110 | </svg>
|
---|
111 | </button>
|
---|
112 | <form id="reviewForm">
|
---|
113 | <input type="hidden" name="productId" th:value="${product.productId}"/>
|
---|
114 | <div class="mb-4">
|
---|
115 | <label for="reviewRating"
|
---|
116 | class="block text-gray-700 text-sm font-bold mb-2">Rating:</label>
|
---|
117 | <input type="number" name="reviewRating" id="reviewRating" min="1" max="5" required
|
---|
118 | class="appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
|
---|
119 | </div>
|
---|
120 | <div class="mb-6">
|
---|
121 | <label for="reviewDescription" class="block text-gray-700 text-sm font-bold mb-2">Description:</label>
|
---|
122 | <textarea name="reviewDescription" id="reviewDescription" required
|
---|
123 | class="appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"></textarea>
|
---|
124 | </div>
|
---|
125 | <div class="flex justify-end">
|
---|
126 | <button type="submit"
|
---|
127 | class="px-4 py-2 bg-indigo-500 text-white font-bold rounded-md shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
---|
128 | Submit Review
|
---|
129 | </button>
|
---|
130 | </div>
|
---|
131 | </form>
|
---|
132 | </div>
|
---|
133 | </div>
|
---|
134 |
|
---|
135 |
|
---|
136 | <div class="mt-4">
|
---|
137 | <ul>
|
---|
138 | <li th:each="review : ${reviews}" class="border-2 rounded-2xl m-5 box-border">
|
---|
139 | <div class="flex items-center m-5">
|
---|
140 | <i class="fa-regular fa-star ml-2 mr-3" style="color: #ffffff;"></i>
|
---|
141 | <p class="text-lg font-semibold mr-4 text-white"
|
---|
142 | th:text="${review.reviewRating}"></p>
|
---|
143 | <p class="text-lg text-white" th:text="${review.reviewDescription}"></p>
|
---|
144 | </div>
|
---|
145 | </li>
|
---|
146 | </ul>
|
---|
147 | </div>
|
---|
148 | </div>
|
---|
149 | </div>
|
---|
150 | </div>
|
---|
151 | </div>
|
---|
152 | </main>
|
---|
153 |
|
---|
154 | <!-- Footer -->
|
---|
155 | <footer class="bg-white rounded-lg shadow m-4 dark:bg-gray-800">
|
---|
156 | <div class="w-full mx-auto max-w-screen-xl p-4 md:flex md:items-center md:justify-between">
|
---|
157 | <span class="text-sm text-gray-500 sm:text-center dark:text-gray-400">© 2024 Tech Harbor. All rights reserved.™
|
---|
158 | </span>
|
---|
159 | <ul class="flex flex-wrap items-center mt-3 text-sm font-medium text-gray-500 dark:text-gray-400 sm:mt-0">
|
---|
160 | <li>
|
---|
161 | <a th:href="@{'/aboutUs'}" class="hover:underline me-4 md:me-6">About</a>
|
---|
162 | </li>
|
---|
163 | <li>
|
---|
164 | <a href="#" class="hover:underline me-4 md:me-6">Privacy Policy</a>
|
---|
165 | </li>
|
---|
166 | <li>
|
---|
167 | <a href="#" class="hover:underline">Contact</a>
|
---|
168 | </li>
|
---|
169 | </ul>
|
---|
170 | </div>
|
---|
171 | </footer>
|
---|
172 | </body>
|
---|
173 |
|
---|
174 |
|
---|
175 | </html>
|
---|
176 |
|
---|
177 | <script th:inline="javascript">
|
---|
178 | /*<![CDATA[*/
|
---|
179 | document.getElementById('addReviewBtn').addEventListener('click', function () {
|
---|
180 | document.getElementById('reviewPopup').style.display = 'flex';
|
---|
181 | });
|
---|
182 |
|
---|
183 | function closePopup() {
|
---|
184 | document.getElementById('reviewPopup').style.display = 'none';
|
---|
185 | }
|
---|
186 |
|
---|
187 | document.getElementById('reviewForm').addEventListener('submit', function (event) {
|
---|
188 | event.preventDefault(); // Prevent default form submission
|
---|
189 |
|
---|
190 | // Get form data
|
---|
191 | var formData = new FormData(document.getElementById('reviewForm'));
|
---|
192 |
|
---|
193 | // Make AJAX request to submit the review
|
---|
194 | fetch('/add-review', {
|
---|
195 | method: 'POST',
|
---|
196 | body: formData
|
---|
197 | })
|
---|
198 | .then(response => {
|
---|
199 | if (!response.ok) {
|
---|
200 | throw new Error('Error submitting review');
|
---|
201 | }
|
---|
202 | closePopup();
|
---|
203 | console.log('Redirecting...')
|
---|
204 | window.location.href = '/product/' + formData.get('productId'); // Redirect to product page
|
---|
205 | })
|
---|
206 | .catch(error => {
|
---|
207 | console.error('Error:', error);
|
---|
208 | });
|
---|
209 | });
|
---|
210 | /*]]>*/
|
---|
211 | </script>
|
---|
212 |
|
---|
213 |
|
---|
214 |
|
---|