// Global DataTables Configuration if (typeof $ !== 'undefined' && $.fn && $.fn.dataTable) { $.extend(true, $.fn.dataTable.defaults, { pageLength: 10, language: { url: "//cdn.datatables.net/plug-ins/1.13.6/i18n/th.json" }, dom: '<"row mb-3"<"col-sm-12 col-md-6"l><"col-sm-12 col-md-6"f>>t<"row mt-3"<"col-sm-12 col-md-5"i><"col-sm-12 col-md-7"p>>', }); } document.addEventListener('DOMContentLoaded', () => { // 1. Sidebar Toggle const sidebar = document.getElementById('sidebar'); const toggleBtn = document.getElementById('sidebarToggle'); const mobileToggleBtn = document.getElementById('mobileSidebarToggle'); if (toggleBtn && sidebar) { toggleBtn.addEventListener('click', () => { if (window.innerWidth >= 992) { sidebar.classList.toggle('collapsed'); } }); } if (mobileToggleBtn && sidebar) { mobileToggleBtn.addEventListener('click', () => { sidebar.classList.toggle('show'); }); } // 2. Theme Management (Light/Dark) const themeToggleBtn = document.getElementById('themeToggle'); const htmlEl = document.documentElement; const themeIcon = themeToggleBtn ? themeToggleBtn.querySelector('i') : null; const savedTheme = localStorage.getItem('theme') || 'light'; setTheme(savedTheme); if (themeToggleBtn) { themeToggleBtn.addEventListener('click', () => { const currentTheme = htmlEl.getAttribute('data-theme'); const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; setTheme(newTheme); }); } function setTheme(theme) { htmlEl.setAttribute('data-theme', theme); localStorage.setItem('theme', theme); if (themeIcon) { themeIcon.className = theme === 'dark' ? 'bi bi-sun-fill' : 'bi bi-moon-fill'; } // Update Chart.js colors dynamically if function exists if (typeof window.updateChartsTheme === 'function') { setTimeout(window.updateChartsTheme, 50); // wait for CSS variables to apply } } // 3. Command Palette (Ctrl + K) const cmdPalette = document.getElementById('commandPalette'); const cmdInput = document.getElementById('cmdInput'); if (cmdPalette && cmdInput) { document.addEventListener('keydown', (e) => { if ((e.ctrlKey || e.metaKey) && e.key === 'k') { e.preventDefault(); cmdPalette.classList.add('active'); cmdInput.focus(); } if (e.key === 'Escape' && cmdPalette.classList.contains('active')) { cmdPalette.classList.remove('active'); } }); // Close when clicking outside cmdPalette.addEventListener('click', (e) => { if (e.target === cmdPalette) { cmdPalette.classList.remove('active'); } }); // Simple Search Filter cmdInput.addEventListener('input', function() { const val = this.value.toLowerCase(); const items = cmdPalette.querySelectorAll('.cmd-item'); items.forEach(item => { const text = item.textContent.toLowerCase(); item.style.display = text.includes(val) ? 'flex' : 'none'; }); }); } // 4. Toast Notifications window.showToast = function(message, type = 'success') { const container = document.getElementById('toastContainer'); if (!container) return; const bgClass = type === 'success' ? 'bg-success text-white' : type === 'danger' ? 'bg-danger text-white' : type === 'warning' ? 'bg-warning text-dark' : 'bg-primary text-white'; const iconClass = type === 'success' ? 'bi-check-circle' : type === 'danger' ? 'bi-x-circle' : type === 'warning' ? 'bi-exclamation-triangle' : 'bi-info-circle'; const toastHtml = `