255 lines
16 KiB
HTML
255 lines
16 KiB
HTML
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>WEVAL Mega Command Center — All Screens</title>
|
||
<style>
|
||
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--g:#22c55e;--r:#ef4444;--w:#f59e0b;--bl:#3b82f6;--cy:#22d3ee;--pu:#a78bfa}
|
||
*{margin:0;padding:0;box-sizing:border-box}body{font-family:'Segoe UI',system-ui;background:var(--bg);color:var(--t)}
|
||
.hdr{background:linear-gradient(135deg,#0f172a,#1e1b4b);padding:16px 20px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10}
|
||
.hdr h1{font-size:1.2rem;font-weight:800}.hdr .sub{font-size:.7rem;color:var(--d)}
|
||
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:8px;padding:12px 20px}
|
||
.st{background:var(--s);border:1px solid var(--b);border-radius:8px;padding:8px;text-align:center}
|
||
.st .v{font-family:monospace;font-size:1.3rem;font-weight:700}.st .l{font-size:.65rem;color:var(--d)}
|
||
.st.ok .v{color:var(--g)}.st.info .v{color:var(--bl)}.st.warn .v{color:var(--w)}
|
||
.cats{display:flex;flex-wrap:wrap;gap:6px;padding:8px 20px;position:sticky;top:56px;background:var(--bg);z-index:9}
|
||
.cat-btn{padding:4px 12px;border-radius:20px;border:1px solid var(--b);background:var(--s);color:var(--d);font-size:.7rem;cursor:pointer}
|
||
.cat-btn.active,.cat-btn:hover{background:var(--bl);color:#fff;border-color:var(--bl)}
|
||
.search{padding:8px 20px}
|
||
.search input{width:100%;background:var(--s);border:1px solid var(--b);border-radius:8px;padding:8px 12px;color:var(--t);font-size:.8rem}
|
||
.section{padding:0 20px 12px}
|
||
.section h2{font-size:.85rem;font-weight:700;color:var(--cy);padding:10px 0 6px;border-bottom:1px solid var(--b);display:flex;justify-content:space-between}
|
||
.section h2 span{color:var(--d);font-weight:400}
|
||
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:6px;padding:8px 0}
|
||
.item{background:var(--s);border:1px solid var(--b);border-radius:6px;padding:8px 10px;font-size:.72rem;cursor:pointer;transition:.15s;display:flex;align-items:center;gap:6px;text-decoration:none;color:var(--t)}
|
||
.item:hover{border-color:var(--bl);background:var(--s2)}
|
||
.dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}
|
||
.dot.g{background:var(--g)}.dot.r{background:var(--r)}.dot.y{background:var(--w)}.dot.b{background:var(--bl)}
|
||
.item .name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
.item .code{font-family:monospace;font-size:.65rem;color:var(--d)}
|
||
.hidden{display:none}
|
||
footer{padding:12px 20px;border-top:1px solid var(--b);font-size:.65rem;color:var(--d);text-align:center}
|
||
</style></head><body>
|
||
<div class="hdr">
|
||
<div><h1>🎯 WEVAL Mega Command Center</h1><div class="sub">3 Servers · All Apps · <span id="total">...</span> screens · <span id="ts"></span></div></div>
|
||
<div style="display:flex;gap:6px">
|
||
<button onclick="scanAll()" style="padding:4px 10px;border-radius:6px;border:1px solid var(--b);background:var(--s);color:var(--t);font-size:.7rem;cursor:pointer">🔄 Scan All</button>
|
||
<button onclick="window.open('/command-center.html')" style="padding:4px 10px;border-radius:6px;border:1px solid var(--b);background:var(--s);color:var(--t);font-size:.7rem;cursor:pointer">📺 Iframe CC</button>
|
||
</div></div>
|
||
|
||
<div class="stats">
|
||
<div class="st ok" id="st-up"><div class="v">-</div><div class="l">UP</div></div>
|
||
<div class="st" id="st-down"><div class="v">-</div><div class="l">DOWN</div></div>
|
||
<div class="st info" id="st-site"><div class="v">-</div><div class="l">Site</div></div>
|
||
<div class="st info" id="st-prod"><div class="v">-</div><div class="l">Products</div></div>
|
||
<div class="st info" id="st-wevia"><div class="v">-</div><div class="l">WEVIA</div></div>
|
||
<div class="st info" id="st-ethica"><div class="v">-</div><div class="l">Ethica</div></div>
|
||
<div class="st info" id="st-arsenal"><div class="v">-</div><div class="l">Arsenal</div></div>
|
||
<div class="st info" id="st-adx"><div class="v">-</div><div class="l">ADX</div></div>
|
||
<div class="st info" id="st-api"><div class="v">-</div><div class="l">APIs</div></div>
|
||
<div class="st info" id="st-docker"><div class="v">-</div><div class="l">Docker</div></div>
|
||
<div class="st info" id="st-infra"><div class="v">-</div><div class="l">Infra</div></div>
|
||
</div>
|
||
|
||
<div class="cats" id="cats"></div>
|
||
<div class="search"><input type="text" id="search" placeholder="Rechercher un écran..." oninput="filterScreens(this.value)"></div>
|
||
<div id="content"></div>
|
||
<footer>WEVAL Mega Command Center — 3 Servers · All Apps — <span id="scan-time">-</span></footer>
|
||
|
||
<script>
|
||
const SCREENS = {
|
||
'Tests & Monitoring': {icon:'🧪', items:[
|
||
{n:'6σ Master Test',u:'/master-test.html'},
|
||
{n:'WEVIA Mega-test',u:'/wevia-ia/mega-test.html'},
|
||
{n:'NonReg OPUS',u:'/nonreg.html'},
|
||
{n:'GoLive',u:'/golive.html'},
|
||
{n:'Code Review',u:'/wevia-ia/code-review-22mars.html'},
|
||
{n:'Visual NonReg Gallery',u:'/wevia-ia/screenshots/nonreg_20260323_0059.html'},
|
||
{n:'Cyber Command v5',u:'/wevia-ia/wevia-cyber-monitor.php'},
|
||
{n:'Failover Monitor',u:'/wevia-ia/wevia-failover-monitor.php'},
|
||
{n:'Cron Control All',u:'/wevia-ia/cron-control-all.html'},
|
||
{n:'ISP Monitor',u:'/wevia-ia/wevia-isp-monitor.html'},
|
||
]},
|
||
'WEVIA Brain': {icon:'🧠', items:[
|
||
{n:'Brain Orchestrator',u:'/wevia-ia/brain-orchestrator.php'},
|
||
{n:'Cognitive Brain',u:'/wevia-ia/cognitive-brain.php'},
|
||
{n:'Cognitive Opus46',u:'/wevia-ia/cognitive-opus46.php'},
|
||
{n:'GPU Rotation',u:'/wevia-ia/cognitive-gpu-rotation.php'},
|
||
{n:'Consensus Engine',u:'/wevia-ia/consensus-engine.php'},
|
||
{n:'RAG Engine',u:'/wevia-ia/wevia-rag-engine.php'},
|
||
{n:'Admin Conversations',u:'/wevia-ia/wevia-admin-conversations.php'},
|
||
{n:'WEVIA Dashboard',u:'/wevia-ia/wevia-dashboard.php'},
|
||
{n:'WEVIA Admin',u:'/wevia-ia/wevia-admin.php'},
|
||
{n:'WEVIA Status',u:'/wevia-ia/wevia-status.php'},
|
||
{n:'WEVIA Providers',u:'/wevia-ia/wevia-providers.php'},
|
||
{n:'PDF Orchestrator',u:'/wevia-ia/opus-pdf-orchestrator.php'},
|
||
{n:'TTS',u:'/wevia-ia/wevia-tts.php'},
|
||
{n:'Vision',u:'/wevia-ia/wevia-vision.php'},
|
||
{n:'Planner',u:'/wevia-ia/wevia-planner.php'},
|
||
{n:'Self-Healing',u:'/wevia-ia/wevia-self-healing.php'},
|
||
]},
|
||
'Ethica': {icon:'🏥', items:[
|
||
{n:'Ethica Monitor',u:'/ethica-monitor.html'},
|
||
{n:'Ethica Dashboard',u:'/arsenal-proxy/ethica-dashboard.html'},
|
||
{n:'Ethica Chatbot',u:'/arsenal-proxy/ethica-chatbot.html'},
|
||
{n:'Ethica collecteur',u:'/arsenal-proxy/ethica-real-collecteur.html'},
|
||
{n:'Ethica Consent',u:'/arsenal-proxy/ethica-consent.html'},
|
||
{n:'Ethica Campaigns',u:'/arsenal-proxy/ethica-campaigns.html'},
|
||
{n:'Ethica HCP Manager',u:'/arsenal-proxy/ethica-hcp-manager.html'},
|
||
{n:'Ethica Drill',u:'/arsenal-proxy/ethica-drill.html'},
|
||
{n:'Ethica SMS',u:'/arsenal-proxy/ethica-sms-engine.html'},
|
||
{n:'Ethica Audit',u:'/arsenal-proxy/ethica-audit.html'},
|
||
{n:'Ethica Crossvalidator',u:'/arsenal-proxy/ethica-crossvalidator.html'},
|
||
{n:'Ethica Diagnostic',u:'/arsenal-proxy/ethica-diagnostic.html'},
|
||
{n:'Ethica Inscription',u:'/arsenal-proxy/ethica-inscription.html'},
|
||
{n:'Ethica Data List',u:'/arsenal-proxy/ethica-data-list.html'},
|
||
]},
|
||
'Products SaaS': {icon:'📦', items:[]},
|
||
'Arsenal WEVADS (S95:5890)': {icon:'⚡', items:[]},
|
||
'ADX/iResponse (S95:5821)': {icon:'📧', items:[]},
|
||
'APIs': {icon:'🔌', items:[
|
||
{n:'WEVIA Chatbot',u:'/api/weval-ia'},
|
||
{n:'Capabilities Core',u:'/api/wevia-capabilities.php?cap=health'},
|
||
{n:'Capabilities Ext',u:'/api/wevia-capabilities-ext.php?cap=list'},
|
||
{n:'Google API',u:'/api/google-api.php?action=test'},
|
||
{n:'Stripe Webhook',u:'/api/stripe-webhook.php'},
|
||
{n:'Auth Check',u:'/products/auth/check.php'},
|
||
{n:'Droid',u:'/api/droid.php'},
|
||
{n:'CX',u:'/api/cx.php'},
|
||
]},
|
||
'Infrastructure': {icon:'🏗️', items:[
|
||
{n:'Uptime Kuma',u:'https://monitor.weval-consulting.com'},
|
||
{n:'Plausible',u:'https://analytics.weval-consulting.com'},
|
||
{n:'Authentik',u:'https://auth.weval-consulting.com'},
|
||
{n:'WEVADS Login',u:'https://wevads.weval-consulting.com/auth/login.html'},
|
||
{n:'WEVADS Mind',u:'https://wevads.weval-consulting.com/'},
|
||
{n:'consent.wevup.app',u:'https://consent.wevup.app/'},
|
||
{n:'track.wevup.app',u:'https://track.wevup.app/'},
|
||
]},
|
||
'Site Pages': {icon:'🌐', items:[
|
||
{n:'Homepage',u:'/'},
|
||
{n:'Blog',u:'/blog'},
|
||
{n:'Contact',u:'/contact'},
|
||
{n:'Workspace',u:'/products/workspace.html'},
|
||
{n:'Trust Center',u:'/products/trust-center.html'},
|
||
{n:'Signup',u:'/products/signup.html'},
|
||
]},
|
||
};
|
||
|
||
// Products (80) — populate dynamically
|
||
const PRODUCTS = ['academy','adscontrol','affiliates','ai-sdr','arsenal','auditai','bizplan','blacklistguard','blueprintai','canvasai','case-studies','cloud-providers','cloudcost','consulting','content-factory','contractai','copyai','creativefactory','dashboard','dashboardai','dataharvest','datainsight','deliverads','deliverscore','devforge','ecosysteme-ia-maroc','email-platform','email-whitelabel','emailverify','esignature','ethica','ethicab2b','formbuilder','gpu-inference','healthcare-crm','ia-arabe','inboxtest','ispmonitor','leadforge','leansixsigma','mailforge','mailstream','mailwarm','medreach-api','medreach','medreachhcp','meetingai','newsletterinsight','outreachai','partnerprogram','presentationai','proposalai','reputationai','roi-calculator','scoutai','sentinel','services','signup','smsforge','solution-finder','storeai','storeforge','technology-radar','translateai','trust-center','wevads-ia-v2','wevads-ia','wevads','wevalcrm','wevalmind','wevia-agency','wevia-enterprise','wevia-whitelabel','wevialife-app','wevialife','workspace','youtubefactory'];
|
||
SCREENS['Products SaaS'].items = PRODUCTS.map(p=>({n:p,u:`/products/${p}.html`}));
|
||
|
||
// Arsenal (top 60 key screens)
|
||
const ARSENAL = ['brain-central','brain-drilldown','brain-report','brain-send','brain-unified-send','brain-combo-discovery','ceo-dashboard','command-center','configuration-manager','control-hub','creative-factory','cron-control','cron-control-all','dark-data','dns-manager','ethica-app-v3','ethica-dashboard','ethica-drill','ethica-hcp-manager','ethica-campaigns','isp-deliverability','ip-manager','monitoring-central','office-management','office-workflow','provider-rotation','seed-manager','sending-optimizer','warmup-manager','cloud-providers','cloud-cost-monitor','cloudflare-manager','affiliate-monitor','ai-copywriter','advanced-dashboard','auto-healing-dashboard','beast-monitor','blacklist-monitor','captcha-solver','cloud-account-factory','sessions-monitor','unified-tracking','universal-drill','system-health','test-metrics'];
|
||
SCREENS['Arsenal WEVADS (S95:5890)'].items = ARSENAL.map(a=>({n:a,u:`/arsenal-proxy/${a}.html`}));
|
||
|
||
// ADX (top 40)
|
||
const ADX = ['auth/login','menu','dashboard','brain-central','brain-drilldown','ceo-dashboard','cloud-providers','configuration-manager','cron-control','dns-manager','ip-manager','monitoring-central','office-management','provider-rotation','seed-manager','sending-optimizer','warmup-manager','creative-factory','isp-deliverability','sessions-monitor'];
|
||
SCREENS['ADX/iResponse (S95:5821)'].items = ADX.map(a=>({n:a,u:`https://wevads.weval-consulting.com/${a}.html`}));
|
||
|
||
let allItems = [];
|
||
let scanResults = {};
|
||
|
||
function render() {
|
||
const cats = document.getElementById('cats');
|
||
const content = document.getElementById('content');
|
||
cats.innerHTML = '';
|
||
content.innerHTML = '';
|
||
allItems = [];
|
||
let catNames = Object.keys(SCREENS);
|
||
|
||
cats.innerHTML = '<button class="cat-btn active" onclick="showAll()">All</button>' + catNames.map(c=>`<button class="cat-btn" onclick="showCat('${c}')">${SCREENS[c].icon} ${c} (${SCREENS[c].items.length})</button>`).join('');
|
||
|
||
let totalScreens = 0;
|
||
for (let [cat, data] of Object.entries(SCREENS)) {
|
||
let sec = document.createElement('div');
|
||
sec.className = 'section';
|
||
sec.dataset.cat = cat;
|
||
sec.innerHTML = `<h2>${data.icon} ${cat} <span>${data.items.length} screens</span></h2>`;
|
||
let grid = document.createElement('div');
|
||
grid.className = 'grid';
|
||
for (let item of data.items) {
|
||
let a = document.createElement('a');
|
||
a.className = 'item';
|
||
a.href = item.u;
|
||
a.target = '_blank';
|
||
a.dataset.name = item.n.toLowerCase();
|
||
a.dataset.cat = cat;
|
||
let status = scanResults[item.u];
|
||
let dotCls = status ? (status >= 200 && status < 400 ? 'g' : status >= 400 && status < 500 ? 'y' : 'r') : 'b';
|
||
a.innerHTML = `<span class="dot ${dotCls}"></span><span class="name">${item.n}</span><span class="code">${status||'—'}</span>`;
|
||
grid.appendChild(a);
|
||
allItems.push(a);
|
||
}
|
||
sec.appendChild(grid);
|
||
content.appendChild(sec);
|
||
totalScreens += data.items.length;
|
||
}
|
||
document.getElementById('total').textContent = totalScreens;
|
||
document.getElementById('ts').textContent = new Date().toLocaleString('fr');
|
||
}
|
||
|
||
function showCat(cat) {
|
||
document.querySelectorAll('.section').forEach(s=>s.classList.toggle('hidden', s.dataset.cat!==cat));
|
||
document.querySelectorAll('.cat-btn').forEach(b=>b.classList.remove('active'));
|
||
event.target.classList.add('active');
|
||
}
|
||
function showAll() {
|
||
document.querySelectorAll('.section').forEach(s=>s.classList.remove('hidden'));
|
||
document.querySelectorAll('.cat-btn').forEach(b=>b.classList.remove('active'));
|
||
document.querySelector('.cat-btn').classList.add('active');
|
||
}
|
||
function filterScreens(q) {
|
||
q = q.toLowerCase();
|
||
allItems.forEach(a=>a.classList.toggle('hidden', !a.dataset.name.includes(q)));
|
||
}
|
||
|
||
async function scanAll() {
|
||
document.getElementById('scan-time').textContent = 'Scanning...';
|
||
let t0 = Date.now();
|
||
let up=0, down=0;
|
||
for (let [cat, data] of Object.entries(SCREENS)) {
|
||
for (let item of data.items) {
|
||
try {
|
||
let r = await fetch(item.u, {method:'HEAD',mode:'no-cors',signal:AbortSignal.timeout(3000)});
|
||
scanResults[item.u] = r.status || 200;
|
||
up++;
|
||
} catch(e) {
|
||
scanResults[item.u] = 0;
|
||
down++;
|
||
}
|
||
}
|
||
}
|
||
document.querySelector('#st-up .v').textContent = up;
|
||
document.querySelector('#st-down .v').textContent = down;
|
||
document.getElementById('scan-time').textContent = `${((Date.now()-t0)/1000).toFixed(1)}s`;
|
||
render();
|
||
// Update category stats
|
||
for (let [cat,data] of Object.entries(SCREENS)) {
|
||
let id = cat.toLowerCase().replace(/[^a-z]/g,'').slice(0,6);
|
||
let el = document.getElementById('st-'+id);
|
||
if (el) el.querySelector('.v').textContent = data.items.length;
|
||
}
|
||
let counts = {};
|
||
for (let [cat,data] of Object.entries(SCREENS)) counts[cat] = data.items.length;
|
||
document.querySelector('#st-site .v').textContent = counts['Site Pages']||0;
|
||
document.querySelector('#st-prod .v').textContent = counts['Products SaaS']||0;
|
||
document.querySelector('#st-wevia .v').textContent = counts['WEVIA Brain']||0;
|
||
document.querySelector('#st-ethica .v').textContent = counts['Ethica']||0;
|
||
document.querySelector('#st-arsenal .v').textContent = counts['Arsenal WEVADS (S95:5890)']||0;
|
||
document.querySelector('#st-adx .v').textContent = counts['ADX/iResponse (S95:5821)']||0;
|
||
document.querySelector('#st-api .v').textContent = counts['APIs']||0;
|
||
document.querySelector('#st-infra .v').textContent = counts['Infrastructure']||0;
|
||
}
|
||
|
||
render();
|
||
// Auto stats
|
||
let tc=0;for(let d of Object.values(SCREENS))tc+=d.items.length;
|
||
document.getElementById('total').textContent = tc;
|
||
document.getElementById('ts').textContent = new Date().toLocaleString('fr');
|
||
for(let[cat,data]of Object.entries(SCREENS)){
|
||
let m={'Site Pages':'site','Products SaaS':'prod','WEVIA Brain':'wevia','Ethica':'ethica','Arsenal WEVADS (S95:5890)':'arsenal','ADX/iResponse (S95:5821)':'adx','APIs':'api','Infrastructure':'infra'};
|
||
let el=document.getElementById('st-'+(m[cat]||''));
|
||
if(el)el.querySelector('.v').textContent=data.items.length;
|
||
}
|
||
</script>
|
||
</body></html>
|