Your IP : 216.73.217.68


Current Path : /home/atelierpru/www/airvalue/adm/
Upload File :
Current File : /home/atelierpru/www/airvalue/adm/index.html

<!DOCTYPE html><html lang="fr"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Admin | AirValue</title><meta name="description" content="Administration AirValue."><meta name="robots" content="noindex, nofollow"><link rel="canonical" href="https://airvalue.fr/adm/"><link rel="icon" type="image/png" href="/favicon.png"><meta property="og:type" content="website"><meta property="og:title" content="Admin | AirValue"><meta property="og:description" content="Administration AirValue."><meta property="og:url" content="https://airvalue.fr/adm/"><meta property="og:site_name" content="AirValue"><meta property="og:image" content="https://airvalue.fr/og-image.jpg"><meta name="twitter:card" content="summary_large_image"><link rel="stylesheet" href="/_astro/Layout.1VwafSx4.css"><link rel="stylesheet" href="/_astro/adm.B7cvWVYR.css"></head><body class="bg-white antialiased"><main class="container mx-auto max-w-6xl px-6 py-12"><h1 class="font-display text-3xl font-bold mb-8">AirValue, administration</h1><section id="login" class="max-w-sm"><form id="login-form" class="space-y-4"><input name="email" type="email" value="airval@airvalue.fr" autocomplete="username" class="w-full px-4 py-3 rounded-xl border border-line text-sm"><input name="password" type="password" placeholder="Mot de passe" autocomplete="current-password" class="w-full px-4 py-3 rounded-xl border border-line text-sm"><button class="btn-cta w-full justify-center text-sm">Connexion</button><p id="login-error" class="hidden text-red-500 text-sm" role="alert"></p></form></section><nav id="admin-tabs" class="hidden flex border-b border-line mb-6"><button data-tab="dashboard" class="adm-tab">Dashboard</button><button data-tab="dataflow" class="adm-tab">POC avec IUDO</button><button data-tab="mvp" class="adm-tab adm-tab--active">POC Air Value</button><button data-tab="poc" class="adm-tab">API</button></nav><section id="dashboard" class="hidden space-y-3"><details class="adm-acc" open><summary><h2 class="font-display text-xl font-bold">Funnel de clics</h2></summary><div class="adm-acc-body"><p class="text-muted text-sm mb-3">Tous les clics de la landing dans l'ordre du parcours : visite → champ adresse → bouton Analyser → adresse validée → analyse terminée → CTA fiche → email → contacts. Visiteurs uniques (admins exclus) ; % = passage depuis l'étape précédente.</p><div id="funnel-cols" class="flex items-stretch gap-2 overflow-x-auto pb-2"></div></div></details><details class="adm-acc"><summary><h2 class="font-display text-xl font-bold">Conversions par variante</h2></summary><div class="adm-acc-body"><div class="overflow-x-auto"><table class="w-full text-sm border border-line rounded-xl overflow-hidden"><thead class="bg-cream text-left"><tr><th class="p-3">Variante</th><th class="p-3">Visiteurs uniques</th><th class="p-3">Opt-in niv. 1</th><th class="p-3">Opt-in niv. 2</th><th class="p-3">Taux niv. 1</th><th class="p-3">Taux niv. 2</th><th class="p-3">Taux global</th></tr></thead><tbody id="stats-body"></tbody></table></div></div></details><details class="adm-acc"><summary><h2 class="font-display text-xl font-bold">Clics CTA de contact</h2></summary><div class="adm-acc-body"><p class="text-muted text-sm mb-3">Clics sur les boutons Appel / WhatsApp / Prendre RDV du hero de la landing.</p><div id="cta-cards" class="grid grid-cols-1 sm:grid-cols-3 gap-3 mb-4"></div><div class="overflow-x-auto"><table class="w-full text-xs border border-line"><thead class="bg-cream text-left"><tr><th class="p-2">Date</th><th class="p-2">CTA</th><th class="p-2">Source</th><th class="p-2">IP</th></tr></thead><tbody id="cta-recent"></tbody></table></div></div></details><details class="adm-acc"><summary><h2 class="font-display text-xl font-bold">Appareils des visiteurs</h2></summary><div class="adm-acc-body"><p class="text-muted text-sm mb-3">Répartition des visites par type d'appareil (basée sur le user-agent).</p><div id="device-cards" class="grid grid-cols-2 sm:grid-cols-4 gap-3"></div></div></details><details class="adm-acc"><summary><h2 class="font-display text-xl font-bold">Test A/B/C</h2></summary><div class="adm-acc-body"><div id="ab-block" class="flex flex-wrap items-center gap-3"></div><p id="ab-note" class="text-muted text-sm mt-2"></p></div></details><details class="adm-acc"><summary><h2 class="font-display text-xl font-bold">Leads</h2></summary><div class="adm-acc-body"><div class="flex gap-2 mb-3" id="filters"><button data-f="" class="px-3 py-1 rounded-full border border-line text-sm">Tous</button><button data-f="complete" class="px-3 py-1 rounded-full border border-line text-sm">Complets</button><button data-f="partial" class="px-3 py-1 rounded-full border border-line text-sm">Partiels</button></div><div class="overflow-x-auto"><table class="w-full text-xs border border-line"><thead class="bg-cream text-left"><tr><th class="p-2">Date</th><th class="p-2">Statut</th><th class="p-2">Variante</th><th class="p-2">Nom</th><th class="p-2">Téléphone</th><th class="p-2">Email</th><th class="p-2">Adresse immeuble</th><th class="p-2">Rôle</th><th class="p-2">Source</th><th class="p-2">N°</th><th class="p-2">Visites</th><th class="p-2">IP</th><th class="p-2"></th></tr></thead><tbody id="leads-body"></tbody></table></div><div class="flex items-center gap-3 mt-3 text-sm"><button id="pg-first" class="px-3 py-1 border border-line rounded">&laquo;</button><button id="pg-prev" class="px-3 py-1 border border-line rounded">&lsaquo;</button><span id="pg-info"></span><button id="pg-next" class="px-3 py-1 border border-line rounded">&rsaquo;</button><button id="pg-last" class="px-3 py-1 border border-line rounded">&raquo;</button></div></div></details><details class="adm-acc"><summary><h2 class="font-display text-xl font-bold">Visiteurs</h2></summary><div class="adm-acc-body"><p class="text-muted text-sm mb-3">Nombre de visites par visiteur, du plus actif au moins actif. L'IP est capturée côté serveur. Les visiteurs marqués ADMIN restent listés mais sont retirés des conversions ; ✕ supprime définitivement l'historique.</p><div class="overflow-x-auto"><table class="w-full text-xs border border-line"><thead class="bg-cream text-left"><tr><th class="p-2">Visiteur</th><th class="p-2">IP</th><th class="p-2">Visites</th><th class="p-2">Opt-ins</th><th class="p-2">Dernière activité</th><th class="p-2">Statut</th><th class="p-2"></th></tr></thead><tbody id="visitors-body"></tbody></table></div><div class="flex items-center gap-3 mt-3 text-sm"><button id="vpg-first" class="px-3 py-1 border border-line rounded">&laquo;</button><button id="vpg-prev" class="px-3 py-1 border border-line rounded">&lsaquo;</button><span id="vpg-info"></span><button id="vpg-next" class="px-3 py-1 border border-line rounded">&rsaquo;</button><button id="vpg-last" class="px-3 py-1 border border-line rounded">&raquo;</button></div></div></details><details class="adm-acc"><summary><h2 class="font-display text-xl font-bold">Test envoi email</h2></summary><div class="adm-acc-body"><p class="text-muted text-sm mb-4">Envoie le rapport quotidien à une adresse de test uniquement (sans CC, sans kill switch). Le bouton ouvre GitHub Actions : cliquer « Run workflow », vérifier l'adresse, lancer.</p><a href="https://github.com/theofpro/airvalue/actions/workflows/daily-leads.yml" target="_blank" rel="noopener noreferrer" class="inline-block px-4 py-2 rounded-full bg-primary text-white text-sm font-medium hover:opacity-90">Tester l'envoi du rapport</a></div></details></section><section id="dataflow-section" class="hidden space-y-6"><div class="flex items-center justify-between mb-2"><p class="text-muted text-sm">Statut : <strong id="df-status" class="text-foreground">–</strong></p><span id="df-build" class="text-xs text-gray-400 font-mono"></span></div><div id="df-recent" hidden></div><div id="df-search-wrap" class="relative"><div class="flex gap-3 items-start"><div class="flex-1 relative"><textarea id="df-address" rows="2" placeholder="Saisir une adresse (ex: 1 boulevard du montparnasse)&#10;… ou plusieurs adresses, une par ligne (batch)" class="w-full px-4 py-3 rounded-xl border border-line text-sm font-mono resize-y" autocomplete="off" spellcheck="false"></textarea><div id="df-dropdown" class="df-dropdown"></div></div><button id="df-run" disabled class="btn-cta text-sm px-6 whitespace-nowrap">Lancer</button></div><div class="flex flex-wrap items-center gap-4 mt-2"><label class="flex items-center gap-2 text-xs text-muted cursor-pointer select-none"><input id="df-nocache" type="checkbox">Ignorer le cache (forcer un nouvel appel des APIs)</label><span class="text-xs text-muted">1 adresse = analyse détaillée · plusieurs lignes = batch (max 100)</span></div></div><p id="df-info" class="text-muted text-sm -mt-2">Sélectionnez une adresse dans la liste pour lancer l'analyse.</p><button id="df-log-toggle" hidden class="text-xs font-semibold text-blue-600 hover:underline self-start">Afficher les logs</button><div id="df-log"></div><div id="df-steps"></div><div class="flex flex-wrap items-center gap-3"><button id="batch-cancel" hidden class="px-4 py-2 text-sm rounded-xl bg-gray-500 text-white hover:bg-gray-600">Arrêter</button><button id="batch-compile" hidden class="px-4 py-2 text-sm rounded-xl bg-emerald-600 text-white hover:bg-emerald-700">Télécharger compilation (simples)</button><span id="batch-progress" class="text-sm text-muted"></span></div><div id="batch-table"></div><div id="batch-pager" class="df-pager"></div></section><section id="mvp-section" class="hidden space-y-4"><div><h2 class="font-display text-xl font-bold mb-1">POC Air Value — moteur national</h2><p class="text-muted text-sm mb-3">Socle national (BAN, cadastre IGN, GPU, BD TOPO) via le proxy airvalue — potentiels vertical et horizontal séparés, statuts stricts sans valeur inventée (docs STEP 1, 7-11, P1-P3). Même moteur que l'analyse de la landing.<span id="mvp-build" class="text-xs text-gray-400 font-mono ml-2"></span></p><div id="mvp-recent" hidden></div><div class="flex gap-3 items-start"><div class="flex-1 relative"><textarea id="mvp-address" rows="2" placeholder="Saisir une adresse (n'importe quelle commune française)&#10;… ou plusieurs adresses, une par ligne (batch)" class="w-full px-4 py-3 rounded-xl border border-line text-sm font-mono resize-y" autocomplete="off" spellcheck="false"></textarea><div id="mvp-dropdown" class="df-dropdown"></div></div><button id="mvp-run" class="btn-cta text-sm px-6 whitespace-nowrap">Lancer</button></div><div class="flex flex-wrap items-center gap-4 mt-2"><label class="flex items-center gap-2 text-sm text-muted"><input id="mvp-nocache" type="checkbox"> Ignorer le cache serveur</label><label class="flex items-center gap-2 text-sm text-muted" title="Tuiles 3D Google sur la minimap (désactivé par défaut)"><input id="mvp-g3d" type="checkbox"> Photoréaliste Google 3D</label><span class="text-xs text-muted">1 adresse = analyse détaillée · plusieurs lignes = batch (max 100)</span></div></div><div id="mvp-report" class="hidden"></div><div id="mvp-minimap" class="hidden" style="width:100%;height:680px;border-radius:12px;overflow:hidden;margin-bottom:1rem;"></div><div id="mvp-steps"></div><div class="flex flex-wrap items-center gap-3"><button id="mb-cancel" hidden class="px-4 py-2 text-sm rounded-xl bg-gray-500 text-white hover:bg-gray-600">Arrêter</button><button id="mb-compile" hidden class="px-4 py-2 text-sm rounded-xl bg-emerald-600 text-white hover:bg-emerald-700">Télécharger la compilation</button><span id="mb-progress" class="text-sm text-muted"></span></div><div id="mb-table"></div><div id="mb-pager" class="df-pager"></div></section><section id="poc-section" class="hidden space-y-6"><div><h2 class="font-display text-xl font-bold mb-1">Sources de données</h2><p class="text-muted text-sm mb-4">Remplace iudo par nos APIs nationales dans le flow POC v0 quand c'est possible. Désactivé = iudo (défaut). Le pipeline MVP V1 utilise déjà 100&nbsp;% nos APIs.</p><div id="sources-list" class="space-y-3"><p class="text-muted text-sm">Chargement…</p></div></div><div class="adm-keys"><h2 class="font-display text-xl font-bold mb-1">Clés API tierces</h2><p class="text-muted text-sm mb-4">Stockées côté serveur (persistant, protégé). Les valeurs ne sont jamais réaffichées : seul un aperçu masqué des 4 derniers caractères est montré. Laisser vide et enregistrer pour supprimer une clé.</p><div id="keys-list" class="space-y-3"><p class="text-muted text-sm">Chargement…</p></div></div></section></main></body></html><script type="module" src="/_astro/adm.astro_astro_type_script_index_0_lang.vAK6FnTY.js"></script><!-- MapLibre GL (vendored, self-hosté) pour la minimap 3D du Data Flow --><link rel="stylesheet" href="/vendor/maplibre-gl.css"><script src="/vendor/maplibre-gl.js"></script><script src="/vendor/polygon-clipping.umd.min.js"></script><script src="/vendor/deck.gl.min.js"></script><!-- ?v= force le rechargement du JS à chaque build (sinon le navigateur peut
     servir un adm-flow.js périmé incompatible avec le CSS de la page).
     __DF_EXPECTED_BUILD permet à adm-flow.js de détecter lui-même qu'il est
     périmé et d'afficher une alerte rouge. --><script>window.__DF_EXPECTED_BUILD='20260804c';window.__MAPBOX_TOKEN='pk.eyJ1IjoidGhlb2FpcnZhbCIsImEiOiJjbXNkZWt6ajcxaXJtMzRzZ2h5b3B3b2dvIn0.oO15qLQzh27W_FtJTqoc0g';</script><script src="/av-minimap.js?v=20260804c"></script><script src="/adm-flow.js?v=20260804c"></script><script type="module" src="/_astro/adm.astro_astro_type_script_index_1_lang.u3oN-xIM.js"></script>