Étape 10 : interface admin (tableau de bord + gestion utilisateurs)

- DashboardController : stats globales (sources par statut, relevés, utilisateurs, activité mensuelle 6 mois)
- UserController : liste filtrée (nom/email/rôle) + édition de rôle avec protections (auto-demotion, dernier admin)
- Vue admin/dashboard : compteurs par statut cliquables, graphique barres mensuel, sources à valider, relevés récents
- Vue admin/utilisateurs : liste paginée avec sections et sources assignées, page d'édition avec radio-cards
- Dashboard principal enrichi : bloc accès admin, mes sources assignées triées par urgence, mes derniers relevés
- Navigation : ajout Tableau de bord admin et Utilisateurs dans le menu Administration

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 17:21:50 +02:00
parent d064f8d28e
commit c790691200
8 changed files with 613 additions and 9 deletions
+20 -1
View File
@@ -40,7 +40,15 @@
</button>
<div x-show="adminOpen" @click.outside="adminOpen = false" x-cloak
class="absolute top-14 mt-1 w-48 bg-white rounded-md shadow-lg border border-gray-100 z-50">
class="absolute top-14 mt-1 w-56 bg-white rounded-md shadow-lg border border-gray-100 z-50">
@if(auth()->user()->isAdmin())
<a href="{{ route('admin.dashboard') }}"
class="block px-4 py-2 text-sm font-medium text-indigo-700 hover:bg-indigo-50 border-b border-gray-100">
Tableau de bord admin
</a>
<a href="{{ route('admin.utilisateurs.index') }}"
class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-50">Utilisateurs</a>
@endif
<a href="{{ route('admin.sections.index') }}"
class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-50">Sections</a>
@if(auth()->user()->isAdmin())
@@ -135,6 +143,14 @@
Recherche
</x-responsive-nav-link>
@if(auth()->user()->isSectionManager())
@if(auth()->user()->isAdmin())
<x-responsive-nav-link :href="route('admin.dashboard')" :active="request()->routeIs('admin.dashboard')">
Tableau de bord admin
</x-responsive-nav-link>
<x-responsive-nav-link :href="route('admin.utilisateurs.index')" :active="request()->routeIs('admin.utilisateurs.*')">
Utilisateurs
</x-responsive-nav-link>
@endif
<x-responsive-nav-link :href="route('admin.sections.index')" :active="request()->routeIs('admin.sections.*')">
Sections
</x-responsive-nav-link>
@@ -145,6 +161,9 @@
<x-responsive-nav-link :href="route('admin.source-types.index')" :active="request()->routeIs('admin.source-types.*')">
Types de sources
</x-responsive-nav-link>
<x-responsive-nav-link :href="route('admin.lieu-types.index')" :active="request()->routeIs('admin.lieu-types.*')">
Types de lieux
</x-responsive-nav-link>
@endif
@endif
</div>