/* Base JavaScript Utilities */ document.addEventListener('DOMContentLoaded', function() { // Initialize tooltips and popovers initializeBootstrap(); // Setup flash message auto-close setupFlashMessages(); // Setup theme toggle if available setupThemeToggle(); }); /** * Initialize Bootstrap tooltips and popovers */ function initializeBootstrap() { // Initialize all tooltips const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl); }); // Initialize all popovers const popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')); popoverTriggerList.map(function (popoverTriggerEl) { return new bootstrap.Popover(popoverTriggerEl); }); } /** * Auto-close flash messages after 5 seconds */ function setupFlashMessages() { const alerts = document.querySelectorAll('.alert'); alerts.forEach(function(alert) { setTimeout(function() { const bsAlert = new bootstrap.Alert(alert); bsAlert.close(); }, 5000); }); } /** * Setup theme toggle functionality */ function setupThemeToggle() { const themeToggle = document.getElementById('theme-toggle'); if (!themeToggle) return; const currentTheme = localStorage.getItem('theme') || 'light'; applyTheme(currentTheme); themeToggle.addEventListener('click', function() { const newTheme = currentTheme === 'light' ? 'dark' : 'light'; applyTheme(newTheme); localStorage.setItem('theme', newTheme); }); } /** * Apply theme to document */ function applyTheme(theme) { const html = document.documentElement; if (theme === 'dark') { html.setAttribute('data-bs-theme', 'dark'); } else { html.removeAttribute('data-bs-theme'); } } /** * Display a toast notification */ function showToast(message, type = 'info') { const toastHtml = `