++ Primo Caricamento
This commit is contained in:
195
resources/views/dashboard.blade.php
Normal file
195
resources/views/dashboard.blade.php
Normal file
@@ -0,0 +1,195 @@
|
||||
{{--
|
||||
resources/views/dashboard.blade.php — Dashboard principale
|
||||
|
||||
@extends indica da quale layout "ereditare" la struttura HTML.
|
||||
@section riempie le sezioni definite con @yield nel layout.
|
||||
--}}
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Dashboard')
|
||||
@section('page-title', 'Dashboard')
|
||||
|
||||
@section('page-actions')
|
||||
<a href="{{ route('customers.create') }}" class="btn btn-primary">
|
||||
<i class="bi bi-person-plus me-1"></i>Nuovo Cliente
|
||||
</a>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
|
||||
{{-- Messaggio di benvenuto --}}
|
||||
@if ($welcomeMessage)
|
||||
<div class="alert alert-info border-0 shadow-sm mb-4">
|
||||
<i class="bi bi-info-circle me-2"></i>{{ $welcomeMessage }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- ═══ Statistiche ═══════════════════════════════════════════════════ --}}
|
||||
<div class="row g-4 mb-4">
|
||||
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card stat-card h-100">
|
||||
<div class="card-body d-flex align-items-center">
|
||||
<div class="rounded-3 p-3 bg-primary bg-opacity-10 me-3">
|
||||
<i class="bi bi-people fs-3 text-primary"></i>
|
||||
</div>
|
||||
<div>
|
||||
<div class="fs-2 fw-bold">{{ $stats['total'] }}</div>
|
||||
<div class="text-muted small">Clienti totali</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card stat-card h-100">
|
||||
<div class="card-body d-flex align-items-center">
|
||||
<div class="rounded-3 p-3 bg-success bg-opacity-10 me-3">
|
||||
<i class="bi bi-person-check fs-3 text-success"></i>
|
||||
</div>
|
||||
<div>
|
||||
<div class="fs-2 fw-bold text-success">{{ $stats['active'] }}</div>
|
||||
<div class="text-muted small">Clienti attivi</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card stat-card h-100">
|
||||
<div class="card-body d-flex align-items-center">
|
||||
<div class="rounded-3 p-3 bg-warning bg-opacity-10 me-3">
|
||||
<i class="bi bi-person-exclamation fs-3 text-warning"></i>
|
||||
</div>
|
||||
<div>
|
||||
<div class="fs-2 fw-bold text-warning">{{ $stats['prospect'] }}</div>
|
||||
<div class="text-muted small">Prospect</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card stat-card h-100">
|
||||
<div class="card-body d-flex align-items-center">
|
||||
<div class="rounded-3 p-3 bg-info bg-opacity-10 me-3">
|
||||
<i class="bi bi-currency-euro fs-3 text-info"></i>
|
||||
</div>
|
||||
<div>
|
||||
{{-- number_format: formatta il numero con separatori --}}
|
||||
<div class="fs-2 fw-bold text-info">
|
||||
{{ $appSettings['currency_symbol'] }}{{ number_format($stats['total_contract_value'], 0, ',', '.') }}
|
||||
</div>
|
||||
<div class="text-muted small">Valore contratti</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{{-- ═══ Clienti recenti + Distribuzione per città ══════════════════════ --}}
|
||||
<div class="row g-4">
|
||||
|
||||
{{-- Ultimi clienti aggiunti --}}
|
||||
<div class="col-lg-8">
|
||||
<div class="card">
|
||||
<div class="card-header bg-white border-0 pt-3 pb-0">
|
||||
<h5 class="fw-semibold mb-0">
|
||||
<i class="bi bi-clock-history me-2 text-muted"></i>Clienti recenti
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover align-middle mb-0">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th class="ps-3">Cliente</th>
|
||||
<th>Tipo</th>
|
||||
<th>Stato</th>
|
||||
<th>Aggiunto</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{-- @forelse: come @foreach ma gestisce il caso lista vuota --}}
|
||||
@forelse ($recentCustomers as $customer)
|
||||
<tr>
|
||||
<td class="ps-3">
|
||||
<div class="fw-semibold">{{ $customer->name }}</div>
|
||||
<div class="text-muted small">{{ $customer->email }}</div>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge bg-light text-dark border">
|
||||
{{ $customer->type_label }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
{{-- badge_color è l'accessor definito nel Model --}}
|
||||
<span class="badge bg-{{ $customer->badge_color }}">
|
||||
{{ ucfirst($customer->status) }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-muted small">
|
||||
{{-- diffForHumans(): "2 giorni fa", "stamattina", ecc. --}}
|
||||
{{ $customer->created_at->diffForHumans() }}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('customers.show', $customer) }}"
|
||||
class="btn btn-sm btn-outline-primary">
|
||||
<i class="bi bi-eye"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="5" class="text-center text-muted py-4">
|
||||
Nessun cliente ancora. <a href="{{ route('customers.create') }}">Aggiungine uno!</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer bg-white text-end border-0">
|
||||
<a href="{{ route('customers.index') }}" class="btn btn-link btn-sm text-decoration-none">
|
||||
Vedi tutti <i class="bi bi-arrow-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Clienti per città --}}
|
||||
<div class="col-lg-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-header bg-white border-0 pt-3 pb-0">
|
||||
<h5 class="fw-semibold mb-0">
|
||||
<i class="bi bi-geo-alt me-2 text-muted"></i>Top città
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@forelse ($byCity as $city => $count)
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<span class="fw-medium">{{ $city ?: 'N/D' }}</span>
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<div class="progress flex-grow-1" style="width: 80px; height: 6px;">
|
||||
@php
|
||||
$maxCount = max(array_values($byCity));
|
||||
$pct = $maxCount > 0 ? ($count / $maxCount) * 100 : 0;
|
||||
@endphp
|
||||
<div class="progress-bar" style="width: {{ $pct }}%"></div>
|
||||
</div>
|
||||
<span class="badge bg-primary rounded-pill">{{ $count }}</span>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<p class="text-muted text-center my-4">Nessun dato disponibile</p>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
Reference in New Issue
Block a user