Files
html/nonreg-old-v2.html
2026-04-19 22:10:02 +02:00

229 lines
12 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>WEVAL — Master Test Report</title>
<link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Outfit:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
<style>
:root{--bg:#080b12;--surface:rgba(255,255,255,.03);--border:rgba(255,255,255,.06);--text:#94a3b8;--white:#f1f5f9;--accent:#6366f1;--teal:#00c896;--red:#ef4444;--gold:#f0c674;--r:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:"Outfit",system-ui,sans-serif;background:var(--bg);color:var(--text);font-size:15px;min-height:100vh}
.wrap{max-width:1200px;margin:0 auto;padding:1.5rem 4%}
.hero{text-align:center;padding:2rem 0 1.5rem}
.badge{display:inline-block;background:rgba(99,102,241,.1);color:var(--accent);padding:6px 18px;border-radius:20px;font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-bottom:.8rem}
h1{font-size:1.8rem;font-weight:800;color:var(--white);margin-bottom:.3rem}
h1 em{color:var(--teal);font-style:normal}
.sub{color:var(--text);font-size:.85rem;margin-bottom:1.5rem}
.tabs{display:flex;gap:0;justify-content:center;margin-bottom:1.5rem;background:var(--surface);border:1px solid var(--border);border-radius:var(--r);overflow:hidden;max-width:600px;margin-left:auto;margin-right:auto}
.tab{flex:1;padding:.7rem 1rem;text-align:center;cursor:pointer;font-weight:600;font-size:.85rem;color:var(--text);transition:all .2s;border:none;background:transparent}
.tab:hover{color:var(--white);background:rgba(99,102,241,.1)}
.tab.active{background:var(--accent);color:#fff}
.tab .count{font-family:"Space Mono";font-size:.7rem;margin-left:.3rem;opacity:.7}
.panel{display:none}
.panel.active{display:block}
.stats{display:flex;gap:.8rem;justify-content:center;flex-wrap:wrap;margin-bottom:1.5rem}
.stat{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);padding:.6rem 1.2rem;text-align:center}
.stat-num{font-family:"Space Mono";font-size:1.5rem;font-weight:700;color:var(--white)}
.stat-label{font-size:.65rem;text-transform:uppercase;letter-spacing:.05em;color:var(--text)}
.stat.pass .stat-num{color:var(--teal)}
.stat.fail .stat-num{color:var(--red)}
.stat.warn .stat-num{color:var(--gold)}
/* NonReg output */
.output{font-family:"Space Mono",monospace;font-size:12px;line-height:1.7;white-space:pre-wrap;word-break:break-word;padding:1rem;background:rgba(0,0,0,.3);border:1px solid var(--border);border-radius:var(--r);max-height:600px;overflow-y:auto}
.output .pass{color:var(--teal)}.output .fail{color:var(--red)}.output .warn{color:var(--gold)}.output .section{color:var(--accent);font-weight:700}
/* Iframe panel */
.iframe-wrap{border:1px solid var(--border);border-radius:var(--r);overflow:hidden;background:#f8fafc}
.iframe-wrap iframe{width:100%;height:80vh;border:none}
/* Run button */
.run-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--accent);color:#fff;border:none;padding:.6rem 1.5rem;border-radius:8px;font-weight:600;font-size:.85rem;cursor:pointer;margin-bottom:1rem;transition:all .2s}
.run-btn:hover{background:#4f46e5;transform:translateY(-1px)}
.run-btn:disabled{opacity:.5;cursor:not-allowed}
.run-btn .spinner{display:none;width:14px;height:14px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}
.run-btn.loading .spinner{display:inline-block}
@keyframes spin{to{transform:rotate(360deg)}}
/* Timestamp */
.ts{font-size:.7rem;color:var(--text);text-align:center;margin-top:.5rem;font-family:"Space Mono"}
</style>
</head>
<body>
<div class="wrap">
<div class="hero">
<div class="badge">Quality Assurance</div>
<h1>WEVAL <em>Master Test Report</em></h1>
<div class="sub">NonReg + Visual + Auth + Overlap — weval-consulting.com</div>
</div>
<div class="tabs">
<div class="tab active" onclick="showTab('nonreg')">🧪 NonReg <span class="count" id="nr-count"></span></div>
<div class="tab" onclick="showTab('visual')">📸 Visual <span class="count" id="vs-count"></span></div>
<div class="tab" onclick="showTab('auth')">🔐 Auth <span class="count" id="au-count"></span></div>
</div>
<!-- NONREG PANEL -->
<div class="panel active" id="p-nonreg">
<div style="text-align:center">
<button class="run-btn" id="btn-nonreg" onclick="runNonreg()"><span class="spinner"></span>▶ Lancer NonReg</button>
<button class="run-btn" onclick="runVisualTest()" style="background:#0ea5e9">📸 Lancer Visual Test</button>
</div>
<div class="stats" id="nr-stats"></div>
<div class="output" id="nr-output">Cliquez "Lancer NonReg" pour exécuter les tests...</div>
<div class="ts" id="nr-ts"></div>
</div>
<!-- VISUAL PANEL -->
<div class="panel" id="p-visual">
<div style="text-align:center;margin-bottom:1rem">
<button class="run-btn" onclick="runVisualTest()" style="background:#0ea5e9"><span class="spinner"></span>📸 Re-lancer Visual Test</button>
</div>
<div class="iframe-wrap">
<iframe id="if-visual" src="/test-report/visual-report.html" loading="lazy"></iframe>
</div>
<div class="ts" id="vs-ts">Dernier rapport chargé</div>
</div>
<!-- AUTH PANEL -->
<div class="panel" id="p-auth">
<div class="iframe-wrap">
<iframe id="if-auth" src="/test-report/auth-report.html" loading="lazy"></iframe>
</div>
<div class="ts" id="au-ts">Dernier rapport chargé</div>
</div>
</div>
<script>
function showTab(id){
document.querySelectorAll('.tab').forEach((t,i)=>t.classList.toggle('active',['nonreg','visual','auth'][i]===id));
document.querySelectorAll('.panel').forEach(p=>p.classList.remove('active'));
document.getElementById('p-'+id).classList.add('active');
}
async function runNonreg(){
var btn=document.getElementById('btn-nonreg');
btn.classList.add('loading');btn.disabled=true;
document.getElementById('nr-output').textContent='⏳ Tests en cours...\n';
try{
var r=await fetch('/api/nonreg-master.php',{credentials:'include'});
var text=await r.text();
var out=document.getElementById('nr-output');
// Parse and colorize
var lines=text.split('\n');
var pass=0,fail=0,warn=0;
var html='';
lines.forEach(function(l){
if(l.includes('✅')||l.includes('PASS')){html+='<span class="pass">'+esc(l)+'</span>\n';pass++;}
else if(l.includes('❌')||l.includes('FAIL')){html+='<span class="fail">'+esc(l)+'</span>\n';fail++;}
else if(l.includes('⚠')||l.includes('WARN')){html+='<span class="warn">'+esc(l)+'</span>\n';warn++;}
else if(l.startsWith('===')||l.startsWith('---')){html+='<span class="section">'+esc(l)+'</span>\n';}
else{html+=esc(l)+'\n';}
});
out.innerHTML=html;
document.getElementById('nr-stats').innerHTML=
'<div class="stat pass"><div class="stat-num">'+pass+'</div><div class="stat-label">Pass</div></div>'+
'<div class="stat fail"><div class="stat-num">'+fail+'</div><div class="stat-label">Fail</div></div>'+
'<div class="stat warn"><div class="stat-num">'+warn+'</div><div class="stat-label">Warn</div></div>'+
'<div class="stat"><div class="stat-num">'+(pass+fail+warn)+'</div><div class="stat-label">Total</div></div>';
document.getElementById('nr-count').textContent=pass+'/'+(pass+fail+warn);
document.getElementById('nr-ts').textContent='Exécuté: '+new Date().toLocaleString('fr-FR');
}catch(e){
document.getElementById('nr-output').textContent='❌ Erreur: '+e.message;
}
btn.classList.remove('loading');btn.disabled=false;
}
async function runVisualTest(){
alert('Visual test lancé en background sur S204.\nDurée estimée: ~2 minutes.\nLe rapport se mettra à jour automatiquement.');
try{
await fetch('/api/cx',{method:'POST',body:'k=WEVADS2026&c='+btoa('cd /opt && python3 weval-visual-test.py && cp /tmp/weval-visual-report.html /var/www/html/test-report/visual-report.html'),headers:{'Content-Type':'application/x-www-form-urlencoded'}});
setTimeout(function(){document.getElementById('if-visual').src='/test-report/visual-report.html?t='+Date.now()},150000);
}catch(e){}
}
function esc(s){return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')}
// Auto-count visual/auth reports
setTimeout(function(){
try{
var vf=document.getElementById('if-visual');
vf.onload=function(){
try{
var d=vf.contentDocument;
var p=d.querySelectorAll('.bp,[class*=pass]').length;
var f=d.querySelectorAll('.bf,[class*=fail]').length;
document.getElementById('vs-count').textContent=p+'/'+(p+f);
}catch(e){}
};
var af=document.getElementById('if-auth');
af.onload=function(){
try{
var d=af.contentDocument;
var p=d.querySelectorAll('.bp,[class*=pass]').length;
var f=d.querySelectorAll('.bf,[class*=fail]').length;
document.getElementById('au-count').textContent=p+'/'+(p+f);
}catch(e){}
};
}catch(e){}
},2000);
</script>
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
<script>
(function(){
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
var d = document;
var m = d.createElement('div');
m.id = 'opus-udrill';
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
var inner = d.createElement('div');
inner.id = 'opus-udrill-in';
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
inner.addEventListener('click', function(e){ e.stopPropagation(); });
m.appendChild(inner);
m.addEventListener('click', function(){ m.style.display='none'; });
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
(d.body || d.documentElement).appendChild(m);
function openCard(card) {
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
inner.innerHTML = html;
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
m.style.display = 'flex';
}
function wire(root) {
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
var cards = root.querySelectorAll(sels);
for (var i = 0; i < cards.length; i++) {
var c = cards[i];
if (c.__opusWired) continue;
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
var r = c.getBoundingClientRect();
if (r.width < 60 || r.height < 40) continue;
c.__opusWired = true;
c.style.cursor = 'pointer';
c.setAttribute('role','button');
c.setAttribute('tabindex','0');
c.addEventListener('click', function(ev){
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
if (ev.target.closest('a,button,input,select')) return;
ev.preventDefault(); ev.stopPropagation();
openCard(this);
});
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
}
}
var initRun = function(){ wire(d.body || d.documentElement); };
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
else initRun();
var mo = new MutationObserver(function(muts){
var newCard = false;
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
if (newCard) initRun();
});
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
})();
</script>
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
</body>
</html>