Path : /home/vishqocm/pcib.in/admin/assets/js/
File Upload :
Current File : /home/vishqocm/pcib.in/admin/assets/js/sidebar.js

/**
 * Admin Sidebar Functionality
 * 
 * This script handles the sidebar toggle functionality and persistence
 */

document.addEventListener('DOMContentLoaded', function() {
    // Get sidebar elements
    const sidebarToggler = document.getElementById('sidebarToggler');
    const topbarSidebarToggler = document.getElementById('topbarSidebarToggler');
    const sidebar = document.getElementById('sidebar');
    const mainContent = document.getElementById('mainContent');
    
    // Load sidebar state from localStorage
    const sidebarCollapsed = localStorage.getItem('sidebarCollapsed') === 'true';
    
    // Apply saved state
    if (sidebarCollapsed) {
        sidebar.classList.add('collapsed');
        mainContent.classList.add('expanded');
    } else {
        sidebar.classList.remove('collapsed');
        mainContent.classList.remove('expanded');
    }
    
    // Function to toggle sidebar
    const toggleSidebar = function(e) {
        if (e) {
            e.preventDefault();
            e.stopPropagation();
        }
        
        // Toggle classes
        sidebar.classList.toggle('collapsed');
        mainContent.classList.toggle('expanded');
        
        // Save state to localStorage
        localStorage.setItem('sidebarCollapsed', sidebar.classList.contains('collapsed'));
    };
    
    // Toggle sidebar when sidebar toggler is clicked
    if (sidebarToggler) {
        sidebarToggler.addEventListener('click', toggleSidebar);
    } else {
        console.error('Sidebar toggler element not found');
    }
    
    // Toggle sidebar when topbar toggler is clicked
    if (topbarSidebarToggler) {
        topbarSidebarToggler.addEventListener('click', toggleSidebar);
    }
    
    // Critical fix for sidebar submenu toggle
    const dropdownToggles = document.querySelectorAll('.sidebar-dropdown .nav-link[data-bs-toggle="collapse"]');
    
    dropdownToggles.forEach(function(toggle) {
        // Remove the data-bs-toggle attribute to prevent Bootstrap's default behavior
        toggle.removeAttribute('data-bs-toggle');
        
        const submenuId = toggle.getAttribute('href');
        if (submenuId && submenuId.startsWith('#')) {
            const submenu = document.querySelector(submenuId);
            
            if (submenu) {
                // Initialize collapse manually
                const bsCollapse = new bootstrap.Collapse(submenu, {
                    toggle: false
                });
                
                // Add click handler for toggle
                toggle.addEventListener('click', function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    
                    // Check if sidebar is collapsed - prevent toggle action and let CSS hover handle it
                    if (sidebar.classList.contains('collapsed')) {
                        return;
                    }
                    
                    // Simple toggle for expanded sidebar
                    if (submenu.classList.contains('show')) {
                        bsCollapse.hide();
                        toggle.setAttribute('aria-expanded', 'false');
                    } else {
                        bsCollapse.show();
                        toggle.setAttribute('aria-expanded', 'true');
                    }
                    
                    // Update chevron icon
                    const chevron = toggle.querySelector('.submenu-icon');
                    if (chevron) {
                        if (submenu.classList.contains('show')) {
                            chevron.style.transform = 'rotate(180deg)';
                        } else {
                            chevron.style.transform = 'rotate(0deg)';
                        }
                    }
                });
                
                // Set initial state of chevron
                const isExpanded = submenu.classList.contains('show');
                toggle.setAttribute('aria-expanded', isExpanded ? 'true' : 'false');
                
                const chevron = toggle.querySelector('.submenu-icon');
                if (chevron) {
                    chevron.style.transform = isExpanded ? 'rotate(180deg)' : 'rotate(0deg)';
                }
                
                // Auto-expand if a submenu item is active
                const hasActiveChild = submenu.querySelector('.nav-link.active');
                if (hasActiveChild && !submenu.classList.contains('show')) {
                    bsCollapse.show();
                    toggle.setAttribute('aria-expanded', 'true');
                    
                    if (chevron) {
                        chevron.style.transform = 'rotate(180deg)';
                    }
                }
                
                // Handle hover behavior for collapsed sidebar
                const dropdownItem = toggle.closest('.sidebar-dropdown');
                if (dropdownItem) {
                    // Show submenu on hover when sidebar is collapsed
                    dropdownItem.addEventListener('mouseenter', function() {
                        if (sidebar.classList.contains('collapsed')) {
                            submenu.classList.add('hover-show');
                            submenu.classList.add('show');
                        }
                    });
                    
                    // Hide submenu when mouse leaves
                    dropdownItem.addEventListener('mouseleave', function() {
                        if (sidebar.classList.contains('collapsed')) {
                            submenu.classList.remove('hover-show');
                            submenu.classList.remove('show');
                        }
                    });
                }
            }
        }
    });
    
    // Configure sidebar behavior on smaller screens
    const handleResize = () => {
        if (window.innerWidth < 992 && !sidebar.classList.contains('collapsed')) {
            sidebar.classList.add('collapsed');
            mainContent.classList.add('expanded');
        }
    };
    
    // Initial check
    handleResize();
    
    // Add resize event listener
    window.addEventListener('resize', handleResize);
});