also fixes flash messages

This commit is contained in:
Michael Beck 2025-06-11 23:45:19 +02:00
parent d730137d20
commit 98901ce38e

View File

@ -12,7 +12,7 @@ function showFlashMessage(message, type = "success", duration = 5000) {
const flashMsg = document.createElement("div"); const flashMsg = document.createElement("div");
const normalizedType = type === "error" ? "danger" : type; const normalizedType = type === "error" ? "danger" : type;
flashMsg.className = `flash-overlay flash-${normalizedType}`; flashMsg.className = `flash-overlay flash-${normalizedType}`;
// Get the appropriate icon based on type // Get the appropriate icon based on type
const getIcon = (messageType) => { const getIcon = (messageType) => {
switch (messageType) { switch (messageType) {
@ -33,37 +33,52 @@ function showFlashMessage(message, type = "success", duration = 5000) {
<div class="flash-content"> <div class="flash-content">
${getIcon(normalizedType)} ${getIcon(normalizedType)}
<div class="flash-message">${message}</div> <div class="flash-message">${message}</div>
<button type="button" class="flash-close" onclick="this.parentElement.parentElement.remove()">×</button> <button type="button" class="flash-close" onclick="removeFlashMessage(this.parentElement.parentElement)">×</button>
</div> </div>
`; `;
// Handle stacking of multiple messages // Add to page first
const existingMessages = document.querySelectorAll('.flash-overlay');
existingMessages.forEach((msg, index) => {
msg.style.setProperty('--flash-index', index + 1);
});
// Add to page
document.body.appendChild(flashMsg); document.body.appendChild(flashMsg);
// Position all messages in stack
updateFlashMessagePositions();
// Auto dismiss // Auto dismiss
setTimeout(() => { setTimeout(() => {
flashMsg.classList.add("fade-out"); removeFlashMessage(flashMsg);
setTimeout(() => {
if (flashMsg.parentNode) {
flashMsg.remove();
// Reposition remaining messages
const remainingMessages = document.querySelectorAll('.flash-overlay');
remainingMessages.forEach((msg, index) => {
msg.style.setProperty('--flash-index', index);
});
}
}, 300);
}, duration); }, duration);
return flashMsg; return flashMsg;
} }
/**
* Remove a flash message and update positions
* @param {HTMLElement} flashMsg - The flash message element to remove
*/
function removeFlashMessage(flashMsg) {
if (!flashMsg || !flashMsg.parentNode) return;
flashMsg.classList.add("fade-out");
setTimeout(() => {
if (flashMsg.parentNode) {
flashMsg.remove();
updateFlashMessagePositions();
}
}, 300);
}
/**
* Update positions of all flash messages to create a proper stack
*/
function updateFlashMessagePositions() {
const messages = document.querySelectorAll(".flash-overlay:not(.fade-out)");
messages.forEach((msg, index) => {
const topPosition = 20 + index * 90; // 90px spacing between messages
msg.style.top = `${topPosition}px`;
msg.style.zIndex = 9999 - index; // Higher z-index for newer messages
});
}
/** /**
* Create a status badge HTML element * Create a status badge HTML element
* @param {string} status - The status to create a badge for * @param {string} status - The status to create a badge for