netgescon-day0/docs/90-UI-interfaccia-unica/90-01-content/03-cards-statistiche.md

11 KiB

📊 CARDS STATISTICHE STANDARD

Template per cards e visualizzazione statistiche


🏗️ PATTERN 3: CARDS STATISTICHE

🎯 Utilizzo: Dashboard e pagine overview moduli

Template Base 4 Cards:

@section('stats-cards')
<div class="row mb-3">
    <div class="col-md-3">
        <div class="small-box bg-primary">
            <div class="inner">
                <h3>{{ $stats['totale'] ?? 0 }}</h3>
                <p>Totale Items</p>
            </div>
            <div class="icon">
                <i class="fas fa-list"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-success">
            <div class="inner">
                <h3>{{ $stats['attivi'] ?? 0 }}</h3>
                <p>Attivi</p>
            </div>
            <div class="icon">
                <i class="fas fa-check"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-warning">
            <div class="inner">
                <h3>{{ $stats['pending'] ?? 0 }}</h3>
                <p>In Sospeso</p>
            </div>
            <div class="icon">
                <i class="fas fa-clock"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-danger">
            <div class="inner">
                <h3>{{ $stats['problemi'] ?? 0 }}</h3>
                <p>Problemi</p>
            </div>
            <div class="icon">
                <i class="fas fa-exclamation"></i>
            </div>
        </div>
    </div>
</div>
@endsection

🎨 COLORI STANDARD CARDS

Color Mapping per Consistency:

/* AdminLTE Small Box Colors */
.small-box.bg-primary { 
    background: #007bff !important; 
    color: #fff;
}    /* Totali/Generici */

.small-box.bg-success { 
    background: #28a745 !important; 
    color: #fff;
}    /* Positivi/Attivi/Successi */

.small-box.bg-warning { 
    background: #ffc107 !important; 
    color: #212529;
}    /* In Attesa/Sospeso/Warning */

.small-box.bg-danger { 
    background: #dc3545 !important; 
    color: #fff;
}     /* Errori/Problemi/Critici */

.small-box.bg-info { 
    background: #17a2b8 !important; 
    color: #fff;
}       /* Info/Neutro/Secondario */

.small-box.bg-secondary { 
    background: #6c757d !important; 
    color: #fff;
}  /* Disattivi/Archiviati */

Quando Usare Ogni Colore:

  • 🔵 Primary (blue): Contatori totali, numeri generici
  • 🟢 Success (green): Stati positivi, attivi, completati
  • 🟡 Warning (yellow): In attesa, sospesi, da verificare
  • 🔴 Danger (red): Errori, problemi, scaduti
  • 🔵 Info (cyan): Informazioni neutre, statistiche
  • Secondary (gray): Inattivi, archiviati, disabilitati

📊 ESEMPI SPECIFICI PER MODULO

Fornitori:

@section('stats-cards')
<div class="row mb-3">
    <div class="col-md-3">
        <div class="small-box bg-primary">
            <div class="inner">
                <h3>{{ $stats['totale_fornitori'] ?? 0 }}</h3>
                <p>Totale Fornitori</p>
            </div>
            <div class="icon">
                <i class="fas fa-truck"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-success">
            <div class="inner">
                <h3>{{ $stats['attivi'] ?? 0 }}</h3>
                <p>Attivi</p>
            </div>
            <div class="icon">
                <i class="fas fa-check-circle"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-warning">
            <div class="inner">
                <h3>{{ $stats['questo_mese'] ?? 0 }}</h3>
                <p>Nuovi Questo Mese</p>
            </div>
            <div class="icon">
                <i class="fas fa-calendar"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-info">
            <div class="inner">
                <h3>{{ $stats['fatture_pending'] ?? 0 }}</h3>
                <p>Fatture in Attesa</p>
            </div>
            <div class="icon">
                <i class="fas fa-euro-sign"></i>
            </div>
        </div>
    </div>
</div>
@endsection

Gestioni:

@section('stats-cards')
<div class="row mb-3">
    <div class="col-md-3">
        <div class="small-box bg-primary">
            <div class="inner">
                <h3>{{ $stats['totale_gestioni'] ?? 0 }}</h3>
                <p>Totale Gestioni</p>
            </div>
            <div class="icon">
                <i class="fas fa-calendar-alt"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-success">
            <div class="inner">
                <h3>{{ $stats['aperte'] ?? 0 }}</h3>
                <p>Gestioni Aperte</p>
            </div>
            <div class="icon">
                <i class="fas fa-folder-open"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-warning">
            <div class="inner">
                <h3>{{ $stats['da_chiudere'] ?? 0 }}</h3>
                <p>Da Chiudere</p>
            </div>
            <div class="icon">
                <i class="fas fa-clock"></i>
            </div>
        </div>
    </div>
    <div class="col-md-3">
        <div class="small-box bg-secondary">
            <div class="inner">
                <h3>{{ $stats['archiviate'] ?? 0 }}</h3>
                <p>Archiviate</p>
            </div>
            <div class="icon">
                <i class="fas fa-archive"></i>
            </div>
        </div>
    </div>
</div>
@endsection

📱 RESPONSIVE DESIGN

Template Mobile-Friendly:

@section('stats-cards')
<div class="row mb-3">
    <!-- Desktop: 4 colonne, Tablet: 2 colonne, Mobile: 1 colonna -->
    <div class="col-12 col-sm-6 col-md-3">
        <div class="small-box bg-primary">
            <div class="inner">
                <h3>{{ $stats['totale'] ?? 0 }}</h3>
                <p class="d-none d-sm-block">Totale Items</p>
                <p class="d-sm-none">Totale</p> <!-- Testo corto su mobile -->
            </div>
            <div class="icon">
                <i class="fas fa-list"></i>
            </div>
        </div>
    </div>
    <!-- Replica per altre cards -->
</div>
@endsection

CSS Responsive per Cards:

/* Responsive adjustments */
@media (max-width: 576px) {
    .small-box h3 {
        font-size: 1.5rem; /* Più piccolo su mobile */
    }
    
    .small-box p {
        font-size: 0.875rem;
        margin-bottom: 0;
    }
    
    .small-box .icon {
        font-size: 2rem; /* Icona più piccola */
        bottom: 5px;
        right: 5px;
    }
}

@media (max-width: 768px) {
    .small-box {
        margin-bottom: 1rem; /* Più spazio tra cards */
    }
}

🔢 FORMATTAZIONE NUMERI

Helper per Formattazione:

// In Controller - formatHelper per stats
private function formatStats($stats) {
    return [
        'totale' => number_format($stats['totale'], 0, ',', '.'),
        'attivi' => number_format($stats['attivi'], 0, ',', '.'),
        'importo' => '€ ' . number_format($stats['importo'], 2, ',', '.'),
        'percentuale' => number_format($stats['percentuale'], 1) . '%'
    ];
}

Template con Formattazione:

<div class="small-box bg-success">
    <div class="inner">
        @if(isset($stats['importo']))
            <h3>€ {{ number_format($stats['importo'], 0, ',', '.') }}</h3>
        @else
            <h3>{{ number_format($stats['attivi'] ?? 0, 0, ',', '.') }}</h3>
        @endif
        <p>Fatturato Attivo</p>
    </div>
    <div class="icon">
        <i class="fas fa-euro-sign"></i>
    </div>
</div>

🎯 CARDS CLICKABILI

<div class="col-md-3">
    <a href="{{ route('admin.fornitori.index', ['filter' => 'attivi']) }}" class="small-box-link">
        <div class="small-box bg-success">
            <div class="inner">
                <h3>{{ $stats['attivi'] ?? 0 }}</h3>
                <p>Fornitori Attivi</p>
            </div>
            <div class="icon">
                <i class="fas fa-check-circle"></i>
            </div>
            <div class="small-box-footer">
                Vedi Lista <i class="fas fa-arrow-circle-right"></i>
            </div>
        </div>
    </a>
</div>
.small-box-link {
    color: inherit;
    text-decoration: none;
}

.small-box-link:hover {
    color: inherit;
    text-decoration: none;
}

.small-box-link:hover .small-box {
    transform: translateY(-2px);
    box-shadow: 0 4px 8px rgba(0,0,0,0.15);
}

.small-box-footer {
    background: rgba(0,0,0,0.1);
    color: rgba(255,255,255,0.8);
    display: block;
    padding: 3px 0;
    text-align: center;
    text-decoration: none;
    font-size: 12px;
}

📊 CARDS ADVANCED

Card con Progress Bar:

<div class="col-md-3">
    <div class="small-box bg-info">
        <div class="inner">
            <h3>{{ $stats['completamento'] ?? 0 }}%</h3>
            <p>Completamento</p>
            <div class="progress" style="height: 4px; margin-top: 5px;">
                <div class="progress-bar" style="width: {{ $stats['completamento'] ?? 0 }}%"></div>
            </div>
        </div>
        <div class="icon">
            <i class="fas fa-tasks"></i>
        </div>
    </div>
</div>

Card con Badge:

<div class="col-md-3">
    <div class="small-box bg-warning">
        <div class="inner">
            <h3>
                {{ $stats['pending'] ?? 0 }}
                @if(($stats['pending'] ?? 0) > 10)
                    <small class="badge badge-danger">!</small>
                @endif
            </h3>
            <p>In Sospeso</p>
        </div>
        <div class="icon">
            <i class="fas fa-clock"></i>
        </div>
    </div>
</div>

🚀 IMPLEMENTAZIONE VELOCE

Steps per Cards:

  1. Copia template base 4 cards
  2. Personalizza labels e icone per il modulo
  3. Configura colors appropriati
  4. Implementa stats nel controller
  5. Testa responsive design
  6. Aggiungi links se necessario

Controller Stats Method:

private function calculateStats()
{
    return [
        'totale' => Model::count(),
        'attivi' => Model::where('stato', 'attivo')->count(),
        'pending' => Model::where('stato', 'pending')->count(),
        'questo_mese' => Model::whereMonth('created_at', now()->month)->count(),
    ];
}

📖 Prossimo file: 04-controller-standard.md