Files
usbcheck.it/public/assets/js/header.js
2025-11-22 03:27:49 +01:00

145 lines
5.2 KiB
JavaScript

// public/assets/js/header.js
document.addEventListener('DOMContentLoaded', function () {
// -------------------------
// Login-Button
// -------------------------
const loginBtn = document.getElementById('loginButton');
if (loginBtn) {
loginBtn.addEventListener('click', function (event) {
event.preventDefault();
const currentPath = window.location.pathname || '/';
const currentQuery = window.location.search || '';
const redirect = currentPath + currentQuery;
// Sprache aus dem Label oben ziehen, falls vorhanden
const langLabelEl = document.getElementById('langCurrentLabel');
let lang = 'de';
if (langLabelEl && langLabelEl.textContent) {
lang = langLabelEl.textContent.trim().toLowerCase();
}
// Wenn wir bereits auf /login sind → nur zum #auth scrollen
if (currentPath === '/login' || currentPath === '/login/') {
const authEl = document.getElementById('auth');
if (authEl) {
authEl.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
return;
}
// Sonst: auf Login-Seite mit lang + redirect-Parameter
const url = '/login/?lang=' + encodeURIComponent(lang) +
'&redirect=' + encodeURIComponent(redirect) +
'#auth';
window.location.href = url;
});
}
// -------------------------
// Avatar-Menü ein-/ausblenden
// -------------------------
const avatarBtn = document.getElementById('userAvatar');
const userMenu = document.getElementById('userMenu');
if (avatarBtn && userMenu) {
avatarBtn.addEventListener('click', function (event) {
event.stopPropagation();
userMenu.classList.toggle('hidden');
const expanded = avatarBtn.getAttribute('aria-expanded') === 'true';
avatarBtn.setAttribute('aria-expanded', expanded ? 'false' : 'true');
});
// Klick außerhalb schließt Menü
document.addEventListener('click', function (event) {
if (!userMenu.classList.contains('hidden')) {
const clickedInsideMenu = userMenu.contains(event.target);
const clickedAvatarButton = avatarBtn.contains(event.target);
if (!clickedInsideMenu && !clickedAvatarButton) {
userMenu.classList.add('hidden');
avatarBtn.setAttribute('aria-expanded', 'false');
}
}
});
}
// -------------------------
// Logout-Modal
// -------------------------
const logoutButtons = document.querySelectorAll('[data-logout-link="true"]');
const backdrop = document.getElementById('logoutModalBackdrop');
const btnConfirm = document.getElementById('logoutConfirm');
const btnCancel = document.getElementById('logoutCancel');
let logoutTarget = null;
function showLogoutModal(targetHref) {
logoutTarget = targetHref || null;
if (!backdrop) return;
backdrop.classList.remove('hidden');
document.body.classList.add('overflow-hidden');
}
function hideLogoutModal() {
if (!backdrop) return;
backdrop.classList.add('hidden');
document.body.classList.remove('overflow-hidden');
logoutTarget = null;
}
if (logoutButtons.length && backdrop && btnConfirm && btnCancel) {
logoutButtons.forEach(function (btn) {
btn.addEventListener('click', function (event) {
event.preventDefault();
event.stopPropagation();
const href = btn.getAttribute('data-logout-href') || btn.getAttribute('href') || '/auth/logout';
showLogoutModal(href);
// Avatar-Menü beim Öffnen des Modals schließen
if (userMenu && !userMenu.classList.contains('hidden')) {
userMenu.classList.add('hidden');
if (avatarBtn) {
avatarBtn.setAttribute('aria-expanded', 'false');
}
}
});
});
// Bestätigen → weiter zur Logout-URL
btnConfirm.addEventListener('click', function () {
if (logoutTarget) {
window.location.href = logoutTarget;
} else {
window.location.href = '/auth/logout';
}
});
// Abbrechen → Modal schließen
btnCancel.addEventListener('click', function () {
hideLogoutModal();
});
// Klick auf Hintergrund schließt Modal
backdrop.addEventListener('click', function (event) {
const card = backdrop.querySelector('div.w-full.max-w-sm');
if (card && !card.contains(event.target)) {
hideLogoutModal();
}
});
// ESC-Taste schließt Modal
document.addEventListener('keydown', function (event) {
if (event.key === 'Escape' && !backdrop.classList.contains('hidden')) {
hideLogoutModal();
}
});
}
});