netgescon-master/netgescon-laravel/resources/views/layouts/app-clean.blade.php

554 lines
22 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>@yield('title', 'NetGesCon') - {{ config('app.name', 'Laravel') }}</title>
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- FontAwesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<!-- NetGesCon Clean Styles -->
<style>
:root {
--netgescon-primary: #2563eb;
--netgescon-secondary: #64748b;
--netgescon-light: #f8fafc;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: var(--netgescon-light);
}
/* Layout orizzontale integrato */
.navbar-top {
background: linear-gradient(135deg, var(--netgescon-primary) 0%, #1d4ed8 100%);
color: white;
padding: 0.75rem;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
min-height: 85px; /* Ridotto per essere più compatto */
}
.main-layout {
display: flex;
min-height: calc(100vh - 85px);
margin-top: 85px; /* Spazio per header fisso ridotto */
transition: all 0.3s ease;
}
.sidebar-integrated {
width: 280px;
background: #fbbf24; /* giallo come nell'originale */
border-right: 4px solid var(--netgescon-primary);
min-height: calc(100vh - 85px);
position: fixed;
top: 85px;
left: 0;
overflow-y: auto;
transition: all 0.3s ease;
}
.sidebar-integrated.collapsed {
width: 0;
overflow: hidden;
}
.content-area {
flex: 1;
padding: 20px;
background-color: var(--netgescon-light);
margin-left: 280px; /* Spazio per sidebar fissa */
transition: all 0.3s ease;
overflow-y: auto;
max-height: calc(100vh - 120px);
}
.sidebar-integrated.collapsed + .content-area {
margin-left: 0; /* Quando sidebar è nascosta */
}
.toggle-sidebar {
background: rgba(255,255,255,0.2) !important;
border: 1px solid rgba(255,255,255,0.3) !important;
color: white !important;
margin-right: 8px;
}
.toggle-sidebar:hover {
background: rgba(255,255,255,0.3) !important;
color: white !important;
}
/* Dark Mode styles */
.dark-mode {
background-color: #1a1a1a !important;
color: #ffffff !important;
}
.dark-mode .navbar-top {
background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%) !important;
}
.dark-mode .sidebar-integrated {
background: #374151 !important; /* grigio scuro invece del giallo */
border-right-color: #6b7280 !important;
}
.dark-mode .sidebar-integrated .border-bottom {
border-color: #6b7280 !important;
}
.dark-mode .content-area {
background-color: #1a1a1a !important;
}
.dark-mode .card {
background-color: #2d2d2d !important;
border-color: #444 !important;
color: #ffffff !important;
}
.dark-mode .nav-link {
color: #ffffff !important;
}
.dark-mode .nav-link:hover {
background-color: rgba(255,255,255,0.1) !important;
}
.dark-mode .nav-link.active {
background-color: #3b82f6 !important;
color: #ffffff !important;
}
.dark-mode .text-dark {
color: #ffffff !important;
}
.dark-mode .text-muted {
color: #aaaaaa !important;
}
.dark-mode .border-primary {
border-color: #6b7280 !important;
}
.dark-mode .bg-primary {
background-color: #3b82f6 !important;
}
@media (max-width: 768px) {
.main-layout {
flex-direction: column;
}
.sidebar-integrated {
width: 100%;
order: 2;
}
.content-area {
order: 1;
}
}
</style>
@stack('styles')
{{-- CSS Personalizzato Utente --}}
@auth
<style id="user-theme-css">
{!! \App\Helpers\ThemeHelper::generateCustomCSS() !!}
</style>
@endauth
</head>
<body>
{{-- Header superiore --}}
<div class="navbar-top">
<div class="d-flex justify-content-between align-items-center">
<div class="d-flex align-items-center">
<button id="toggle-sidebar" class="btn btn-outline-light btn-sm toggle-sidebar me-3" title="Nascondi/Mostra Menu">
<i class="fas fa-bars"></i>
</button>
<h4 class="mb-0">🏢 NetGesCon</h4>
</div>
<!-- Info Stabile e Gestione Centralizzati -->
<div class="d-flex align-items-center gap-4">
<div class="text-center">
<div class="fw-bold">Condominio Roma Centro</div>
<div class="small opacity-75">CF: 12345678901 | Saldo: €12.350,00</div>
</div>
<div class="text-center">
<span class="badge bg-success px-3 py-2">ORDINARIA</span>
<div class="small">2025/Ord.</div>
</div>
<div class="text-center">
<div class="small">Prossime Scadenze</div>
<button class="btn btn-warning btn-sm" onclick="openCalendar()">
<i class="fas fa-exclamation-triangle me-1"></i>3 in scadenza
</button>
</div>
</div>
<!-- Controlli Utente -->
<div class="d-flex align-items-center gap-2">
<span class="small opacity-75">Gestione Condominiale</span>
<div class="vr opacity-50"></div>
<button class="btn btn-outline-light btn-sm" onclick="openNoteModal()" title="Note e Chiamate">
<i class="fas fa-sticky-note me-1"></i>Note
</button>
<button class="btn btn-outline-light btn-sm" onclick="openRubrica()" title="Rubrica">
<i class="fas fa-address-book me-1"></i>Rubrica
</button>
<button class="btn btn-outline-light btn-sm" onclick="toggleDarkMode()" title="Dark Mode">
<i class="fas fa-moon me-1"></i>Dark
</button>
<div class="vr opacity-50"></div>
<span class="text-light small">
<i class="fas fa-user-circle me-1"></i>
{{ auth()->user()->name ?? 'Amministratore' }}
</span>
<form method="POST" action="{{ route('logout') }}" class="d-inline">
@csrf
<button type="submit" class="btn btn-outline-light btn-sm" title="Logout">
<i class="fas fa-sign-out-alt"></i>
</button>
</form>
</div>
</div>
</div>
{{-- Layout principale orizzontale --}}
<div class="main-layout">
{{-- Sidebar integrata --}}
<div class="sidebar-integrated">
@include('components.menu.sidebar')
</div>
{{-- Area contenuto --}}
<div class="content-area">
{{-- Alert messages --}}
@if (session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="fas fa-check-circle me-2"></i>
{{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
@endif
@if (session('error'))
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-circle me-2"></i>
{{ session('error') }}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
@endif
@if (session('warning'))
<div class="alert alert-warning alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-triangle me-2"></i>
{{ session('warning') }}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
@endif
{{-- Content della pagina --}}
@yield('content')
{{-- Footer --}}
<footer class="mt-4 pt-3 border-top">
<div class="row">
<div class="col-md-6">
<small class="text-muted">
© {{ date('Y') }} NetGesCon - Gestione Condominiale
<span class="ms-2">v2.1.0</span>
</small>
</div>
<div class="col-md-6 text-end">
<small class="text-muted">
<a href="#" class="text-decoration-none text-muted me-2">Supporto</a>
<a href="#" class="text-decoration-none text-muted me-2">Contatti</a>
<a href="#" class="text-decoration-none text-muted">www.netgescon.it</a>
</small>
</div>
</div>
</footer>
</div>
</div>
{{-- Mobile sidebar --}}
<div class="offcanvas offcanvas-start bg-warning" tabindex="-1" id="mobile-sidebar" aria-labelledby="mobileSidebarLabel">
<div class="offcanvas-header border-bottom border-primary">
<h5 class="offcanvas-title" id="mobileSidebarLabel">Menu</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body p-0">
@include('components.menu.sidebar')
</div>
</div>
{{-- Mobile menu button --}}
<button class="btn btn-primary d-md-none position-fixed" style="top: 20px; left: 20px; z-index: 1001;"
type="button" data-bs-toggle="offcanvas" data-bs-target="#mobile-sidebar">
<i class="fas fa-bars"></i>
</button>
{{-- Modal Note e Chiamate --}}
<div class="modal fade" id="noteModal" tabindex="-1" aria-labelledby="noteModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="noteModalLabel">
<i class="fas fa-sticky-note me-2"></i>Note, Chiamate e TODO
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-6">
<h6><i class="fas fa-phone text-success me-2"></i>Chiamate Recenti</h6>
<div class="list-group mb-3">
<div class="list-group-item">
<div class="d-flex justify-content-between">
<div>
<strong>Mario Rossi</strong> - Apt. 12
<br><small class="text-muted">Problema riscaldamento</small>
</div>
<small class="text-muted">10:30</small>
</div>
</div>
<div class="list-group-item">
<div class="d-flex justify-content-between">
<div>
<strong>Ditta Elettrica</strong>
<br><small class="text-muted">Preventivo lavori</small>
</div>
<small class="text-muted">Ieri</small>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<h6><i class="fas fa-tasks text-warning me-2"></i>TODO Urgenti</h6>
<div class="list-group mb-3">
<div class="list-group-item">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="todo1">
<label class="form-check-label" for="todo1">
Raccomandata Agenzia Entrate
</label>
</div>
</div>
<div class="list-group-item">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="todo2">
<label class="form-check-label" for="todo2">
Controllo polizza assicurazione
</label>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<h6><i class="fas fa-edit text-primary me-2"></i>Nuova Nota</h6>
<form>
<div class="mb-3">
<label for="noteText" class="form-label">Testo della nota</label>
<textarea class="form-control" id="noteText" rows="3" placeholder="Inserisci la tua nota..."></textarea>
</div>
<div class="row">
<div class="col-md-6">
<label for="noteType" class="form-label">Tipo</label>
<select class="form-select" id="noteType">
<option value="nota">Nota</option>
<option value="chiamata">Chiamata</option>
<option value="todo">TODO</option>
<option value="promemoria">Promemoria</option>
</select>
</div>
<div class="col-md-6">
<label for="notePriority" class="form-label">Priorità</label>
<select class="form-select" id="notePriority">
<option value="normale">Normale</option>
<option value="alta">Alta</option>
<option value="urgente">Urgente</option>
</select>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Chiudi</button>
<button type="button" class="btn btn-primary">Salva Nota</button>
</div>
</div>
</div>
</div>
<!-- Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<!-- NetGesCon Script -->
<script>
// Toggle sidebar
document.getElementById('toggle-sidebar').addEventListener('click', function() {
const sidebar = document.querySelector('.sidebar-integrated');
const icon = this.querySelector('i');
sidebar.classList.toggle('collapsed');
if (sidebar.classList.contains('collapsed')) {
icon.className = 'fas fa-chevron-right';
this.title = 'Mostra Menu';
} else {
icon.className = 'fas fa-bars';
this.title = 'Nascondi Menu';
}
});
// Note e chiamate modal
function openNoteModal() {
const noteModal = new bootstrap.Modal(document.getElementById('noteModal'));
noteModal.show();
}
// Calendario e scadenze
function openCalendar() {
alert('📅 Apertura Calendario NetGesCon\n\n' +
'🔸 Prossime Scadenze:\n' +
'• Rata Dicembre 2024 - 15/01/2025\n' +
'• Assicurazione Condominio - 28/02/2025\n' +
'• Revisione Impianti - 15/03/2025\n' +
'• Assemblea Ordinaria - 30/03/2025\n\n' +
'📝 Funzionalità in sviluppo:\n' +
'• Visualizzazione giorno/settimana/mese/anno\n' +
'• Sincronizzazione Google/Microsoft Calendar\n' +
'• Promemoria automatici\n' +
'• Gestione appuntamenti\n' +
'• Note e chiamate integrate');
}
// Dark Mode
function toggleDarkMode() {
document.body.classList.toggle('dark-mode');
const isDark = document.body.classList.contains('dark-mode');
// Salva la preferenza
localStorage.setItem('darkMode', isDark);
// Cambia icona
const darkButtons = document.querySelectorAll('[onclick="toggleDarkMode()"] i');
darkButtons.forEach(btn => {
btn.className = isDark ? 'fas fa-sun' : 'fas fa-moon';
});
// Cambia anche il testo del tooltip
const darkBtns = document.querySelectorAll('[onclick="toggleDarkMode()"]');
darkBtns.forEach(btn => {
btn.setAttribute('title', isDark ? 'Light Mode' : 'Dark Mode');
});
}
// Carica preferenza Dark Mode all'avvio
document.addEventListener('DOMContentLoaded', function() {
if (localStorage.getItem('darkMode') === 'true') {
toggleDarkMode();
}
});
document.addEventListener('DOMContentLoaded', function() {
const noteBtn = document.querySelector('[title="Note e Chiamate"]');
if (noteBtn) {
noteBtn.addEventListener('click', function() {
const noteModal = new bootstrap.Modal(document.getElementById('noteModal'));
noteModal.show();
});
}
// Toggle Dark Mode
function toggleDarkMode() {
document.body.classList.toggle('dark-mode');
// Salva preferenza nel localStorage
const isDark = document.body.classList.contains('dark-mode');
localStorage.setItem('darkMode', isDark);
// Aggiorna icona
const darkBtn = document.querySelector('[onclick="toggleDarkMode()"] i');
if (darkBtn) {
darkBtn.className = isDark ? 'fas fa-sun me-1' : 'fas fa-moon me-1';
}
}
// Carica preferenza Dark Mode
if (localStorage.getItem('darkMode') === 'true') {
document.body.classList.add('dark-mode');
const darkBtn = document.querySelector('[onclick="toggleDarkMode()"] i');
if (darkBtn) {
darkBtn.className = 'fas fa-sun me-1';
}
}
// Calendario (placeholder)
function openCalendar() {
alert('Calendario Scadenze:\n\n📅 GENNAIO 2025\n• 15/01 - Rata dicembre (3 giorni)\n• 20/01 - Scadenza F24 (8 giorni)\n• 28/01 - Assicurazione (16 giorni)\n\n⚠ 3 scadenze imminenti');
}
// Funzione per aprire le news (placeholder)
function openNewsPage() {
window.open('https://www.ansa.it/', '_blank');
}
// Rubrica (placeholder)
const rubriceBtn = document.querySelector('[title="Rubrica"]');
if (rubriceBtn) {
rubriceBtn.addEventListener('click', function() {
alert('Rubrica - Funzione in sviluppo');
});
}
// Stampa
const printBtn = document.querySelector('[title="Stampa"]');
if (printBtn) {
printBtn.addEventListener('click', function() {
window.print();
});
}
// Scadenze
const scadenzeBtn = document.querySelector('[title="Vedi Scadenze"]');
if (scadenzeBtn) {
scadenzeBtn.addEventListener('click', function() {
alert('Scadenze:\n• Rata dicembre 2024 - 15/01/2025\n• Assicurazione condominiale - 28/02/2025\n• Revisione impianti - 15/03/2025');
});
}
// Cambio stabile
const stabileBtn = document.querySelector('[title="Cambia Stabile"]');
if (stabileBtn) {
stabileBtn.addEventListener('click', function() {
alert('Selezione Stabile - Funzione in sviluppo');
});
}
});
</script>
@stack('scripts')
</body>
</html>