Update templates/menu.html
Browse files- templates/menu.html +72 -12
templates/menu.html
CHANGED
@@ -896,7 +896,7 @@
|
|
896 |
</div>
|
897 |
</div>
|
898 |
|
899 |
-
<!-- Avatar View Modal -->
|
900 |
<div class="modal fade avatar-modal" id="avatarViewModal" tabindex="-1" aria-labelledby="avatarViewModalLabel" aria-hidden="true">
|
901 |
<div class="modal-dialog modal-dialog-centered">
|
902 |
<div class="modal-content">
|
@@ -1324,25 +1324,25 @@
|
|
1324 |
if (deleteAvatar) deleteAvatar.remove();
|
1325 |
}
|
1326 |
|
1327 |
-
// Avatar click handler (show modal
|
1328 |
avatarIcon.addEventListener('click', function(event) {
|
1329 |
event.stopPropagation();
|
1330 |
const avatarImg = this.querySelector('.avatar-image');
|
1331 |
if (avatarImg) {
|
1332 |
-
avatarModalImage.src = avatarImg.src;
|
1333 |
new bootstrap.Modal(document.getElementById('avatarViewModal')).show();
|
1334 |
} else {
|
1335 |
dropdownMenu.style.display = dropdownMenu.style.display === 'block' ? 'none' : 'block';
|
1336 |
}
|
1337 |
});
|
1338 |
|
1339 |
-
// Handle image upload with
|
1340 |
avatarUpload.addEventListener('change', function(event) {
|
1341 |
const file = event.target.files[0];
|
1342 |
if (file) {
|
1343 |
-
const maxSize =
|
1344 |
if (file.size > maxSize) {
|
1345 |
-
alert('Image size must not exceed
|
1346 |
this.value = '';
|
1347 |
return;
|
1348 |
}
|
@@ -1356,11 +1356,14 @@
|
|
1356 |
},
|
1357 |
body: JSON.stringify({ image: base64Image })
|
1358 |
})
|
1359 |
-
.then(response =>
|
|
|
|
|
|
|
1360 |
.then(data => {
|
1361 |
if (data.success) {
|
1362 |
const img = document.createElement('img');
|
1363 |
-
img.src = data.image;
|
1364 |
img.alt = 'User Avatar';
|
1365 |
img.className = 'avatar-image';
|
1366 |
img.style.cssText = 'width: 100%; height: 100%; object-fit: cover; border-radius: 50%;';
|
@@ -1377,14 +1380,68 @@
|
|
1377 |
}
|
1378 |
dropdownMenu.style.display = 'none';
|
1379 |
} else {
|
1380 |
-
alert('Failed to upload image: ' + (data.error || 'Unknown error'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1381 |
}
|
1382 |
})
|
1383 |
.catch(error => {
|
1384 |
console.error('Upload error:', error);
|
1385 |
-
alert('Error uploading image');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1386 |
});
|
1387 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1388 |
reader.readAsDataURL(file);
|
1389 |
}
|
1390 |
});
|
@@ -1398,7 +1455,10 @@
|
|
1398 |
'Content-Type': 'application/json'
|
1399 |
}
|
1400 |
})
|
1401 |
-
.then(response =>
|
|
|
|
|
|
|
1402 |
.then(data => {
|
1403 |
if (data.success) {
|
1404 |
clearAvatar();
|
@@ -1409,7 +1469,7 @@
|
|
1409 |
})
|
1410 |
.catch(error => {
|
1411 |
console.error('Delete error:', error);
|
1412 |
-
alert('Error deleting image');
|
1413 |
});
|
1414 |
});
|
1415 |
}
|
|
|
896 |
</div>
|
897 |
</div>
|
898 |
|
899 |
+
<!-- Avatar View Modal (Triggered Directly from Avatar Icon) -->
|
900 |
<div class="modal fade avatar-modal" id="avatarViewModal" tabindex="-1" aria-labelledby="avatarViewModalLabel" aria-hidden="true">
|
901 |
<div class="modal-dialog modal-dialog-centered">
|
902 |
<div class="modal-content">
|
|
|
1324 |
if (deleteAvatar) deleteAvatar.remove();
|
1325 |
}
|
1326 |
|
1327 |
+
// Avatar click handler (show modal directly from avatar icon)
|
1328 |
avatarIcon.addEventListener('click', function(event) {
|
1329 |
event.stopPropagation();
|
1330 |
const avatarImg = this.querySelector('.avatar-image');
|
1331 |
if (avatarImg) {
|
1332 |
+
avatarModalImage.src = avatarImg.src || '/static/default-avatar.jpg'; // Fallback image
|
1333 |
new bootstrap.Modal(document.getElementById('avatarViewModal')).show();
|
1334 |
} else {
|
1335 |
dropdownMenu.style.display = dropdownMenu.style.display === 'block' ? 'none' : 'block';
|
1336 |
}
|
1337 |
});
|
1338 |
|
1339 |
+
// Handle image upload with 15MB limit and error handling
|
1340 |
avatarUpload.addEventListener('change', function(event) {
|
1341 |
const file = event.target.files[0];
|
1342 |
if (file) {
|
1343 |
+
const maxSize = 15 * 1024 * 1024; // 15MB in bytes
|
1344 |
if (file.size > maxSize) {
|
1345 |
+
alert('Image size must not exceed 15MB.');
|
1346 |
this.value = '';
|
1347 |
return;
|
1348 |
}
|
|
|
1356 |
},
|
1357 |
body: JSON.stringify({ image: base64Image })
|
1358 |
})
|
1359 |
+
.then(response => {
|
1360 |
+
if (!response.ok) throw new Error('Upload failed');
|
1361 |
+
return response.json();
|
1362 |
+
})
|
1363 |
.then(data => {
|
1364 |
if (data.success) {
|
1365 |
const img = document.createElement('img');
|
1366 |
+
img.src = data.image || '/static/default-avatar.jpg'; // Fallback image
|
1367 |
img.alt = 'User Avatar';
|
1368 |
img.className = 'avatar-image';
|
1369 |
img.style.cssText = 'width: 100%; height: 100%; object-fit: cover; border-radius: 50%;';
|
|
|
1380 |
}
|
1381 |
dropdownMenu.style.display = 'none';
|
1382 |
} else {
|
1383 |
+
alert('Failed to upload image: ' + (data.error || 'Unknown error. Using default image.'));
|
1384 |
+
const img = document.createElement('img');
|
1385 |
+
img.src = '/static/default-avatar.jpg'; // Fallback image
|
1386 |
+
img.alt = 'User Avatar';
|
1387 |
+
img.className = 'avatar-image';
|
1388 |
+
img.style.cssText = 'width: 100%; height: 100%; object-fit: cover; border-radius: 50%;';
|
1389 |
+
avatarIcon.innerHTML = '';
|
1390 |
+
avatarIcon.appendChild(img);
|
1391 |
+
saveAvatar('/static/default-avatar.jpg');
|
1392 |
+
if (!deleteAvatar) {
|
1393 |
+
const deleteItem = document.createElement('div');
|
1394 |
+
deleteItem.className = 'dropdown-item delete-item';
|
1395 |
+
deleteItem.id = 'deleteAvatar';
|
1396 |
+
deleteItem.innerText = 'Delete Image';
|
1397 |
+
dropdownMenu.insertBefore(deleteItem, dropdownMenu.querySelector('.dropdown-item:last-child'));
|
1398 |
+
addDeleteListener(deleteItem);
|
1399 |
+
}
|
1400 |
+
dropdownMenu.style.display = 'none';
|
1401 |
}
|
1402 |
})
|
1403 |
.catch(error => {
|
1404 |
console.error('Upload error:', error);
|
1405 |
+
alert('Error uploading image. Using default image as fallback.');
|
1406 |
+
const img = document.createElement('img');
|
1407 |
+
img.src = '/static/default-avatar.jpg'; // Fallback image
|
1408 |
+
img.alt = 'User Avatar';
|
1409 |
+
img.className = 'avatar-image';
|
1410 |
+
img.style.cssText = 'width: 100%; height: 100%; object-fit: cover; border-radius: 50%;';
|
1411 |
+
avatarIcon.innerHTML = '';
|
1412 |
+
avatarIcon.appendChild(img);
|
1413 |
+
saveAvatar('/static/default-avatar.jpg');
|
1414 |
+
if (!deleteAvatar) {
|
1415 |
+
const deleteItem = document.createElement('div');
|
1416 |
+
deleteItem.className = 'dropdown-item delete-item';
|
1417 |
+
deleteItem.id = 'deleteAvatar';
|
1418 |
+
deleteItem.innerText = 'Delete Image';
|
1419 |
+
dropdownMenu.insertBefore(deleteItem, dropdownMenu.querySelector('.dropdown-item:last-child'));
|
1420 |
+
addDeleteListener(deleteItem);
|
1421 |
+
}
|
1422 |
+
dropdownMenu.style.display = 'none';
|
1423 |
});
|
1424 |
};
|
1425 |
+
reader.onerror = function() {
|
1426 |
+
alert('Error reading the image file. Using default image as fallback.');
|
1427 |
+
const img = document.createElement('img');
|
1428 |
+
img.src = '/static/default-avatar.jpg'; // Fallback image
|
1429 |
+
img.alt = 'User Avatar';
|
1430 |
+
img.className = 'avatar-image';
|
1431 |
+
img.style.cssText = 'width: 100%; height: 100%; object-fit: cover; border-radius: 50%;';
|
1432 |
+
avatarIcon.innerHTML = '';
|
1433 |
+
avatarIcon.appendChild(img);
|
1434 |
+
saveAvatar('/static/default-avatar.jpg');
|
1435 |
+
if (!deleteAvatar) {
|
1436 |
+
const deleteItem = document.createElement('div');
|
1437 |
+
deleteItem.className = 'dropdown-item delete-item';
|
1438 |
+
deleteItem.id = 'deleteAvatar';
|
1439 |
+
deleteItem.innerText = 'Delete Image';
|
1440 |
+
dropdownMenu.insertBefore(deleteItem, dropdownMenu.querySelector('.dropdown-item:last-child'));
|
1441 |
+
addDeleteListener(deleteItem);
|
1442 |
+
}
|
1443 |
+
dropdownMenu.style.display = 'none';
|
1444 |
+
};
|
1445 |
reader.readAsDataURL(file);
|
1446 |
}
|
1447 |
});
|
|
|
1455 |
'Content-Type': 'application/json'
|
1456 |
}
|
1457 |
})
|
1458 |
+
.then(response => {
|
1459 |
+
if (!response.ok) throw new Error('Delete failed');
|
1460 |
+
return response.json();
|
1461 |
+
})
|
1462 |
.then(data => {
|
1463 |
if (data.success) {
|
1464 |
clearAvatar();
|
|
|
1469 |
})
|
1470 |
.catch(error => {
|
1471 |
console.error('Delete error:', error);
|
1472 |
+
alert('Error deleting image. Please try again.');
|
1473 |
});
|
1474 |
});
|
1475 |
}
|