Files
html/brain-center-tenant.html
2026-04-19 21:20:03 +02:00

118 lines
6.9 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>Brain Center Tenant</title>
<style>
body{font-family:system-ui;background:#0a0e1a;color:#e2e8f0;margin:0;padding:20px}
h1{color:#a5b4fc}
.summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:20px}
.stat{background:#151e33;padding:16px;border-radius:8px;border:1px solid #1e293b}
.stat-value{font-size:1.8rem;color:#22d3ee;font-weight:700}
.stat-label{color:#94a3b8;font-size:.75rem;text-transform:uppercase;margin-top:4px}
.section{background:#151e33;padding:20px;border-radius:8px;margin-bottom:16px}
.section h3{color:#a5b4fc;margin-top:0}
.row{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid #1e293b}
.row:last-child{border-bottom:none}
.actions{display:flex;gap:10px;flex-wrap:wrap}
.btn{padding:8px 16px;background:#6366f1;color:#fff;border:none;border-radius:6px;cursor:pointer;text-decoration:none;font-weight:500}
.btn:hover{background:#4f46e5}
.btn.secondary{background:#1e293b}
</style></head>
<body>
<h1>🧠 Brain Center — <span id="tname">tenant</span></h1>
<div class="actions">
<a class="btn" id="link-vsm">🗺️ VSM Hub</a>
<a class="btn" id="link-dmaic">🔬 DMAIC</a>
<a class="btn" id="link-kpi">📊 KPI Live</a>
<a class="btn secondary" href="/onboarding-em.html"> Nouveau tenant</a>
</div>
<div class="summary" id="summary"><div class="stat"><div class="stat-value">-</div><div class="stat-label">Loading...</div></div></div>
<div class="section"><h3>Value Streams</h3><div id="vs-list">Loading...</div></div>
<div class="section"><h3>Cycles DMAIC actifs</h3><div id="dmaic-list">Loading...</div></div>
<script>
const TENANT = new URLSearchParams(location.search).get('id') || 'weval';
document.getElementById('tname').textContent = TENANT;
document.getElementById('link-vsm').href = `/vsm-hub.html?tenant=${TENANT}`;
document.getElementById('link-dmaic').href = `/dmaic-workbench.html?tenant=${TENANT}`;
document.getElementById('link-kpi').href = `/kpi-live-dashboard.html?tenant=${TENANT}`;
Promise.all([
fetch(`/api/em/vsm?tenant=${TENANT}`).then(r=>r.json()),
fetch(`/api/em/dmaic?tenant=${TENANT}`).then(r=>r.json()),
fetch(`/api/em/agents-registry?tenant=${TENANT}`).then(r=>r.json()),
fetch(`/api/em/kpi/live?tenant=${TENANT}`).then(r=>r.json())
]).then(([vsm,dmaic,agents,kpi])=>{
const dmaicActive = (dmaic.cycles||[]).filter(c=>c.phase!=='control').length;
document.getElementById('summary').innerHTML = `
<div class="stat"><div class="stat-value">${(vsm.depts||[]).length}</div><div class="stat-label">Depts</div></div>
<div class="stat"><div class="stat-value">${(agents.agents||[]).length}</div><div class="stat-label">Agents</div></div>
<div class="stat"><div class="stat-value">${dmaicActive}</div><div class="stat-label">DMAIC actifs</div></div>
<div class="stat"><div class="stat-value">${(kpi.kpis||[]).length}</div><div class="stat-label">KPIs live</div></div>
`;
document.getElementById('vs-list').innerHTML = (vsm.depts||[]).map(d=>`<div class="row"><span>${d.icon||'📊'} <strong>${d.dept_name}</strong> <small style="color:#64748b">(${d.dept_code})</small></span><a href="/vsm-hub.html?tenant=${TENANT}&dept=${d.dept_code}" style="color:#a5b4fc">Voir →</a></div>`).join('');
document.getElementById('dmaic-list').innerHTML = (dmaic.cycles||[]).slice(0,8).map(c=>`<div class="row"><span><strong>${c.name}</strong></span><span style="color:#22d3ee">${c.phase} ${c.progress}%</span></div>`).join('');
});
</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 === -->
</body></html>