62 lines
1.8 KiB
JavaScript
62 lines
1.8 KiB
JavaScript
/* =====================================================
|
|
Raccoon Timekeeper - JavaScript Utilities
|
|
===================================================== */
|
|
|
|
// Format minutes to H:MM
|
|
function formatMinutes(totalMinutes) {
|
|
if (!totalMinutes) return '0:00';
|
|
const hours = Math.floor(totalMinutes / 60);
|
|
const mins = totalMinutes % 60;
|
|
return `${hours}:${mins.toString().padStart(2, '0')}`;
|
|
}
|
|
|
|
// Show toast notification
|
|
function showToast(message, type = 'success') {
|
|
const container = document.getElementById('toastContainer');
|
|
if (!container) return;
|
|
|
|
const toast = document.createElement('div');
|
|
toast.className = `toast toast-${type}`;
|
|
toast.textContent = message;
|
|
container.appendChild(toast);
|
|
|
|
setTimeout(() => {
|
|
toast.style.opacity = '0';
|
|
setTimeout(() => toast.remove(), 300);
|
|
}, 3000);
|
|
}
|
|
|
|
// Toggle user dropdown menu
|
|
function toggleUserMenu() {
|
|
const dropdown = document.getElementById('userDropdown');
|
|
if (dropdown) {
|
|
dropdown.classList.toggle('active');
|
|
}
|
|
}
|
|
|
|
// Close dropdown when clicking outside
|
|
document.addEventListener('click', function(e) {
|
|
const userMenu = document.querySelector('.user-menu');
|
|
const dropdown = document.getElementById('userDropdown');
|
|
|
|
if (userMenu && dropdown && !userMenu.contains(e.target)) {
|
|
dropdown.classList.remove('active');
|
|
}
|
|
});
|
|
|
|
// Close modals with Escape key
|
|
document.addEventListener('keydown', function(e) {
|
|
if (e.key === 'Escape') {
|
|
document.querySelectorAll('.modal.active').forEach(modal => {
|
|
modal.classList.remove('active');
|
|
});
|
|
}
|
|
});
|
|
|
|
// Close modal when clicking backdrop
|
|
document.addEventListener('click', function(e) {
|
|
if (e.target.classList.contains('modal')) {
|
|
e.target.classList.remove('active');
|
|
}
|
|
});
|