# Story 5.3: Admin - System Health Dashboard
Status: done
## Story
En tant qu'**Admin**,
Je veux **voir les métriques de santé système en temps réel**,
de sorte que **je puisse surveiller la plateforme et réagir rapidement aux problèmes**.
## Acceptance Criteria
1. **System Health Card**: Affiche le statut global du système (healthy/unhealthy) avec indicateur animé
2. **Disk Space Card**: Affiche l'utilisation disque en pourcentage avec barre de progression
3. **Temporary Files Card**: Affiche le nombre de fichiers orphelins avec bouton de purge
4. **Provider Status Panel**: Affiche le statut de chaque provider (Google, DeepL, Ollama, OpenAI) avec latence
5. **Auto Refresh**: Les métriques se rafraîchissent automatiquement toutes les 30 secondes
6. **Manual Refresh**: Bouton pour rafraîchir manuellement les données
7. **Purge Action**: Le bouton "Purge" déclenche `/api/v1/admin/cleanup/trigger` et affiche le résultat
8. **Loading States**: États de chargement pendant les appels API
9. **Error Handling**: Gestion gracieuse des erreurs API avec message utilisateur
10. **Responsive**: S'affiche correctement sur desktop et mobile
## Tasks / Subtasks
- [x] **Task 1: Créer le hook useAdminDashboard** (AC: #5, #8, #9)
- [x] 1.1 Créer `frontend/src/app/admin/useAdminDashboard.ts`
- [x] 1.2 Implémenter le fetch de `/api/v1/admin/dashboard` avec TanStack Query
- [x] 1.3 Configurer le refetch automatique toutes les 30 secondes (`refetchInterval`)
- [x] 1.4 Gérer les états loading/error/success
- [x] 1.5 Exposer les données: system, providers, cleanup, rate_limits
- [x] **Task 2: Créer SystemHealthCards.tsx** (AC: #1, #2, #3, #7)
- [x] 2.1 Créer `frontend/src/app/admin/SystemHealthCards.tsx`
- [x] 2.2 Card "Server Health" avec indicateur animé (ping pulse)
- [x] 2.3 Card "Disk Space" avec Progress bar et pourcentage
- [x] 2.4 Card "Temporary Files" avec bouton Purge
- [x] 2.5 Adapter le design depuis `office-translator-landing-page/components/admin-system-health.tsx`
- [x] 2.6 Utiliser les composants shadcn/ui: Card, Button, Progress, Badge
- [x] **Task 3: Créer ProviderStatus.tsx** (AC: #4)
- [x] 3.1 Créer `frontend/src/app/admin/ProviderStatus.tsx`
- [x] 3.2 Afficher chaque provider avec badge de statut (online/degraded/offline)
- [x] 3.3 Tooltip avec latence pour chaque provider
- [x] 3.4 Adapter le design depuis `office-translator-landing-page/components/admin-provider-status.tsx`
- [x] 3.5 Utiliser les composants shadcn/ui: Badge, Tooltip
- [x] **Task 4: Implémenter la purge manuelle** (AC: #7)
- [x] 4.1 Créer `useCleanup.ts` pour appeler `/api/v1/admin/cleanup/trigger`
- [x] 4.2 État de chargement pendant la purge (spinner sur le bouton)
- [x] 4.3 Afficher le résultat: "X files deleted"
- [x] 4.4 Invalider le cache TanStack Query après purge
- [x] **Task 5: Modifier la page admin/page.tsx** (AC: #6, #10)
- [x] 5.1 Importer et utiliser SystemHealthCards et ProviderStatus
- [x] 5.2 Ajouter bouton "Refresh" avec icône RefreshCw
- [x] 5.3 Layout responsive: grid 3 colonnes pour les cards, full-width pour providers
- [x] 5.4 Remplacer le contenu placeholder existant
- [x] **Task 6: Tests et validation** (AC: Tous)
- [x] 6.1 `npm run build` → 0 erreurs TypeScript
- [x] 6.2 Tester avec backend actif → données affichées correctement
- [x] 6.3 Tester auto-refresh → données mises à jour après 30s
- [x] 6.4 Tester purge → spinner + résultat affiché
- [x] 6.5 Tester error handling → backend éteint → message d'erreur
- [x] 6.6 Tester responsive → mobile et desktop
## Dev Notes
### 🏗️ Stack Technique
| Technologie | Version |
|-------------|---------|
| Next.js | 16.0.6 (App Router) |
| React | 19.2.0 |
| TanStack Query | v5 |
| Tailwind CSS | configuré |
| shadcn/ui | Card, Button, Progress, Badge, Tooltip |
| Lucide React | HeartPulse, HardDrive, FileWarning, Trash2, Loader2, RefreshCw |
### 📁 Structure Cible (Colocation Pattern)
```
frontend/src/app/admin/
├── layout.tsx # Layout existant avec sidebar/header
├── page.tsx # ⭐ Dashboard admin principal (modifier)
├── SystemHealthCards.tsx # ⭐ Nouveau: Cards santé système
├── ProviderStatus.tsx # ⭐ Nouveau: Panel statut providers
├── useAdminDashboard.ts # ⭐ Nouveau: Hook TanStack Query
├── useCleanup.ts # ⭐ Nouveau: Hook pour purge
├── types.ts # ⭐ Nouveau: TypeScript interfaces
├── AdminSidebar.tsx # Existant (Story 5.2)
├── AdminHeader.tsx # Existant (Story 5.2)
├── login/ # Existant
├── users/ # Placeholder (Story 5.4)
├── system/ # Placeholder (Story 5.6)
└── logs/ # Placeholder (Story 5.7)
```
**⚠️ Règle absolue (architecture.md):**
```
🚨 FICHIERS SPÉCIAUX: page.tsx, layout.tsx → TOUJOURS minuscules
🚨 COLOCATION: Components/hooks/types dans le dossier de leur page
```
### 🔗 API Endpoints
| Endpoint | Méthode | Description |
|----------|---------|-------------|
| `/api/v1/admin/dashboard` | GET | Dashboard data complet |
| `/api/v1/admin/cleanup/trigger` | POST | Déclencher la purge manuelle |
### 📊 Response Format: GET /api/v1/admin/dashboard
```json
{
"timestamp": "2024-01-15T10:30:00Z",
"status": "healthy",
"system": {
"memory": {},
"disk": {}
},
"providers": {
"google": {
"name": "google",
"available": true,
"last_check": "2024-01-15T10:29:00Z"
}
},
"cleanup": {
"files_cleaned": 12,
"tracked_files_count": 5
},
"rate_limits": {
"active_clients": 3
},
"config": {
"max_file_size_mb": 50,
"supported_extensions": [".xlsx", ".docx", ".pptx"],
"translation_service": "google"
}
}
```
### 📊 Response Format: POST /api/v1/admin/cleanup/trigger
```json
{
"status": "success",
"files_cleaned": 5,
"message": "Cleaned up 5 expired files"
}
```
### 🎨 Patterns UI à Réutiliser
**SystemHealthCards.tsx** - depuis `office-translator-landing-page/components/admin-system-health.tsx`:
```tsx
// Structure à adapter