# ๐Ÿ“‹ SIDEBAR - Documentazione Completa NetGescon > **Componente Sidebar dell'interfaccia universale** > **๐Ÿ“… Creato:** 21/07/2025 > **๐Ÿ”„ Ultimo aggiornamento:** 21/07/2025 > **๐ŸŽฏ Prioritร :** ๐Ÿ”ฅ CRITICA --- ## ๐Ÿ“‹ **OVERVIEW SIDEBAR** La Sidebar NetGescon รจ il componente **NAVIGATION PRINCIPALE** che contiene: - ๐Ÿ  **Dashboard Links** - ๐Ÿข **Stabili Management** - ๐Ÿ˜๏ธ **Condomini Management** - ๐Ÿ’ฐ **Contabilitร  & Fiscale** - ๐Ÿ‘ฅ **User & Admin Tools** - โš™๏ธ **Sistema Permessi Integrato** ### ๐Ÿ“ **Specifiche Layout** - **Larghezza:** `280px` desktop, `100%` mobile - **Posizione:** `fixed left` sempre visibile desktop - **Altezza:** `calc(100vh - 70px)` (header escluso) - **Scroll:** Interno quando contenuto > viewport --- ## ๐ŸŽจ **DESIGN SPECIFICATIONS** ### ๐ŸŒˆ **Color Palette** ```css /* Sidebar Background */ .netgescon-sidebar { background: var(--netgescon-gray-900); border-right: 1px solid var(--netgescon-gray-700); } /* Menu Items */ .sidebar-link { color: var(--netgescon-gray-300); background: transparent; } .sidebar-link:hover { color: var(--netgescon-gray-100); background: var(--netgescon-gray-800); } .sidebar-link.active { color: var(--netgescon-primary-light); background: rgba(37, 99, 235, 0.1); border-right: 3px solid var(--netgescon-primary); } ``` ### ๐Ÿ“ **Dimensions** ```css .netgescon-sidebar { width: 280px; height: calc(100vh - 70px); top: 70px; left: 0; position: fixed; z-index: 999; overflow-y: auto; overflow-x: hidden; } /* Mobile */ @media (max-width: 767px) { .netgescon-sidebar { width: 100%; transform: translateX(-100%); transition: transform 0.3s ease; } .netgescon-sidebar.mobile-open { transform: translateX(0); } } ``` --- ## ๐Ÿงฉ **STRUTTURA MODULARE** ### ๐Ÿ“ **Directory Structure** ``` resources/views/components/menu/ โ”œโ”€โ”€ sidebar.blade.php # File principale โ””โ”€โ”€ sections/ # Componenti modulari โ”œโ”€โ”€ header.blade.php # Header sidebar con user info โ”œโ”€โ”€ dashboard.blade.php # Dashboard links โ”œโ”€โ”€ stabili.blade.php # Gestione stabili (submenu) โ”œโ”€โ”€ condomini.blade.php # Gestione condomini (submenu) โ”œโ”€โ”€ contabilita.blade.php # Contabilitร  (submenu) โ”œโ”€โ”€ fiscale.blade.php # Fiscale (submenu) โ”œโ”€โ”€ menu-semplici.blade.php # Menu senza submenu โ”œโ”€โ”€ footer.blade.php # Footer sidebar โ”œโ”€โ”€ menu-helpers.blade.php # Helper funzioni โ””โ”€โ”€ permissions.blade.php # Sistema permessi ``` ### ๐ŸŽฏ **Main Sidebar Component** ```blade ``` --- ## ๐Ÿ‘ฅ **SISTEMA PERMESSI** ### ๐Ÿ” **Ruoli Definiti** ```php // Definiti in config/netgescon.php 'roles' => [ 'super_admin' => 'Super Amministratore', 'admin' => 'Amministratore', 'amministratore' => 'Amministratore Condominio', 'collaboratore' => 'Collaboratore', 'ragioniere' => 'Ragioniere/Commercialista', 'condomino' => 'Condomino', 'guest' => 'Ospite' ]; ``` ### ๐Ÿ›ก๏ธ **Helper Functions** ```blade @php /** * Verifica se l'utente puรฒ accedere a una sezione menu */ function canUserAccessMenu($menuSection, $userRole = null) { $userRole = $userRole ?? (auth()->user()->role ?? 'guest'); $permissions = [ 'super_admin' => ['*'], // Accesso totale 'admin' => [ 'dashboard', 'stabili', 'condomini', 'unita', 'contabilita', 'fiscale', 'comunicazioni', 'utenti', 'reports', 'impostazioni' ], 'amministratore' => [ 'dashboard', 'stabili', 'condomini', 'unita', 'contabilita', 'comunicazioni', 'reports' ], 'collaboratore' => [ 'dashboard', 'stabili', 'condomini', 'unita', 'comunicazioni' ], 'ragioniere' => [ 'dashboard', 'contabilita', 'fiscale', 'reports' ], 'condomino' => [ 'dashboard', 'comunicazioni', 'tickets' ], 'guest' => [] ]; return in_array('*', $permissions[$userRole] ?? []) || in_array($menuSection, $permissions[$userRole] ?? []); } /** * Verifica accesso a qualsiasi menu di una lista */ function canUserAccessAnyMenu($menuSections, $userRole = null) { foreach ($menuSections as $section) { if (canUserAccessMenu($section, $userRole)) { return true; } } return false; } @endphp ``` --- ## ๐Ÿ  **MENU SECTIONS DETAILED** ### 1. **๐Ÿ“Š DASHBOARD** ```blade ``` ### 2. **๐Ÿข STABILI (con Submenu)** ```blade ``` ### 3. **๐Ÿ˜๏ธ CONDOMINI (con Submenu)** ```blade ``` ### 4. **๐Ÿ’ฐ CONTABILITร€ (con Submenu)** ```blade ``` --- ## โšก **JAVASCRIPT FUNCTIONALITY** ### ๐Ÿ“ **File:** `/public/js/components/sidebar.js` ```javascript /** * Sidebar NetGescon - JavaScript Functions */ // Inizializza sidebar function initializeSidebar() { initializeSubmenuToggles(); initializeActiveStates(); initializeMobileOverlay(); initializeScrollBehavior(); } // Gestione submenu toggle function initializeSubmenuToggles() { const toggles = document.querySelectorAll('.sidebar-toggle'); toggles.forEach(toggle => { toggle.addEventListener('click', function() { const targetId = this.getAttribute('data-target'); const submenu = document.getElementById(targetId); const chevron = this.querySelector('.fa-chevron-down'); // Toggle submenu submenu.classList.toggle('open'); // Rotate chevron chevron.classList.toggle('rotate-180'); // Store state in localStorage localStorage.setItem(`submenu-${targetId}`, submenu.classList.contains('open')); }); }); } // Ripristina stato submenu da localStorage function restoreSubmenuStates() { const submenus = document.querySelectorAll('.submenu'); submenus.forEach(submenu => { const stored = localStorage.getItem(`submenu-${submenu.id}`); if (stored === 'true') { submenu.classList.add('open'); const toggle = document.querySelector(`[data-target="${submenu.id}"]`); const chevron = toggle.querySelector('.fa-chevron-down'); chevron.classList.add('rotate-180'); } }); } // Active states management function initializeActiveStates() { const currentUrl = window.location.pathname; const links = document.querySelectorAll('.sidebar-link, .submenu-link'); links.forEach(link => { const href = link.getAttribute('href'); if (href && currentUrl.startsWith(href)) { link.classList.add('active'); // Se รจ un submenu link, apri anche il parent if (link.classList.contains('submenu-link')) { const submenu = link.closest('.submenu'); if (submenu) { submenu.classList.add('open'); const toggle = document.querySelector(`[data-target="${submenu.id}"]`); const chevron = toggle.querySelector('.fa-chevron-down'); chevron.classList.add('rotate-180'); } } } }); } // Mobile behavior function toggleMobileMenu() { const sidebar = document.querySelector('.netgescon-sidebar'); const overlay = document.querySelector('.mobile-overlay'); sidebar.classList.toggle('mobile-open'); if (overlay) { overlay.classList.toggle('hidden'); } else { createMobileOverlay(); } } function createMobileOverlay() { const overlay = document.createElement('div'); overlay.className = 'mobile-overlay fixed inset-0 bg-black bg-opacity-50 z-998 md:hidden'; overlay.onclick = toggleMobileMenu; document.body.appendChild(overlay); } // Smooth scroll interno sidebar function initializeScrollBehavior() { const sidebar = document.querySelector('.netgescon-sidebar'); // Scroll to active item const activeItem = sidebar.querySelector('.active'); if (activeItem) { activeItem.scrollIntoView({ behavior: 'smooth', block: 'center' }); } } // Initialize on DOM ready document.addEventListener('DOMContentLoaded', function() { initializeSidebar(); restoreSubmenuStates(); }); ``` --- ## ๐Ÿ“ฑ **RESPONSIVE BEHAVIOR** ### ๐Ÿ–ฅ๏ธ **Desktop (โ‰ฅ768px)** ```css .netgescon-sidebar { position: fixed; left: 0; transform: none; width: 280px; } .content-area { margin-left: 280px; } ``` ### ๐Ÿ“ฑ **Mobile (โ‰ค767px)** ```css .netgescon-sidebar { position: fixed; left: 0; width: 100%; transform: translateX(-100%); transition: transform 0.3s ease; z-index: 1001; } .netgescon-sidebar.mobile-open { transform: translateX(0); } .content-area { margin-left: 0; } .mobile-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.5); z-index: 1000; } ``` --- ## ๐ŸŽจ **STYLING CLASSES** ### ๐Ÿ”ง **CSS Custom Properties** ```css /* Sidebar Animations */ .submenu { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; } .submenu.open { max-height: 500px; } /* Hover Effects */ .sidebar-link:hover { transform: translateX(4px); transition: all 0.2s ease; } /* Active State */ .sidebar-link.active::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--netgescon-primary); } /* Icon Spacing */ .sidebar-link i { min-width: 20px; margin-right: 12px; } /* Mobile Specific */ @media (max-width: 767px) { .sidebar-link { padding: 16px 20px; font-size: 16px; } .submenu-link { padding: 12px 40px; } } ``` --- ## ๐Ÿงช **TESTING CHECKLIST** ### โœ… **Functional Tests** - [ ] Submenu expand/collapse - [ ] Active state highlighting - [ ] Permission-based visibility - [ ] Mobile menu toggle - [ ] Scroll behavior - [ ] State persistence ### โœ… **Visual Tests** - [ ] Icon alignment - [ ] Hover effects - [ ] Active states styling - [ ] Mobile responsive - [ ] Smooth animations ### โœ… **Accessibility Tests** - [ ] Keyboard navigation - [ ] Screen reader compatibility - [ ] Focus indicators - [ ] ARIA labels --- ## ๐Ÿ› **COMMON ISSUES & FIXES** ### ๐Ÿšจ **Submenu non si apre** **Causa:** JavaScript non inizializzato o selettori errati **Fix:** Verifica inizializzazione e selettori CSS ### ๐Ÿšจ **Active state non funziona** **Causa:** URL routing non corrispondente **Fix:** Aggiorna logica comparazione URL ### ๐Ÿšจ **Mobile overlay non scompare** **Causa:** Event listener click non agganciato **Fix:** Verifica function toggleMobileMenu() ### ๐Ÿšจ **Permessi non funzionano** **Causa:** Helper functions non caricate o ruoli errati **Fix:** Verifica file permissions.blade.php e user roles --- ## ๐Ÿ“š **FILES CORRELATI** ### ๐Ÿงฉ **Templates** - `/resources/views/components/menu/sidebar.blade.php` - `/resources/views/components/menu/sections/` (directory) ### ๐ŸŽจ **Styles** - `/public/css/components/sidebar.css` - `/public/css/netgescon-admin.css` ### โšก **JavaScript** - `/public/js/components/sidebar.js` - `/public/js/netgescon-admin.js` --- ## ๐ŸŽฏ **NEXT STEPS** ### ๐Ÿ”ฎ **Planned Improvements** - [ ] **Sidebar Customization** - User preferences - [ ] **Quick Search** - Search in menu items - [ ] **Favorites** - Pin frequently used items - [ ] **Breadcrumb Integration** - Sync with sidebar state - [ ] **Dark Mode** - Theme switch --- *๐Ÿ“ Documento mantenuto da: GitHub Copilot AI Assistant* *๐Ÿ”— Componente: Sidebar NetGescon Interface v2.1.0*