Files
TimeTrack/static/js/user-dropdown.js
Jens Luedicke 7a5e271395 Fix user dropdown accessibility in mobile/tablet menu
- Prevent sidebar from closing when clicking user dropdown toggle
- Exclude user dropdown from auto-close behavior on navigation clicks
- Position user dropdown modal correctly on mobile/tablet screens
- Increase z-index to ensure dropdown appears above mobile overlay
- Center dropdown modal on mobile/tablet for better accessibility
- Add proper event handling to prevent unwanted closures
2025-07-14 10:32:28 +02:00

58 lines
2.5 KiB
JavaScript

// User dropdown context menu functionality
document.addEventListener('DOMContentLoaded', function() {
const userDropdownToggle = document.getElementById('user-dropdown-toggle');
const userDropdownModal = document.getElementById('user-dropdown-modal');
// Toggle dropdown context menu
if (userDropdownToggle && userDropdownModal) {
userDropdownToggle.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
// Toggle active class
const isActive = userDropdownModal.classList.contains('active');
userDropdownModal.classList.toggle('active');
// Position the dropdown relative to the toggle button
if (!isActive) {
const toggleRect = userDropdownToggle.getBoundingClientRect();
const sidebarHeader = userDropdownToggle.closest('.sidebar-header');
const sidebarHeaderRect = sidebarHeader.getBoundingClientRect();
// Position relative to sidebar header
userDropdownModal.style.position = 'absolute';
userDropdownModal.style.top = (toggleRect.bottom - sidebarHeaderRect.top + 5) + 'px';
userDropdownModal.style.right = '10px';
userDropdownModal.style.left = 'auto';
}
});
}
// Close dropdown when clicking outside
document.addEventListener('click', function(e) {
if (userDropdownModal && !userDropdownModal.contains(e.target) && !userDropdownToggle.contains(e.target)) {
// Don't close if we're clicking on the mobile overlay
if (e.target.id === 'mobile-nav-overlay' || e.target.classList.contains('mobile-overlay')) {
return;
}
userDropdownModal.classList.remove('active');
}
});
// Close dropdown when pressing Escape
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && userDropdownModal && userDropdownModal.classList.contains('active')) {
userDropdownModal.classList.remove('active');
}
});
// Close dropdown when clicking on menu items
if (userDropdownModal) {
const menuLinks = userDropdownModal.querySelectorAll('a');
menuLinks.forEach(link => {
link.addEventListener('click', function() {
userDropdownModal.classList.remove('active');
});
});
}
});