metalfrom.eu/apps/admin/site/index.html
Nicolas Fryder 68e483762e feat: flag-icons dropdown + admin live monitor
- Sélecteur de langue : dropdown custom avec flag-icons CDN (fi fi-xx), fermeture click-outside, aria-expanded
- Admin Monitor : nouvelle vue live avec status temps réel (crawl runs, géocodeur, jobs en attente)
- Log stream incrémental : fetch uniquement les nouveaux logs via min_id, buffer 500 entrées, filtre level + recherche texte client-side, flash animation sur nouvelles lignes
- Boutons inline Annuler pour runs actifs et jobs en attente
- API : GET /admin/api/live (agrégé), POST crawl-runs/:id/cancel, POST job-triggers/:id/cancel, param min_id sur GET /logs
- Refresh configurable 3/5/10/30s, pause/reprendre, vider le buffer

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 21:02:13 +02:00

56 lines
2 KiB
HTML

<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<title>Admin — metalfrom.eu</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=UnifrakturCook:wght@700&family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="login-screen" class="login-screen">
<form id="login-form" class="login-card">
<div class="brand">Admin</div>
<p class="login-sub">metalfrom.eu — accès restreint</p>
<label>Utilisateur
<input type="text" id="login-username" autocomplete="username" required>
</label>
<label>Mot de passe
<input type="password" id="login-password" autocomplete="current-password" required>
</label>
<button type="submit" class="btn btn-primary">Se connecter</button>
<div id="login-error" class="login-error"></div>
</form>
</div>
<div id="app" class="app hidden">
<header id="topbar">
<div class="brand">Admin</div>
<nav id="nav" class="nav">
<a href="#/dashboard" data-view="dashboard">Dashboard</a>
<a href="#/bands" data-view="bands">Bands</a>
<a href="#/conflicts" data-view="conflicts">Conflits</a>
<a href="#/queue" data-view="queue">Queue</a>
<a href="#/runs" data-view="runs">Crawl runs</a>
<a href="#/monitor" data-view="monitor">Monitor</a>
<a href="#/logs" data-view="logs">Historique</a>
<a href="#/geocoding" data-view="geocoding">Géocodage</a>
<a href="#/jobs" data-view="jobs">Jobs</a>
<a href="#/checkpoints" data-view="checkpoints">Checkpoints</a>
<a href="#/audit" data-view="audit">Audit</a>
</nav>
<div class="topbar-right">
<span id="whoami" class="whoami"></span>
<button id="logout-btn" class="btn btn-mini">Déconnexion</button>
</div>
</header>
<main id="content" class="content"></main>
</div>
<script src="app.js"></script>
</body>
</html>