netgescon-master/resources/views/components/menu/sidebar-new.blade.php
2025-07-20 14:57:25 +00:00

432 lines
23 KiB
PHP

{{-- Nuovo menu sidebar completo e organizzato logicamente --}}
<nav class="h-full flex flex-col bg-yellow-300 dark:bg-gray-800 border-r-4 border-indigo-500 dark:border-yellow-500 py-6 px-2 w-full shadow-xl z-50">
@php
$userRoles = auth()->check() ? auth()->user()->getRoleNames()->toArray() : [];
$panelPrefix = '';
if (in_array('super-admin', $userRoles)) {
$panelPrefix = 'superadmin.';
} elseif (in_array('admin', $userRoles) || in_array('amministratore', $userRoles)) {
$panelPrefix = 'admin.';
}
// MENU ORGANIZZATO IN CATEGORIE LOGICHE
$mainMenu = [
// 1. DASHBOARD & OVERVIEW
[
'icon' => 'fa-solid fa-home',
'label' => __('menu.dashboard'),
'route' => $panelPrefix . 'dashboard',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore', 'condomino'],
],
// 2. ANAGRAFICA (Dati di base)
[
'icon' => 'fa-solid fa-address-book',
'label' => __('menu.anagrafica'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
'expandable' => true,
'id' => 'anagrafica-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-building',
'label' => __('menu.stabili'),
'route' => $panelPrefix . 'stabili.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-door-open',
'label' => __('menu.unita_immobiliari'),
'route' => $panelPrefix . 'unitaImmobiliari.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-users',
'label' => __('menu.soggetti'),
'route' => $panelPrefix . 'soggetti.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-id-card',
'label' => __('menu.anagrafica_condominiale'),
'route' => $panelPrefix . 'anagrafica-condominiale.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-key',
'label' => __('menu.diritti_reali'),
'route' => $panelPrefix . 'diritti-reali.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-table',
'label' => __('menu.tabelle_millesimali'),
'route' => $panelPrefix . 'tabelle-millesimali.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-address-book',
'label' => __('menu.rubrica'),
'route' => $panelPrefix . 'rubrica.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-truck',
'label' => __('menu.fornitori'),
'route' => $panelPrefix . 'fornitori.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
]
],
// 3. CONTRATTI & LOCAZIONI
[
'icon' => 'fa-solid fa-file-contract',
'label' => __('menu.contratti_locazioni'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
'expandable' => true,
'id' => 'contratti-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-file-signature',
'label' => __('menu.contratti_locazione'),
'route' => $panelPrefix . 'contratti-locazione.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
// Placeholder per future funzionalità contratti
[
'icon' => 'fa-solid fa-calendar-dollar',
'label' => __('menu.canoni_scadenze'),
'route' => '#', // TODO: Implementare
'roles' => ['admin', 'super-admin', 'amministratore'],
],
]
],
// 4. CONTABILITÀ & FINANZE
[
'icon' => 'fa-solid fa-file-invoice-dollar',
'label' => __('menu.contabilita'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore'],
'expandable' => true,
'id' => 'contabilita-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-chart-line',
'label' => __('menu.movimenti'),
'route' => $panelPrefix . 'contabilita.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
[
'icon' => 'fa-solid fa-balance-scale',
'label' => __('menu.bilanci'),
'route' => $panelPrefix . 'bilanci.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
[
'icon' => 'fa-solid fa-university',
'label' => __('menu.banche'),
'route' => $panelPrefix . 'banche.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
[
'icon' => 'fa-solid fa-exchange-alt',
'label' => __('menu.movimenti_bancari'),
'route' => $panelPrefix . 'movimenti-bancari.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
[
'icon' => 'fa-solid fa-file-import',
'label' => __('menu.import_export_xml'),
'route' => $panelPrefix . 'contabilita.import-xml',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
]
],
// 5. SPESE & RIPARTIZIONI
[
'icon' => 'fa-solid fa-calculator',
'label' => __('menu.gestione_spese'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore'],
'expandable' => true,
'id' => 'spese-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-receipt',
'label' => __('menu.voci_spesa'),
'route' => $panelPrefix . 'voci-spesa.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
[
'icon' => 'fa-solid fa-chart-pie',
'label' => __('menu.ripartizione_spese'),
'route' => $panelPrefix . 'ripartizioni-spesa.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
[
'icon' => 'fa-solid fa-credit-card',
'label' => __('menu.piano_rateizzazione'),
'route' => $panelPrefix . 'piani-rateizzazione.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
[
'icon' => 'fa-solid fa-calendar-check',
'label' => __('menu.rate'),
'route' => $panelPrefix . 'rate.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
]
],
// 6. ASSEMBLEE & DELIBERE
[
'icon' => 'fa-solid fa-users-cog',
'label' => __('menu.assemblee'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore'],
'expandable' => true,
'id' => 'assemblee-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-calendar-alt',
'label' => __('menu.calendario_assemblee'),
'route' => $panelPrefix . 'assemblee.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
// Placeholder per future funzionalità assemblee
[
'icon' => 'fa-solid fa-file-alt',
'label' => __('menu.convocazioni'),
'route' => '#', // TODO: Implementare
'roles' => ['admin', 'super-admin', 'amministratore'],
],
]
],
// 7. PREVENTIVI & PIANIFICAZIONE
[
'icon' => 'fa-solid fa-clipboard-list',
'label' => __('menu.preventivi_planning'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore'],
'expandable' => true,
'id' => 'preventivi-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-file-invoice',
'label' => __('menu.preventivi'),
'route' => $panelPrefix . 'preventivi.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
// Placeholder per future funzionalità preventivi
]
],
// 8. DOCUMENTI & ARCHIVIO
[
'icon' => 'fa-solid fa-folder-open',
'label' => __('menu.documenti'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
'expandable' => true,
'id' => 'documenti-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-paperclip',
'label' => __('menu.allegati'),
'route' => $panelPrefix . 'allegati.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-file-alt',
'label' => __('menu.documenti_ufficiali'),
'route' => $panelPrefix . 'documenti.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore'],
],
[
'icon' => 'fa-solid fa-folder',
'label' => __('menu.file_manager'),
'route' => $panelPrefix . 'file-manager.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
]
],
// 9. GESTIONI AMMINISTRATIVE
[
'icon' => 'fa-solid fa-cogs',
'label' => __('menu.gestioni'),
'route' => $panelPrefix . 'gestioni.index',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
// 10. SUPPORTO & ASSISTENZA
[
'icon' => 'fa-solid fa-life-ring',
'label' => __('menu.supporto'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore', 'condomino'],
'expandable' => true,
'id' => 'supporto-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-ticket-alt',
'label' => __('menu.tickets'),
'route' => $panelPrefix . 'tickets.index',
'roles' => ['admin', 'super-admin', 'amministratore', 'collaboratore', 'condomino'],
],
]
],
// 11. SISTEMA & CONFIGURAZIONI
[
'icon' => 'fa-solid fa-cog',
'label' => __('menu.sistema'),
'route' => '#',
'roles' => ['admin', 'super-admin', 'amministratore'],
'expandable' => true,
'id' => 'sistema-menu',
'submenu' => [
[
'icon' => 'fa-solid fa-users-cog',
'label' => __('menu.utenti'),
'route' => $panelPrefix . 'users.index',
'roles' => ['admin', 'super-admin'],
],
[
'icon' => 'fa-solid fa-user-shield',
'label' => __('menu.ruoli'),
'route' => '#', // TODO: Implementare RoleController avanzato
'roles' => ['admin', 'super-admin'],
],
[
'icon' => 'fa-solid fa-key',
'label' => __('menu.api_tokens'),
'route' => $panelPrefix . 'api-tokens.index',
'roles' => ['admin', 'super-admin'],
],
[
'icon' => 'fa-solid fa-sliders-h',
'label' => __('menu.impostazioni'),
'route' => $panelPrefix . 'impostazioni',
'roles' => ['admin', 'super-admin', 'amministratore'],
],
]
],
];
@endphp
{{-- Header fisso con info stabile --}}
<div class="px-2 pt-3 pb-2 bg-yellow-200 dark:bg-gray-700 border-b-2 border-indigo-500 dark:border-yellow-500 sticky top-0 z-20">
<div class="flex flex-col items-center">
<span class="text-xs text-gray-700 dark:text-gray-300 mb-1">{{ $annoAttivo }}/{{ $gestione }}</span>
<div class="flex items-center gap-2 bg-yellow-200 dark:bg-gray-800 rounded px-2 py-1 shadow" style="min-width: 160px;">
<div class="flex flex-col justify-center items-center mr-1">
<button id="prev-stabile" class="w-6 h-6 flex items-center justify-center rounded bg-indigo-500 text-white hover:bg-indigo-700 text-xs mb-1" title="Stabile precedente">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-up" width="18" height="18" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><polyline points="6 15 12 9 18 15" /></svg>
</button>
<button id="next-stabile" class="w-6 h-6 flex items-center justify-center rounded bg-indigo-500 text-white hover:bg-indigo-700 text-xs" title="Stabile successivo">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-down" width="18" height="18" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><polyline points="6 9 12 15 18 9" /></svg>
</button>
</div>
<button id="current-stabile" class="flex-1 text-base font-semibold text-gray-900 dark:text-gray-100 bg-transparent hover:bg-yellow-300 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 transition text-center" title="Cambia stabile">
{{ $stabileAttivo }}
</button>
</div>
<button id="toggle-darkmode" class="mt-2 px-2 py-1 rounded bg-gray-800 dark:bg-yellow-600 text-yellow-300 dark:text-gray-900 hover:bg-gray-900 dark:hover:bg-yellow-700 text-xs flex items-center gap-1" title="Attiva/disattiva modalità scura">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-moon w-4 h-4 dark:hidden" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 3h.393a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /></svg>
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-sun w-4 h-4 hidden dark:block" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><circle cx="12" cy="12" r="4" /><path d="m3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /></svg>
<span class="hidden md:inline">{{ __('Dark Mode') }}</span>
</button>
</div>
</div>
{{-- Menu principale scrollabile --}}
<div class="flex-1 overflow-y-auto py-4">
<ul class="space-y-1">
@foreach($mainMenu as $menuItem)
@if(auth()->check() && array_intersect($userRoles, $menuItem['roles']))
<li>
@if(isset($menuItem['expandable']) && $menuItem['expandable'])
{{-- Menu espandibile --}}
<div x-data="{ open: false }" class="relative">
<button @click="open = !open"
class="w-full flex items-center justify-between px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 rounded-lg hover:bg-yellow-400 dark:hover:bg-gray-700 group transition-all duration-200">
<div class="flex items-center">
<i class="{{ $menuItem['icon'] }} w-5 h-5 mr-3 text-indigo-600 dark:text-yellow-400"></i>
<span>{{ $menuItem['label'] }}</span>
</div>
<svg class="w-4 h-4 transition-transform duration-200" :class="{'rotate-180': open}" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
{{-- Sottomenu --}}
<div x-show="open" x-transition class="mt-1 ml-6 space-y-1">
@foreach($menuItem['submenu'] as $subItem)
@if(auth()->check() && array_intersect($userRoles, $subItem['roles']))
<a href="{{ $subItem['route'] != '#' ? route($subItem['route']) : '#' }}"
class="flex items-center px-3 py-2 text-sm text-gray-600 dark:text-gray-300 rounded-lg hover:bg-yellow-300 dark:hover:bg-gray-600 transition-colors duration-200 {{ $subItem['route'] == '#' ? 'cursor-not-allowed opacity-50' : '' }}">
<i class="{{ $subItem['icon'] }} w-4 h-4 mr-2 text-gray-500 dark:text-gray-400"></i>
<span>{{ $subItem['label'] }}</span>
@if($subItem['route'] == '#')
<span class="ml-auto text-xs bg-orange-200 dark:bg-orange-600 text-orange-800 dark:text-orange-200 px-1 rounded">TODO</span>
@endif
</a>
@endif
@endforeach
</div>
</div>
@else
{{-- Menu normale --}}
<a href="{{ $menuItem['route'] != '#' ? route($menuItem['route']) : '#' }}"
class="flex items-center px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 rounded-lg hover:bg-yellow-400 dark:hover:bg-gray-700 group transition-all duration-200 {{ $menuItem['route'] == '#' ? 'cursor-not-allowed opacity-50' : '' }}">
<i class="{{ $menuItem['icon'] }} w-5 h-5 mr-3 text-indigo-600 dark:text-yellow-400"></i>
<span>{{ $menuItem['label'] }}</span>
@if($menuItem['route'] == '#')
<span class="ml-auto text-xs bg-orange-200 dark:bg-orange-600 text-orange-800 dark:text-orange-200 px-1 rounded">TODO</span>
@endif
</a>
@endif
</li>
@endif
@endforeach
</ul>
</div>
{{-- Footer con info utente --}}
<div class="border-t border-gray-300 dark:border-gray-600 pt-4 mt-4">
<div class="px-3">
<div class="flex items-center">
<div class="flex-shrink-0">
<div class="w-8 h-8 bg-indigo-500 rounded-full flex items-center justify-center">
<span class="text-white text-sm font-semibold">{{ substr(auth()->user()->name ?? 'U', 0, 1) }}</span>
</div>
</div>
<div class="ml-3 min-w-0 flex-1">
<p class="text-sm font-medium text-gray-700 dark:text-gray-200 truncate">
{{ auth()->user()->name ?? 'Utente' }}
</p>
<p class="text-xs text-gray-500 dark:text-gray-400 truncate">
{{ implode(', ', $userRoles) }}
</p>
</div>
</div>
</div>
</div>
</nav>
{{-- Alpine.js per interattività menu --}}
@push('scripts')
<script>
// Menu interattività aggiuntiva se necessaria
document.addEventListener('DOMContentLoaded', function() {
// Gestione menu collassabile se necessario
});
</script>
@endpush