Files
html/dormant-dashboard-v2.html
2026-04-21 14:55:01 +02:00

149 lines
8.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><title>Dormant Dashboard — WEVIA EM</title><style>
*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,sans-serif;background:#0a0e1a;color:#e2e8f0;padding:20px}
.hd{background:linear-gradient(135deg,#7c3aed,#4c1d95);padding:22px 28px;border-radius:12px;margin-bottom:20px}
.hd h1{color:white;font-size:26px}.hd .sub{color:rgba(255,255,255,.85);margin-top:6px;font-size:13px}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card{background:#111827;border:1px solid #1e293b;border-radius:10px;padding:16px}
.card h3{color:#a855f7;font-size:14px;margin-bottom:10px;text-transform:uppercase;letter-spacing:1px}
.row{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #1e293b;font-size:12px}
.row:last-child{border:none}
.ok{color:#4ade80}.ko{color:#f87171}.warn{color:#facc15}
.actions{margin-top:12px;display:flex;gap:8px;flex-wrap:wrap}
.btn{padding:6px 12px;background:#1e293b;border-radius:4px;color:#a855f7;text-decoration:none;font-size:11px;font-weight:600}
.btn:hover{background:#7c3aed;color:white}
.sep{margin:30px 0 15px;color:#a855f7;font-size:13px;border-bottom:1px solid #1e293b;padding-bottom:5px;text-transform:uppercase;letter-spacing:2px}
</style></head><body>
<div class="hd"><h1>🎯 Dormant Dashboard</h1><div class="sub">WEVIA EM — Aucune capability inactive, tout wired, tout visible</div></div>
<div class="sep">Capabilities Open-Source (12 services)</div>
<div class="grid" id="cap-grid">Loading...</div>
<div class="sep">Intégrations Universelles (104 connecteurs)</div>
<div class="grid" id="uc-grid">Loading...</div>
<div class="sep">Actions rapides</div>
<div class="grid">
<div class="card"><h3>🚀 Gérer via chat</h3>
<div class="row">Widget WEVIA Master</div>
<div class="actions"><a class="btn" href="/wevia-master.html">Ouvrir chat</a></div>
</div>
<div class="card"><h3>🧪 Full NonReg EM</h3>
<div class="row">22 endpoints + 8 pages UI</div>
<div class="actions"><a class="btn" href="/api/em-webhooks.php?action=em-nonreg" target="_blank">Run NonReg</a></div>
</div>
<div class="card"><h3>🎯 Lean 6σ Dashboard</h3>
<div class="row">Muda/Poka/Kaizen/Gemba/PDCA/Andon/5S/A3</div>
<div class="actions"><a class="btn" href="/lean6sigma-dashboard.html">Ouvrir</a></div>
</div>
<div class="card"><h3>🔌 Universal Hub</h3>
<div class="row">Tout ERP · CRM · IA · Cloud · Hardware</div>
<div class="actions"><a class="btn" href="/universal-integration-hub.html">Explorer</a></div>
</div>
</div>
<script>
async function loadCaps(){
const services=[
['Paperclip','http://127.0.0.1:3088/'],['Twenty CRM','http://127.0.0.1:3000/healthz'],
['Mattermost','http://127.0.0.1:8065/api/v4/system/ping'],['Uptime-Kuma','http://127.0.0.1:3002/'],
['Searxng','http://127.0.0.1:8080/'],['Prometheus','http://127.0.0.1:9095/-/ready'],
['Loki','http://127.0.0.1:3100/ready'],['Gitea','http://127.0.0.1:3300/'],
['Qdrant','http://localhost:6333/'],['N8N','http://127.0.0.1:5678/healthz'],
['Ollama','http://localhost:11434/'],['Sovereign AI','http://127.0.0.1:4000/']
];
const r=await fetch('/api/wevia-master-api.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:'capabilities inventory',session:'ui',history:[]})}).then(r=>r.json());
const txt=r.content||'';
const lines=txt.split('\n').filter(l=>l.includes('✅')||l.includes('❌'));
document.getElementById('cap-grid').innerHTML=lines.map(l=>{
const ok=l.includes('✅');
const name=l.replace(/^.*[✅❌]\s+/,'').replace(/\s*\(HTTP.*\)\s*$/,'').trim();
const http=(l.match(/HTTP\s+(\d+)/)||[])[1]||'-';
return `<div class="card"><h3>${ok?'✅':'❌'} ${name}</h3>
<div class="row"><span>Status</span><span class="${ok?'ok':'ko'}">HTTP ${http}</span></div>
<div class="row"><span>Wired WEVIA</span><span class="ok">YES</span></div>
<div class="row"><span>Type</span><span>open-source</span></div>
</div>`;
}).join('');
}
async function loadUC(){
const d=await fetch('/api/em/universal-stats').then(r=>r.json());
document.getElementById('uc-grid').innerHTML=(d.by_category||[]).map(c=>`
<div class="card"><h3>${c.category.toUpperCase()}</h3>
<div class="row"><span>Connecteurs</span><span class="ok">${c.c}</span></div>
<div class="row"><span>Status</span><span class="ok">available</span></div>
<div class="actions"><a class="btn" href="/universal-integration-hub.html?cat=${c.category}">Voir détail</a></div>
</div>
`).join('');
}
(async()=>{await loadCaps();await loadUC()})();
</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) {
// Clone card content + show close btn + increase font-size
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 a more-specific drill is already active (e.g. pp-card custom), let it handle
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);} });
}
}
// Initial + mutation observer
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 === -->
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body></html>