Spaces:
Runtime error
Runtime error
Update templates/menu.html
Browse files- templates/menu.html +129 -72
templates/menu.html
CHANGED
@@ -131,7 +131,7 @@
|
|
131 |
top: 50%;
|
132 |
transform: translateY(-50%);
|
133 |
display: flex;
|
134 |
-
align-items:
|
135 |
justify-content: center;
|
136 |
}
|
137 |
.avatar-icon {
|
@@ -147,56 +147,62 @@
|
|
147 |
font-size: 20px;
|
148 |
font-weight: bold;
|
149 |
position: relative;
|
|
|
|
|
|
|
|
|
150 |
}
|
151 |
.avatar-icon img {
|
152 |
width: 100%;
|
153 |
height: 100%;
|
154 |
object-fit: cover;
|
155 |
border-radius: 50%;
|
|
|
|
|
|
|
|
|
156 |
}
|
157 |
.dropdown-menu {
|
158 |
position: absolute;
|
159 |
right: 0;
|
160 |
top: 100%;
|
161 |
background-color: #fff8f0;
|
162 |
-
border-radius:
|
163 |
-
width:
|
164 |
-
box-shadow:
|
165 |
display: none;
|
166 |
border: 1px solid #ffd8b1;
|
|
|
|
|
167 |
}
|
168 |
.dropdown-menu .dropdown-item {
|
169 |
-
padding:
|
170 |
text-decoration: none;
|
171 |
color: #333;
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
transition: background-color 0.2s ease;
|
176 |
-
}
|
177 |
-
.dropdown-menu .dropdown-item:first-child {
|
178 |
-
border-top: none;
|
179 |
}
|
180 |
.dropdown-menu .dropdown-item:hover {
|
181 |
background-color: #ffe4c4;
|
182 |
-
color: #
|
183 |
-
}
|
184 |
-
.upload-item:hover,
|
185 |
-
.delete-item:hover {
|
186 |
-
background-color: #ffe4c4;
|
187 |
-
color: #333;
|
188 |
}
|
189 |
.upload-item,
|
190 |
-
.delete-item
|
191 |
-
|
|
|
192 |
text-decoration: none;
|
193 |
color: #333;
|
194 |
-
|
195 |
-
display: block;
|
196 |
-
font-size: 15px;
|
197 |
transition: background-color 0.2s ease;
|
198 |
cursor: pointer;
|
199 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
200 |
.fixed-top-bar {
|
201 |
position: relative;
|
202 |
top: 0;
|
@@ -355,6 +361,15 @@
|
|
355 |
max-height: 60vh;
|
356 |
overflow-y: auto;
|
357 |
padding: 15px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
358 |
}
|
359 |
.modal-body #modal-img {
|
360 |
max-height: 200px;
|
@@ -694,11 +709,17 @@
|
|
694 |
font-size: 20px;
|
695 |
}
|
696 |
.dropdown-menu {
|
697 |
-
width:
|
698 |
}
|
699 |
.dropdown-menu .dropdown-item {
|
700 |
-
padding: 12px
|
701 |
-
font-size:
|
|
|
|
|
|
|
|
|
|
|
|
|
702 |
}
|
703 |
.category-buttons {
|
704 |
gap: 8px;
|
@@ -721,6 +742,9 @@
|
|
721 |
max-height: 50vh;
|
722 |
padding: 8px;
|
723 |
}
|
|
|
|
|
|
|
724 |
.modal-body #modal-img {
|
725 |
max-height: 150px;
|
726 |
width: 100%;
|
@@ -864,6 +888,7 @@
|
|
864 |
<div class="dropdown-menu" id="avatarDropdown">
|
865 |
{% if user_image %}
|
866 |
<div class="dropdown-item delete-item" id="deleteAvatar">Delete Image</div>
|
|
|
867 |
{% endif %}
|
868 |
<a href="{{ url_for('orderhistory.order_history') }}" class="dropdown-item">Order History</a>
|
869 |
<div class="dropdown-item upload-item">
|
@@ -1041,6 +1066,24 @@
|
|
1041 |
</div>
|
1042 |
</div>
|
1043 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1044 |
<!-- Modal for Soft Drinks Quantity Selection -->
|
1045 |
<div class="modal fade" id="softDrinkModal" tabindex="-1" aria-labelledby="softDrinkModalLabel" aria-hidden="true">
|
1046 |
<div class="modal-dialog modal-dialog-centered">
|
@@ -1258,11 +1301,13 @@
|
|
1258 |
const avatarIcon = document.getElementById('avatarIcon');
|
1259 |
const avatarUpload = document.getElementById('avatarUpload');
|
1260 |
const deleteAvatar = document.getElementById('deleteAvatar');
|
|
|
1261 |
|
1262 |
// Load avatar from localStorage if available
|
1263 |
function loadAvatar() {
|
1264 |
const savedAvatar = localStorage.getItem('userAvatar');
|
1265 |
-
|
|
|
1266 |
const img = document.createElement('img');
|
1267 |
img.src = savedAvatar;
|
1268 |
img.alt = 'User Avatar';
|
@@ -1270,17 +1315,42 @@
|
|
1270 |
img.style.cssText = 'width: 100%; height: 100%; object-fit: cover; border-radius: 50%;';
|
1271 |
avatarIcon.innerHTML = '';
|
1272 |
avatarIcon.appendChild(img);
|
1273 |
-
|
1274 |
-
|
1275 |
-
|
1276 |
-
|
1277 |
-
deleteItem.innerText = 'Delete Image';
|
1278 |
-
dropdownMenu.insertBefore(deleteItem, dropdownMenu.firstChild);
|
1279 |
-
addDeleteListener(deleteItem);
|
1280 |
-
}
|
1281 |
}
|
1282 |
}
|
1283 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1284 |
// Save avatar to localStorage
|
1285 |
function saveAvatar(imageUrl) {
|
1286 |
localStorage.setItem('userAvatar', imageUrl);
|
@@ -1290,7 +1360,7 @@
|
|
1290 |
function clearAvatar() {
|
1291 |
localStorage.removeItem('userAvatar');
|
1292 |
avatarIcon.innerHTML = `<span>{{ first_letter }}</span>`;
|
1293 |
-
|
1294 |
}
|
1295 |
|
1296 |
// Avatar click handler
|
@@ -1333,14 +1403,7 @@
|
|
1333 |
avatarIcon.innerHTML = '';
|
1334 |
avatarIcon.appendChild(img);
|
1335 |
saveAvatar(data.image);
|
1336 |
-
|
1337 |
-
const deleteItem = document.createElement('div');
|
1338 |
-
deleteItem.className = 'dropdown-item delete-item';
|
1339 |
-
deleteItem.id = 'deleteAvatar';
|
1340 |
-
deleteItem.innerText = 'Delete Image';
|
1341 |
-
dropdownMenu.insertBefore(deleteItem, dropdownMenu.firstChild);
|
1342 |
-
addDeleteListener(deleteItem);
|
1343 |
-
}
|
1344 |
dropdownMenu.style.display = 'none';
|
1345 |
} else {
|
1346 |
alert('Failed to upload image: ' + (data.error || 'Unknown error. Using default image.'));
|
@@ -1352,14 +1415,7 @@
|
|
1352 |
avatarIcon.innerHTML = '';
|
1353 |
avatarIcon.appendChild(img);
|
1354 |
saveAvatar('/static/default-avatar.jpg');
|
1355 |
-
|
1356 |
-
const deleteItem = document.createElement('div');
|
1357 |
-
deleteItem.className = 'dropdown-item delete-item';
|
1358 |
-
deleteItem.id = 'deleteAvatar';
|
1359 |
-
deleteItem.innerText = 'Delete Image';
|
1360 |
-
dropdownMenu.insertBefore(deleteItem, dropdownMenu.firstChild);
|
1361 |
-
addDeleteListener(deleteItem);
|
1362 |
-
}
|
1363 |
dropdownMenu.style.display = 'none';
|
1364 |
}
|
1365 |
})
|
@@ -1374,14 +1430,7 @@
|
|
1374 |
avatarIcon.innerHTML = '';
|
1375 |
avatarIcon.appendChild(img);
|
1376 |
saveAvatar('/static/default-avatar.jpg');
|
1377 |
-
|
1378 |
-
const deleteItem = document.createElement('div');
|
1379 |
-
deleteItem.className = 'dropdown-item delete-item';
|
1380 |
-
deleteItem.id = 'deleteAvatar';
|
1381 |
-
deleteItem.innerText = 'Delete Image';
|
1382 |
-
dropdownMenu.insertBefore(deleteItem, dropdownMenu.firstChild);
|
1383 |
-
addDeleteListener(deleteItem);
|
1384 |
-
}
|
1385 |
dropdownMenu.style.display = 'none';
|
1386 |
});
|
1387 |
};
|
@@ -1395,14 +1444,7 @@
|
|
1395 |
avatarIcon.innerHTML = '';
|
1396 |
avatarIcon.appendChild(img);
|
1397 |
saveAvatar('/static/default-avatar.jpg');
|
1398 |
-
|
1399 |
-
const deleteItem = document.createElement('div');
|
1400 |
-
deleteItem.className = 'dropdown-item delete-item';
|
1401 |
-
deleteItem.id = 'deleteAvatar';
|
1402 |
-
deleteItem.innerText = 'Delete Image';
|
1403 |
-
dropdownMenu.insertBefore(deleteItem, dropdownMenu.firstChild);
|
1404 |
-
addDeleteListener(deleteItem);
|
1405 |
-
}
|
1406 |
dropdownMenu.style.display = 'none';
|
1407 |
};
|
1408 |
reader.readAsDataURL(file);
|
@@ -1437,11 +1479,26 @@
|
|
1437 |
});
|
1438 |
}
|
1439 |
|
1440 |
-
//
|
1441 |
-
|
1442 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1443 |
}
|
1444 |
|
|
|
|
|
|
|
|
|
1445 |
// Load avatar on page load
|
1446 |
loadAvatar();
|
1447 |
|
@@ -1891,7 +1948,7 @@
|
|
1891 |
optionsContainer.appendChild(listItem);
|
1892 |
});
|
1893 |
sectionDiv.appendChild(optionsContainer);
|
1894 |
-
|
1895 |
});
|
1896 |
})
|
1897 |
.catch(err => {
|
|
|
131 |
top: 50%;
|
132 |
transform: translateY(-50%);
|
133 |
display: flex;
|
134 |
+
align-items: center;
|
135 |
justify-content: center;
|
136 |
}
|
137 |
.avatar-icon {
|
|
|
147 |
font-size: 20px;
|
148 |
font-weight: bold;
|
149 |
position: relative;
|
150 |
+
transition: transform 0.2s ease;
|
151 |
+
}
|
152 |
+
.avatar-icon:hover {
|
153 |
+
transform: scale(1.1);
|
154 |
}
|
155 |
.avatar-icon img {
|
156 |
width: 100%;
|
157 |
height: 100%;
|
158 |
object-fit: cover;
|
159 |
border-radius: 50%;
|
160 |
+
transition: transform 0.2s ease;
|
161 |
+
}
|
162 |
+
.avatar-icon img:hover {
|
163 |
+
transform: scale(1.1);
|
164 |
}
|
165 |
.dropdown-menu {
|
166 |
position: absolute;
|
167 |
right: 0;
|
168 |
top: 100%;
|
169 |
background-color: #fff8f0;
|
170 |
+
border-radius: 8px;
|
171 |
+
width: 200px;
|
172 |
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
173 |
display: none;
|
174 |
border: 1px solid #ffd8b1;
|
175 |
+
padding: 5px 0;
|
176 |
+
z-index: 1000;
|
177 |
}
|
178 |
.dropdown-menu .dropdown-item {
|
179 |
+
padding: 10px 16px;
|
180 |
text-decoration: none;
|
181 |
color: #333;
|
182 |
+
font-size: 14px;
|
183 |
+
transition: background-color 0.2s ease, color 0.2s ease;
|
184 |
+
cursor: pointer;
|
|
|
|
|
|
|
|
|
185 |
}
|
186 |
.dropdown-menu .dropdown-item:hover {
|
187 |
background-color: #ffe4c4;
|
188 |
+
color: #2c2c2c;
|
|
|
|
|
|
|
|
|
|
|
189 |
}
|
190 |
.upload-item,
|
191 |
+
.delete-item,
|
192 |
+
.view-item {
|
193 |
+
padding: 10px 16px;
|
194 |
text-decoration: none;
|
195 |
color: #333;
|
196 |
+
font-size: 14px;
|
|
|
|
|
197 |
transition: background-color 0.2s ease;
|
198 |
cursor: pointer;
|
199 |
}
|
200 |
+
.upload-item:hover,
|
201 |
+
.delete-item:hover,
|
202 |
+
.view-item:hover {
|
203 |
+
background-color: #ffe4c4;
|
204 |
+
color: #2c2c2c;
|
205 |
+
}
|
206 |
.fixed-top-bar {
|
207 |
position: relative;
|
208 |
top: 0;
|
|
|
361 |
max-height: 60vh;
|
362 |
overflow-y: auto;
|
363 |
padding: 15px;
|
364 |
+
text-align: center;
|
365 |
+
}
|
366 |
+
.modal-body #avatar-modal-img {
|
367 |
+
max-width: 100%;
|
368 |
+
max-height: 400px;
|
369 |
+
object-fit: contain;
|
370 |
+
border-radius: 8px;
|
371 |
+
margin: 0 auto;
|
372 |
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
373 |
}
|
374 |
.modal-body #modal-img {
|
375 |
max-height: 200px;
|
|
|
709 |
font-size: 20px;
|
710 |
}
|
711 |
.dropdown-menu {
|
712 |
+
width: 180px;
|
713 |
}
|
714 |
.dropdown-menu .dropdown-item {
|
715 |
+
padding: 8px 12px;
|
716 |
+
font-size: 13px;
|
717 |
+
}
|
718 |
+
.upload-item,
|
719 |
+
.delete-item,
|
720 |
+
.view-item {
|
721 |
+
padding: 8px 12px;
|
722 |
+
font-size: 13px;
|
723 |
}
|
724 |
.category-buttons {
|
725 |
gap: 8px;
|
|
|
742 |
max-height: 50vh;
|
743 |
padding: 8px;
|
744 |
}
|
745 |
+
.modal-body #avatar-modal-img {
|
746 |
+
max-height: 300px;
|
747 |
+
}
|
748 |
.modal-body #modal-img {
|
749 |
max-height: 150px;
|
750 |
width: 100%;
|
|
|
888 |
<div class="dropdown-menu" id="avatarDropdown">
|
889 |
{% if user_image %}
|
890 |
<div class="dropdown-item delete-item" id="deleteAvatar">Delete Image</div>
|
891 |
+
<div class="dropdown-item view-item" id="viewAvatar">View Avatar</div>
|
892 |
{% endif %}
|
893 |
<a href="{{ url_for('orderhistory.order_history') }}" class="dropdown-item">Order History</a>
|
894 |
<div class="dropdown-item upload-item">
|
|
|
1066 |
</div>
|
1067 |
</div>
|
1068 |
|
1069 |
+
<!-- Modal for Avatar View -->
|
1070 |
+
<div class="modal fade" id="avatarModal" tabindex="-1" aria-labelledby="avatarModalLabel" aria-hidden="true">
|
1071 |
+
<div class="modal-dialog modal-dialog-centered modal-lg">
|
1072 |
+
<div class="modal-content">
|
1073 |
+
<div class="modal-header">
|
1074 |
+
<h5 class="modal-title" id="avatarModalLabel">View Avatar</h5>
|
1075 |
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
1076 |
+
</div>
|
1077 |
+
<div class="modal-body">
|
1078 |
+
<img id="avatar-modal-img" class="img-fluid rounded mx-auto d-block" alt="Avatar Image" style="max-height: 400px; object-fit: contain;">
|
1079 |
+
</div>
|
1080 |
+
<div class="modal-footer">
|
1081 |
+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
1082 |
+
</div>
|
1083 |
+
</div>
|
1084 |
+
</div>
|
1085 |
+
</div>
|
1086 |
+
|
1087 |
<!-- Modal for Soft Drinks Quantity Selection -->
|
1088 |
<div class="modal fade" id="softDrinkModal" tabindex="-1" aria-labelledby="softDrinkModalLabel" aria-hidden="true">
|
1089 |
<div class="modal-dialog modal-dialog-centered">
|
|
|
1301 |
const avatarIcon = document.getElementById('avatarIcon');
|
1302 |
const avatarUpload = document.getElementById('avatarUpload');
|
1303 |
const deleteAvatar = document.getElementById('deleteAvatar');
|
1304 |
+
const viewAvatar = document.getElementById('viewAvatar');
|
1305 |
|
1306 |
// Load avatar from localStorage if available
|
1307 |
function loadAvatar() {
|
1308 |
const savedAvatar = localStorage.getItem('userAvatar');
|
1309 |
+
const avatarImage = avatarIcon.querySelector('.avatar-image');
|
1310 |
+
if (savedAvatar && !avatarImage) {
|
1311 |
const img = document.createElement('img');
|
1312 |
img.src = savedAvatar;
|
1313 |
img.alt = 'User Avatar';
|
|
|
1315 |
img.style.cssText = 'width: 100%; height: 100%; object-fit: cover; border-radius: 50%;';
|
1316 |
avatarIcon.innerHTML = '';
|
1317 |
avatarIcon.appendChild(img);
|
1318 |
+
ensureAvatarOptions();
|
1319 |
+
} else if (!savedAvatar && avatarImage) {
|
1320 |
+
avatarIcon.innerHTML = `<span>{{ first_letter }}</span>`;
|
1321 |
+
removeAvatarOptions();
|
|
|
|
|
|
|
|
|
1322 |
}
|
1323 |
}
|
1324 |
|
1325 |
+
// Ensure avatar options (Delete and View) are present only once
|
1326 |
+
function ensureAvatarOptions() {
|
1327 |
+
if (!document.querySelector('#deleteAvatar')) {
|
1328 |
+
const deleteItem = document.createElement('div');
|
1329 |
+
deleteItem.className = 'dropdown-item delete-item';
|
1330 |
+
deleteItem.id = 'deleteAvatar';
|
1331 |
+
deleteItem.innerText = 'Delete Image';
|
1332 |
+
dropdownMenu.insertBefore(deleteItem, dropdownMenu.firstChild);
|
1333 |
+
addDeleteListener(deleteItem);
|
1334 |
+
}
|
1335 |
+
if (!document.querySelector('#viewAvatar')) {
|
1336 |
+
const viewItem = document.createElement('div');
|
1337 |
+
viewItem.className = 'dropdown-item view-item';
|
1338 |
+
viewItem.id = 'viewAvatar';
|
1339 |
+
viewItem.innerText = 'View Avatar';
|
1340 |
+
const firstChild = dropdownMenu.firstChild;
|
1341 |
+
if (firstChild) dropdownMenu.insertBefore(viewItem, firstChild.nextSibling);
|
1342 |
+
addViewListener(viewItem);
|
1343 |
+
}
|
1344 |
+
}
|
1345 |
+
|
1346 |
+
// Remove avatar options
|
1347 |
+
function removeAvatarOptions() {
|
1348 |
+
const deleteItem = document.getElementById('deleteAvatar');
|
1349 |
+
const viewItem = document.getElementById('viewAvatar');
|
1350 |
+
if (deleteItem) deleteItem.remove();
|
1351 |
+
if (viewItem) viewItem.remove();
|
1352 |
+
}
|
1353 |
+
|
1354 |
// Save avatar to localStorage
|
1355 |
function saveAvatar(imageUrl) {
|
1356 |
localStorage.setItem('userAvatar', imageUrl);
|
|
|
1360 |
function clearAvatar() {
|
1361 |
localStorage.removeItem('userAvatar');
|
1362 |
avatarIcon.innerHTML = `<span>{{ first_letter }}</span>`;
|
1363 |
+
removeAvatarOptions();
|
1364 |
}
|
1365 |
|
1366 |
// Avatar click handler
|
|
|
1403 |
avatarIcon.innerHTML = '';
|
1404 |
avatarIcon.appendChild(img);
|
1405 |
saveAvatar(data.image);
|
1406 |
+
ensureAvatarOptions();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1407 |
dropdownMenu.style.display = 'none';
|
1408 |
} else {
|
1409 |
alert('Failed to upload image: ' + (data.error || 'Unknown error. Using default image.'));
|
|
|
1415 |
avatarIcon.innerHTML = '';
|
1416 |
avatarIcon.appendChild(img);
|
1417 |
saveAvatar('/static/default-avatar.jpg');
|
1418 |
+
ensureAvatarOptions();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1419 |
dropdownMenu.style.display = 'none';
|
1420 |
}
|
1421 |
})
|
|
|
1430 |
avatarIcon.innerHTML = '';
|
1431 |
avatarIcon.appendChild(img);
|
1432 |
saveAvatar('/static/default-avatar.jpg');
|
1433 |
+
ensureAvatarOptions();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1434 |
dropdownMenu.style.display = 'none';
|
1435 |
});
|
1436 |
};
|
|
|
1444 |
avatarIcon.innerHTML = '';
|
1445 |
avatarIcon.appendChild(img);
|
1446 |
saveAvatar('/static/default-avatar.jpg');
|
1447 |
+
ensureAvatarOptions();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1448 |
dropdownMenu.style.display = 'none';
|
1449 |
};
|
1450 |
reader.readAsDataURL(file);
|
|
|
1479 |
});
|
1480 |
}
|
1481 |
|
1482 |
+
// Handle avatar view
|
1483 |
+
function addViewListener(viewElement) {
|
1484 |
+
viewElement.addEventListener('click', function() {
|
1485 |
+
const avatarImage = avatarIcon.querySelector('.avatar-image');
|
1486 |
+
if (avatarImage) {
|
1487 |
+
const modalImg = document.getElementById('avatar-modal-img');
|
1488 |
+
modalImg.src = avatarImage.src;
|
1489 |
+
const modal = new bootstrap.Modal(document.getElementById('avatarModal'));
|
1490 |
+
modal.show();
|
1491 |
+
} else {
|
1492 |
+
alert('No avatar image to view.');
|
1493 |
+
}
|
1494 |
+
dropdownMenu.style.display = 'none';
|
1495 |
+
});
|
1496 |
}
|
1497 |
|
1498 |
+
// Add listeners if elements exist
|
1499 |
+
if (deleteAvatar) addDeleteListener(deleteAvatar);
|
1500 |
+
if (viewAvatar) addViewListener(viewAvatar);
|
1501 |
+
|
1502 |
// Load avatar on page load
|
1503 |
loadAvatar();
|
1504 |
|
|
|
1948 |
optionsContainer.appendChild(listItem);
|
1949 |
});
|
1950 |
sectionDiv.appendChild(optionsContainer);
|
1951 |
+
addonsList.appendChild(sectionDiv);
|
1952 |
});
|
1953 |
})
|
1954 |
.catch(err => {
|