/** * Main JavaScript file for the Affiliate Tracker */ document.addEventListener('DOMContentLoaded', function() { // Toggle sidebar on mobile const toggleSidebarBtn = document.querySelector('.toggle-sidebar'); const sidebar = document.querySelector('.sidebar'); if (toggleSidebarBtn && sidebar) { toggleSidebarBtn.addEventListener('click', function() { sidebar.classList.toggle('collapsed'); }); } // Close modal when clicking outside window.addEventListener('click', function(event) { if (event.target.classList.contains('modal')) { document.querySelectorAll('.modal').forEach(function(modal) { modal.style.display = 'none'; }); } }); // Initialize date range pickers if they exist if (typeof flatpickr !== 'undefined') { const dateRangePickers = document.querySelectorAll('.date-range-picker'); if (dateRangePickers.length > 0) { dateRangePickers.forEach(function(picker) { flatpickr(picker, { mode: 'range', dateFormat: 'Y-m-d' }); }); } } // Form validation const forms = document.querySelectorAll('form'); forms.forEach(function(form) { if (form.classList.contains('needs-validation')) { form.addEventListener('submit', function(event) { if (!form.checkValidity()) { event.preventDefault(); event.stopPropagation(); } form.classList.add('was-validated'); }, false); } }); // Handle error messages const errorMessages = document.querySelectorAll('.error-message'); if (errorMessages.length > 0) { setTimeout(function() { errorMessages.forEach(function(message) { message.style.opacity = '0'; setTimeout(function() { message.style.display = 'none'; }, 500); }); }, 5000); } // Confirm dangerous actions const dangerBtns = document.querySelectorAll('[data-confirm]'); dangerBtns.forEach(function(btn) { btn.addEventListener('click', function(event) { const confirmMsg = this.getAttribute('data-confirm'); if (!window.confirm(confirmMsg)) { event.preventDefault(); } }); }); });