239 lines
22 KiB
HTML
Executable File
239 lines
22 KiB
HTML
Executable File
<?php include_once("/opt/wevads-arsenal/public/api/wevads-metrics.php"); ?>
|
|
<?php
|
|
@$_db=new PDO("pgsql:host=localhost;dbname=adx_system","admin","admin123");
|
|
$_db->setAttribute(PDO::ATTR_TIMEOUT, 5);
|
|
$_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
$_db->exec("SET search_path TO admin");
|
|
$_db->exec("SET statement_timeout = 15000");
|
|
|
|
function safeQuery($db, $sql, $default=0) {
|
|
try { return $db->query($sql)->fetchColumn(); } catch(Exception $e) { return $default; }
|
|
}
|
|
function safeQueryAll($db, $sql) {
|
|
try { return $db->query($sql)->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e) { return []; }
|
|
}
|
|
|
|
// Large tables: pg_class estimate (instant)
|
|
$_contacts = (int)safeQuery($_db, "SELECT reltuples::bigint FROM pg_class WHERE relname='send_contacts'");
|
|
$_leads = (int)safeQuery($_db, "SELECT reltuples::bigint FROM pg_class WHERE relname='leads'");
|
|
if($_leads < 1000) $_leads = (int)safeQuery($_db, "SELECT COUNT(*) FROM leads");
|
|
$_sendData = (int)safeQuery($_db, "SELECT reltuples::bigint FROM pg_class WHERE relname='send_data'");
|
|
|
|
// Exact counts for small tables
|
|
$_scraped = (int)safeQuery($_db, "SELECT COUNT(*) FROM scrapping_results");
|
|
$_verified = (int)safeQuery($_db, "SELECT COUNT(*) FROM scrapping_results WHERE is_verified=true");
|
|
$_offers = (int)safeQuery($_db, "SELECT COUNT(*) FROM offers WHERE is_active=true");
|
|
$_campaigns = (int)safeQuery($_db, "SELECT COUNT(*) FROM campaigns");
|
|
$_brainConfigs = (int)safeQuery($_db, "SELECT COUNT(*) FROM brain_send_configs");
|
|
$_ytCh = (int)safeQuery($_db, "SELECT COUNT(*) FROM youtube_channels WHERE status='active'");
|
|
$_ytVids = (int)safeQuery($_db, "SELECT COUNT(*) FROM youtube_videos WHERE status='published'");
|
|
$_ytRev = safeQuery($_db, "SELECT COALESCE(SUM(monthly_revenue),0)::numeric(10,2) FROM youtube_channels WHERE status='active'");
|
|
$_ytAdRev = safeQuery($_db, "SELECT COALESCE(SUM(ad_revenue),0)::numeric(10,2) FROM youtube_videos");
|
|
$_ytAffRev = safeQuery($_db, "SELECT COALESCE(SUM(affiliate_revenue),0)::numeric(10,2) FROM youtube_videos");
|
|
$_creatives = (int)safeQuery($_db, "SELECT COUNT(*) FROM creatives WHERE is_active=true");
|
|
$_personas = (int)safeQuery($_db, "SELECT COUNT(*) FROM hamid_personas");
|
|
$_darkJobs = (int)safeQuery($_db, "SELECT COUNT(*) FROM dark_scraper_jobs");
|
|
$_darkResults = (int)safeQuery($_db, "SELECT COUNT(*) FROM dark_scout_results");
|
|
$_harvested = (int)safeQuery($_db, "SELECT COUNT(*) FROM harvested_leads");
|
|
|
|
// ISP breakdown - use subquery for speed
|
|
$_isps = safeQueryAll($_db, "SELECT isp, COUNT(*) as cnt FROM send_contacts WHERE status='active' AND isp IS NOT NULL GROUP BY isp ORDER BY cnt DESC LIMIT 8");
|
|
if(empty($_isps)) $_isps = [];
|
|
|
|
// Source breakdown (from leads)
|
|
$_sources = safeQueryAll($_db, "SELECT COALESCE(NULLIF(source,''),'unknown') as src, COUNT(*) as cnt FROM leads GROUP BY source ORDER BY cnt DESC LIMIT 8");
|
|
|
|
// YouTube channels
|
|
$_ytChannels = safeQueryAll($_db, "SELECT channel_name, subscribers, total_views, monthly_revenue, language FROM youtube_channels WHERE status='active' ORDER BY monthly_revenue DESC");
|
|
|
|
// Brain winners
|
|
$_brainWinners = (int)safeQuery($_db, "SELECT COUNT(*) FROM brain_send_configs WHERE inbox_rate>70 AND total_sent>0");
|
|
$_brainAvgInbox = safeQuery($_db, "SELECT ROUND(AVG(NULLIF(inbox_rate,0))::numeric,1) FROM brain_send_configs WHERE total_sent>0") ?: 0;
|
|
|
|
$_totalRev = $_ytAdRev + $_ytAffRev;
|
|
?>
|
|
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<title>WEVADS — Dashboard</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
|
<style>
|
|
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6}
|
|
*{margin:0;padding:0;box-sizing:border-box}body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;font-size:12px}
|
|
.mono{font-family:'JetBrains Mono',monospace}
|
|
.hdr{background:var(--s);border-bottom:1px solid var(--b);padding:14px 20px;display:flex;justify-content:space-between;align-items:center}
|
|
.hdr h1{font-size:20px;font-weight:700;margin-left:80px}.hdr h1 span{background:linear-gradient(135deg,var(--cy),var(--gn));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
|
.wrap{padding:16px 20px;max-width:1500px;margin:0 auto}
|
|
|
|
/* Big KPIs row */
|
|
.big-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
|
|
.big-sc{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:18px;cursor:pointer;transition:all .2s}
|
|
.big-sc:hover{transform:translateY(-3px);box-shadow:0 12px 36px rgba(0,0,0,.4);border-color:var(--cy)}
|
|
.big-sc .n{font-family:'JetBrains Mono',monospace;font-size:28px;font-weight:700}.big-sc .l{font-size:10px;text-transform:uppercase;color:var(--d);margin-top:4px}.big-sc .delta{font-size:10px;margin-top:4px}
|
|
|
|
/* Mini KPIs */
|
|
.mini-stats{display:grid;grid-template-columns:repeat(8,1fr);gap:8px;margin-bottom:16px}
|
|
.mini-sc{background:var(--s);border:1px solid var(--b);border-radius:8px;padding:10px;text-align:center;cursor:pointer;transition:all .2s}
|
|
.mini-sc:hover{border-color:var(--cy);transform:translateY(-1px)}
|
|
.mini-sc .n{font-family:'JetBrains Mono',monospace;font-size:16px;font-weight:700}.mini-sc .l{font-size:8px;text-transform:uppercase;color:var(--d);margin-top:2px}
|
|
|
|
.g2{display:grid;grid-template-columns:1fr 1fr;gap:12px}.g3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
|
|
.cd{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px;margin-bottom:12px}
|
|
table{width:100%;border-collapse:collapse;font-size:11px}th{text-align:left;color:var(--d);text-transform:uppercase;font-size:9px;padding:6px 8px;border-bottom:1px solid var(--b)}td{padding:6px 8px;border-bottom:1px solid rgba(30,41,59,.3)}
|
|
.badge{font-size:8px;padding:2px 6px;border-radius:3px;font-weight:600}.badge-gn{background:rgba(52,211,153,.15);color:var(--gn)}.badge-rd{background:rgba(248,113,113,.15);color:var(--rd)}.badge-am{background:rgba(251,191,36,.15);color:var(--am)}.badge-cy{background:rgba(34,211,238,.15);color:var(--cy)}.badge-pu{background:rgba(167,139,250,.15);color:var(--pu)}
|
|
.btn{padding:8px 16px;border-radius:6px;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;font-size:10px;font-weight:600;transition:all .2s;text-decoration:none}.btn:hover{border-color:var(--cy);transform:translateY(-1px)}
|
|
.bar{height:8px;border-radius:4px;background:var(--s2);overflow:hidden;margin-top:4px}.bar-fill{height:100%;border-radius:4px}
|
|
.modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.75);z-index:9999;justify-content:center;align-items:center}.modal-box{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:20px;max-width:950px;width:92%;max-height:82vh;overflow-y:auto}
|
|
.pipeline{display:flex;align-items:center;gap:6px;margin:14px 0}.pipeline .stage{flex:1;background:var(--s2);border:1px solid var(--b);border-radius:8px;padding:12px;text-align:center}.pipeline .arrow{color:var(--gn);font-size:18px}
|
|
.section-title{font-size:13px;font-weight:700;margin-bottom:10px;display:flex;align-items:center;gap:6px}
|
|
.quick-link{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;background:var(--s);border:1px solid var(--b);border-radius:8px;text-decoration:none;color:var(--t);font-size:11px;transition:all .2s}
|
|
.quick-link:hover{border-color:var(--cy);transform:translateY(-1px)}
|
|
@media(max-width:1100px){.big-stats{grid-template-columns:repeat(2,1fr)}.mini-stats{grid-template-columns:repeat(4,1fr)}.g2,.g3{grid-template-columns:1fr}}
|
|
</style>
|
|
<link rel="stylesheet" href="wevads-global.css?v1770777318">
|
|
</head><body>
|
|
<div class="hdr"><div><h1>📊 <span>WEVADS Dashboard</span></h1><div style="color:var(--d);font-size:11px;margin-top:4px">Control Center — Email · Scraping · YouTube · Brain · Pipeline</div></div><div style="display:flex;gap:8px;align-items:center"><span class="badge badge-gn">● LIVE</span><a href="menu.html" class="btn">Menu</a></div></div>
|
|
<div class="wrap">
|
|
|
|
<!-- BIG KPIs -->
|
|
<div class="big-stats">
|
|
<div class="big-sc" onclick="drill('contacts')"><div class="n" style="color:var(--cy)"><?=number_format($_contacts)?></div><div class="l">Send Pool ▼</div><div class="delta" style="color:var(--gn)">active contacts · <?=count($_isps)?> ISPs</div></div>
|
|
<div class="big-sc" onclick="drill('leads')"><div class="n" style="color:var(--bl)"><?=number_format($_leads)?></div><div class="l">CRM Leads ▼</div><div class="delta"><?=count($_sources)?> sources · <?=number_format($_sendData)?> send_data</div></div>
|
|
<div class="big-sc" onclick="drill('revenue')"><div class="n" style="color:var(--gn)">$<?=number_format($_totalRev,0)?></div><div class="l">Revenue ▼</div><div class="delta">$<?=number_format($_ytAdRev,0)?> ad + $<?=number_format($_ytAffRev,0)?> affiliate</div></div>
|
|
<div class="big-sc" onclick="drill('brain')"><div class="n" style="color:var(--pu)"><?=$_brainConfigs?></div><div class="l">Brain Configs ▼</div><div class="delta"><?=$_brainWinners?> winners · <?=$_brainAvgInbox?>% avg inbox</div></div>
|
|
</div>
|
|
|
|
<!-- MINI KPIs -->
|
|
<div class="mini-stats">
|
|
<div class="mini-sc" onclick="drill('scraped')"><div class="n" style="color:var(--am)"><?=number_format($_scraped)?></div><div class="l">Scraped</div></div>
|
|
<div class="mini-sc" onclick="drill('offers')"><div class="n" style="color:var(--gn)"><?=$_offers?></div><div class="l">Offers</div></div>
|
|
<div class="mini-sc" onclick="drill('campaigns')"><div class="n" style="color:var(--bl)"><?=$_campaigns?></div><div class="l">Campaigns</div></div>
|
|
<div class="mini-sc" onclick="drill('youtube')"><div class="n" style="color:var(--rd)"><?=$_ytCh?></div><div class="l">YT Channels</div></div>
|
|
<div class="mini-sc" onclick="drill('creatives')"><div class="n" style="color:var(--pk)"><?=$_creatives?></div><div class="l">Creatives</div></div>
|
|
<div class="mini-sc" onclick="drill('personas')"><div class="n" style="color:var(--pu)"><?=$_personas?></div><div class="l">Personas</div></div>
|
|
<div class="mini-sc" onclick="drill('dark')"><div class="n" style="color:var(--cy)"><?=$_darkJobs?></div><div class="l">Dark Jobs</div></div>
|
|
<div class="mini-sc" onclick="drill('pipeline')"><div class="n" style="color:var(--gn)"><?=$_darkResults?></div><div class="l">Scout Results</div></div>
|
|
</div>
|
|
|
|
<!-- MAIN CONTENT -->
|
|
<div class="g2">
|
|
<!-- ISP Distribution -->
|
|
<div class="cd">
|
|
<div class="section-title" style="color:var(--cy)">📧 ISP Distribution</div>
|
|
<table><thead><tr><th>ISP</th><th>Contacts</th><th>%</th><th>Volume</th></tr></thead><tbody>
|
|
<?php foreach($_isps as $i): $pct=$_contacts>0?round($i['cnt']/$_contacts*100,1):0; $w=min($pct*3,100); ?>
|
|
<tr><td style="font-weight:600"><?=htmlspecialchars($i['isp'])?></td><td class="mono"><?=number_format($i['cnt'])?></td><td><?=$pct?>%</td><td><div class="bar" style="width:100px"><div class="bar-fill" style="width:<?=$w?>%;background:var(--cy)"></div></div></td></tr>
|
|
<?php endforeach; ?>
|
|
</tbody></table>
|
|
</div>
|
|
|
|
<!-- Data Sources -->
|
|
<div class="cd">
|
|
<div class="section-title" style="color:var(--pk)">📦 Data Sources</div>
|
|
<table><thead><tr><th>Source</th><th>Contacts</th><th>%</th><th>Volume</th></tr></thead><tbody>
|
|
<?php foreach($_sources as $s): $pct=$_leads>0?round($s['cnt']/$_leads*100,1):0; $w=min($pct*2,100); ?>
|
|
<tr><td style="font-weight:600"><?=htmlspecialchars($s['src'])?></td><td class="mono"><?=number_format($s['cnt'])?></td><td><?=$pct?>%</td><td><div class="bar" style="width:100px"><div class="bar-fill" style="width:<?=$w?>%;background:var(--pk)"></div></div></td></tr>
|
|
<?php endforeach; ?>
|
|
</tbody></table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="g2">
|
|
<!-- YouTube -->
|
|
<div class="cd">
|
|
<div class="section-title" style="color:var(--rd)">▶ YouTube Channels</div>
|
|
<table><thead><tr><th>Channel</th><th>Subs</th><th>Views</th><th>$/mo</th></tr></thead><tbody>
|
|
<?php foreach($_ytChannels as $c): $f=['fr'=>'🇫🇷','de'=>'🇩🇪','en'=>'🇬🇧'][$c['language']]??'🌍'; ?>
|
|
<tr><td style="font-weight:600"><?=$f?> <?=htmlspecialchars($c['channel_name'])?></td><td class="mono" style="color:var(--am)"><?=number_format($c['subscribers'])?></td><td class="mono"><?=number_format($c['total_views'])?></td><td class="mono" style="color:var(--gn)">$<?=number_format($c['monthly_revenue'],0)?></td></tr>
|
|
<?php endforeach; ?>
|
|
</tbody></table>
|
|
</div>
|
|
|
|
<!-- Pipeline -->
|
|
<div class="cd">
|
|
<div class="section-title" style="color:var(--gn)">🔄 Pipeline Flow</div>
|
|
<div class="pipeline">
|
|
<div class="stage"><div style="font-size:16px;font-weight:700;color:var(--am)"><?=number_format($_scraped)?></div><div style="font-size:8px;color:var(--d)">Scraped</div></div><div class="arrow">→</div>
|
|
<div class="stage"><div style="font-size:16px;font-weight:700;color:var(--cy)"><?=number_format($_harvested)?></div><div style="font-size:8px;color:var(--d)">Harvested</div></div><div class="arrow">→</div>
|
|
<div class="stage"><div style="font-size:16px;font-weight:700;color:var(--bl)"><?=number_format($_leads)?></div><div style="font-size:8px;color:var(--d)">CRM</div></div><div class="arrow">→</div>
|
|
<div class="stage"><div style="font-size:16px;font-weight:700;color:var(--gn)"><?=number_format($_contacts)?></div><div style="font-size:8px;color:var(--d)">Send</div></div>
|
|
</div>
|
|
<div style="margin-top:12px">
|
|
<div class="section-title" style="color:var(--pu)">🚀 Quick Links</div>
|
|
<div style="display:flex;flex-wrap:wrap;gap:6px">
|
|
<a href="scrapping-factory.html" class="quick-link">🔍 Scraping</a>
|
|
<a href="dark-scraper.html" class="quick-link">🕷️ Dark Scraper</a>
|
|
<a href="dark-matrix.html" class="quick-link">🧪 Matrix</a>
|
|
<a href="dark-slot.html" class="quick-link">🎰 Slot</a>
|
|
<a href="youtube-factory.html" class="quick-link">▶ YouTube</a>
|
|
<a href="crm-send.html" class="quick-link">📤 CRM Send</a>
|
|
<a href="harvest-manager.html" class="quick-link">🌾 Harvest</a>
|
|
<a href="brain-ia.html" class="quick-link">🧠 Brain IA</a>
|
|
<a href="dark-scout.html" class="quick-link">🔭 Scout</a>
|
|
<a href="lookalike-engine.html" class="quick-link">🧬 Lookalike</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- DRILL MODAL -->
|
|
<div class="modal" id="drillModal" onclick="if(event.target===this)this.style.display='none'"><div class="modal-box"><div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:14px"><h3 id="drillTitle" style="font-size:14px;color:var(--cy)"></h3><button onclick="document.getElementById('drillModal').style.display='none'" style="background:none;border:none;color:var(--rd);font-size:18px;cursor:pointer">✕</button></div><div id="drillContent" style="font-size:11px"></div></div></div>
|
|
|
|
<script>
|
|
async function drill(type){
|
|
var m=document.getElementById('drillModal'),tt=document.getElementById('drillTitle'),ct=document.getElementById('drillContent');
|
|
m.style.display='flex';ct.innerHTML='<div style="text-align:center;padding:40px;color:var(--d)">Loading...</div>';
|
|
try{var html='';
|
|
if(type==='contacts'||type==='leads'||type==='scraped'){
|
|
var titles={contacts:'📤 Send Pool Contacts',leads:'💼 CRM Leads',scraped:'🔍 Scraped Contacts'};
|
|
tt.textContent=titles[type];
|
|
var pg=arguments[1]||1;
|
|
var r=await fetch('/api/advanced-scraping.php?action=drill_total&page='+pg);
|
|
var d=(await r.json()).data||{};
|
|
html+='<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px">';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--gn)">'+(d.verified||0).toLocaleString()+'</div><div style="font-size:9px;color:var(--d)">Verified</div></div>';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--rd)">'+(d.unverified||0).toLocaleString()+'</div><div style="font-size:9px;color:var(--d)">Unverified</div></div>';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:20px;font-weight:700;color:var(--cy)">'+(d.total_contacts||0).toLocaleString()+'</div><div style="font-size:9px;color:var(--d)">Total</div></div></div>';
|
|
html+='<div style="overflow-x:auto"><table><thead><tr><th>Email</th><th>Name</th><th>Company</th><th>Location</th><th>✓</th></tr></thead><tbody>';
|
|
(d.contacts||[]).forEach(function(c){html+='<tr><td style="color:var(--cy);font-family:monospace;font-size:11px">'+(c.email||'-')+'</td><td>'+(c.full_name||'—')+'</td><td>'+(c.company||'—')+'</td><td>'+(c.location||'—')+'</td><td>'+(c.is_verified?'✅':'❌')+'</td></tr>';});
|
|
html+='</tbody></table></div>';
|
|
if((d.pages||1)>1){html+='<div style="display:flex;gap:8px;justify-content:center;margin-top:10px">';if(d.page>1)html+='<button class="btn" onclick="drill(\''+type+'\','+(d.page-1)+')">◄</button>';html+='<span style="color:var(--d);line-height:32px">'+d.page+'/'+d.pages+'</span>';if(d.page<d.pages)html+='<button class="btn" onclick="drill(\''+type+'\','+(d.page+1)+')">►</button>';html+='</div>';}
|
|
} else if(type==='revenue'||type==='youtube'){
|
|
tt.textContent='💰 Revenue & YouTube';
|
|
var r=await fetch('/api/youtube-channels.php?action=dashboard');var d=await r.json();
|
|
var vtot=d.video_totals||{};var adR=parseFloat(vtot.ad_rev||0);var affR=parseFloat(vtot.aff_rev||0);
|
|
html+='<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px">';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:22px;font-weight:700;color:var(--am)">$'+adR.toFixed(2)+'</div><div style="font-size:9px;color:var(--d)">Ad Revenue</div></div>';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:22px;font-weight:700;color:var(--gn)">$'+affR.toFixed(2)+'</div><div style="font-size:9px;color:var(--d)">Affiliate</div></div>';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:22px;font-weight:700;color:var(--pk)">$'+(adR+affR).toFixed(2)+'</div><div style="font-size:9px;color:var(--d)">Total</div></div></div>';
|
|
html+='<table><thead><tr><th>Channel</th><th>Subs</th><th>Views</th><th>$/mo</th></tr></thead><tbody>';
|
|
(d.channels||[]).forEach(function(c){html+='<tr><td style="font-weight:600">'+c.channel_name+'</td><td class="mono">'+Number(c.subscribers).toLocaleString()+'</td><td class="mono">'+Number(c.total_views).toLocaleString()+'</td><td class="mono" style="color:var(--gn)">$'+Number(c.monthly_revenue).toLocaleString()+'</td></tr>';});
|
|
html+='</tbody></table>';
|
|
} else if(type==='pipeline'||type==='dark'){
|
|
tt.textContent='🔄 Pipeline Flow';
|
|
var r=await fetch('/api/pipeline-sync.php?action=drill&type=pipeline');var stages=(await r.json()).stages||[];
|
|
html+='<div class="pipeline">';stages.forEach(function(s,i){html+='<div class="stage"><div style="font-size:20px;font-weight:700;color:'+s.color+'">'+Number(s.count).toLocaleString()+'</div><div style="font-size:9px;color:var(--d)">'+s.name+'</div></div>';if(i<stages.length-1)html+='<div class="arrow">→</div>';});html+='</div>';
|
|
html+='<div style="text-align:center;margin-top:14px"><button class="btn" style="padding:12px 40px;background:rgba(52,211,153,.12);border-color:var(--gn);color:var(--gn)" onclick="syncPipeline()">🔄 Sync Pipeline</button></div>';
|
|
} else if(type==='brain'){
|
|
tt.textContent='🧠 Brain Configs';
|
|
html+='<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px">';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:22px;font-weight:700;color:var(--pu)"><?=$_brainConfigs?></div><div style="font-size:9px;color:var(--d)">Total</div></div>';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:22px;font-weight:700;color:var(--gn)"><?=$_brainWinners?></div><div style="font-size:9px;color:var(--d)">Winners</div></div>';
|
|
html+='<div class="cd" style="text-align:center"><div style="font-size:22px;font-weight:700;color:var(--am)"><?=$_brainAvgInbox?>%</div><div style="font-size:9px;color:var(--d)">Avg Inbox</div></div></div>';
|
|
html+='<div style="display:flex;gap:8px;justify-content:center"><a href="dark-slot.html" class="btn" style="background:rgba(167,139,250,.12);border-color:var(--pu);color:var(--pu)">🎰 Dark Slot</a><a href="dark-matrix.html" class="btn" style="background:rgba(34,211,238,.12);border-color:var(--cy);color:var(--cy)">🧪 Matrix</a></div>';
|
|
} else {
|
|
var links={offers:'offers-manager.html',campaigns:'campaign-manager.html',creatives:'creative-factory.html',personas:'lookalike-engine.html'};
|
|
tt.textContent='📊 '+type.charAt(0).toUpperCase()+type.slice(1);
|
|
html+='<div class="cd" style="text-align:center;padding:20px"><div style="font-size:30px;margin-bottom:8px">📊</div><div style="color:var(--d)">Detailed view available in dedicated page</div>';
|
|
if(links[type]) html+='<div style="margin-top:12px"><a href="'+links[type]+'" class="btn" style="background:rgba(34,211,238,.12);border-color:var(--cy);color:var(--cy)">Open '+type+' →</a></div>';
|
|
html+='</div>';
|
|
}
|
|
ct.innerHTML=html;
|
|
}catch(e){ct.innerHTML='<div style="color:var(--rd)">'+e.message+'</div>';}
|
|
}
|
|
|
|
async function syncPipeline(){var ct=document.getElementById('drillContent');ct.innerHTML='<div style="text-align:center;padding:20px;color:var(--am)">⏳</div>';try{var r=await fetch('/api/pipeline-sync.php?action=sync');var s=(await r.json()).synced||{};ct.innerHTML='<div style="text-align:center;padding:15px"><div style="font-size:30px">✅</div><div style="color:var(--gn);font-weight:700">Done</div><div style="color:var(--d);margin-top:8px">CRM: '+s.scraping_to_crm+' | Send: '+s.scraping_to_send+'</div></div>';}catch(e){ct.innerHTML='<div style="color:var(--rd)">'+e.message+'</div>';}}
|
|
</script>
|
|
<script src="arsenal-common.js?v1770778169"></script>
|
|
<?php include("/opt/wevads-arsenal/public/universal-drill.html"); ?>
|
|
</body></html>
|