fix-wevialife-resolved-alerts-dismiss-api-no-false-urgents
This commit is contained in:
8
api/���]X�KX]]ۛ�[�˜�
Normal file
8
api/���]X�KX]]ۛ�[�˜�
Normal file
@@ -0,0 +1,8 @@
|
||||
if [ "\$BLANKS" -gt "0" ]; then
|
||||
dbq "DELETE FROM ethica.medecins_validated WHERE source!='hcp_gen_20260218' AND (nom IS NULL OR nom='' OR nom=' ')" > /dev/null
|
||||
log "BLANKS: Removed \$BLANKS"
|
||||
else
|
||||
log "BLANKS: Clean"
|
||||
fi
|
||||
|
||||
# 5. NONREG - 6 API endpoints
|
||||
1
api/��XK���
Normal file
1
api/��XK���
Normal file
@@ -0,0 +1 @@
|
||||
luc192YWxpZGF0ZWQgYiBXSEVSRSBiLnNvdXJjZT0nMXNhbnRlJyBBTkQgKGIuaWQ9YS5pZCsxIE9SIGIuaWQ9YS5pZC0xKSBBTkQgYi50ZWxlcGhvbmUgSVMgTk9UIE5VTEwgQU5EIGIudGVsZXBob25lIT0nJykiID4gL2Rldi9udWxsCk5PX0NPTlRBQ1Q9JChkYnEgIlNFTEVDVCBjb3VudCgqKSBGUk9NIGV0aGljYS5tZWRlY2luc19jbGVhbiBXSEVSRSAoZW1haWwgSVMgTlVMTCBPUiBlbWFpbD0nJyBPUiBlbWFpbD0nTi9BJykgQU5EICh0ZWxlcGhvbmUgSVMgTlVMTCBPUiB0ZWxlcGhvbmU9JycgT1IgdGVsZXBob25lPSdOL0EnKSIpCmxvZyAiRU5SSUNIOiAkTk9fQ09OVEFDVCBjb250YWN0cyBzdGlsbCB3aXRob3V0IGFueSBjb250YWN0IGluZm8iCgojIDQuIEJMQU5LIE5BTUUgR1VBUkQKQkxBTktTPSQoZGJxICJTRUxFQ1QgY291bnQoKikgRlJPTSBldGhpY2EubWVkZWNpbnNfdmFsaWRhdGVkIFdIRVJFIHNvdXJjZSE9J2hjcF9nZW5fMjAyNjAyMTgnIEFORCAobm9tIElTIE5VTEwgT1Igbm9tPScnIE9SIG5vbT0nICcpIikKaWYgWyAiJEJMQU5LUyIgLWd0ICIwIiBdOyB0aGVuCiAgZGJxICJERUxFVEUgRlJPTSBldGhpY2EubWVkZWNpbnNfdmFsaWRhdGVkIFdIRVJFIHNvdXJjZSE9J2hjcF9nZW5fMjAyNjAyMTgnIEFORCAobm9tIElTIE5VTEwgT1Igbm9tPScnIE9SIG5vbT0nICcpIiA+IC9kZXYvbnVsbAogIGxvZyAiQkxBTktTOiBSZW1vdmVkICRCTEFOS1MiCmVsc2UKICBsb2cgIkJMQU5LUzogQ2xlYW4iCmZpCgojIDUuIE5PTlJFRyAtIDYgQVBJIGVuZHBvaW50cwpFUlJPUlM9MApmb3IgVVJMIGluIFwKICAiaHR0cHM6Ly9ldGhpY2Eud2V2dXAuYXBwL2FwaS9ldGhpY2EtcmVhbC1zY3JhcGVyLWFwaS5waHA/YWN0aW9uPXN0YXR1cyIgXAogICJodHRwczovL2V0aGljYS53ZXZ1cC5hcHAvYXBpL2V0aGljYS12YWxpZGF0aW9uLWFwaS5waHA/YWN0aW9uPXN0YXR1cyZ0b2tlbj1FVEhJQ0FfQVBJXzI
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,241 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>WEVAL Command Center</title>
|
||||
<style>
|
||||
:root{--bg:#06080f;--card:#0d1117;--border:#1e293b;--text:#e2e8f0;--dim:#64748b;--accent:#a5b4fc;--green:#22c55e;--red:#ef4444;--warn:#f59e0b;--blue:#3b82f6}
|
||||
*{box-sizing:border-box;margin:0;padding:0}
|
||||
body{font-family:'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(--text);height:100vh;display:flex;flex-direction:column;overflow:hidden}
|
||||
header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:var(--card);border-bottom:1px solid var(--border);flex-shrink:0}
|
||||
header h1{font-size:15px;color:var(--accent);font-weight:700}
|
||||
.nav{display:flex;gap:4px;flex-wrap:wrap}
|
||||
.nav button{padding:5px 10px;border:1px solid var(--border);background:var(--card);color:var(--dim);border-radius:5px;cursor:pointer;font-size:11px;transition:.15s;white-space:nowrap}
|
||||
.nav button:hover{color:var(--text);border-color:var(--accent)}
|
||||
.nav button.active{background:var(--accent);color:#000;border-color:var(--accent);font-weight:600}
|
||||
.nav button .dot{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:4px}
|
||||
.dot-ok{background:var(--green)}.dot-fail{background:var(--red)}.dot-warn{background:var(--warn)}
|
||||
.main{flex:1;display:flex;overflow:hidden}
|
||||
.sidebar{width:220px;background:var(--card);border-right:1px solid var(--border);overflow-y:auto;flex-shrink:0;padding:8px 0}
|
||||
.sidebar.hidden{display:none}
|
||||
.sg{padding:4px 12px}
|
||||
.sg-title{font-size:10px;color:var(--dim);font-weight:700;text-transform:uppercase;letter-spacing:.5px;padding:8px 0 4px}
|
||||
.sg a{display:flex;align-items:center;gap:6px;padding:5px 8px;color:var(--dim);text-decoration:none;font-size:12px;border-radius:4px;cursor:pointer;transition:.1s}
|
||||
.sg a:hover{background:#1e293b;color:var(--text)}
|
||||
.sg a.active{background:var(--accent);color:#000;font-weight:600}
|
||||
.sg a .st{font-size:9px;padding:1px 5px;border-radius:3px;margin-left:auto}
|
||||
.st-ok{background:#052e16;color:var(--green)}.st-fail{background:#450a0a;color:var(--red)}
|
||||
.content{flex:1;display:flex;flex-direction:column;overflow:hidden}
|
||||
.toolbar{display:flex;gap:6px;padding:6px 10px;background:var(--card);border-bottom:1px solid var(--border);align-items:center;flex-shrink:0}
|
||||
.toolbar span{font-size:11px;color:var(--dim)}
|
||||
.toolbar button{padding:3px 8px;border:1px solid var(--border);background:var(--card);color:var(--dim);border-radius:4px;cursor:pointer;font-size:11px}
|
||||
.toolbar button:hover{color:var(--text)}
|
||||
#frame{flex:1;border:none;width:100%;background:var(--bg)}
|
||||
.grid-view{flex:1;overflow-y:auto;padding:10px;display:grid;grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:8px}
|
||||
.grid-view .tile{background:var(--card);border:1px solid var(--border);border-radius:8px;overflow:hidden;height:300px;display:flex;flex-direction:column}
|
||||
.grid-view .tile-header{display:flex;justify-content:space-between;align-items:center;padding:6px 10px;border-bottom:1px solid var(--border);flex-shrink:0}
|
||||
.grid-view .tile-header span{font-size:11px;font-weight:600;color:var(--accent)}
|
||||
.grid-view .tile-header button{padding:2px 6px;border:1px solid var(--border);background:transparent;color:var(--dim);border-radius:3px;cursor:pointer;font-size:10px}
|
||||
.grid-view .tile-header button:hover{color:var(--text)}
|
||||
.grid-view .tile iframe{flex:1;border:none;width:100%}
|
||||
.status-bar{display:flex;gap:12px;padding:4px 16px;background:var(--card);border-top:1px solid var(--border);font-size:10px;color:var(--dim);flex-shrink:0;align-items:center}
|
||||
.status-bar .pill{padding:1px 6px;border-radius:3px;font-weight:600}
|
||||
.pill-ok{background:#052e16;color:var(--green)}.pill-fail{background:#450a0a;color:var(--red)}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header>
|
||||
<h1>WEVAL Command Center</h1>
|
||||
<div class="nav" id="cats"></div>
|
||||
<div style="display:flex;gap:6px">
|
||||
<button class="nav" onclick="toggleSidebar()" style="padding:5px 8px;border:1px solid var(--border);background:var(--card);color:var(--dim);border-radius:5px;cursor:pointer;font-size:11px">☰</button>
|
||||
<button class="nav" onclick="setView('single')" id="vSingle" style="padding:5px 8px;border:1px solid var(--border);background:var(--card);color:var(--dim);border-radius:5px;cursor:pointer;font-size:11px">▣</button>
|
||||
<button class="nav" onclick="setView('grid')" id="vGrid" style="padding:5px 8px;border:1px solid var(--border);background:var(--card);color:var(--dim);border-radius:5px;cursor:pointer;font-size:11px">⊞</button>
|
||||
<button class="nav" onclick="healthCheck()" id="btnHealth" style="padding:5px 8px;border:1px solid var(--border);background:var(--card);color:var(--dim);border-radius:5px;cursor:pointer;font-size:11px">🔄 Health</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="main">
|
||||
<div class="sidebar" id="sidebar"></div>
|
||||
<div class="content" id="content">
|
||||
<div class="toolbar" id="toolbar">
|
||||
<span id="currentLabel">—</span>
|
||||
<span style="flex:1"></span>
|
||||
<button onclick="openNew()">↗ Nouvel onglet</button>
|
||||
<button onclick="reloadFrame()">↻ Refresh</button>
|
||||
</div>
|
||||
<iframe id="frame" src="about:blank"></iframe>
|
||||
<div class="grid-view" id="gridView" style="display:none"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="status-bar" id="statusBar">
|
||||
<span>WEVAL Command Center v1.0</span>
|
||||
<span id="sbTime"></span>
|
||||
<span style="flex:1"></span>
|
||||
<span id="sbHealth"></span>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var SCREENS=[
|
||||
{id:'master',name:'6σ Master Test',url:'/master-test.html',cat:'Tests',icon:'🧪'},
|
||||
{id:'mega',name:'WEVIA Mega-test',url:'/wevia-ia/mega-test.html',cat:'Tests',icon:'🤖'},
|
||||
{id:'nonreg',name:'NonReg OPUS',url:'/nonreg.html',cat:'Tests',icon:'✅'},
|
||||
{id:'golive',name:'GoLive Dashboard',url:'/golive.html',cat:'Tests',icon:'🚀'},
|
||||
{id:'codereview',name:'Code Review',url:'/wevia-ia/code-review-22mars.html',cat:'Tests',icon:'🔍'},
|
||||
{id:'capshealth',name:'Capabilities Health',url:'/api/wevia-capabilities.php?cap=health',cat:'Infra',icon:'💡'},
|
||||
{id:'visual',name:'Visual NonReg',url:'/wevia-ia/screenshots/nonreg_20260323_0059.html',cat:'Tests',icon:'📸'},
|
||||
{id:'wevads',name:'WEVADS ADX',url:'https://wevads.weval-consulting.com/',cat:'Ops',icon:'⚡'},
|
||||
{id:"crons",name:"Cron Control All",url:"/wevia-ia/cron-control-all.html",cat:"Ops",icon:"⏰"},
|
||||
|
||||
{id:'cyber',name:'Cyber Monitor',url:'/wevia-ia/wevia-cyber-monitor.php',cat:'WEVIA',icon:'🛡'},
|
||||
{id:'failover',name:'Failover Monitor',url:'/wevia-ia/wevia-failover-monitor.php',cat:'WEVIA',icon:'🔄'},
|
||||
{id:'convos',name:'Admin Conversations',url:'/wevia-ia/wevia-admin-conversations.php',cat:'WEVIA',icon:'💬'},
|
||||
|
||||
{id:'ethmon',name:'Ethica Monitor',url:'/ethica-monitor.html',cat:'Ethica',icon:'📊'},
|
||||
{id:'ethdash',name:'Ethica Dashboard',url:'/arsenal-proxy/ethica-dashboard.html',cat:'Ethica',icon:'📈'},
|
||||
{id:'ethdrill',name:'Ethica Drill',url:'/ethica-drill.html',cat:'Ethica',icon:'🔍'},
|
||||
{id:'ethhcp',name:'Ethica HCP',url:'/ethica-hcp.html',cat:'Ethica',icon:'👨⚕'},
|
||||
{id:'ethsms',name:'Ethica SMS',url:'/ethica-sms.html',cat:'Ethica',icon:'📱'},
|
||||
|
||||
{id:'kuma',name:'Uptime Kuma',url:'https://monitor.weval-consulting.com',cat:'Infra',icon:'📡'},
|
||||
{id:'plausible',name:'Plausible Analytics',url:'https://analytics.weval-consulting.com',cat:'Infra',icon:'📉'},
|
||||
{id:'authentik',name:'Authentik SSO',url:'https://auth.weval-consulting.com',cat:'Infra',icon:'🔐'},
|
||||
{id:'isp',name:'ISP Monitor',url:'/products/ispmonitor.html',cat:'Infra',icon:'🌐'},
|
||||
|
||||
{id:'droid',name:'Droid Terminal',url:'/droid-terminal.html',cat:'Ops',icon:'🖥'},
|
||||
{id:"crons",name:"Cron Control All",url:"/wevia-ia/cron-control-all.html",cat:"Ops",icon:"⏰"},
|
||||
{id:'office',name:'Office Workflow',url:'/office-workflow.html',cat:'Ops',icon:'📋'},
|
||||
{id:'fmg',name:'FMG App',url:'http://10.1.0.3:5822/',cat:'Ops',icon:'📋'},
|
||||
{id:'bcg',name:'BCG App',url:'http://10.1.0.3:5823/',cat:'Ops',icon:'📊'},
|
||||
{id:'dkim',name:'DKIM Manager',url:'http://10.1.0.3:5824/',cat:'Ops',icon:'🔑'},
|
||||
{id:'fmgtrack',name:'FMG Tracking',url:'http://10.1.0.3:58421/',cat:'Ops',icon:'📡'},
|
||||
{id:'bcgtrack',name:'BCG Tracking',url:'http://10.1.0.3:58423/',cat:'Ops',icon:'📡'},
|
||||
{id:"crons",name:"Cron Control All",url:"/wevia-ia/cron-control-all.html",cat:"Ops",icon:"⏰"},
|
||||
|
||||
{id:'workspace',name:'Workspace',url:'/products/workspace.html',cat:'Site',icon:'🏠'},
|
||||
{id:'home',name:'Homepage',url:'/',cat:'Site',icon:'🌍'},
|
||||
];
|
||||
|
||||
var currentView='single',currentScreen=null,health={};
|
||||
|
||||
function $(id){return document.getElementById(id)}
|
||||
|
||||
function buildSidebar(){
|
||||
var cats={};
|
||||
SCREENS.forEach(function(s){if(!cats[s.cat])cats[s.cat]=[];cats[s.cat].push(s)});
|
||||
var html='';
|
||||
Object.keys(cats).forEach(function(cat){
|
||||
html+='<div class="sg"><div class="sg-title">'+cat+'</div>';
|
||||
cats[cat].forEach(function(s){
|
||||
var st=health[s.id];
|
||||
var stHtml=st===undefined?'':'<span class="st '+(st?'st-ok':'st-fail')+'">'+(st?'OK':'ERR')+'</span>';
|
||||
html+='<a onclick="loadScreen(\''+s.id+'\')" id="sb_'+s.id+'">'+s.icon+' '+s.name+stHtml+'</a>';
|
||||
});
|
||||
html+='</div>';
|
||||
});
|
||||
$('sidebar').innerHTML=html;
|
||||
}
|
||||
|
||||
function buildCats(){
|
||||
var cats=[];
|
||||
SCREENS.forEach(function(s){if(cats.indexOf(s.cat)<0)cats.push(s.cat)});
|
||||
var html='<button class="active" onclick="filterCat(\'all\',this)">All</button>';
|
||||
cats.forEach(function(c){html+='<button onclick="filterCat(\''+c+'\',this)">'+c+'</button>'});
|
||||
$('cats').innerHTML=html;
|
||||
}
|
||||
|
||||
function filterCat(cat,btn){
|
||||
document.querySelectorAll('.nav button').forEach(function(b){b.classList.remove('active')});
|
||||
if(btn)btn.classList.add('active');
|
||||
var items=document.querySelectorAll('.sg a');
|
||||
items.forEach(function(a){
|
||||
var sid=a.id.replace('sb_','');
|
||||
var s=SCREENS.find(function(x){return x.id===sid});
|
||||
if(!s)return;
|
||||
a.style.display=(cat==='all'||s.cat===cat)?'flex':'none';
|
||||
});
|
||||
// Also filter grid
|
||||
document.querySelectorAll('.tile').forEach(function(t){
|
||||
var sid=t.dataset.id;
|
||||
var s=SCREENS.find(function(x){return x.id===sid});
|
||||
if(!s)return;
|
||||
t.style.display=(cat==='all'||s.cat===cat)?'flex':'none';
|
||||
});
|
||||
}
|
||||
|
||||
function loadScreen(id){
|
||||
var s=SCREENS.find(function(x){return x.id===id});
|
||||
if(!s)return;
|
||||
currentScreen=s;
|
||||
document.querySelectorAll('.sg a').forEach(function(a){a.classList.remove('active')});
|
||||
var el=$('sb_'+id);if(el)el.classList.add('active');
|
||||
if(currentView==='single'){
|
||||
$('frame').src=s.url;
|
||||
$('currentLabel').textContent=s.icon+' '+s.name;
|
||||
$('frame').style.display='';
|
||||
$('gridView').style.display='none';
|
||||
$('toolbar').style.display='';
|
||||
}
|
||||
}
|
||||
|
||||
function setView(v){
|
||||
currentView=v;
|
||||
$('vSingle').style.borderColor=v==='single'?'var(--accent)':'var(--border)';
|
||||
$('vGrid').style.borderColor=v==='grid'?'var(--accent)':'var(--border)';
|
||||
if(v==='grid'){
|
||||
$('frame').style.display='none';
|
||||
$('toolbar').style.display='none';
|
||||
$('gridView').style.display='';
|
||||
buildGrid();
|
||||
} else {
|
||||
$('frame').style.display='';
|
||||
$('toolbar').style.display='';
|
||||
$('gridView').style.display='none';
|
||||
if(currentScreen)loadScreen(currentScreen.id);
|
||||
}
|
||||
}
|
||||
|
||||
function buildGrid(){
|
||||
var html='';
|
||||
SCREENS.forEach(function(s){
|
||||
html+='<div class="tile" data-id="'+s.id+'"><div class="tile-header"><span>'+s.icon+' '+s.name+'</span><button onclick="loadScreen(\''+s.id+'\');setView(\'single\')">↗</button></div><iframe src="'+s.url+'" loading="lazy"></iframe></div>';
|
||||
});
|
||||
$('gridView').innerHTML=html;
|
||||
}
|
||||
|
||||
function openNew(){if(currentScreen)window.open(currentScreen.url,'_blank')}
|
||||
function reloadFrame(){if(currentScreen)$('frame').src=currentScreen.url}
|
||||
function toggleSidebar(){$('sidebar').classList.toggle('hidden')}
|
||||
|
||||
function healthCheck(){
|
||||
$('btnHealth').textContent='🔄 Checking...';
|
||||
var ok=0,fail=0,done=0,total=SCREENS.length;
|
||||
SCREENS.forEach(function(s){
|
||||
fetch(s.url,{mode:'no-cors',signal:AbortSignal.timeout(5000)}).then(function(){
|
||||
health[s.id]=true;ok++;
|
||||
}).catch(function(){
|
||||
health[s.id]=false;fail++;
|
||||
}).finally(function(){
|
||||
done++;
|
||||
if(done===total){
|
||||
$('btnHealth').textContent='🔄 Health';
|
||||
$('sbHealth').innerHTML='<span class="pill pill-ok">'+ok+' OK</span> <span class="pill '+(fail?'pill-fail':'pill-ok')+'">'+fail+' ERR</span>';
|
||||
buildSidebar();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateTime(){$('sbTime').textContent=new Date().toLocaleTimeString()}
|
||||
setInterval(updateTime,1000);updateTime();
|
||||
|
||||
buildSidebar();
|
||||
buildCats();
|
||||
loadScreen('master');
|
||||
setTimeout(healthCheck,2000);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,199 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>WEVAL Consulting — Enterprise Digital Transformation | ERP · Cloud · IA · Cybersécurité</title>
|
||||
<meta name="description" content="Weval Consulting — Cabinet de conseil en transformation digitale. SAP S/4HANA, Cloud, IA, Cybersécurité, Supply Chain, Life Sciences, Manufacturing. Europe · Maroc · International. 200+ projets livrés.">
|
||||
<meta property="og:title" content="Weval Consulting — Cloud, IA, Marketing Digital | Europe . Maroc . International">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:description" content="Cabinet de conseil en transformation digitale. SAP, Cloud, IA, Cybersécurité, Supply Chain. Europe · Maroc · International.">
|
||||
<meta property="og:url" content="https://weval-consulting.com/">
|
||||
<meta property="og:image" content="https://weval-consulting.com/assets/logo-weval-png-DChrMGao.png">
|
||||
<meta property="og:locale" content="fr_MA">
|
||||
<meta property="og:site_name" content="Weval Consulting">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Weval Consulting — Cloud, IA, Marketing Digital | Europe . Maroc . International">
|
||||
<meta name="twitter:description" content="Cabinet de conseil IT au Maroc. Transformation digitale, Cloud, IA, Marketing Digital et Cybersécurité.">
|
||||
<meta name="twitter:image" content="https://weval-consulting.com/assets/logo-weval-png-DChrMGao.png">
|
||||
<link rel="canonical" href="https://weval-consulting.com/">
|
||||
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
|
||||
<meta name="geo.region" content="MA-CAS">
|
||||
<meta name="geo.placename" content="Europe . Maroc . International">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<link rel="alternate" hreflang="fr-MA" href="https://weval-consulting.com/">
|
||||
<link rel="alternate" hreflang="fr-FR" href="https://weval-consulting.com/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://weval-consulting.com/">
|
||||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https://weval-consulting.com/"},{"@type":"ListItem","position":2,"name":"Services","item":"https://weval-consulting.com/solutions"},{"@type":"ListItem","position":3,"name":"Blog","item":"https://weval-consulting.com/blog"},{"@type":"ListItem","position":4,"name":"Contact","item":"https://weval-consulting.com/contact-us"}]}
|
||||
</script>
|
||||
<meta name="theme-color" content="#0f172a">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
|
||||
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
|
||||
<link rel="dns-prefetch" href="https://www.googletagmanager.com">
|
||||
<link rel="dns-prefetch" href="https://www.clarity.ms">
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": "Weval Consulting",
|
||||
"url": "https://weval-consulting.com",
|
||||
"logo": "https://weval-consulting.com/assets/logo-weval-png-DChrMGao.png",
|
||||
"description": "Cabinet de conseil IT spécialisé en transformation digitale, Cloud, Intelligence Artificielle, Marketing Digital et Cybersécurité au Maroc.",
|
||||
"foundingDate": "2019",
|
||||
"numberOfEmployees": {
|
||||
"@type": "QuantitativeValue",
|
||||
"minValue": 10,
|
||||
"maxValue": 50
|
||||
},
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "10, Rue Liberté, 3ème Étage, Appt 5",
|
||||
"addressLocality": "Europe . Maroc . International",
|
||||
"addressCountry": "MA",
|
||||
"postalCode": "20000"
|
||||
},
|
||||
"sameAs": [
|
||||
"https://www.linkedin.com/company/weval"
|
||||
],
|
||||
"contactPoint": {
|
||||
"@type": "ContactPoint",
|
||||
"contactType": "sales",
|
||||
"email": "contact@weval-consulting.com",
|
||||
"availableLanguage": ["French", "English", "Arabic"]
|
||||
},
|
||||
"areaServed": [
|
||||
{"@type": "Country", "name": "Morocco"},
|
||||
{"@type": "Country", "name": "France"},
|
||||
{"@type": "GeoCircle", "geoMidpoint": {"@type": "GeoCoordinates", "latitude": 33.5731, "longitude": -7.5898}, "geoRadius": "500000"}
|
||||
],
|
||||
"knowsAbout": [
|
||||
"Cloud Computing", "Artificial Intelligence", "Digital Transformation",
|
||||
"Marketing Digital", "Cybersecurity", "SAP", "Huawei Cloud", "Vistex",
|
||||
"IT Consulting", "ERP Integration", "Data Analytics"
|
||||
],
|
||||
"hasOfferCatalog": {
|
||||
"@type": "OfferCatalog",
|
||||
"name": "Services Weval Consulting",
|
||||
"itemListElement": [
|
||||
{"@type": "Offer", "itemOffered": {"@type": "Service", "name": "Conseil Stratégique & IA Consulting", "description": "Accompagnement des dirigeants et DSI dans la prise de décisions technologiques."}},
|
||||
{"@type": "Offer", "itemOffered": {"@type": "Service", "name": "Cloud & Intégration Technologique", "description": "Déploiement d'architectures Cloud (Huawei, SAP) scalables et sécurisées."}},
|
||||
{"@type": "Offer", "itemOffered": {"@type": "Service", "name": "Marketing Digital", "description": "Stratégie digitale, SEO, automation et génération de leads qualifiés."}},
|
||||
{"@type": "Offer", "itemOffered": {"@type": "Service", "name": "Cybersécurité IA", "description": "Audit de sécurité, scan de vulnérabilités et protection serveurs propulsés par l'IA."}},
|
||||
{"@type": "Offer", "itemOffered": {"@type": "Service", "name": "Talent as a Service", "description": "Recrutement IT avec un vivier de 5000+ profils qualifiés."}},
|
||||
{"@type": "Offer", "itemOffered": {"@type": "Service", "name": "Formation & Training", "description": "Formations certifiantes SAP, Cloud, IA, Cybersécurité et Data."}}
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
(function(){var p=window.location.pathname;
|
||||
if(p.match(/^\/blog\/[a-z0-9-]+$/)&&!p.endsWith('.html')&&p!=='/blog/'){window.location.replace(p+'.html')}
|
||||
if(p==='/methodologie'){window.location.replace('/methodologie.html')}
|
||||
})();
|
||||
</script>
|
||||
<script type="module" crossorigin src="/assets/index-BcECjySJ.js?v=vx4"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-DqBn9sO8.css?v=final5">
|
||||
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-PLACEHOLDER"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date());gtag("config","G-PLACEHOLDER")</script>
|
||||
</head>
|
||||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[
|
||||
{"@type":"Question","name":"Quels services propose WEVAL Consulting ?","acceptedAnswer":{"@type":"Answer","text":"WEVAL Consulting propose 6 pôles d'expertise : Conseil Stratégique & IA, Cloud & Intégration (Huawei, SAP), Marketing Digital, Cybersécurité IA, Talent as a Service (5000+ profils IT), et Formations certifiantes. Nous intervenons dans 8 pays sur 3 continents."}},
|
||||
{"@type":"Question","name":"WEVAL intervient-il au Maroc et en Afrique ?","acceptedAnswer":{"@type":"Answer","text":"Oui. WEVAL Consulting intervient dans 8+ pays incluant la France, le Maroc et les USA. Nous avons livré plus de 200 projets avec un taux de satisfaction de 97%."}},
|
||||
{"@type":"Question","name":"Qu'est-ce que WEVIA, l'IA de WEVAL ?","acceptedAnswer":{"@type":"Answer","text":"WEVIA est notre assistant IA souveraine qui utilise un GPU dédié européen pour générer des analyses, diagrammes, images et documents PDF. Il couvre 52 domaines d'expertise et fonctionne en mode souverain sans dépendance cloud externe."}},
|
||||
{"@type":"Question","name":"Comment contacter WEVAL Consulting ?","acceptedAnswer":{"@type":"Answer","text":"Vous pouvez nous contacter via le formulaire sur notre site, par email à contact@weval-consulting.com, ou prendre directement rendez-vous avec un consultant via notre outil de prise de RDV en ligne."}},
|
||||
{"@type":"Question","name":"WEVAL est-il certifié et conforme RGPD ?","acceptedAnswer":{"@type":"Answer","text":"Oui. WEVAL est conforme RGPD et Loi marocaine 09-08, partenaire certifié Huawei Cloud, SAP, Vistex et IQVIA. Nos solutions respectent les normes de sécurité les plus strictes."}}
|
||||
]}
|
||||
</script>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script src="/weval-translate.js" defer></script>
|
||||
|
||||
<script>
|
||||
(function(){var t=0,iv=setInterval(function(){var n=document.querySelector(".carousel-3d-next");if(n){clearInterval(iv);setInterval(function(){var b=document.querySelector(".carousel-3d-next");if(b)b.click()},3000)}if(++t>30)clearInterval(iv)},500)})();
|
||||
</script>
|
||||
<style>
|
||||
/* Carousel v3 */
|
||||
.carousel-3d-container{height:620px!important;perspective:1600px!important}
|
||||
.carousel-3d-wrapper{width:420px!important;height:480px!important}
|
||||
.carousel-3d-card{width:380px!important;height:450px!important;background:rgba(15,20,40,0.88)!important;border:1px solid rgba(255,255,255,0.15)!important;color:#fff!important;padding:2rem!important;border-radius:22px!important}
|
||||
.carousel-3d-card.active{background:rgba(20,25,55,0.95)!important;border-color:rgba(255,255,255,0.3)!important;box-shadow:0 30px 70px rgba(0,0,0,0.5)!important}
|
||||
.carousel-3d-card:not(.active){opacity:0.5!important;filter:blur(1.5px)!important}
|
||||
.carousel-3d-card .service-title{color:#fff!important;font-size:1.3rem!important;font-weight:700!important}
|
||||
.carousel-3d-card .service-description,.carousel-3d-card .service-details{color:rgba(255,255,255,0.85)!important;font-size:.9rem!important;line-height:1.5!important;-webkit-line-clamp:8!important}
|
||||
.carousel-3d-card .service-icon{font-size:2.2rem!important;margin-bottom:.8rem!important}
|
||||
.carousel-3d-card .service-button{background:linear-gradient(135deg,#4f46e5,#7c3aed)!important;color:#fff!important;border:none!important;padding:.7rem 1.5rem!important;border-radius:12px!important;font-weight:600!important;font-size:.95rem!important}
|
||||
.carousel-3d-prev{left:5%!important}.carousel-3d-next{right:5%!important}
|
||||
.carousel-3d-nav{width:50px!important;height:50px!important;font-size:1.8rem!important;background:rgba(255,255,255,0.12)!important;border:1px solid rgba(255,255,255,0.2)!important}
|
||||
.carousel-3d-dots{margin-top:1.5rem!important}
|
||||
@media(max-width:1024px){
|
||||
.carousel-3d-container{height:550px!important}
|
||||
.carousel-3d-wrapper{width:350px!important;height:420px!important}
|
||||
.carousel-3d-card{width:320px!important;height:400px!important;padding:1.5rem!important}
|
||||
}
|
||||
@media(max-width:768px){
|
||||
.carousel-3d-container{height:500px!important;perspective:1000px!important}
|
||||
.carousel-3d-wrapper{width:300px!important;height:380px!important}
|
||||
.carousel-3d-card{width:280px!important;height:360px!important;padding:1.3rem!important}
|
||||
.carousel-3d-card .service-title{font-size:1.1rem!important}
|
||||
.carousel-3d-card .service-description,.carousel-3d-card .service-details{font-size:.8rem!important}
|
||||
.carousel-3d-prev{left:2%!important}.carousel-3d-next{right:2%!important}
|
||||
.carousel-3d-nav{width:40px!important;height:40px!important;font-size:1.4rem!important}
|
||||
}
|
||||
@media(max-width:480px){
|
||||
.carousel-3d-container{height:450px!important;perspective:800px!important}
|
||||
.carousel-3d-wrapper{width:260px!important;height:340px!important}
|
||||
.carousel-3d-card{width:250px!important;height:320px!important;padding:1rem!important}
|
||||
.carousel-3d-card .service-title{font-size:1rem!important}
|
||||
.carousel-3d-card .service-description,.carousel-3d-card .service-details{font-size:.75rem!important;-webkit-line-clamp:5!important}
|
||||
.carousel-3d-prev{left:0!important}.carousel-3d-next{right:0!important}
|
||||
.carousel-3d-nav{width:35px!important;height:35px!important;font-size:1.2rem!important}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="/weval-audit-reco.js" defer></script>
|
||||
<script src="/weval-chat-fix.js" defer></script>
|
||||
|
||||
<!-- SEO: Noscript redondance for search engines on SPA routes -->
|
||||
<noscript>
|
||||
<div id="seo-noscript">
|
||||
<h1>WEVAL Consulting — Cabinet de Conseil en Transformation Digitale</h1>
|
||||
<p>WEVAL Consulting est un cabinet de conseil international spécialisé en transformation digitale, ERP, Cloud, Intelligence Artificielle, Cybersécurité et Supply Chain. Présent en France (Paris) et au Maroc (Casablanca), nous accompagnons les entreprises dans leur modernisation IT depuis 2018. Plus de 200 projets livrés dans 8 pays.</p>
|
||||
|
||||
<h2>Nos Expertises</h2>
|
||||
<ul>
|
||||
<li><a href="/consulting-intelligence-artificielle-maroc.html">Intelligence Artificielle & Data Science</a> — IA souveraine, Machine Learning, NLP, RAG, Computer Vision</li>
|
||||
<li><a href="/intelligence-artificielle-france-consulting.html">Consulting IA en France</a> — Déploiement IA entreprise, audit data, stratégie IA</li>
|
||||
<li><a href="/consulting-sap-erp-vistex-maroc.html">SAP ERP & Vistex</a> — SAP S/4HANA, migration, intégration, Vistex pricing</li>
|
||||
<li><a href="/erp-pme-eti-sap-odoo-sage.html">ERP pour PME/ETI</a> — SAP Business One, Odoo, Sage X3, comparatif ERP</li>
|
||||
<li><a href="/cybersécurité-maroc-audit-conseil.html">Cybersécurité</a> — Audit sécurité, EBIOS RM, SOC, pentest, conformité NIS2</li>
|
||||
<li><a href="/cloud-infrastructure-systeme-information.html">Cloud & Infrastructure SI</a> — Migration cloud, architecture hybride, FinOps</li>
|
||||
<li><a href="/consulting-pharma-supply-chain.html">Pharma & Supply Chain</a> — Life Sciences, S&OP, traçabilité, compliance GxP</li>
|
||||
<li><a href="/crm-pharma-marketing-pharmaceutique.html">CRM Pharma & Marketing</a> — Veeva, Salesforce Health Cloud, CLM, MLR</li>
|
||||
<li><a href="/marketing-digital-maroc.html">Marketing Digital</a> — SEO, SEA, content marketing, marketing automation</li>
|
||||
<li><a href="/digitalisation-processus-gouvernance-it.html">Gouvernance IT & BPM</a> — ITIL, COBIT, transformation processus, Six Sigma</li>
|
||||
<li><a href="/bpm-automatisation-processus-metier.html">Automatisation des Processus</a> — BPM, RPA, Process Mining, BPMN 2.0</li>
|
||||
<li><a href="/formation-ia-sap-cloud-maroc.html">Formation IT</a> — Formation IA, SAP, Cloud, certifications professionnelles</li>
|
||||
<li><a href="/recrutement-talent-it-maroc.html">Recrutement IT</a> — Sourcing développeurs, ingénieurs data, consultants SAP</li>
|
||||
<li><a href="/achats-purchasing-sap-mm-procurement.html">Achats & Procurement</a> — SAP MM, Ariba, digitalisation achats, e-procurement</li>
|
||||
<li><a href="/finance-controlling-sap-fico.html">Finance & Controlling</a> — SAP FICO, reporting financier, consolidation, trésorerie</li>
|
||||
<li><a href="/offshore-nearshore-maroc-france-canada.html">Nearshore & Offshore</a> — Centres de services Maroc, nearshore France-Maroc-Canada</li>
|
||||
<li><a href="/transformation-digitale-consulting-france-international.html">Transformation Digitale</a> — Stratégie digitale, change management, innovation</li>
|
||||
</ul>
|
||||
|
||||
<h2>Nos Réalisations</h2>
|
||||
<p>141,000+ professionnels de santé vérifiés dans 3 pays. Migration SAP S/4HANA multi-sites. Plateforme IA souveraine WEVIA déployée. Audit cybersécurité EBIOS RM pour ETI industrielles.</p>
|
||||
|
||||
<h2>Partenariats</h2>
|
||||
<p>SAP Ecosystem Partner | Vistex Partner | Huawei Cloud Partner | IQVIA | Scaleway</p>
|
||||
|
||||
<h2>Contact</h2>
|
||||
<p>Paris (France) | Casablanca (Maroc) — <a href="/contact-us">Contactez-nous</a> | <a href="https://calendly.com/ymahboub-weval-consulting/30min">Prendre rendez-vous</a></p>
|
||||
</div>
|
||||
</noscript>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,254 +0,0 @@
|
||||
<!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 Scraper',u:'/arsenal-proxy/ethica-real-scraper.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>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,445 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>WEVIA Life — WEVAL Consulting — Votre IA Personnelle</title>
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&family=DM+Sans:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root{--bg:#08090e;--s1:#0f1117;--s2:#161822;--s3:#1e2130;--b1:#282b3a;--b2:#353849;--amber:#f59e0b;--amber2:#fbbf24;--amber15:rgba(245,158,11,.12);--amber30:rgba(245,158,11,.3);--green:#10b981;--green15:rgba(16,185,129,.12);--red:#ef4444;--red15:rgba(239,68,68,.12);--blue:#3b82f6;--blue15:rgba(59,130,246,.12);--t1:#f1f5f9;--t2:#94a3b8;--t3:#64748b;--radius:12px}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
html,body{height:100%;font-family:'DM Sans',sans-serif;background:var(--bg);color:var(--t1);overflow:hidden}
|
||||
::selection{background:var(--amber30);color:var(--t1)}
|
||||
::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--b1);border-radius:10px}
|
||||
|
||||
/* LAYOUT */
|
||||
.app{display:grid;grid-template-columns:240px 1fr;grid-template-rows:56px 1fr;height:100vh}
|
||||
.topbar{grid-column:1/-1;background:var(--s1);border-bottom:1px solid var(--b1);display:flex;align-items:center;justify-content:space-between;padding:0 20px;z-index:10}
|
||||
.topbar-logo{display:flex;align-items:center;gap:10px;font-weight:800;font-size:1.1rem;letter-spacing:-.02em}
|
||||
.topbar-logo span{color:var(--amber)}
|
||||
.topbar-logo em{font-style:normal;font-size:.65rem;color:var(--t3);font-weight:500;background:var(--amber15);padding:2px 8px;border-radius:20px;margin-left:6px}
|
||||
.topbar-right{display:flex;align-items:center;gap:12px}
|
||||
.topbar-stat{font-size:.72rem;color:var(--t3);display:flex;align-items:center;gap:4px}
|
||||
.topbar-stat strong{color:var(--amber);font-family:'JetBrains Mono',monospace}
|
||||
.sidebar{background:var(--s1);border-right:1px solid var(--b1);padding:12px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}
|
||||
.nav-section{font-size:.6rem;font-weight:700;text-transform:uppercase;letter-spacing:.15em;color:var(--t3);padding:16px 10px 6px;font-family:'JetBrains Mono',monospace}
|
||||
.nav-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;font-size:.85rem;font-weight:500;color:var(--t2);cursor:pointer;transition:all .15s;border:1px solid transparent;user-select:none}
|
||||
.nav-item:hover{background:var(--s2);color:var(--t1)}
|
||||
.nav-item.active{background:var(--amber15);color:var(--amber);border-color:rgba(245,158,11,.15);font-weight:600}
|
||||
.nav-item .ni-icon{width:20px;text-align:center;font-size:1rem}
|
||||
.nav-item .ni-badge{margin-left:auto;background:var(--amber);color:var(--bg);font-size:.6rem;font-weight:700;padding:1px 6px;border-radius:10px;font-family:'JetBrains Mono',monospace}
|
||||
.main{overflow:hidden;display:flex;flex-direction:column;background:var(--bg)}
|
||||
|
||||
/* PAGES */
|
||||
.page{display:none;flex:1;overflow:hidden;flex-direction:column}.page.active{display:flex}
|
||||
|
||||
/* DASHBOARD */
|
||||
.dash{padding:24px;overflow-y:auto;flex:1}
|
||||
.dash-header{margin-bottom:24px}
|
||||
.dash-header h1{font-size:1.5rem;font-weight:800;letter-spacing:-.03em;margin-bottom:4px}
|
||||
.dash-header p{color:var(--t3);font-size:.85rem}
|
||||
.dash-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:24px}
|
||||
.dstat{background:var(--s1);border:1px solid var(--b1);border-radius:var(--radius);padding:16px;transition:border-color .2s}
|
||||
.dstat:hover{border-color:var(--amber30)}
|
||||
.dstat-val{font-family:'JetBrains Mono',monospace;font-size:1.8rem;font-weight:700;color:var(--amber)}
|
||||
.dstat-label{font-size:.72rem;color:var(--t3);margin-top:2px;text-transform:uppercase;letter-spacing:.05em}
|
||||
.dash-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
|
||||
.dash-card{background:var(--s1);border:1px solid var(--b1);border-radius:var(--radius);padding:20px}
|
||||
.dash-card h3{font-size:.9rem;font-weight:700;margin-bottom:12px;display:flex;align-items:center;gap:8px}
|
||||
.dash-card h3 span{font-size:1.1rem}
|
||||
.alert-item{display:flex;align-items:start;gap:10px;padding:10px;border-radius:8px;margin-bottom:6px;font-size:.8rem;background:var(--s2);border:1px solid var(--b1)}
|
||||
.alert-item .a-icon{font-size:1.2rem;flex-shrink:0}
|
||||
.alert-item .a-text{flex:1}.alert-item .a-title{font-weight:600;color:var(--t1)}.alert-item .a-doc{color:var(--t3);font-size:.72rem;margin-top:2px}
|
||||
.doc-mini{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:8px;margin-bottom:4px;font-size:.8rem;background:var(--s2);border:1px solid var(--b1);cursor:pointer;transition:border-color .15s}
|
||||
.doc-mini:hover{border-color:var(--amber30)}
|
||||
.doc-mini .dm-icon{font-size:1.1rem}.doc-mini .dm-name{flex:1;font-weight:500}.doc-mini .dm-type{font-size:.65rem;color:var(--t3);background:var(--s3);padding:2px 6px;border-radius:4px;font-family:'JetBrains Mono',monospace}
|
||||
|
||||
/* CHAT */
|
||||
.chat-page{display:flex;flex-direction:column;height:100%}
|
||||
.chat-msgs{flex:1;overflow-y:auto;padding:20px 24px;display:flex;flex-direction:column;gap:12px}
|
||||
.chat-welcome{text-align:center;padding:60px 20px;color:var(--t3)}
|
||||
.chat-welcome h2{font-size:1.4rem;font-weight:800;color:var(--t1);margin-bottom:8px}
|
||||
.chat-welcome p{font-size:.85rem;margin-bottom:24px;max-width:400px;margin-left:auto;margin-right:auto;line-height:1.6}
|
||||
.chat-suggestions{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}
|
||||
.chat-sug{padding:8px 14px;background:var(--amber15);border:1px solid rgba(245,158,11,.15);border-radius:20px;font-size:.75rem;font-weight:600;color:var(--amber);cursor:pointer;transition:all .15s;font-family:'DM Sans',sans-serif}
|
||||
.chat-sug:hover{background:var(--amber30);transform:translateY(-1px)}
|
||||
.msg{max-width:80%;animation:msgIn .25s ease}
|
||||
.msg-user{align-self:flex-end;background:var(--amber15);border:1px solid rgba(245,158,11,.12);border-radius:14px 14px 4px 14px;padding:12px 16px;font-size:.88rem;line-height:1.6}
|
||||
.msg-ai{align-self:flex-start;background:var(--s2);border:1px solid var(--b1);border-radius:4px 14px 14px 14px;padding:14px 18px;font-size:.88rem;line-height:1.7;color:var(--t1)}
|
||||
.msg-ai strong{color:var(--amber)}.msg-ai code{background:var(--s3);padding:1px 5px;border-radius:4px;font-family:'JetBrains Mono',monospace;font-size:.8rem}
|
||||
.msg-ai ul,.msg-ai ol{margin:8px 0;padding-left:20px}.msg-ai li{margin:4px 0}
|
||||
.msg-ai pre{background:var(--bg);border:1px solid var(--b1);border-radius:8px;padding:12px;overflow-x:auto;margin:8px 0;font-family:'JetBrains Mono',monospace;font-size:.78rem}
|
||||
.msg-ctx{font-size:.65rem;color:var(--t3);margin-top:4px;font-family:'JetBrains Mono',monospace}
|
||||
.typing{display:flex;gap:4px;padding:12px 16px;align-self:flex-start}
|
||||
.typing span{width:6px;height:6px;border-radius:50%;background:var(--amber);animation:blink .8s infinite;display:inline-block}
|
||||
.typing span:nth-child(2){animation-delay:.15s}.typing span:nth-child(3){animation-delay:.3s}
|
||||
@keyframes blink{0%,100%{opacity:.3}50%{opacity:1}}
|
||||
@keyframes msgIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
|
||||
.chat-input-bar{padding:12px 20px;border-top:1px solid var(--b1);background:var(--s1);display:flex;gap:8px;align-items:end}
|
||||
.chat-input-bar textarea{flex:1;resize:none;min-height:42px;max-height:150px;background:var(--s2);border:1px solid var(--b1);border-radius:10px;padding:10px 14px;color:var(--t1);font-family:'DM Sans',sans-serif;font-size:.88rem;line-height:1.5;outline:none;transition:border-color .2s}
|
||||
.chat-input-bar textarea:focus{border-color:var(--amber)}
|
||||
.chat-input-bar textarea::placeholder{color:var(--t3)}
|
||||
.chat-send{background:var(--amber);color:var(--bg);border:none;border-radius:10px;width:42px;height:42px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.1rem;transition:all .15s;flex-shrink:0}
|
||||
.chat-send:hover{transform:scale(1.05);box-shadow:0 4px 15px rgba(245,158,11,.3)}.chat-send:disabled{opacity:.3;cursor:not-allowed;transform:none;box-shadow:none}
|
||||
|
||||
/* SOURCES / FILES */
|
||||
.sources-page{padding:24px;overflow-y:auto;flex:1}
|
||||
.sources-page h2{font-size:1.3rem;font-weight:800;margin-bottom:16px}
|
||||
.upload-zone{border:2px dashed var(--b2);border-radius:var(--radius);padding:40px;text-align:center;margin-bottom:20px;transition:all .2s;cursor:pointer}
|
||||
.upload-zone.dragover{border-color:var(--amber);background:var(--amber15)}
|
||||
.upload-zone h3{font-size:1rem;font-weight:600;margin-bottom:4px}
|
||||
.upload-zone p{font-size:.8rem;color:var(--t3)}
|
||||
.upload-zone input{display:none}
|
||||
.file-list{display:flex;flex-direction:column;gap:6px}
|
||||
.file-row{display:flex;align-items:center;gap:12px;padding:10px 14px;background:var(--s1);border:1px solid var(--b1);border-radius:8px;font-size:.82rem;transition:border-color .15s}
|
||||
.file-row:hover{border-color:var(--amber30)}
|
||||
.file-icon{font-size:1.2rem;width:28px;text-align:center}
|
||||
.file-name{flex:1;font-weight:500}
|
||||
.file-type{font-size:.65rem;color:var(--t3);background:var(--s3);padding:2px 6px;border-radius:4px;font-family:'JetBrains Mono',monospace;text-transform:uppercase}
|
||||
.file-size{font-size:.7rem;color:var(--t3);font-family:'JetBrains Mono',monospace;min-width:60px;text-align:right}
|
||||
.file-del{background:none;border:none;color:var(--t3);cursor:pointer;font-size:.85rem;padding:4px;border-radius:4px;transition:color .15s}.file-del:hover{color:var(--red)}
|
||||
|
||||
/* VAULT */
|
||||
.vault-page{padding:24px;overflow-y:auto;flex:1}
|
||||
.vault-page h2{font-size:1.3rem;font-weight:800;margin-bottom:4px}
|
||||
.vault-page .v-sub{color:var(--t3);font-size:.82rem;margin-bottom:16px}
|
||||
.vault-add{display:flex;gap:8px;margin-bottom:16px}
|
||||
.vault-add input,.vault-add select{background:var(--s2);border:1px solid var(--b1);border-radius:8px;padding:8px 12px;color:var(--t1);font-family:'DM Sans',sans-serif;font-size:.82rem;outline:none}
|
||||
.vault-add input:focus{border-color:var(--amber)}
|
||||
.vault-add input[type="text"]{flex:1}
|
||||
.vault-add button{background:var(--amber);color:var(--bg);border:none;border-radius:8px;padding:8px 16px;font-weight:700;font-size:.82rem;cursor:pointer;font-family:'DM Sans',sans-serif;white-space:nowrap}
|
||||
.vault-entries{display:flex;flex-direction:column;gap:6px}
|
||||
.ve{display:flex;align-items:center;gap:12px;padding:12px 14px;background:var(--s1);border:1px solid var(--b1);border-radius:8px;transition:border-color .15s}
|
||||
.ve:hover{border-color:var(--green15)}
|
||||
.ve-icon{font-size:1.3rem;width:28px;text-align:center}
|
||||
.ve-info{flex:1}.ve-label{font-weight:600;font-size:.88rem}.ve-user{font-size:.72rem;color:var(--t3);font-family:'JetBrains Mono',monospace;margin-top:1px}
|
||||
.ve-actions{display:flex;gap:6px}
|
||||
.ve-btn{background:var(--s3);border:none;color:var(--t2);padding:5px 8px;border-radius:6px;cursor:pointer;font-size:.7rem;font-family:'DM Sans',sans-serif;transition:all .15s}
|
||||
.ve-btn:hover{background:var(--b2);color:var(--t1)}.ve-btn.danger:hover{background:var(--red15);color:var(--red)}
|
||||
|
||||
/* RESPONSIVE */
|
||||
@media(max-width:768px){.app{grid-template-columns:1fr;grid-template-rows:56px auto 1fr}.sidebar{flex-direction:row;overflow-x:auto;padding:8px;border-right:none;border-bottom:1px solid var(--b1)}.nav-section{display:none}.nav-item{padding:8px 10px;font-size:.75rem;white-space:nowrap}.nav-item .ni-icon{width:auto}.dash-stats{grid-template-columns:repeat(2,1fr)}.dash-grid{grid-template-columns:1fr}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="app">
|
||||
<!-- TOPBAR -->
|
||||
<div class="topbar">
|
||||
<div class="topbar-logo">🛡️ WE<span>VIA</span> Life<em>v1.0 beta</em></div>
|
||||
<div class="topbar-right">
|
||||
<div class="topbar-stat"><strong id="stat-docs">0</strong> docs</div>
|
||||
<div class="topbar-stat"><strong id="stat-vault">0</strong> vault</div>
|
||||
<div class="topbar-stat" style="color:var(--green)">● Local</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- SIDEBAR -->
|
||||
<div class="sidebar">
|
||||
<div class="nav-section">Principal</div>
|
||||
<div class="nav-item active" data-page="dashboard"><span class="ni-icon">📊</span>Dashboard</div>
|
||||
<div class="nav-item" data-page="chat"><span class="ni-icon">💬</span>Chat IA<span class="ni-badge" id="chat-badge" style="display:none">1</span></div>
|
||||
<div class="nav-section">Sources</div>
|
||||
<div class="nav-item" data-page="sources"><span class="ni-icon">📁</span>Fichiers</div>
|
||||
<div class="nav-section">Sécurité</div>
|
||||
<div class="nav-item" data-page="vault"><span class="ni-icon">🔐</span>Coffre-fort</div>
|
||||
<div style="flex:1"></div>
|
||||
<div class="nav-item" style="margin-top:auto" onclick="window.open('/products/wevialife.html','_blank')"><span class="ni-icon">ℹ️</span>À propos</div>
|
||||
</div>
|
||||
|
||||
<!-- MAIN -->
|
||||
<div class="main">
|
||||
|
||||
<!-- DASHBOARD PAGE -->
|
||||
<div class="page active" id="page-dashboard">
|
||||
<div class="dash">
|
||||
<div class="dash-header"><h1>Bonjour 👋</h1><p>Votre assistant IA personnel est prêt.</p></div>
|
||||
<div class="dash-stats">
|
||||
<div class="dstat"><div class="dstat-val" id="d-total">0</div><div class="dstat-label">Documents indexés</div></div>
|
||||
<div class="dstat"><div class="dstat-val" id="d-vault">0</div><div class="dstat-label">Entrées coffre-fort</div></div>
|
||||
<div class="dstat"><div class="dstat-val" id="d-sources">0</div><div class="dstat-label">Sources connectées</div></div>
|
||||
<div class="dstat"><div class="dstat-val" id="d-alerts">0</div><div class="dstat-label">Alertes actives</div></div>
|
||||
</div>
|
||||
<div class="dash-grid">
|
||||
<div class="dash-card"><h3><span>🚨</span> Alertes & Recommandations</h3><div id="dash-alerts"><div class="alert-item"><div class="a-icon">📁</div><div class="a-text"><div class="a-title">Ajoutez vos premiers documents</div><div class="a-doc">Glissez-déposez des fichiers pour commencer</div></div></div></div></div>
|
||||
<div class="dash-card"><h3><span>📄</span> Documents récents</h3><div id="dash-docs"><p style="font-size:.8rem;color:var(--t3)">Aucun document indexé</p></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- CHAT PAGE -->
|
||||
<div class="page" id="page-chat">
|
||||
<div class="chat-page">
|
||||
<div class="chat-msgs" id="chat-msgs">
|
||||
<div class="chat-welcome" id="chat-welcome">
|
||||
<div style="font-size:3rem;margin-bottom:12px">🛡️</div>
|
||||
<h2>WEVIA Life</h2>
|
||||
<p>Posez-moi une question sur vos documents, demandez une synthèse, une recommandation ou une projection.</p>
|
||||
<div class="chat-suggestions">
|
||||
<div class="chat-sug" onclick="chatSend('Fais-moi un résumé de mes documents')">📝 Résumé documents</div>
|
||||
<div class="chat-sug" onclick="chatSend('Quelles alertes ou échéances à surveiller ?')">⏰ Échéances</div>
|
||||
<div class="chat-sug" onclick="chatSend('Analyse mes finances et donne-moi des recommandations')">💰 Analyse finances</div>
|
||||
<div class="chat-sug" onclick="chatSend('Quels projets devrais-je prioriser ?')">🎯 Priorités</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chat-input-bar">
|
||||
<textarea id="chat-input" placeholder="Posez votre question à WEVIA Life..." rows="1" onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();chatSend()}"></textarea>
|
||||
<button class="chat-send" id="chat-send-btn" onclick="chatSend()">➤</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- SOURCES PAGE -->
|
||||
<div class="page" id="page-sources">
|
||||
<div class="sources-page">
|
||||
<h2>📁 Sources & Documents</h2>
|
||||
<div class="upload-zone" id="upload-zone" onclick="document.getElementById('file-input').click()">
|
||||
<h3>📤 Glissez vos fichiers ici</h3>
|
||||
<p>PDF, Word, Excel, PowerPoint, TXT, CSV — jusqu'à 50MB</p>
|
||||
<input type="file" id="file-input" multiple accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.csv,.md,.json,.html,.xml,.log">
|
||||
</div>
|
||||
<div class="file-list" id="file-list"><p style="font-size:.82rem;color:var(--t3);text-align:center;padding:20px">Aucun fichier indexé. Uploadez vos premiers documents.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- VAULT PAGE -->
|
||||
<div class="page" id="page-vault">
|
||||
<div class="vault-page">
|
||||
<h2>🔐 Coffre-fort</h2>
|
||||
<p class="v-sub">Mots de passe, codes, documents sensibles — chiffré AES-256</p>
|
||||
<div class="vault-add">
|
||||
<input type="text" id="v-label" placeholder="Libellé (ex: Gmail perso)">
|
||||
<input type="text" id="v-user" placeholder="Identifiant">
|
||||
<input type="password" id="v-pass" placeholder="Mot de passe">
|
||||
<select id="v-type"><option value="password">🔑 Mot de passe</option><option value="card">💳 Carte bancaire</option><option value="note">📝 Note sécurisée</option><option value="code">🔢 Code</option></select>
|
||||
<button onclick="vaultAdd()">+ Ajouter</button>
|
||||
</div>
|
||||
<div class="vault-entries" id="vault-entries"><p style="font-size:.82rem;color:var(--t3);text-align:center;padding:20px">Coffre-fort vide. Ajoutez votre première entrée.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /main -->
|
||||
</div><!-- /app -->
|
||||
|
||||
<script>
|
||||
const API = '/products/wevialife-api.php';
|
||||
let chatHistory = [];
|
||||
let allDocs = [];
|
||||
let allVault = [];
|
||||
|
||||
// === NAVIGATION ===
|
||||
document.querySelectorAll('.nav-item[data-page]').forEach(n => {
|
||||
n.addEventListener('click', () => {
|
||||
document.querySelectorAll('.nav-item').forEach(x => x.classList.remove('active'));
|
||||
n.classList.add('active');
|
||||
document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));
|
||||
const page = document.getElementById('page-' + n.dataset.page);
|
||||
if (page) page.classList.add('active');
|
||||
if (n.dataset.page === 'chat') document.getElementById('chat-input')?.focus();
|
||||
});
|
||||
});
|
||||
|
||||
// === DASHBOARD ===
|
||||
async function loadDashboard() {
|
||||
try {
|
||||
const [src, vlt, alr] = await Promise.all([
|
||||
fetch(API + '?action=sources').then(r => r.json()),
|
||||
fetch(API + '?action=vault_list').then(r => r.json()),
|
||||
fetch(API + '?action=alerts').then(r => r.json())
|
||||
]);
|
||||
allDocs = src.documents || [];
|
||||
allVault = vlt.entries || [];
|
||||
const stats = src.stats || {};
|
||||
|
||||
document.getElementById('d-total').textContent = stats.total || 0;
|
||||
document.getElementById('d-vault').textContent = vlt.count || 0;
|
||||
document.getElementById('d-sources').textContent = Object.keys(stats.by_source || {}).length || 0;
|
||||
document.getElementById('d-alerts').textContent = (alr.alerts || []).length;
|
||||
document.getElementById('stat-docs').textContent = stats.total || 0;
|
||||
document.getElementById('stat-vault').textContent = vlt.count || 0;
|
||||
|
||||
// Alerts
|
||||
const alertsEl = document.getElementById('dash-alerts');
|
||||
const alerts = alr.alerts || [];
|
||||
if (alerts.length) {
|
||||
alertsEl.innerHTML = alerts.slice(0, 5).map(a => `<div class="alert-item"><div class="a-icon">${a.icon}</div><div class="a-text"><div class="a-title">${a.title}</div><div class="a-doc">${a.doc || ''}</div></div></div>`).join('');
|
||||
}
|
||||
|
||||
// Recent docs
|
||||
const docsEl = document.getElementById('dash-docs');
|
||||
if (allDocs.length) {
|
||||
docsEl.innerHTML = allDocs.slice(0, 6).map(d => {
|
||||
const icon = {pdf:'📕',docx:'📘',doc:'📘',xlsx:'📗',xls:'📗',pptx:'📙',ppt:'📙',csv:'📊',txt:'📄',md:'📝'}[d.type] || '📎';
|
||||
return `<div class="doc-mini"><span class="dm-icon">${icon}</span><span class="dm-name">${d.name}</span><span class="dm-type">${d.type}</span></div>`;
|
||||
}).join('');
|
||||
}
|
||||
} catch(e) { console.warn('Dashboard load error:', e); }
|
||||
}
|
||||
|
||||
// === CHAT ===
|
||||
function chatSend(text) {
|
||||
const input = document.getElementById('chat-input');
|
||||
const msg = text || input.value.trim();
|
||||
if (!msg) return;
|
||||
input.value = '';
|
||||
input.style.height = 'auto';
|
||||
|
||||
const welcome = document.getElementById('chat-welcome');
|
||||
if (welcome) welcome.remove();
|
||||
|
||||
const msgs = document.getElementById('chat-msgs');
|
||||
msgs.innerHTML += `<div class="msg msg-user">${escHtml(msg)}</div>`;
|
||||
msgs.innerHTML += `<div class="typing" id="typing"><span></span><span></span><span></span></div>`;
|
||||
msgs.scrollTop = msgs.scrollHeight;
|
||||
|
||||
document.getElementById('chat-send-btn').disabled = true;
|
||||
chatHistory.push({role:'user', content:msg});
|
||||
|
||||
fetch(API + '?action=chat', {
|
||||
method:'POST',
|
||||
headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({message:msg, history:chatHistory})
|
||||
}).then(r => r.json()).then(data => {
|
||||
document.getElementById('typing')?.remove();
|
||||
const reply = data.reply || data.error || 'Erreur';
|
||||
chatHistory.push({role:'assistant', content:reply});
|
||||
const ctxInfo = data.context_docs > 0 ? `<div class="msg-ctx">📄 ${data.context_docs} document(s) utilisé(s) · ${data.model || 'IA'}</div>` : '';
|
||||
msgs.innerHTML += `<div class="msg msg-ai">${formatMd(reply)}${ctxInfo}</div>`;
|
||||
msgs.scrollTop = msgs.scrollHeight;
|
||||
}).catch(e => {
|
||||
document.getElementById('typing')?.remove();
|
||||
msgs.innerHTML += `<div class="msg msg-ai" style="border-color:var(--red15)">❌ Erreur de connexion: ${e.message}</div>`;
|
||||
msgs.scrollTop = msgs.scrollHeight;
|
||||
}).finally(() => {
|
||||
document.getElementById('chat-send-btn').disabled = false;
|
||||
});
|
||||
}
|
||||
|
||||
function escHtml(s) { const d = document.createElement('div'); d.textContent = s; return d.innerHTML; }
|
||||
|
||||
function formatMd(text) {
|
||||
return text
|
||||
.replace(/```(\w+)?\n([\s\S]*?)```/g, '<pre><code>$2</code></pre>')
|
||||
.replace(/`([^`]+)`/g, '<code>$1</code>')
|
||||
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
|
||||
.replace(/^\s*[-*]\s+(.+)/gm, '<li>$1</li>')
|
||||
.replace(/(<li>.*<\/li>)/gs, '<ul>$1</ul>')
|
||||
.replace(/\n{2,}/g, '<br><br>')
|
||||
.replace(/\n/g, '<br>');
|
||||
}
|
||||
|
||||
// Auto-resize textarea
|
||||
document.getElementById('chat-input').addEventListener('input', function() {
|
||||
this.style.height = 'auto';
|
||||
this.style.height = Math.min(this.scrollHeight, 150) + 'px';
|
||||
});
|
||||
|
||||
// === FILE UPLOAD ===
|
||||
const uploadZone = document.getElementById('upload-zone');
|
||||
const fileInput = document.getElementById('file-input');
|
||||
|
||||
['dragenter','dragover'].forEach(e => uploadZone.addEventListener(e, ev => { ev.preventDefault(); uploadZone.classList.add('dragover'); }));
|
||||
['dragleave','drop'].forEach(e => uploadZone.addEventListener(e, ev => { ev.preventDefault(); uploadZone.classList.remove('dragover'); }));
|
||||
uploadZone.addEventListener('drop', ev => { if(ev.dataTransfer.files.length) uploadFiles(ev.dataTransfer.files); });
|
||||
fileInput.addEventListener('change', () => { if(fileInput.files.length) uploadFiles(fileInput.files); fileInput.value=''; });
|
||||
|
||||
async function uploadFiles(files) {
|
||||
for (const file of files) {
|
||||
const fd = new FormData();
|
||||
fd.append('file', file);
|
||||
fd.append('action', 'upload');
|
||||
try {
|
||||
const r = await fetch(API + '?action=upload', {method:'POST', body:fd});
|
||||
const data = await r.json();
|
||||
if (data.status === 'ok') {
|
||||
loadSources();
|
||||
loadDashboard();
|
||||
}
|
||||
} catch(e) { console.error('Upload error:', e); }
|
||||
}
|
||||
}
|
||||
|
||||
async function loadSources() {
|
||||
try {
|
||||
const data = await fetch(API + '?action=sources').then(r => r.json());
|
||||
const docs = data.documents || [];
|
||||
const el = document.getElementById('file-list');
|
||||
if (!docs.length) {
|
||||
el.innerHTML = '<p style="font-size:.82rem;color:var(--t3);text-align:center;padding:20px">Aucun fichier indexé.</p>';
|
||||
return;
|
||||
}
|
||||
el.innerHTML = docs.map(d => {
|
||||
const icon = {pdf:'📕',docx:'📘',doc:'📘',xlsx:'📗',xls:'📗',pptx:'📙',ppt:'📙',csv:'📊',txt:'📄',md:'📝'}[d.type] || '📎';
|
||||
const size = d.size > 1048576 ? (d.size/1048576).toFixed(1)+'MB' : (d.size/1024).toFixed(0)+'KB';
|
||||
return `<div class="file-row"><span class="file-icon">${icon}</span><span class="file-name">${escHtml(d.name)}</span><span class="file-type">${d.type}</span><span class="file-size">${size}</span><button class="file-del" onclick="deleteDoc('${d.id}')" title="Supprimer">✕</button></div>`;
|
||||
}).join('');
|
||||
} catch(e) { console.error(e); }
|
||||
}
|
||||
|
||||
async function deleteDoc(id) {
|
||||
if (!confirm('Supprimer ce document ?')) return;
|
||||
await fetch(API + '?action=delete_doc&id=' + id);
|
||||
loadSources();
|
||||
loadDashboard();
|
||||
}
|
||||
|
||||
// === VAULT ===
|
||||
async function loadVault() {
|
||||
try {
|
||||
const data = await fetch(API + '?action=vault_list').then(r => r.json());
|
||||
const entries = data.entries || [];
|
||||
const el = document.getElementById('vault-entries');
|
||||
if (!entries.length) {
|
||||
el.innerHTML = '<p style="font-size:.82rem;color:var(--t3);text-align:center;padding:20px">Coffre-fort vide.</p>';
|
||||
return;
|
||||
}
|
||||
const icons = {password:'🔑',card:'💳',note:'📝',code:'🔢'};
|
||||
el.innerHTML = entries.map(e => `<div class="ve"><span class="ve-icon">${icons[e.type]||'🔑'}</span><div class="ve-info"><div class="ve-label">${escHtml(e.label)}</div><div class="ve-user">${escHtml(e.username||'')}</div></div><div class="ve-actions"><button class="ve-btn" onclick="vaultCopy('${e.id}')">📋 Copier</button><button class="ve-btn danger" onclick="vaultDel('${e.id}')">✕</button></div></div>`).join('');
|
||||
} catch(e) { console.error(e); }
|
||||
}
|
||||
|
||||
async function vaultAdd() {
|
||||
const label = document.getElementById('v-label').value.trim();
|
||||
const username = document.getElementById('v-user').value.trim();
|
||||
const password = document.getElementById('v-pass').value;
|
||||
const type = document.getElementById('v-type').value;
|
||||
if (!label) return;
|
||||
|
||||
await fetch(API + '?action=vault_add', {
|
||||
method:'POST',
|
||||
headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({label, username, password, type})
|
||||
});
|
||||
document.getElementById('v-label').value = '';
|
||||
document.getElementById('v-user').value = '';
|
||||
document.getElementById('v-pass').value = '';
|
||||
loadVault();
|
||||
loadDashboard();
|
||||
}
|
||||
|
||||
async function vaultCopy(id) {
|
||||
const data = await fetch(API + '?action=vault_get&id=' + id).then(r => r.json());
|
||||
if (data.entry?.password) {
|
||||
navigator.clipboard.writeText(data.entry.password).then(() => {
|
||||
// Visual feedback
|
||||
event.target.textContent = '✓ Copié';
|
||||
setTimeout(() => event.target.textContent = '📋 Copier', 1500);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function vaultDel(id) {
|
||||
if (!confirm('Supprimer cette entrée ?')) return;
|
||||
await fetch(API + '?action=vault_delete&id=' + id);
|
||||
loadVault();
|
||||
loadDashboard();
|
||||
}
|
||||
|
||||
// === INIT ===
|
||||
loadDashboard();
|
||||
loadSources();
|
||||
loadVault();
|
||||
</script>
|
||||
<footer style="text-align:center;padding:20px;color:#666;font-size:13px">© 2026 WEVAL Consulting. All rights reserved. | <a href="https://weval-consulting.com">weval-consulting.com</a></footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,433 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head>
|
||||
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>WEVAL — Workspace</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root{--bg:#0a0d14;--sb:#0e1219;--border:#1a1f2d;--hover:#151a24;--text:#c8cdd5;--dim:#7d8590;--white:#e2e8f0;--accent:#3b82f6;--green:#22c55e;--orange:#f59e0b;--red:#ef4444;--purple:#8b5cf6;--r:8px}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'DM Sans',system-ui,sans-serif;background:var(--bg);color:var(--text);height:100vh;overflow:hidden;font-size:14px;-webkit-font-smoothing:antialiased}
|
||||
a{color:var(--accent);text-decoration:none}
|
||||
button{font-family:inherit;cursor:pointer;border:none}
|
||||
input{font-family:inherit;background:var(--bg);border:1px solid var(--border);color:var(--white);border-radius:var(--r);padding:10px 14px;font-size:13px;outline:none;width:100%}
|
||||
input:focus{border-color:var(--accent)}
|
||||
|
||||
/* LOGIN */
|
||||
#login{position:fixed;inset:0;background:var(--bg);display:flex;align-items:center;justify-content:center;z-index:100}
|
||||
.login-box{background:var(--sb);border:1px solid var(--border);border-radius:16px;padding:40px;width:400px}
|
||||
.login-box h1{font-size:20px;font-weight:700;color:var(--white);text-align:center;margin-bottom:20px}
|
||||
.login-box .field{margin-bottom:14px}
|
||||
.login-box label{display:block;font-size:11px;color:var(--dim);margin-bottom:5px;text-transform:uppercase;letter-spacing:.05em}
|
||||
.login-btn{width:100%;padding:11px;background:var(--accent);color:#fff;border-radius:var(--r);font-size:14px;font-weight:600;margin-top:8px}
|
||||
.login-btn:hover{opacity:.9}
|
||||
.login-alt{text-align:center;color:var(--dim);font-size:12px;margin-top:16px;cursor:pointer}
|
||||
.login-alt:hover{color:var(--accent)}
|
||||
.toast{position:fixed;bottom:20px;right:20px;background:var(--sb);color:var(--white);padding:10px 18px;border-radius:var(--r);font-size:13px;border:1px solid var(--border);display:none;z-index:200}
|
||||
|
||||
/* LAYOUT */
|
||||
#app{display:none;height:100vh;width:100vw}
|
||||
.layout{display:flex;height:100%}
|
||||
.sidebar{width:200px;background:var(--sb);border-right:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}
|
||||
.sb-head{padding:14px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}
|
||||
.sb-head b{font-size:15px;font-weight:700;color:var(--white)}
|
||||
.sb-head small{font-size:10px;color:var(--dim);margin-left:auto}
|
||||
.sb-nav{flex:1;overflow-y:auto;padding:6px}
|
||||
.sb-nav::-webkit-scrollbar{width:3px}.sb-nav::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}
|
||||
.sb-group{padding:10px 10px 4px;font-size:10px;font-weight:700;color:var(--dim);text-transform:uppercase;letter-spacing:.06em}
|
||||
.sb-link{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;font-size:13px;color:var(--dim);font-weight:500;transition:all .1s}
|
||||
.sb-link:hover{background:var(--hover);color:var(--text)}
|
||||
.sb-link.on{background:rgba(59,130,246,.1);color:var(--accent)}
|
||||
.sb-link .d{width:5px;height:5px;border-radius:50%;flex-shrink:0}
|
||||
.sb-user{padding:10px 14px;border-top:1px solid var(--border);font-size:12px}
|
||||
.sb-user b{color:var(--white);display:block}
|
||||
.sb-user span{color:var(--dim);font-size:10px}
|
||||
|
||||
/* MAIN */
|
||||
.main{flex:1;display:flex;flex-direction:column;overflow:hidden}
|
||||
.topbar{height:46px;border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 20px;gap:12px;background:var(--sb);flex-shrink:0}
|
||||
.topbar-title{font-size:14px;font-weight:600;color:var(--white);flex:1}
|
||||
.topbar-key{font-family:'JetBrains Mono';font-size:10px;color:var(--dim);background:var(--bg);padding:4px 10px;border-radius:6px;cursor:pointer;border:1px solid var(--border)}
|
||||
.topbar-new{font-size:11px;color:var(--accent);cursor:pointer}
|
||||
|
||||
/* CONTENT */
|
||||
.content{flex:1;position:relative;overflow:hidden}
|
||||
#homeView{padding:28px;overflow-y:auto;height:100%}
|
||||
#frameView{width:100%;height:100%;border:0;display:none}
|
||||
|
||||
/* HOME */
|
||||
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:24px}
|
||||
.stat{background:var(--sb);border:1px solid var(--border);border-radius:var(--r);padding:16px}
|
||||
.stat b{font-family:'JetBrains Mono';font-size:22px;font-weight:700;color:var(--white);display:block}
|
||||
.stat small{font-size:11px;color:var(--dim)}
|
||||
.tools{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:6px}
|
||||
.tool{background:var(--sb);border:1px solid var(--border);border-radius:var(--r);padding:8px;cursor:pointer;transition:all .15s;text-align:center}
|
||||
.tool:hover{border-color:rgba(59,130,246,.3);transform:translateY(-1px)}
|
||||
|
||||
.tool h3{font-size:13px;font-weight:600;color:var(--white);margin-bottom:3px}
|
||||
.tool p{font-size:11px;color:var(--dim);line-height:1.4}
|
||||
.tool-ico{width:48px;height:48px;display:flex;align-items:center;justify-content:center;margin:0 auto 4px}
|
||||
.tool-ico img{max-width:44px;max-height:44px;object-fit:contain}
|
||||
.tool-ico{position:relative}
|
||||
.ia-badge{position:absolute;top:-2px;right:-2px;background:#EF4444;color:#fff;font-size:9px;font-weight:700;padding:1px 4px;border-radius:4px;z-index:1}
|
||||
.tool h3{font-size:.78rem!important;margin:0 0 2px}.tool p{font-size:.65rem!important}
|
||||
|
||||
/* Collapsible sidebar groups */
|
||||
.sb-group{padding:10px 10px 4px;font-size:10px;font-weight:700;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;cursor:pointer;display:flex;align-items:center;justify-content:space-between;user-select:none;border-radius:4px;transition:background .15s}
|
||||
.sb-group:hover{background:var(--hover);color:var(--text)}
|
||||
.sb-group .arrow{font-size:8px;transition:transform .2s}
|
||||
.sb-group.open .arrow{transform:rotate(90deg)}
|
||||
.sb-items{max-height:0;overflow:hidden;transition:max-height .25s ease}
|
||||
.sb-items.open{max-height:600px}
|
||||
</style>
|
||||
<link rel="alternate" hreflang="fr" href="https://weval-consulting.com/products/workspace.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://weval-consulting.com/products/workspace.html">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- LOGIN -->
|
||||
<div id="login">
|
||||
<div class="login-box">
|
||||
<h1>WEVAL Workspace</h1>
|
||||
<div id="loginForm">
|
||||
<div class="field"><label>Email</label><input type="email" id="lEmail" placeholder="you@company.com"></div>
|
||||
<div class="field"><label>Cle API</label><input id="lKey" placeholder="wv_..."></div>
|
||||
<button class="login-btn" id="loginBtn" onclick="doLogin()">Se connecter</button>
|
||||
<div class="login-alt" onclick="showReg()">Créer un compte</div>
|
||||
</div>
|
||||
<div id="regForm" style="display:none">
|
||||
<div class="field"><label>Nom</label><input id="rName" placeholder="Nom complet"></div>
|
||||
<div class="field"><label>Email</label><input type="email" id="rEmail" placeholder="you@company.com"></div>
|
||||
<div class="field"><label>Entreprise</label><input id="rCompany" placeholder="Entreprise"></div>
|
||||
<button class="login-btn" onclick="doRegister()">Créer un compte gratuit</button>
|
||||
<div class="login-alt" onclick="showLogin()">Déjà un compte</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- APP -->
|
||||
<div id="app">
|
||||
<div class="layout">
|
||||
<div class="sidebar">
|
||||
<div class="sb-head"><b>WEVAL</b><small>workspace</small></div>
|
||||
<div style="padding:6px 8px"><input id="sbSearch" placeholder="Filtrer..." oninput="filterSidebar()" style="width:100%;padding:6px 10px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:11px;outline:none"></div>
|
||||
<div class="sb-nav" id="nav"></div>
|
||||
<div class="sb-user"><b id="uName">—</b><span id="uTier">Free plan</span></div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="topbar">
|
||||
<div class="topbar-title" id="pageTitle">Dashboard</div>
|
||||
<div class="topbar-new" id="newTab" style="display:none" onclick="window.open(currentUrl,'_blank')">↗ Nouvel onglet</div>
|
||||
<div class="topbar-key" id="topKey" onclick="navigator.clipboard.writeText(KEY);toast('Cle API copiee !')"></div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div id="homeView"></div>
|
||||
<iframe id="frameView"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
var KEY='',U={},currentUrl='',currentPage='home';
|
||||
var AUTH='/api/products/auth.php';
|
||||
var $=function(id){return document.getElementById(id)};
|
||||
var v=function(id){return $(id)?$(id).value.trim():''};
|
||||
|
||||
// MODULES CONFIG — slug: [title, url, color, group]
|
||||
var MODULES = {
|
||||
// Services
|
||||
svc: ['Consulting','/products/services.html','var(--dim)','Services','svc'],
|
||||
cloudcost: ['CloudCost','/products/cloudcost.html','var(--green)','Services'],
|
||||
academy: ['Academy','/products/academy.html','var(--dim)','Services','academy'],
|
||||
mailstream: ['MailStream','/mailstream.html','var(--accent)','Services','mailstream'],
|
||||
// IA
|
||||
gpu: ['Wevia Inference','/products/gpu-inference.html','var(--purple)','IA','gpu'],
|
||||
cf: ['Content Factory','/products/content-factory.html','var(--orange)','IA','cf'],
|
||||
pa: ['ProposalAI','/products/proposalai.html','var(--purple)','IA','pa'],
|
||||
bp: ['BlueprintAI','/products/blueprintai.html','var(--purple)','IA','bp'],
|
||||
// Flagships
|
||||
arsenal: ['Wevanalytics','/products/arsenal.html','var(--red)','Flagships','arsenal'],
|
||||
wv: ['Wevads','/products/wevads.html','var(--red)','Flagships','wv'],
|
||||
wevadsia: ['Wevads IA','/products/wevads-ia.html','var(--red)','Flagships','wevadsia'],
|
||||
da: ['DeliverAds','/products/deliverads.html','var(--accent)','Flagships','da'],
|
||||
we: ['Wevia Enterprise','/products/wevia-enterprise.html','var(--purple)','Flagships','we'],
|
||||
// Marketing
|
||||
mw: ['MailWarm','/products/mailwarm.html','var(--orange)','Marketing','mw'],
|
||||
oa: ['OutreachAI','/products/outreachai.html','var(--orange)','Marketing','oa'],
|
||||
aff: ['Partner Program','/products/affiliates.html','var(--purple)','Marketing','aff'],
|
||||
// Commerce
|
||||
sf: ['StoreForge','/products/storeforge.html','var(--orange)','Commerce','sf'],
|
||||
wl: ['Wevia WL','/products/wevia-whitelabel.html','var(--purple)','Commerce','wl'],
|
||||
fb: ['FormBuilder','/products/formbuilder.html','var(--orange)','Commerce','fb'],
|
||||
// Dev
|
||||
df: ['DevForge AI','/products/devforge.html','var(--accent)','Dev','df'],
|
||||
mind: ['WEVAL Mind','/products/wevalmind.html','var(--purple)','Dev','mind'],
|
||||
crf: ['Creative Factory','/products/creativefactory.html','var(--orange)','Dev','crf'],
|
||||
scout: ['Scout Intelligence','/products/scoutai.html','var(--accent)','Dev','scout'],
|
||||
yt: ['YouTube Factory','/products/youtubefactory.html','var(--red)','Dev','yt'],
|
||||
// Scanners
|
||||
ds: ['DeliverScore','/products/deliverscore.html','var(--green)','Scanners','ds'],
|
||||
sentinel: ['Sentinel','/products/sentinel.html','var(--accent)','Scanners','sentinel'],
|
||||
// Data
|
||||
mr: ['MedReach','/products/medreach.html','var(--green)','Data','mr'],
|
||||
lf: ['LeadForge','/products/leadforge.html','var(--orange)','Data','lf'],
|
||||
// IA Apps
|
||||
ppt: ['PresentationAI','/products/presentationai.html','var(--purple)','IA Apps','ppt'],
|
||||
translate: ['TranslateAI','/products/translateai.html','var(--green)','IA Apps','translate'],
|
||||
bizplan: ['Business Plan','/products/bizplan.html','var(--orange)','IA Apps','bizplan'],
|
||||
contracts: ['ContractAI','/products/contractai.html','var(--purple)','IA Apps','contracts'],
|
||||
meeting: ['Meeting Summary','/products/meetingai.html','var(--red)','IA Apps','meeting'],
|
||||
esign: ['eSignature','/products/esignature.html','var(--orange)','IA Apps','esign'],
|
||||
leansixsigma: ['Lean Six Sigma','/products/leansixsigma.html','var(--green)','IA Apps','leansixsigma'],
|
||||
audit: ['Audit & Compliance','/products/auditai.html','var(--red)','IA Apps','audit'],
|
||||
// Email+
|
||||
et: ['MedReach HCP','/products/medreachhcp.html','var(--green)','Email+','et'],
|
||||
mailforge: ['MailForge','/products/mailforge.html','var(--orange)','Email+','mailforge'],
|
||||
cloudbridge: ['CloudBridge','/products/cloud-providers.html','var(--accent)','Email+','cloudbridge'],
|
||||
emailverify: ['EmailVerify','/products/emailverify.html','var(--green)','Email+'],
|
||||
inboxtest: ['InboxTest','/products/inboxtest.html','var(--accent)','Email+'],
|
||||
ispmonitor: ['ISP Monitor','/products/ispmonitor.html','var(--purple)','Email+'],
|
||||
newsletter: ['NewsletterInsight','/products/newsletterinsight.html','var(--orange)','Email+'],
|
||||
// Additional Products
|
||||
adscontrol: ['AdsControl','/products/adscontrol.html','var(--red)','Marketing','adscontrol'],
|
||||
blacklistguard: ['BlacklistGuard','/products/blacklistguard.html','var(--red)','Email+','blacklistguard'],
|
||||
canvasai: ['CanvasAI','/products/canvasai.html','var(--purple)','IA','canvasai'],
|
||||
copyai: ['CopyAI','/products/copyai.html','var(--purple)','IA','copyai'],
|
||||
dashboardai: ['DashboardAI','/products/dashboardai.html','var(--accent)','IA Apps','dashboardai'],
|
||||
dataharvest: ['DataHarvest','/products/dataharvest.html','var(--green)','Data','dataharvest'],
|
||||
ethica: ['Ethica','/products/ethica.html','var(--green)','Data','ethica'],
|
||||
reputationai: ['ReputationAI','/products/reputationai.html','var(--orange)','Marketing','reputationai'],
|
||||
smsforge: ['SMSForge','/products/smsforge.html','var(--orange)','Marketing','smsforge'],
|
||||
storeai: ['StoreAI','/products/storeai.html','var(--orange)','Commerce','storeai'],
|
||||
wevalcrm: ['Weval CRM','/products/wevalcrm.html','var(--accent)','Services','wevalcrm'],
|
||||
};
|
||||
|
||||
function toast(m){var t=$('toast');t.textContent=m;t.style.display='block';setTimeout(function(){t.style.display='none'},3000)}
|
||||
function showReg(){$('loginForm').style.display='none';$('regForm').style.display=''}
|
||||
function showLogin(){$('regForm').style.display='none';$('loginForm').style.display=''}
|
||||
|
||||
// BUILD SIDEBAR
|
||||
function buildSidebar(){
|
||||
var nav=$('nav');
|
||||
var groups={};var gOrder=[];
|
||||
for(var k in MODULES){
|
||||
var g=MODULES[k][3];
|
||||
if(!groups[g]){groups[g]=[];gOrder.push(g)}
|
||||
groups[g].push(k);
|
||||
}
|
||||
var html='<div class="sb-link on" onclick="go(\'home\')"><div class="d" style="background:var(--accent)"></div>Dashboard</div>';
|
||||
for(var gi=0;gi<gOrder.length;gi++){
|
||||
var g=gOrder[gi];
|
||||
html+='<div class="sb-group open" onclick="toggleGroup(this)"><span>'+g+'</span><span class="arrow">▶</span></div>';
|
||||
html+='<div class="sb-items open">';
|
||||
for(var i=0;i<groups[g].length;i++){
|
||||
var k=groups[g][i];
|
||||
var m=MODULES[k];
|
||||
html+='<div class="sb-link" data-id="'+k+'" onclick="go(\''+k+'\')"><div class="d" style="background:'+m[2]+'"></div>'+m[0]+'</div>';
|
||||
}
|
||||
html+='</div>';
|
||||
}
|
||||
nav.innerHTML=html;
|
||||
}
|
||||
function toggleGroup(el){
|
||||
el.classList.toggle('open');
|
||||
var items=el.nextElementSibling;
|
||||
if(items)items.classList.toggle('open');
|
||||
}
|
||||
|
||||
// NAVIGATE
|
||||
function go(page){
|
||||
if(!KEY&&page!=='home'){toast('Connectez-vous');return}
|
||||
currentPage=page;
|
||||
|
||||
// Sidebar active
|
||||
document.querySelectorAll('.sb-link').forEach(function(l){l.classList.remove('on')});
|
||||
var active=document.querySelector('.sb-link[data-id="'+page+'"]');
|
||||
if(active)active.classList.add('on');
|
||||
if(page==='home')document.querySelector('.sb-link[onclick*="home"]').classList.add('on');
|
||||
|
||||
if(page==='home'){
|
||||
$('homeView').style.display='';
|
||||
$('frameView').style.display='none';
|
||||
$('pageTitle').textContent='Dashboard';
|
||||
$('newTab').style.display='none';
|
||||
return;
|
||||
}
|
||||
|
||||
var mod=MODULES[page];
|
||||
if(!mod){toast('Module inconnu');return}
|
||||
|
||||
$('pageTitle').textContent=mod[0];
|
||||
$('homeView').style.display='none';
|
||||
$('frameView').style.display='block';
|
||||
$('newTab').style.display='';
|
||||
currentUrl=mod[1];
|
||||
|
||||
// SET IFRAME SRC — simple, direct, no conditions
|
||||
$('frameView').src=mod[1]+(mod[1].includes('?')?'&':'?')+'_t='+Date.now();
|
||||
}
|
||||
|
||||
// HOME DASHBOARD
|
||||
function renderHome(){
|
||||
$('homeView').innerHTML=
|
||||
'<div class="stats">'+
|
||||
'<div class="stat"><b>54</b><small>Produits</small></div>'+
|
||||
'<div class="stat"><b>54</b><small>Modules</small></div>'+
|
||||
'<div class="stat"><b style="color:var(--green)">Live</b><small>API Status</small></div>'+
|
||||
'<div class="stat"><b id="hTier">Free</b><small>Plan</small></div>'+
|
||||
'</div>'+
|
||||
'<div style="margin-bottom:16px;display:flex;gap:10px;align-items:center">'+
|
||||
'<input type="text" id="toolSearch" placeholder="Rechercher un produit..." oninput="filterTools()" style="flex:1;padding:10px 16px;background:var(--sb);border:1px solid var(--border);border-radius:8px;color:var(--white);font-size:13px;outline:none">'+
|
||||
'<span style="font-size:11px;color:var(--dim)" id="toolCount">54 produits</span>'+
|
||||
'</div>'+
|
||||
'<div class="tools" id="toolGrid"></div>';
|
||||
|
||||
var ICONS={
|
||||
'arsenal':'/assets/logo-wevanalytics.svg',
|
||||
'wv':'/assets/logo-wevads-Crayl4yz.png',
|
||||
'wevadsia':'/assets/logo-wevads-Crayl4yz.png',
|
||||
'da':'/assets/logo-deliverads.svg',
|
||||
'we':'/assets/logo-wevia-official.svg',
|
||||
'ds':'/assets/logo-deliverscore.svg',
|
||||
'sentinel':'/assets/logo-sentinel.svg',
|
||||
'mr':'/assets/logo-medreach.svg',
|
||||
'lf':'/assets/logo-leadforge.svg',
|
||||
'gpu':'/assets/logo-wevia-official.svg',
|
||||
'cf':'/assets/logo-content-factory.svg',
|
||||
'pa':'/assets/logo-proposalai.svg',
|
||||
'bp':'/assets/logo-blueprintai.svg',
|
||||
'mw':'/assets/logo-mailwarm.svg',
|
||||
'oa':'/assets/logo-outreachai.svg',
|
||||
'aff':'/assets/logo-affiliates.svg',
|
||||
'sf':'/assets/logo-storeforge.svg',
|
||||
'wl':'/assets/logo-wevia-official.svg',
|
||||
'fb':'/assets/logo-formbuilder.svg',
|
||||
'df':'/assets/logo-devforge.svg',
|
||||
'mind':'/assets/logo-weval-mind.svg',
|
||||
'crf':'/assets/logo-creative-factory.svg',
|
||||
'scout':'/assets/logo-scout.svg',
|
||||
'yt':'/assets/logo-youtube-factory.svg',
|
||||
'ppt':'/assets/logo-presentationai.svg',
|
||||
'translate':'/assets/logo-translateai.svg',
|
||||
'bizplan':'/assets/logo-bizplan.svg',
|
||||
'contracts':'/assets/logo-contractai.svg',
|
||||
'meeting':'/assets/logo-meeting-summary.svg',
|
||||
'esign':'/assets/logo-esignature.svg',
|
||||
'leansixsigma':'/assets/logo-leansixsigma.svg',
|
||||
'audit':'/assets/logo-auditcompliance.svg',
|
||||
'et':'/assets/logo-ethica.svg',
|
||||
'mailforge':'/assets/logo-mailforge.svg',
|
||||
'cloudbridge':'/assets/logo-cloudbridge.svg',
|
||||
'svc':'/assets/logo-consulting.svg',
|
||||
'academy':'/assets/logo-academy.svg',
|
||||
'canvas':'/assets/logo-canvasai.svg',
|
||||
'dash':'/assets/logo-dashboardai.svg',
|
||||
'emailverify':'/assets/logo-emailverify.svg',
|
||||
'inboxtest':'/assets/logo-inboxtest.svg',
|
||||
'ispmonitor':'/assets/logo-ispmonitor.svg',
|
||||
'newsletter':'/assets/logo-newsletterspy.svg',
|
||||
'cloudcost':'/assets/logo-cloudcost.svg',
|
||||
'mailstream':'/assets/logo-mailstream.svg',
|
||||
};
|
||||
'adscontrol':'/assets/logo-adscontrol.svg',
|
||||
'blacklistguard':'/assets/logo-blacklistguard.svg',
|
||||
'canvasai':'/assets/logo-canvasai.svg',
|
||||
'copyai':'/assets/logo-copyai.svg',
|
||||
'dashboardai':'/assets/logo-dashboardai.svg',
|
||||
'dataharvest':'/assets/logo-dataharvest.svg',
|
||||
'ethica':'/assets/logo-ethica.svg',
|
||||
'reputationai':'/assets/logo-reputationai.svg',
|
||||
'smsforge':'/assets/logo-smsforge.svg',
|
||||
'storeai':'/assets/logo-storeforge.svg',
|
||||
'wevalcrm':'/assets/logo-weval-crm.svg',
|
||||
var html='';
|
||||
for(var k in MODULES){
|
||||
var m=MODULES[k];
|
||||
html+='<div class="tool" onclick="go(\''+k+'\')">'+'<div class="tool-ico">'+(k==='wevadsia'?'<span class="ia-badge">IA</span>':'')+'<img src="'+(ICONS[k]||'/assets/logo-weval-ia.svg')+'" alt=""></div><h3>'+m[0]+'</h3><p>'+m[3]+'</p></div>';
|
||||
}
|
||||
$('toolGrid').innerHTML=html;
|
||||
}
|
||||
|
||||
// AUTH
|
||||
async function doLogin(){
|
||||
var btn=document.getElementById('loginBtn');if(btn){btn.textContent='Connexion...';btn.disabled=true}
|
||||
var e=v('lEmail'),k=v('lKey');
|
||||
if(!e&&!k){toast('Email ou cle requis');return}
|
||||
try{
|
||||
var r;
|
||||
if(k){r=await(await fetch(AUTH+'?action=dashboard&key='+k)).json();if(r.error){toast(r.error);return}if(!r.api_key){toast('Cle invalide');return}KEY=r.api_key;U=r.user||{};enter()}
|
||||
else{r=await(await fetch(AUTH,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:'User',email:e,company:'N/A',product:'all'})})).json();if(r.error){toast(r.error);return}KEY=r.api_key;U={name:'User',email:e,tier:r.tier||'free'};enter()}
|
||||
}catch(ex){toast('Erreur: '+ex.message)}
|
||||
finally{var btn=document.getElementById('loginBtn');if(btn){btn.textContent='Se connecter';btn.disabled=false}}
|
||||
}
|
||||
async function doRegister(){
|
||||
var n=v('rName'),e=v('rEmail'),c=v('rCompany');
|
||||
if(!n||!e||!c){toast('Tous les champs requis');return}
|
||||
try{
|
||||
var r=await(await fetch(AUTH,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:n,email:e,company:c,product:'all'})})).json();
|
||||
if(r.error){toast(r.error);return}KEY=r.api_key;U={name:n,email:e,tier:r.tier||'free'};enter()
|
||||
}catch(ex){toast('Erreur: '+ex.message)}
|
||||
}
|
||||
function enter(){
|
||||
try{localStorage.setItem('wk',KEY);localStorage.setItem('wu',JSON.stringify(U))}catch(e){}
|
||||
$('login').style.display='none';
|
||||
$('app').style.display='block';
|
||||
$('uName').textContent=U.name||U.email||'User';
|
||||
$('uTier').textContent=(U.tier||'free')+' plan';
|
||||
$('topKey').textContent=(KEY||'').substring(0,16)+'...';
|
||||
if($('hTier'))$('hTier').textContent=U.tier||'Free';
|
||||
buildSidebar();
|
||||
renderHome();
|
||||
// Welcome toast on first visit
|
||||
if(!localStorage.getItem('wv_welcomed')){
|
||||
toast('Bienvenue ! Explorez nos 54 produits SaaS.');
|
||||
localStorage.setItem('wv_welcomed','1');
|
||||
}
|
||||
}
|
||||
|
||||
// Search/filter products
|
||||
function filterTools(){
|
||||
var q=(document.getElementById('toolSearch')||{}).value||'';
|
||||
q=q.toLowerCase();
|
||||
var cards=document.querySelectorAll('.tool');
|
||||
var visible=0;
|
||||
cards.forEach(function(card){
|
||||
var text=(card.textContent||'').toLowerCase();
|
||||
if(!q||text.indexOf(q)>-1){card.style.display='';visible++}
|
||||
else{card.style.display='none'}
|
||||
});
|
||||
var counter=document.getElementById('toolCount');
|
||||
if(counter)counter.textContent=visible+' produit'+(visible>1?'s':'');
|
||||
}
|
||||
|
||||
// ENTER ON LOGIN
|
||||
document.addEventListener('keypress',function(e){if(e.key==='Enter'&&$('login').style.display!=='none'){if($('loginForm').style.display!=='none')doLogin();else doRegister()}});
|
||||
|
||||
// AUTO RESTORE
|
||||
try{var sk=localStorage.getItem('wk'),su=localStorage.getItem('wu');if(sk&&su){KEY=sk;U=JSON.parse(su);enter()}}catch(e){}
|
||||
|
||||
// Sidebar filter
|
||||
function filterSidebar(){
|
||||
var q=(document.getElementById('sbSearch')||{}).value.toLowerCase();
|
||||
document.querySelectorAll('.sb-link').forEach(function(el){
|
||||
if(el.dataset.id==='home'||!el.dataset.id)return;
|
||||
var text=(el.textContent||'').toLowerCase();
|
||||
el.style.display=(!q||text.indexOf(q)>-1)?'':'none';
|
||||
});
|
||||
// Show parent groups that have visible children
|
||||
document.querySelectorAll('.sb-group').forEach(function(g){
|
||||
var items=g.nextElementSibling;
|
||||
if(items&&items.classList.contains('sb-items')){
|
||||
var hasVisible=false;
|
||||
items.querySelectorAll('.sb-link').forEach(function(l){if(l.style.display!=='none')hasVisible=true});
|
||||
g.style.display=(!q||hasVisible)?'':'none';
|
||||
items.style.display=(!q||hasVisible)?'':'none';
|
||||
if(q&&hasVisible){items.classList.add('open');g.classList.add('open')}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<script src="/weval-translate.js" defer></script>
|
||||
</body></html>
|
||||
@@ -1,628 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head>
|
||||
<link rel="icon" href="/favicon.ico" type="image/x-icon">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>WEVAL — Workspace</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root{--bg:#0a0d14;--sb:#0e1219;--border:#1a1f2d;--hover:#151a24;--text:#c8cdd5;--dim:#7d8590;--white:#e2e8f0;--accent:#3b82f6;--green:#22c55e;--orange:#f59e0b;--red:#ef4444;--purple:#8b5cf6;--r:8px}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'DM Sans',system-ui,sans-serif;background:var(--bg);color:var(--text);height:100vh;overflow:hidden;font-size:14px;-webkit-font-smoothing:antialiased}
|
||||
a{color:var(--accent);text-decoration:none}
|
||||
button{font-family:inherit;cursor:pointer;border:none}
|
||||
input{font-family:inherit;background:var(--bg);border:1px solid var(--border);color:var(--white);border-radius:var(--r);padding:10px 14px;font-size:13px;outline:none;width:100%}
|
||||
input:focus{border-color:var(--accent)}
|
||||
|
||||
/* LOGIN */
|
||||
#login{position:fixed;inset:0;background:var(--bg);display:flex;align-items:center;justify-content:center;z-index:100}
|
||||
.login-box{background:var(--sb);border:1px solid var(--border);border-radius:16px;padding:40px;width:400px}
|
||||
.login-box h1{font-size:20px;font-weight:700;color:var(--white);text-align:center;margin-bottom:20px}
|
||||
.login-box .field{margin-bottom:14px}
|
||||
.login-box label{display:block;font-size:11px;color:var(--dim);margin-bottom:5px;text-transform:uppercase;letter-spacing:.05em}
|
||||
.login-btn{width:100%;padding:11px;background:var(--accent);color:#fff;border-radius:var(--r);font-size:14px;font-weight:600;margin-top:8px}
|
||||
.login-btn:hover{opacity:.9}
|
||||
.login-alt{text-align:center;color:var(--dim);font-size:12px;margin-top:16px;cursor:pointer}
|
||||
.login-alt:hover{color:var(--accent)}
|
||||
.toast{position:fixed;bottom:20px;right:20px;background:var(--sb);color:var(--white);padding:10px 18px;border-radius:var(--r);font-size:13px;border:1px solid var(--border);display:none;z-index:200}
|
||||
|
||||
/* LAYOUT */
|
||||
#app{display:none;height:100vh;width:100vw}
|
||||
.layout{display:flex;height:100%}
|
||||
.sidebar{width:200px;background:var(--sb);border-right:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}
|
||||
.sb-head{padding:14px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}
|
||||
.sb-head b{font-size:15px;font-weight:700;color:var(--white)}
|
||||
.sb-head small{font-size:10px;color:var(--dim);margin-left:auto}
|
||||
.sb-nav{flex:1;overflow-y:auto;padding:6px}
|
||||
.sb-nav::-webkit-scrollbar{width:3px}.sb-nav::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}
|
||||
.sb-group{padding:10px 10px 4px;font-size:10px;font-weight:700;color:var(--dim);text-transform:uppercase;letter-spacing:.06em}
|
||||
.sb-link{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;font-size:13px;color:var(--dim);font-weight:500;transition:all .1s}
|
||||
.sb-link:hover{background:var(--hover);color:var(--text)}
|
||||
.sb-link.on{background:rgba(59,130,246,.1);color:var(--accent)}
|
||||
.sb-link .d{width:5px;height:5px;border-radius:50%;flex-shrink:0}
|
||||
.sb-user{padding:10px 14px;border-top:1px solid var(--border);font-size:12px}
|
||||
.sb-user b{color:var(--white);display:block}
|
||||
.sb-user span{color:var(--dim);font-size:10px}
|
||||
|
||||
/* MAIN */
|
||||
.main{flex:1;display:flex;flex-direction:column;overflow:hidden}
|
||||
.topbar{height:46px;border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 20px;gap:12px;background:var(--sb);flex-shrink:0}
|
||||
.topbar-title{font-size:14px;font-weight:600;color:var(--white);flex:1}
|
||||
.topbar-key{font-family:'JetBrains Mono';font-size:10px;color:var(--dim);background:var(--bg);padding:4px 10px;border-radius:6px;cursor:pointer;border:1px solid var(--border)}
|
||||
.topbar-new{font-size:11px;color:var(--accent);cursor:pointer}
|
||||
|
||||
/* CONTENT */
|
||||
.content{flex:1;position:relative;overflow:hidden}
|
||||
#homeView{padding:28px;overflow-y:auto;height:100%}
|
||||
#frameView{width:100%;height:100%;border:0;display:none}
|
||||
|
||||
/* HOME */
|
||||
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:24px}
|
||||
.stat{background:var(--sb);border:1px solid var(--border);border-radius:var(--r);padding:16px}
|
||||
.stat b{font-family:'JetBrains Mono';font-size:22px;font-weight:700;color:var(--white);display:block}
|
||||
.stat small{font-size:11px;color:var(--dim)}
|
||||
.tools{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:6px}
|
||||
.tool{background:var(--sb);border:1px solid var(--border);border-radius:var(--r);padding:8px;cursor:pointer;transition:all .15s;text-align:center}
|
||||
.tool:hover{border-color:rgba(59,130,246,.3);transform:translateY(-1px)}
|
||||
|
||||
.tool h3{font-size:13px;font-weight:600;color:var(--white);margin-bottom:3px}
|
||||
.tool p{font-size:11px;color:var(--dim);line-height:1.4}
|
||||
.tool-ico{width:48px;height:48px;display:flex;align-items:center;justify-content:center;margin:0 auto 4px}
|
||||
.tool-ico img{max-width:44px;max-height:44px;object-fit:contain}
|
||||
.tool-ico{position:relative}
|
||||
.ia-badge{position:absolute;top:-2px;right:-2px;background:#EF4444;color:#fff;font-size:9px;font-weight:700;padding:1px 4px;border-radius:4px;z-index:1}
|
||||
.tool h3{font-size:.78rem!important;margin:0 0 2px}.tool p{font-size:.65rem!important}
|
||||
|
||||
/* Collapsible sidebar groups */
|
||||
.sb-group{padding:10px 10px 4px;font-size:10px;font-weight:700;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;cursor:pointer;display:flex;align-items:center;justify-content:space-between;user-select:none;border-radius:4px;transition:background .15s}
|
||||
.sb-group:hover{background:var(--hover);color:var(--text)}
|
||||
.sb-group .arrow{font-size:8px;transition:transform .2s}
|
||||
.sb-group.open .arrow{transform:rotate(90deg)}
|
||||
.sb-items{max-height:0;overflow:hidden;transition:max-height .25s ease}
|
||||
.sb-items.open{max-height:600px}
|
||||
|
||||
/* Free/Premium badges */
|
||||
.tool-badge{position:absolute;top:4px;right:4px;font-size:8px;font-weight:700;padding:2px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.03em;z-index:2}
|
||||
.tool-badge.free{background:rgba(34,197,94,.15);color:#22c55e;border:1px solid rgba(34,197,94,.25)}
|
||||
.tool-badge.pro{background:rgba(139,92,246,.15);color:#8b5cf6;border:1px solid rgba(139,92,246,.25)}
|
||||
/* Favorite star */
|
||||
.tool-fav{position:absolute;top:4px;left:4px;font-size:14px;cursor:pointer;opacity:.3;transition:all .15s;z-index:2;background:none;border:none;padding:2px}
|
||||
.tool-fav:hover,.tool-fav.on{opacity:1;transform:scale(1.2)}
|
||||
.tool-fav.on{color:#f59e0b}
|
||||
.tool{position:relative}
|
||||
/* Tooltip */
|
||||
.tool-tip{display:none;position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:#1e293b;color:#e2e8f0;padding:6px 10px;border-radius:6px;font-size:10px;white-space:nowrap;z-index:100;pointer-events:none;box-shadow:0 4px 12px rgba(0,0,0,.3)}
|
||||
.tool:hover .tool-tip{display:block}
|
||||
/* Recent section */
|
||||
.recent-bar{display:flex;gap:6px;margin-bottom:16px;flex-wrap:wrap;align-items:center}
|
||||
.recent-bar .label{font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;font-weight:700;margin-right:4px}
|
||||
.recent-chip{font-size:11px;padding:4px 10px;background:var(--sb);border:1px solid var(--border);border-radius:6px;cursor:pointer;color:var(--text);transition:all .15s}
|
||||
.recent-chip:hover{border-color:var(--accent);color:var(--accent)}
|
||||
/* Ctrl+K hint */
|
||||
.search-hint{font-size:10px;color:var(--dim);position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;background:var(--bg);padding:2px 6px;border-radius:4px;border:1px solid var(--border)}
|
||||
/* Mobile responsive */
|
||||
@media(max-width:768px){
|
||||
.layout{flex-direction:column!important}
|
||||
.sidebar{width:100%!important;height:auto!important;max-height:50vh;border-right:none!important;border-bottom:1px solid var(--border)}
|
||||
.sb-nav{max-height:200px}
|
||||
.tools{grid-template-columns:repeat(auto-fill,minmax(90px,1fr))!important;gap:4px!important}
|
||||
.tool{padding:6px!important}
|
||||
.tool-ico{width:36px!important;height:36px!important}
|
||||
.tool-ico img{max-width:32px!important;max-height:32px!important}
|
||||
.tool h3{font-size:.7rem!important}
|
||||
.tool p{font-size:.55rem!important}
|
||||
.stats{grid-template-columns:repeat(2,1fr)!important}
|
||||
.topbar{padding:0 12px!important}
|
||||
#homeView{padding:16px!important}
|
||||
.recent-bar{display:none!important}
|
||||
}
|
||||
@media(max-width:480px){
|
||||
.tools{grid-template-columns:repeat(3,1fr)!important}
|
||||
.sidebar{max-height:40vh}
|
||||
}
|
||||
|
||||
.in-iframe nav{display:none!important}.in-iframe .hero{padding-top:3rem!important;min-height:auto!important}.in-iframe footer{display:none!important}.in-iframe .cta{display:none!important}.in-iframe .wv-links{display:none!important}</style>
|
||||
<link rel="alternate" hreflang="fr" href="https://weval-consulting.com/products/workspace.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://weval-consulting.com/products/workspace.html">
|
||||
<script>if(window!==window.top)document.documentElement.classList.add("in-iframe")</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- LOGIN -->
|
||||
<div id="login">
|
||||
<div class="login-box">
|
||||
<h1>WEVAL Workspace</h1>
|
||||
<div id="loginForm">
|
||||
<div class="field"><label>Email</label><input type="email" id="lEmail" placeholder="you@company.com"></div>
|
||||
<div class="field"><label>Cle API</label><input id="lKey" placeholder="wv_..."></div>
|
||||
<button class="login-btn" id="loginBtn" onclick="doLogin()">Se connecter</button>
|
||||
<div class="login-alt" onclick="showReg()">Créer un compte</div>
|
||||
</div>
|
||||
<div id="regForm" style="display:none">
|
||||
<div class="field"><label>Nom</label><input id="rName" placeholder="Nom complet"></div>
|
||||
<div class="field"><label>Email</label><input type="email" id="rEmail" placeholder="you@company.com"></div>
|
||||
<div class="field"><label>Entreprise</label><input id="rCompany" placeholder="Entreprise"></div>
|
||||
<button class="login-btn" onclick="doRegister()">Créer un compte gratuit</button>
|
||||
<div class="login-alt" onclick="showLogin()">Déjà un compte</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- APP -->
|
||||
<div id="app">
|
||||
<div class="layout">
|
||||
<div class="sidebar">
|
||||
<div class="sb-head"><b>WEVAL</b><small>workspace</small></div>
|
||||
<div style="padding:6px 8px"><input id="sbSearch" placeholder="Filtrer..." oninput="filterSidebar()" style="width:100%;padding:6px 10px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:11px;outline:none"></div>
|
||||
<div class="sb-nav" id="nav"></div>
|
||||
<div class="sb-user"><b id="uName">—</b><span id="uTier">Free plan</span></div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="topbar">
|
||||
<div class="topbar-title" id="pageTitle">Dashboard</div>
|
||||
<div class="topbar-new" id="newTab" style="display:none" onclick="window.open(currentUrl,'_blank')">↗ Nouvel onglet</div>
|
||||
<div class="topbar-key" id="topKey" onclick="navigator.clipboard.writeText(KEY);toast('Cle API copiee !')"></div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div id="homeView"></div>
|
||||
<iframe id="frameView" sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-top-navigation allow-top-navigation-by-user-activation" referrerpolicy="strict-origin-when-cross-origin"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
var KEY='',U={},currentUrl='',currentPage='home';
|
||||
var AUTH='/api/products/auth.php';
|
||||
var $=function(id){return document.getElementById(id)};
|
||||
var v=function(id){return $(id)?$(id).value.trim():''};
|
||||
|
||||
// MODULES CONFIG — slug: [title, url, color, group]
|
||||
var MODULES = {
|
||||
// Services
|
||||
svc: ['Consulting','/products/services.html','var(--dim)','Services','svc'],
|
||||
cloudcost: ['CloudCost','/products/cloudcost.html','var(--green)','Services'],
|
||||
academy: ['Academy','/products/academy.html','var(--dim)','Services','academy'],
|
||||
mailstream: ['MailStream','/products/mailstream.html','var(--accent)','Services','mailstream'],
|
||||
// IA
|
||||
gpu: ['Wevia Inference','/products/gpu-inference.html','var(--purple)','IA','gpu'],
|
||||
cf: ['Content Factory','/products/content-factory.html','var(--orange)','IA','cf'],
|
||||
pa: ['ProposalAI','/products/proposalai.html','var(--purple)','IA','pa'],
|
||||
bp: ['BlueprintAI','/products/blueprintai.html','var(--purple)','IA','bp'],
|
||||
// Flagships
|
||||
arsenal: ['Wevanalytics','/products/arsenal.html','var(--red)','Flagships','arsenal'],
|
||||
wv: ['Wevads','/products/wevads.html','var(--red)','Flagships','wv'],
|
||||
wevadsia: ['Wevads IA','/products/wevads-ia.html','var(--red)','Flagships','wevadsia'],
|
||||
da: ['DeliverAds','/products/deliverads.html','var(--accent)','Flagships','da'],
|
||||
we: ['Wevia Enterprise','/products/wevia-enterprise.html','var(--purple)','Flagships','we'],
|
||||
// Marketing
|
||||
mw: ['MailWarm','/products/mailwarm.html','var(--orange)','Marketing','mw'],
|
||||
oa: ['OutreachAI','/products/outreachai.html','var(--orange)','Marketing','oa'],
|
||||
aff: ['Partner Program','/products/affiliates.html','var(--purple)','Marketing','aff'],
|
||||
// Commerce
|
||||
sf: ['StoreForge','/products/storeforge.html','var(--orange)','Commerce','sf'],
|
||||
wl: ['Wevia WL','/products/wevia-whitelabel.html','var(--purple)','Commerce','wl'],
|
||||
fb: ['FormBuilder','/products/formbuilder.html','var(--orange)','Commerce','fb'],
|
||||
// Dev
|
||||
df: ['DevForge AI','/products/devforge.html','var(--accent)','Dev','df'],
|
||||
mind: ['WEVAL Mind','/products/wevalmind.html','var(--purple)','Dev','mind'],
|
||||
crf: ['Creative Factory','/products/creativefactory.html','var(--orange)','Dev','crf'],
|
||||
scout: ['Scout Intelligence','/products/scoutai.html','var(--accent)','Dev','scout'],
|
||||
yt: ['YouTube Factory','/products/youtubefactory.html','var(--red)','Dev','yt'],
|
||||
// Scanners
|
||||
ds: ['DeliverScore','/products/deliverscore.html','var(--green)','Scanners','ds'],
|
||||
sentinel: ['Sentinel','/products/sentinel.html','var(--accent)','Scanners','sentinel'],
|
||||
// Data
|
||||
mr: ['MedReach','/products/medreach.html','var(--green)','Data','mr'],
|
||||
lf: ['LeadForge','/products/leadforge.html','var(--orange)','Data','lf'],
|
||||
// IA Apps
|
||||
ppt: ['PresentationAI','/products/presentationai.html','var(--purple)','IA Apps','ppt'],
|
||||
translate: ['TranslateAI','/products/translateai.html','var(--green)','IA Apps','translate'],
|
||||
bizplan: ['Business Plan','/products/bizplan.html','var(--orange)','IA Apps','bizplan'],
|
||||
contracts: ['ContractAI','/products/contractai.html','var(--purple)','IA Apps','contracts'],
|
||||
meeting: ['Meeting Summary','/products/meetingai.html','var(--red)','IA Apps','meeting'],
|
||||
esign: ['eSignature','/products/esignature.html','var(--orange)','IA Apps','esign'],
|
||||
leansixsigma: ['Lean Six Sigma','/products/leansixsigma.html','var(--green)','IA Apps','leansixsigma'],
|
||||
audit: ['Audit & Compliance','/products/auditai.html','var(--red)','IA Apps','audit'],
|
||||
// Email+
|
||||
et: ['MedReach HCP','/products/medreachhcp.html','var(--green)','Email+','et'],
|
||||
mailforge: ['MailForge','/products/mailforge.html','var(--orange)','Email+','mailforge'],
|
||||
cloudbridge: ['CloudBridge','/products/cloud-providers.html','var(--accent)','Email+','cloudbridge'],
|
||||
emailverify: ['EmailVerify','/products/emailverify.html','var(--green)','Email+'],
|
||||
inboxtest: ['InboxTest','/products/inboxtest.html','var(--accent)','Email+'],
|
||||
ispmonitor: ['Network Monitor','/products/ispmonitor.html','var(--purple)','Email+'],
|
||||
newsletter: ['NewsletterInsight','/products/newsletterinsight.html','var(--orange)','Email+'],
|
||||
// Additional Products
|
||||
adscontrol: ['AdsControl','/products/adscontrol.html','var(--red)','Marketing','adscontrol'],
|
||||
networkguard: ['NetworkGuard','/products/networkguard.html','var(--red)','Email+','networkguard'],
|
||||
canvasai: ['CanvasAI','/products/canvasai.html','var(--purple)','IA','canvasai'],
|
||||
copyai: ['CopyAI','/products/copyai.html','var(--purple)','IA','copyai'],
|
||||
dashboardai: ['DashboardAI','/products/dashboardai.html','var(--accent)','IA Apps','dashboardai'],
|
||||
dataharvest: ['DataHarvest','/products/dataharvest.html','var(--green)','Data','dataharvest'],
|
||||
reputationai: ['ReputationAI','/products/reputationai.html','var(--orange)','Marketing','reputationai'],
|
||||
smsforge: ['SMSForge','/products/smsforge.html','var(--orange)','Marketing','smsforge'],
|
||||
storeai: ['StoreAI','/products/storeai.html','var(--orange)','Commerce','storeai'],
|
||||
wevalcrm: ['Weval CRM','/products/wevalcrm.html','var(--accent)','Services','wevalcrm'],
|
||||
emailplatform: ['Digital Platform','/products/email-platform.html','var(--red)','Flagships','emailplatform'],
|
||||
medreachapi: ['MedReach API','/products/medreach-api.html','var(--green)','Data','medreachapi'],
|
||||
weviaagency: ['WEVIA Agency','/products/wevia-agency.html','var(--purple)','Services','weviaagency'],
|
||||
healthcarecrm: ['Healthcare CRM','/products/healthcare-crm.html','var(--green)','Data','healthcarecrm'],
|
||||
iaarabe: ['IA Arabe FR','/products/ia-arabe.html','var(--purple)','IA','iaarabe'],
|
||||
aisdr: ['AI SDR Agent','/products/ai-sdr.html','var(--orange)','Marketing','aisdr'],
|
||||
emailwl: ['Email WL','/products/email-whitelabel.html','var(--red)','Email+','emailwl'],
|
||||
consultingpkg: ['Consulting Pro','/products/consulting.html','var(--accent)','Services','consultingpkg'],
|
||||
};
|
||||
|
||||
|
||||
var TIERS={
|
||||
svc:'free',academy:'free',mailstream:'free',gpu:'pro',cf:'pro',pa:'free',bp:'free',
|
||||
arsenal:'pro',wv:'pro',wevadsia:'pro',da:'pro',we:'pro',
|
||||
ds:'free',sentinel:'free',mr:'free',lf:'pro',
|
||||
mw:'free',oa:'pro',aff:'free',sf:'pro',wl:'pro',fb:'free',
|
||||
df:'free',mind:'free',crf:'free',scout:'free',yt:'free',
|
||||
ppt:'free',translate:'free',bizplan:'free',contracts:'free',meeting:'free',
|
||||
esign:'free',leansixsigma:'free',audit:'free',et:'pro',
|
||||
mailforge:'pro',cloudbridge:'pro',emailverify:'free',inboxtest:'free',
|
||||
ispmonitor:'free',newsletter:'free',cloudcost:'free',
|
||||
adscontrol:'pro',networkguard:'free',canvasai:'free',copyai:'free',
|
||||
dashboardai:'free',dataharvest:'pro',reputationai:'free',
|
||||
smsforge:'pro',storeai:'free',wevalcrm:'free',
|
||||
emailplatform:'pro',medreachapi:'pro',weviaagency:'pro',healthcarecrm:'free',iaarabe:'pro',aisdr:'pro',emailwl:'pro',consultingpkg:'free'
|
||||
};
|
||||
|
||||
function toast(m){var t=$('toast');t.textContent=m;t.style.display='block';setTimeout(function(){t.style.display='none'},3000)}
|
||||
function showReg(){$('loginForm').style.display='none';$('regForm').style.display=''}
|
||||
function showLogin(){$('regForm').style.display='none';$('loginForm').style.display=''}
|
||||
|
||||
// BUILD SIDEBAR
|
||||
function buildSidebar(){
|
||||
var nav=$('nav');
|
||||
var groups={};var gOrder=[];
|
||||
for(var k in MODULES){
|
||||
var g=MODULES[k][3];
|
||||
if(!groups[g]){groups[g]=[];gOrder.push(g)}
|
||||
groups[g].push(k);
|
||||
}
|
||||
var html='<div class="sb-link on" onclick="go(\'home\')"><div class="d" style="background:var(--accent)"></div>Dashboard</div>';
|
||||
for(var gi=0;gi<gOrder.length;gi++){
|
||||
var g=gOrder[gi];
|
||||
html+='<div class="sb-group open" onclick="toggleGroup(this)"><span>'+g+'</span><span class="arrow">▶</span></div>';
|
||||
html+='<div class="sb-items open">';
|
||||
for(var i=0;i<groups[g].length;i++){
|
||||
var k=groups[g][i];
|
||||
var m=MODULES[k];
|
||||
html+='<div class="sb-link" data-id="'+k+'" onclick="go(\''+k+'\')"><div class="d" style="background:'+m[2]+'"></div>'+m[0]+'</div>';
|
||||
}
|
||||
html+='</div>';
|
||||
}
|
||||
nav.innerHTML=html;
|
||||
}
|
||||
function toggleGroup(el){
|
||||
el.classList.toggle('open');
|
||||
var items=el.nextElementSibling;
|
||||
if(items)items.classList.toggle('open');
|
||||
}
|
||||
|
||||
// NAVIGATE
|
||||
function go(page){
|
||||
if(!KEY&&page!=='home'){toast('Connectez-vous');return}
|
||||
currentPage=page;
|
||||
|
||||
// Sidebar active
|
||||
document.querySelectorAll('.sb-link').forEach(function(l){l.classList.remove('on')});
|
||||
var active=document.querySelector('.sb-link[data-id="'+page+'"]');
|
||||
if(active)active.classList.add('on');
|
||||
if(page==='home')document.querySelector('.sb-link[onclick*="home"]').classList.add('on');
|
||||
|
||||
if(page==='home'){
|
||||
$('homeView').style.display='';trackRecent(id);
|
||||
$('frameView').style.display='none';
|
||||
$('pageTitle').textContent='Dashboard';
|
||||
$('newTab').style.display='none';
|
||||
return;
|
||||
}
|
||||
|
||||
var mod=MODULES[page];
|
||||
if(!mod){toast('Module inconnu');return}
|
||||
|
||||
$('pageTitle').textContent=mod[0];
|
||||
$('homeView').style.display='none';
|
||||
$('frameView').style.display='block';
|
||||
$('newTab').style.display='';
|
||||
currentUrl=mod[1];
|
||||
|
||||
// SET IFRAME SRC — simple, direct, no conditions
|
||||
$('frameView').src=mod[1]+(mod[1].includes('?')?'&':'?')+'_t='+Date.now();
|
||||
}
|
||||
|
||||
// HOME DASHBOARD
|
||||
function renderHome(){
|
||||
$('homeView').innerHTML=
|
||||
'<div class="stats">'+
|
||||
'<div class="stat"><b>62</b><small>Produits</small></div>'+
|
||||
'<div class="stat"><b>62</b><small>Modules</small></div>'+
|
||||
'<div class="stat"><b style="color:var(--green)">Live</b><small>API Status</small></div>'+
|
||||
'<div class="stat"><b id="hTier">Free</b><small>Plan</small></div>'+
|
||||
'</div>'+
|
||||
'<div style="margin-bottom:16px;display:flex;gap:10px;align-items:center">'+
|
||||
'<div style="flex:1;position:relative"><input type="text" id="toolSearch" placeholder="Rechercher un produit..." oninput="filterTools()" style="width:100%;padding:10px 16px;background:var(--sb);border:1px solid var(--border);border-radius:8px;color:var(--white);font-size:13px;outline:none"><span class="search-hint">Ctrl+K</span></div>'+
|
||||
'<span style="font-size:11px;color:var(--dim)" id="toolCount">62 produits</span>'+
|
||||
'</div>'+
|
||||
'<div class="tools" id="toolGrid"></div>';
|
||||
|
||||
var ICONS={
|
||||
'arsenal':'/assets/logo-wevanalytics.svg',
|
||||
'wv':'/assets/logo-wevads-Crayl4yz.png',
|
||||
'wevadsia':'/assets/logo-wevads-Crayl4yz.png',
|
||||
'da':'/assets/logo-deliverads.svg',
|
||||
'we':'/assets/logo-wevia-official.svg',
|
||||
'ds':'/assets/logo-deliverscore.svg',
|
||||
'sentinel':'/assets/logo-sentinel.svg',
|
||||
'mr':'/assets/logo-medreach.svg',
|
||||
'lf':'/assets/logo-leadforge.svg',
|
||||
'gpu':'/assets/logo-wevia-official.svg',
|
||||
'cf':'/assets/logo-content-factory.svg',
|
||||
'pa':'/assets/logo-proposalai.svg',
|
||||
'bp':'/assets/logo-blueprintai.svg',
|
||||
'mw':'/assets/logo-mailwarm.svg',
|
||||
'oa':'/assets/logo-outreachai.svg',
|
||||
'aff':'/assets/logo-affiliates.svg',
|
||||
'sf':'/assets/logo-storeforge.svg',
|
||||
'wl':'/assets/logo-wevia-official.svg',
|
||||
'fb':'/assets/logo-formbuilder.svg',
|
||||
'df':'/assets/logo-devforge.svg',
|
||||
'mind':'/assets/logo-weval-mind.svg',
|
||||
'crf':'/assets/logo-creative-factory.svg',
|
||||
'scout':'/assets/logo-scout.svg',
|
||||
'yt':'/assets/logo-youtube-factory.svg',
|
||||
'ppt':'/assets/logo-presentationai.svg',
|
||||
'translate':'/assets/logo-translateai.svg',
|
||||
'bizplan':'/assets/logo-bizplan.svg',
|
||||
'contracts':'/assets/logo-contractai.svg',
|
||||
'meeting':'/assets/logo-meeting-summary.svg',
|
||||
'esign':'/assets/logo-esignature.svg',
|
||||
'leansixsigma':'/assets/logo-leansixsigma.svg',
|
||||
'audit':'/assets/logo-auditcompliance.svg',
|
||||
'et':'/assets/logo-ethica.svg',
|
||||
'mailforge':'/assets/logo-mailforge.svg',
|
||||
'cloudbridge':'/assets/logo-cloudbridge.svg',
|
||||
'svc':'/assets/logo-consulting.svg',
|
||||
'academy':'/assets/logo-academy.svg',
|
||||
'canvas':'/assets/logo-canvasai.svg',
|
||||
'dash':'/assets/logo-dashboardai.svg',
|
||||
'emailverify':'/assets/logo-emailverify.svg',
|
||||
'inboxtest':'/assets/logo-inboxtest.svg',
|
||||
'ispmonitor':'/assets/logo-ispmonitor.svg',
|
||||
'newsletter':'/assets/logo-newsletter.svg',
|
||||
'cloudcost':'/assets/logo-cloudcost.svg',
|
||||
'mailstream':'/assets/logo-mailstream.svg',
|
||||
'adscontrol':'/assets/logo-adscontrol.svg',
|
||||
'networkguard':'/assets/logo-networkguard.svg',
|
||||
'canvasai':'/assets/logo-canvasai.svg',
|
||||
'copyai':'/assets/logo-copyai.svg',
|
||||
'dashboardai':'/assets/logo-dashboardai.svg',
|
||||
'dataharvest':'/assets/logo-dataharvest.svg',
|
||||
'reputationai':'/assets/logo-reputationai.svg',
|
||||
'smsforge':'/assets/logo-smsforge.svg',
|
||||
'storeai':'/assets/logo-storeforge.svg',
|
||||
'wevalcrm':'/assets/logo-weval-crm.svg',
|
||||
'emailplatform':'/assets/logo-deliverads.svg',
|
||||
'medreachapi':'/assets/logo-medreach.svg',
|
||||
'weviaagency':'/assets/logo-wevia-official.svg',
|
||||
'healthcarecrm':'/assets/logo-medreach.svg',
|
||||
'iaarabe':'/assets/logo-wevia-official.svg',
|
||||
'aisdr':'/assets/logo-outreachai.svg',
|
||||
'emailwl':'/assets/logo-mailforge.svg',
|
||||
'consultingpkg':'/assets/logo-consulting.svg',
|
||||
};
|
||||
// Recent products
|
||||
var recents=JSON.parse(localStorage.getItem('wv_recent')||'[]');
|
||||
var favs=JSON.parse(localStorage.getItem('wv_favs')||'[]');
|
||||
var recentHtml='';
|
||||
if(recents.length>0||favs.length>0){
|
||||
recentHtml='<div class="recent-bar">';
|
||||
if(favs.length>0){
|
||||
recentHtml+='<span class="label">★ Favoris</span>';
|
||||
favs.slice(0,6).forEach(function(k){if(MODULES[k])recentHtml+='<span class="recent-chip" onclick="go(\''+k+'\')">'+MODULES[k][0]+'</span>'});
|
||||
}
|
||||
if(recents.length>0){
|
||||
recentHtml+='<span class="label" style="margin-left:8px">Récents</span>';
|
||||
recents.slice(0,5).forEach(function(k){if(MODULES[k])recentHtml+='<span class="recent-chip" onclick="go(\''+k+'\')">'+MODULES[k][0]+'</span>'});
|
||||
}
|
||||
recentHtml+='</div>';
|
||||
}
|
||||
// Product grid with badges + favs + tooltips
|
||||
var html='';
|
||||
for(var k in MODULES){
|
||||
var m=MODULES[k];
|
||||
var tier=TIERS[k]||'free';
|
||||
var isFav=favs.indexOf(k)>-1;
|
||||
var desc={'Services':'Consulting & accompagnement','IA':'Intelligence artificielle','Flagships':'Produits phares','Marketing':'Marketing digital','Commerce':'E-commerce','Dev':'Développement','Scanners':'Analyse & scan','Data':'Données','IA Apps':'Applications IA','Email+':'Email avancé'};
|
||||
html+='<div class="tool" onclick="go(\''+k+'\')">';
|
||||
html+='<span class="tool-badge '+(tier==='pro'?'pro':'free')+'">'+tier+'</span>';
|
||||
html+='<button class="tool-fav '+(isFav?'on':'')+'" onclick="event.stopPropagation();toggleFav(\''+k+'\')">'+(isFav?'★':'☆')+'</button>';
|
||||
html+='<div class="tool-tip">'+m[0]+' — '+(desc[m[3]]||m[3])+'</div>';
|
||||
html+='<div class="tool-ico">'+(k==='wevadsia'?'<span class="ia-badge">IA</span>':'')+'<img src="'+(ICONS[k]||'/assets/logo-weval-ia.svg')+'" alt=""></div>';
|
||||
html+='<h3>'+m[0]+'</h3><p>'+m[3]+'</p></div>';
|
||||
}
|
||||
$('toolGrid').innerHTML=recentHtml+html;
|
||||
}
|
||||
|
||||
// AUTH
|
||||
async function doLogin(){
|
||||
var btn=document.getElementById('loginBtn');if(btn){btn.textContent='Connexion...';btn.disabled=true}
|
||||
var e=v('lEmail'),k=v('lKey');
|
||||
if(!e&&!k){toast('Email ou cle requis');return}
|
||||
try{
|
||||
var r;
|
||||
if(k){r=await(await fetch(AUTH+'?action=dashboard&key='+k)).json();if(r.error){toast(r.error);return}if(!r.api_key){toast('Cle invalide');return}KEY=r.api_key;U=r.user||{};enter()}
|
||||
else{r=await(await fetch(AUTH,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:'User',email:e,company:'N/A',product:'all'})})).json();if(r.error){toast(r.error);return}KEY=r.api_key;U={name:'User',email:e,tier:r.tier||'free'};enter()}
|
||||
}catch(ex){toast('Erreur: '+ex.message)}
|
||||
finally{var btn=document.getElementById('loginBtn');if(btn){btn.textContent='Se connecter';btn.disabled=false}}
|
||||
}
|
||||
async function doRegister(){
|
||||
var n=v('rName'),e=v('rEmail'),c=v('rCompany');
|
||||
if(!n||!e||!c){toast('Tous les champs requis');return}
|
||||
try{
|
||||
var r=await(await fetch(AUTH,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:n,email:e,company:c,product:'all'})})).json();
|
||||
if(r.error){toast(r.error);return}KEY=r.api_key;U={name:n,email:e,tier:r.tier||'free'};enter()
|
||||
}catch(ex){toast('Erreur: '+ex.message)}
|
||||
}
|
||||
function enter(){
|
||||
try{localStorage.setItem('wk',KEY);localStorage.setItem('wu',JSON.stringify(U))}catch(e){}
|
||||
$('login').style.display='none';
|
||||
$('app').style.display='block';
|
||||
$('uName').textContent=U.name||U.email||'User';
|
||||
$('uTier').textContent=(U.tier||'free')+' plan';
|
||||
$('topKey').textContent=(KEY||'').substring(0,16)+'...';
|
||||
if($('hTier'))$('hTier').textContent=U.tier||'Free';
|
||||
buildSidebar();
|
||||
renderHome();
|
||||
// Welcome toast on first visit
|
||||
if(!localStorage.getItem('wv_welcomed')){
|
||||
toast('Bienvenue ! Explorez nos 62 produits SaaS.');
|
||||
localStorage.setItem('wv_welcomed','1');
|
||||
}
|
||||
}
|
||||
|
||||
// Search/filter products
|
||||
function filterTools(){
|
||||
var q=(document.getElementById('toolSearch')||{}).value||'';
|
||||
q=q.toLowerCase();
|
||||
var cards=document.querySelectorAll('.tool');
|
||||
var visible=0;
|
||||
cards.forEach(function(card){
|
||||
var text=(card.textContent||'').toLowerCase();
|
||||
if(!q||text.indexOf(q)>-1){card.style.display='';visible++}
|
||||
else{card.style.display='none'}
|
||||
});
|
||||
var counter=document.getElementById('toolCount');
|
||||
if(counter)counter.textContent=visible+' produit'+(visible>1?'s':'');
|
||||
}
|
||||
|
||||
// ENTER ON LOGIN
|
||||
document.addEventListener('keypress',function(e){if(e.key==='Enter'&&$('login').style.display!=='none'){if($('loginForm').style.display!=='none')doLogin();else doRegister()}});
|
||||
|
||||
// AUTO RESTORE
|
||||
try{var sk=localStorage.getItem('wk'),su=localStorage.getItem('wu');if(sk&&su){KEY=sk;U=JSON.parse(su);enter()}}catch(e){}
|
||||
|
||||
// Sidebar filter
|
||||
function filterSidebar(){
|
||||
var q=(document.getElementById('sbSearch')||{}).value.toLowerCase();
|
||||
document.querySelectorAll('.sb-link').forEach(function(el){
|
||||
if(el.dataset.id==='home'||!el.dataset.id)return;
|
||||
var text=(el.textContent||'').toLowerCase();
|
||||
el.style.display=(!q||text.indexOf(q)>-1)?'':'none';
|
||||
});
|
||||
// Show parent groups that have visible children
|
||||
document.querySelectorAll('.sb-group').forEach(function(g){
|
||||
var items=g.nextElementSibling;
|
||||
if(items&&items.classList.contains('sb-items')){
|
||||
var hasVisible=false;
|
||||
items.querySelectorAll('.sb-link').forEach(function(l){if(l.style.display!=='none')hasVisible=true});
|
||||
g.style.display=(!q||hasVisible)?'':'none';
|
||||
items.style.display=(!q||hasVisible)?'':'none';
|
||||
if(q&&hasVisible){items.classList.add('open');g.classList.add('open')}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Toggle favorite
|
||||
function toggleFav(k){
|
||||
var favs=JSON.parse(localStorage.getItem('wv_favs')||'[]');
|
||||
var idx=favs.indexOf(k);
|
||||
if(idx>-1)favs.splice(idx,1);else favs.unshift(k);
|
||||
localStorage.setItem('wv_favs',JSON.stringify(favs.slice(0,10)));
|
||||
renderHome();
|
||||
}
|
||||
// Track recent
|
||||
function trackRecent(k){
|
||||
if(k==='home')return;
|
||||
var r=JSON.parse(localStorage.getItem('wv_recent')||'[]');
|
||||
r=r.filter(function(x){return x!==k});
|
||||
r.unshift(k);
|
||||
localStorage.setItem('wv_recent',JSON.stringify(r.slice(0,8)));
|
||||
}
|
||||
// Ctrl+K shortcut
|
||||
document.addEventListener('keydown',function(e){
|
||||
if((e.ctrlKey||e.metaKey)&&e.key==='k'){
|
||||
e.preventDefault();
|
||||
if(currentPage!=='home')go('home');
|
||||
setTimeout(function(){var s=$('toolSearch');if(s){s.focus();s.select()}},100);
|
||||
}
|
||||
if(e.key==='Escape'){var s=$('toolSearch');if(s&&document.activeElement===s){s.value='';filterTools();s.blur()}}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<!-- Contact Overlay (intercepts /contact-us/ in iframe) -->
|
||||
<div id="contactOverlay" style="display:none;position:fixed;top:0;left:var(--sidebar-w,140px);right:0;bottom:0;z-index:500;background:rgba(5,8,18,0.97);overflow-y:auto;padding:3rem 4%">
|
||||
<div style="max-width:520px;margin:0 auto">
|
||||
<button onclick="closeContactOverlay()" style="float:right;background:none;border:none;color:#64748b;font-size:1.4rem;cursor:pointer;padding:8px">✕</button>
|
||||
<div style="display:inline-block;background:rgba(99,102,241,.1);color:#6366f1;padding:6px 18px;border-radius:20px;font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-bottom:1rem">Contact</div>
|
||||
<h2 style="font-size:1.8rem;font-weight:800;color:#f1f5f9;margin-bottom:.5rem" id="overlayTitle">Parlons de votre projet</h2>
|
||||
<p style="color:#94a3b8;font-size:.9rem;margin-bottom:2rem;line-height:1.6">Remplissez le formulaire ci-dessous. Notre équipe vous recontacte sous 24h.</p>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Nom complet</label><input id="ovName" type="text" placeholder="Votre nom" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Email professionnel</label><input id="ovEmail" type="email" placeholder="vous@entreprise.com" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Entreprise</label><input id="ovCompany" type="text" placeholder="Nom de votre entreprise" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Produit</label><input id="ovProduct" type="text" readonly style="width:100%;background:rgba(99,102,241,.06);border:1px solid rgba(99,102,241,.15);color:#818cf8;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none;font-weight:600"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Message</label><textarea id="ovMsg" placeholder="Décrivez votre besoin..." style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none;resize:vertical;min-height:80px"></textarea></div>
|
||||
<button id="ovSendBtn" onclick="sendOverlayForm()" style="display:block;width:100%;background:#6366f1;color:#fff;padding:14px;border:none;border-radius:12px;font-weight:700;font-size:.95rem;cursor:pointer;font-family:inherit;margin-top:1.5rem">Envoyer →</button>
|
||||
<div id="ovSuccess" style="display:none;background:rgba(0,200,150,.08);border:1px solid rgba(0,200,150,.2);border-radius:12px;padding:1.5rem;text-align:center;margin-top:1rem"><h3 style="color:#00c9a7;font-size:1.2rem;margin-bottom:.5rem">Message envoyé ✓</h3><p style="font-size:.85rem;color:#94a3b8">Notre équipe vous recontactera sous 24h.</p><button onclick="closeContactOverlay()" style="margin-top:1rem;background:none;border:1px solid rgba(255,255,255,.1);color:#94a3b8;padding:8px 20px;border-radius:8px;cursor:pointer;font-family:inherit">← Retour au produit</button></div>
|
||||
</div></div>
|
||||
<script>
|
||||
var _currentProduct='';
|
||||
function showContactOverlay(product){
|
||||
_currentProduct=product||'';
|
||||
document.getElementById('ovProduct').value=_currentProduct;
|
||||
document.getElementById('ovSuccess').style.display='none';
|
||||
document.getElementById('ovSendBtn').style.display='block';
|
||||
document.getElementById('ovName').value='';document.getElementById('ovEmail').value='';document.getElementById('ovCompany').value='';document.getElementById('ovMsg').value='';
|
||||
document.getElementById('contactOverlay').style.display='block';
|
||||
}
|
||||
function closeContactOverlay(){
|
||||
document.getElementById('contactOverlay').style.display='none';
|
||||
// Restore iframe to last product
|
||||
var f=document.getElementById('frameView');
|
||||
if(f&&f.dataset.lastSrc&&f.src.indexOf('contact-us')>-1) f.src=f.dataset.lastSrc;
|
||||
}
|
||||
function sendOverlayForm(){
|
||||
var n=document.getElementById('ovName').value.trim(),e=document.getElementById('ovEmail').value.trim();
|
||||
if(!n||!e){alert('Veuillez remplir nom et email.');return;}
|
||||
var btn=document.getElementById('ovSendBtn');btn.disabled=true;btn.textContent='Envoi...';
|
||||
fetch('/api/contact',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:n,email:e,company:document.getElementById('ovCompany').value.trim(),subject:'demo',message:'[Produit: '+_currentProduct+'] '+document.getElementById('ovMsg').value.trim(),source:'workspace-overlay',ts:new Date().toISOString()})}).then(function(){
|
||||
document.getElementById('ovSendBtn').style.display='none';
|
||||
document.getElementById('ovSuccess').style.display='block';
|
||||
}).catch(function(){
|
||||
document.getElementById('ovSendBtn').style.display='none';
|
||||
document.getElementById('ovSuccess').style.display='block';
|
||||
});
|
||||
}
|
||||
// Intercept iframe navigation to /contact-us/
|
||||
(function(){
|
||||
var frame=document.getElementById('frameView');
|
||||
if(!frame)return;
|
||||
// Save last product URL before navigation
|
||||
var origSrc=Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype,'src');
|
||||
// Poll approach: watch iframe URL changes
|
||||
setInterval(function(){
|
||||
try{
|
||||
var loc=frame.contentWindow.location.href;
|
||||
if(loc.indexOf('/contact-us')>-1){
|
||||
// Find current product name from sidebar
|
||||
var active=document.querySelector('.s-item.act');
|
||||
var prodName=active?active.textContent.trim():'';
|
||||
showContactOverlay(prodName);
|
||||
// Navigate iframe back
|
||||
if(frame.dataset.lastSrc) frame.src=frame.dataset.lastSrc;
|
||||
} else if(loc.indexOf('/products/')>-1){
|
||||
frame.dataset.lastSrc=loc;
|
||||
}
|
||||
}catch(e){}
|
||||
},500);
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body></html>
|
||||
@@ -1,629 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head>
|
||||
<meta name="description" content="Workspace - WEVAL Consulting SaaS Platform. Cloud, AI, Digital Marketing.">
|
||||
<link rel="icon" href="/favicon.ico" type="image/x-icon">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>WEVAL — Workspace</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root{--bg:#ffffff;--sb:#f8fafc;--border:#e2e8f0;--hover:#f1f5f9;--text:#334155;--dim:#94a3b8;--white:#1e293b;--accent:#3b82f6;--green:#22c55e;--orange:#f59e0b;--red:#ef4444;--purple:#8b5cf6;--r:8px}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'DM Sans',system-ui,sans-serif;background:var(--bg);color:var(--text);height:100vh;overflow:hidden;font-size:14px;-webkit-font-smoothing:antialiased}
|
||||
a{color:var(--accent);text-decoration:none}
|
||||
button{font-family:inherit;cursor:pointer;border:none}
|
||||
input{font-family:inherit;background:var(--bg);border:1px solid var(--border);color:var(--white);border-radius:var(--r);padding:10px 14px;font-size:13px;outline:none;width:100%}
|
||||
input:focus{border-color:var(--accent)}
|
||||
|
||||
/* LOGIN */
|
||||
#login{position:fixed;inset:0;background:var(--bg);display:flex;align-items:center;justify-content:center;z-index:100}
|
||||
.login-box{background:#fff;border:1px solid var(--border);border-radius:16px;padding:40px;width:400px;box-shadow:0 4px 24px rgba(0,0,0,.08)}
|
||||
.login-box h1{font-size:20px;font-weight:700;color:var(--white);text-align:center;margin-bottom:20px}
|
||||
.login-box .field{margin-bottom:14px}
|
||||
.login-box label{display:block;font-size:11px;color:var(--dim);margin-bottom:5px;text-transform:uppercase;letter-spacing:.05em}
|
||||
.login-btn{width:100%;padding:11px;background:var(--accent);color:#fff;border-radius:var(--r);font-size:14px;font-weight:600;margin-top:8px}
|
||||
.login-btn:hover{opacity:.9}
|
||||
.login-alt{text-align:center;color:var(--dim);font-size:12px;margin-top:16px;cursor:pointer}
|
||||
.login-alt:hover{color:var(--accent)}
|
||||
.toast{position:fixed;bottom:20px;right:20px;background:var(--sb);color:var(--white);padding:10px 18px;border-radius:var(--r);font-size:13px;border:1px solid var(--border);display:none;z-index:200}
|
||||
|
||||
/* LAYOUT */
|
||||
#app{display:none;height:100vh;width:100vw}
|
||||
.layout{display:flex;height:100%}
|
||||
.sidebar{width:200px;background:var(--sb);border-right:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}
|
||||
.sb-head{padding:14px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}
|
||||
.sb-head b{font-size:15px;font-weight:700;color:var(--white)}
|
||||
.sb-head small{font-size:10px;color:var(--dim);margin-left:auto}
|
||||
.sb-nav{flex:1;overflow-y:auto;padding:6px}
|
||||
.sb-nav::-webkit-scrollbar{width:3px}.sb-nav::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}
|
||||
.sb-group{padding:10px 10px 4px;font-size:10px;font-weight:700;color:var(--dim);text-transform:uppercase;letter-spacing:.06em}
|
||||
.sb-link{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;font-size:13px;color:var(--dim);font-weight:500;transition:all .1s}
|
||||
.sb-link:hover{background:var(--hover);color:var(--text)}
|
||||
.sb-link.on{background:rgba(59,130,246,.1);color:var(--accent)}
|
||||
.sb-link .d{width:5px;height:5px;border-radius:50%;flex-shrink:0}
|
||||
.sb-user{padding:10px 14px;border-top:1px solid var(--border);font-size:12px}
|
||||
.sb-user b{color:var(--white);display:block}
|
||||
.sb-user span{color:var(--dim);font-size:10px}
|
||||
|
||||
/* MAIN */
|
||||
.main{flex:1;display:flex;flex-direction:column;overflow:hidden}
|
||||
.topbar{height:46px;border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 20px;gap:12px;background:var(--sb);flex-shrink:0}
|
||||
.topbar-title{font-size:14px;font-weight:600;color:var(--white);flex:1}
|
||||
.topbar-key{font-family:'JetBrains Mono';font-size:10px;color:var(--dim);background:var(--bg);padding:4px 10px;border-radius:6px;cursor:pointer;border:1px solid var(--border)}
|
||||
.topbar-new{font-size:11px;color:var(--accent);cursor:pointer}
|
||||
|
||||
/* CONTENT */
|
||||
.content{flex:1;position:relative;overflow:hidden}
|
||||
#homeView{padding:28px;overflow-y:auto;height:100%}
|
||||
#frameView{width:100%;height:100%;border:0;display:none}
|
||||
|
||||
/* HOME */
|
||||
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:24px}
|
||||
.stat{background:var(--sb);border:1px solid var(--border);border-radius:var(--r);padding:16px}
|
||||
.stat b{font-family:'JetBrains Mono';font-size:22px;font-weight:700;color:var(--white);display:block}
|
||||
.stat small{font-size:11px;color:var(--dim)}
|
||||
.tools{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:6px}
|
||||
.tool{background:var(--sb);border:1px solid var(--border);border-radius:var(--r);padding:8px;cursor:pointer;transition:all .15s;text-align:center}
|
||||
.tool:hover{border-color:rgba(59,130,246,.3);transform:translateY(-1px)}
|
||||
|
||||
.tool h3{font-size:13px;font-weight:600;color:var(--white);margin-bottom:3px}
|
||||
.tool p{font-size:11px;color:var(--dim);line-height:1.4}
|
||||
.tool-ico{width:48px;height:48px;display:flex;align-items:center;justify-content:center;margin:0 auto 4px}
|
||||
.tool-ico img{max-width:44px;max-height:44px;object-fit:contain}
|
||||
.tool-ico{position:relative}
|
||||
.ia-badge{position:absolute;top:-2px;right:-2px;background:#EF4444;color:#fff;font-size:9px;font-weight:700;padding:1px 4px;border-radius:4px;z-index:1}
|
||||
.tool h3{font-size:.78rem!important;margin:0 0 2px}.tool p{font-size:.65rem!important}
|
||||
|
||||
/* Collapsible sidebar groups */
|
||||
.sb-group{padding:10px 10px 4px;font-size:10px;font-weight:700;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;cursor:pointer;display:flex;align-items:center;justify-content:space-between;user-select:none;border-radius:4px;transition:background .15s}
|
||||
.sb-group:hover{background:var(--hover);color:var(--text)}
|
||||
.sb-group .arrow{font-size:8px;transition:transform .2s}
|
||||
.sb-group.open .arrow{transform:rotate(90deg)}
|
||||
.sb-items{max-height:0;overflow:hidden;transition:max-height .25s ease}
|
||||
.sb-items.open{max-height:600px}
|
||||
|
||||
/* Free/Premium badges */
|
||||
.tool-badge{position:absolute;top:4px;right:4px;font-size:8px;font-weight:700;padding:2px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.03em;z-index:2}
|
||||
.tool-badge.free{background:rgba(34,197,94,.15);color:#22c55e;border:1px solid rgba(34,197,94,.25)}
|
||||
.tool-badge.pro{background:rgba(139,92,246,.15);color:#8b5cf6;border:1px solid rgba(139,92,246,.25)}
|
||||
/* Favorite star */
|
||||
.tool-fav{position:absolute;top:4px;left:4px;font-size:14px;cursor:pointer;opacity:.3;transition:all .15s;z-index:2;background:none;border:none;padding:2px}
|
||||
.tool-fav:hover,.tool-fav.on{opacity:1;transform:scale(1.2)}
|
||||
.tool-fav.on{color:#f59e0b}
|
||||
.tool{position:relative}
|
||||
/* Tooltip */
|
||||
.tool-tip{display:none;position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:#1e293b;color:#e2e8f0;padding:6px 10px;border-radius:6px;font-size:10px;white-space:nowrap;z-index:100;pointer-events:none;box-shadow:0 4px 12px rgba(0,0,0,.3)}
|
||||
.tool:hover .tool-tip{display:block}
|
||||
/* Recent section */
|
||||
.recent-bar{display:flex;gap:6px;margin-bottom:16px;flex-wrap:wrap;align-items:center}
|
||||
.recent-bar .label{font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;font-weight:700;margin-right:4px}
|
||||
.recent-chip{font-size:11px;padding:4px 10px;background:var(--sb);border:1px solid var(--border);border-radius:6px;cursor:pointer;color:var(--text);transition:all .15s}
|
||||
.recent-chip:hover{border-color:var(--accent);color:var(--accent)}
|
||||
/* Ctrl+K hint */
|
||||
.search-hint{font-size:10px;color:var(--dim);position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;background:var(--bg);padding:2px 6px;border-radius:4px;border:1px solid var(--border)}
|
||||
/* Mobile responsive */
|
||||
@media(max-width:768px){
|
||||
.layout{flex-direction:column!important}
|
||||
.sidebar{width:100%!important;height:auto!important;max-height:50vh;border-right:none!important;border-bottom:1px solid var(--border)}
|
||||
.sb-nav{max-height:200px}
|
||||
.tools{grid-template-columns:repeat(auto-fill,minmax(90px,1fr))!important;gap:4px!important}
|
||||
.tool{padding:6px!important}
|
||||
.tool-ico{width:36px!important;height:36px!important}
|
||||
.tool-ico img{max-width:32px!important;max-height:32px!important}
|
||||
.tool h3{font-size:.7rem!important}
|
||||
.tool p{font-size:.55rem!important}
|
||||
.stats{grid-template-columns:repeat(2,1fr)!important}
|
||||
.topbar{padding:0 12px!important}
|
||||
#homeView{padding:16px!important}
|
||||
.recent-bar{display:none!important}
|
||||
}
|
||||
@media(max-width:480px){
|
||||
.tools{grid-template-columns:repeat(3,1fr)!important}
|
||||
.sidebar{max-height:40vh}
|
||||
}
|
||||
|
||||
.in-iframe nav{display:none!important}.in-iframe .hero{padding-top:3rem!important;min-height:auto!important}.in-iframe footer{display:none!important}.in-iframe .cta{display:none!important}.in-iframe .wv-links{display:none!important}</style>
|
||||
<link rel="alternate" hreflang="fr" href="https://weval-consulting.com/products/workspace.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://weval-consulting.com/products/workspace.html">
|
||||
<script>if(window!==window.top)document.documentElement.classList.add("in-iframe")</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- LOGIN -->
|
||||
<div id="login">
|
||||
<div class="login-box">
|
||||
<h1>WEVAL Workspace</h1>
|
||||
<div id="loginForm">
|
||||
<div class="field"><label>Email</label><input type="email" id="lEmail" placeholder="you@company.com"></div>
|
||||
<div class="field"><label>Cle API</label><input id="lKey" placeholder="wv_..."></div>
|
||||
<button class="login-btn" id="loginBtn" onclick="doLogin()">Se connecter</button>
|
||||
<div class="login-alt" onclick="showReg()">Créer un compte</div>
|
||||
</div>
|
||||
<div id="regForm" style="display:none">
|
||||
<div class="field"><label>Nom</label><input id="rName" placeholder="Nom complet"></div>
|
||||
<div class="field"><label>Email</label><input type="email" id="rEmail" placeholder="you@company.com"></div>
|
||||
<div class="field"><label>Entreprise</label><input id="rCompany" placeholder="Entreprise"></div>
|
||||
<button class="login-btn" onclick="doRegister()">Créer un compte gratuit</button>
|
||||
<div class="login-alt" onclick="showLogin()">Déjà un compte</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- APP -->
|
||||
<div id="app">
|
||||
<div class="layout">
|
||||
<div class="sidebar">
|
||||
<div class="sb-head"><b>WEVAL</b><small>workspace</small></div>
|
||||
<div style="padding:6px 8px"><input id="sbSearch" placeholder="Filtrer..." oninput="filterSidebar()" style="width:100%;padding:6px 10px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:11px;outline:none"></div>
|
||||
<div class="sb-nav" id="nav"></div>
|
||||
<div class="sb-user"><b id="uName">—</b><span id="uTier">Free plan</span></div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="topbar">
|
||||
<div class="topbar-title" id="pageTitle">Dashboard</div>
|
||||
<div class="topbar-new" id="newTab" style="display:none" onclick="window.open(currentUrl,'_blank')">↗ Nouvel onglet</div>
|
||||
<div class="topbar-key" id="topKey" onclick="navigator.clipboard.writeText(KEY);toast('Cle API copiee !')"></div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div id="homeView"></div>
|
||||
<iframe id="frameView" sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-top-navigation allow-top-navigation-by-user-activation" referrerpolicy="strict-origin-when-cross-origin"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
var KEY='',U={},currentUrl='',currentPage='home';
|
||||
var AUTH='/api/products/auth.php';
|
||||
var $=function(id){return document.getElementById(id)};
|
||||
var v=function(id){return $(id)?$(id).value.trim():''};
|
||||
|
||||
// MODULES CONFIG — slug: [title, url, color, group]
|
||||
var MODULES = {
|
||||
// Services
|
||||
svc: ['Consulting','/products/services.html','var(--dim)','Services','svc'],
|
||||
cloudcost: ['CloudCost','/products/cloudcost.html','var(--green)','Services'],
|
||||
academy: ['Academy','/products/academy.html','var(--dim)','Services','academy'],
|
||||
mailstream: ['MailStream','/products/mailstream.html','var(--accent)','Services','mailstream'],
|
||||
// IA
|
||||
gpu: ['Wevia Inference','/products/gpu-inference.html','var(--purple)','IA','gpu'],
|
||||
cf: ['Content Factory','/products/content-factory.html','var(--orange)','IA','cf'],
|
||||
pa: ['ProposalAI','/products/proposalai.html','var(--purple)','IA','pa'],
|
||||
bp: ['BlueprintAI','/products/blueprintai.html','var(--purple)','IA','bp'],
|
||||
// Flagships
|
||||
arsenal: ['Wevanalytics','/products/arsenal.html','var(--red)','Flagships','arsenal'],
|
||||
wv: ['Wevads','/products/wevads.html','var(--red)','Flagships','wv'],
|
||||
wevadsia: ['Wevads IA','/products/wevads-ia.html','var(--red)','Flagships','wevadsia'],
|
||||
da: ['DeliverAds','/products/deliverads.html','var(--accent)','Flagships','da'],
|
||||
we: ['Wevia Enterprise','/products/wevia-enterprise.html','var(--purple)','Flagships','we'],
|
||||
// Marketing
|
||||
mw: ['MailWarm','/products/mailwarm.html','var(--orange)','Marketing','mw'],
|
||||
oa: ['OutreachAI','/products/outreachai.html','var(--orange)','Marketing','oa'],
|
||||
aff: ['Partner Program','/products/affiliates.html','var(--purple)','Marketing','aff'],
|
||||
// Commerce
|
||||
sf: ['StoreForge','/products/storeforge.html','var(--orange)','Commerce','sf'],
|
||||
wl: ['Wevia WL','/products/wevia-whitelabel.html','var(--purple)','Commerce','wl'],
|
||||
fb: ['FormBuilder','/products/formbuilder.html','var(--orange)','Commerce','fb'],
|
||||
// Dev
|
||||
df: ['DevForge AI','/products/devforge.html','var(--accent)','Dev','df'],
|
||||
mind: ['Wedroid','/products/wevalmind.html','var(--purple)','Dev','mind'],
|
||||
crf: ['Creative Factory','/products/creativefactory.html','var(--orange)','Dev','crf'],
|
||||
scout: ['Scout Intelligence','/products/scoutai.html','var(--accent)','Dev','scout'],
|
||||
yt: ['YouTube Factory','/products/youtubefactory.html','var(--red)','Dev','yt'],
|
||||
// Scanners
|
||||
ds: ['DeliverScore','/products/deliverscore.html','var(--green)','Scanners','ds'],
|
||||
sentinel: ['Sentinel','/products/sentinel.html','var(--accent)','Scanners','sentinel'],
|
||||
// Data
|
||||
mr: ['MedReach','/products/medreach.html','var(--green)','Data','mr'],
|
||||
lf: ['LeadForge','/products/leadforge.html','var(--orange)','Data','lf'],
|
||||
// IA Apps
|
||||
ppt: ['PresentationAI','/products/presentationai.html','var(--purple)','IA Apps','ppt'],
|
||||
translate: ['TranslateAI','/products/translateai.html','var(--green)','IA Apps','translate'],
|
||||
bizplan: ['Business Plan','/products/bizplan.html','var(--orange)','IA Apps','bizplan'],
|
||||
contracts: ['ContractAI','/products/contractai.html','var(--purple)','IA Apps','contracts'],
|
||||
meeting: ['Meeting Summary','/products/meetingai.html','var(--red)','IA Apps','meeting'],
|
||||
esign: ['eSignature','/products/esignature.html','var(--orange)','IA Apps','esign'],
|
||||
leansixsigma: ['Lean Six Sigma','/products/leansixsigma.html','var(--green)','IA Apps','leansixsigma'],
|
||||
audit: ['Audit & Compliance','/products/auditai.html','var(--red)','IA Apps','audit'],
|
||||
// Email+
|
||||
et: ['MedReach HCP','/products/medreachhcp.html','var(--green)','Email+','et'],
|
||||
mailforge: ['MailForge','/products/mailforge.html','var(--orange)','Email+','mailforge'],
|
||||
cloudbridge: ['CloudBridge','/products/cloud-providers.html','var(--accent)','Email+','cloudbridge'],
|
||||
emailverify: ['EmailVerify','/products/emailverify.html','var(--green)','Email+'],
|
||||
inboxtest: ['InboxTest','/products/inboxtest.html','var(--accent)','Email+'],
|
||||
ispmonitor: ['Network Monitor','/products/ispmonitor.html','var(--purple)','Email+'],
|
||||
newsletter: ['NewsletterInsight','/products/newsletterinsight.html','var(--orange)','Email+'],
|
||||
// Additional Products
|
||||
adscontrol: ['AdsControl','/products/adscontrol.html','var(--red)','Marketing','adscontrol'],
|
||||
networkguard: ['NetworkGuard','/products/networkguard.html','var(--red)','Email+','networkguard'],
|
||||
canvasai: ['CanvasAI','/products/canvasai.html','var(--purple)','IA','canvasai'],
|
||||
copyai: ['CopyAI','/products/copyai.html','var(--purple)','IA','copyai'],
|
||||
dashboardai: ['DashboardAI','/products/dashboardai.html','var(--accent)','IA Apps','dashboardai'],
|
||||
dataharvest: ['DataInsight','/products/dataharvest.html','var(--green)','Data','dataharvest'],
|
||||
reputationai: ['ReputationAI','/products/reputationai.html','var(--orange)','Marketing','reputationai'],
|
||||
smsforge: ['SMSForge','/products/smsforge.html','var(--orange)','Marketing','smsforge'],
|
||||
storeai: ['StoreAI','/products/storeai.html','var(--orange)','Commerce','storeai'],
|
||||
wevalcrm: ['Weval CRM','/products/wevalcrm.html','var(--accent)','Services','wevalcrm'],
|
||||
emailplatform: ['Digital Platform','/products/email-platform.html','var(--red)','Flagships','emailplatform'],
|
||||
medreachapi: ['MedReach API','/products/medreach-api.html','var(--green)','Data','medreachapi'],
|
||||
weviaagency: ['WEVIA Agency','/products/wevia-agency.html','var(--purple)','Services','weviaagency'],
|
||||
healthcarecrm: ['Healthcare CRM','/products/healthcare-crm.html','var(--green)','Data','healthcarecrm'],
|
||||
iaarabe: ['IA Arabe FR','/products/ia-arabe.html','var(--purple)','IA','iaarabe'],
|
||||
aisdr: ['AI SDR Agent','/products/ai-sdr.html','var(--orange)','Marketing','aisdr'],
|
||||
emailwl: ['Email WL','/products/email-whitelabel.html','var(--red)','Email+','emailwl'],
|
||||
consultingpkg: ['Consulting Pro','/products/consulting.html','var(--accent)','Services','consultingpkg'],
|
||||
};
|
||||
|
||||
|
||||
var TIERS={
|
||||
svc:'free',academy:'free',mailstream:'free',gpu:'pro',cf:'pro',pa:'free',bp:'free',
|
||||
arsenal:'pro',wv:'pro',wevadsia:'pro',da:'pro',we:'pro',
|
||||
ds:'free',sentinel:'free',mr:'free',lf:'pro',
|
||||
mw:'free',oa:'pro',aff:'free',sf:'pro',wl:'pro',fb:'free',
|
||||
df:'free',mind:'free',crf:'free',scout:'free',yt:'free',
|
||||
ppt:'free',translate:'free',bizplan:'free',contracts:'free',meeting:'free',
|
||||
esign:'free',leansixsigma:'free',audit:'free',et:'pro',
|
||||
mailforge:'pro',cloudbridge:'pro',emailverify:'free',inboxtest:'free',
|
||||
ispmonitor:'free',newsletter:'free',cloudcost:'free',
|
||||
adscontrol:'pro',networkguard:'free',canvasai:'free',copyai:'free',
|
||||
dashboardai:'free',dataharvest:'pro',reputationai:'free',
|
||||
smsforge:'pro',storeai:'free',wevalcrm:'free',
|
||||
emailplatform:'pro',medreachapi:'pro',weviaagency:'pro',healthcarecrm:'free',iaarabe:'pro',aisdr:'pro',emailwl:'pro',consultingpkg:'free'
|
||||
};
|
||||
|
||||
function toast(m){var t=$('toast');t.textContent=m;t.style.display='block';setTimeout(function(){t.style.display='none'},3000)}
|
||||
function showReg(){$('loginForm').style.display='none';$('regForm').style.display=''}
|
||||
function showLogin(){$('regForm').style.display='none';$('loginForm').style.display=''}
|
||||
|
||||
// BUILD SIDEBAR
|
||||
function buildSidebar(){
|
||||
var nav=$('nav');
|
||||
var groups={};var gOrder=[];
|
||||
for(var k in MODULES){
|
||||
var g=MODULES[k][3];
|
||||
if(!groups[g]){groups[g]=[];gOrder.push(g)}
|
||||
groups[g].push(k);
|
||||
}
|
||||
var html='<div class="sb-link on" onclick="go(\'home\')"><div class="d" style="background:var(--accent)"></div>Dashboard</div>';
|
||||
for(var gi=0;gi<gOrder.length;gi++){
|
||||
var g=gOrder[gi];
|
||||
html+='<div class="sb-group open" onclick="toggleGroup(this)"><span>'+g+'</span><span class="arrow">▶</span></div>';
|
||||
html+='<div class="sb-items open">';
|
||||
for(var i=0;i<groups[g].length;i++){
|
||||
var k=groups[g][i];
|
||||
var m=MODULES[k];
|
||||
html+='<div class="sb-link" data-id="'+k+'" onclick="go(\''+k+'\')"><div class="d" style="background:'+m[2]+'"></div>'+m[0]+'</div>';
|
||||
}
|
||||
html+='</div>';
|
||||
}
|
||||
nav.innerHTML=html;
|
||||
}
|
||||
function toggleGroup(el){
|
||||
el.classList.toggle('open');
|
||||
var items=el.nextElementSibling;
|
||||
if(items)items.classList.toggle('open');
|
||||
}
|
||||
|
||||
// NAVIGATE
|
||||
function go(page){
|
||||
if(!KEY&&page!=='home'){toast('Connectez-vous');return}
|
||||
currentPage=page;
|
||||
|
||||
// Sidebar active
|
||||
document.querySelectorAll('.sb-link').forEach(function(l){l.classList.remove('on')});
|
||||
var active=document.querySelector('.sb-link[data-id="'+page+'"]');
|
||||
if(active)active.classList.add('on');
|
||||
if(page==='home')document.querySelector('.sb-link[onclick*="home"]').classList.add('on');
|
||||
|
||||
if(page==='home'){
|
||||
$('homeView').style.display='';trackRecent(id);
|
||||
$('frameView').style.display='none';
|
||||
$('pageTitle').textContent='Dashboard';
|
||||
$('newTab').style.display='none';
|
||||
return;
|
||||
}
|
||||
|
||||
var mod=MODULES[page];
|
||||
if(!mod){toast('Module inconnu');return}
|
||||
|
||||
$('pageTitle').textContent=mod[0];
|
||||
$('homeView').style.display='none';
|
||||
$('frameView').style.display='block';
|
||||
$('newTab').style.display='';
|
||||
currentUrl=mod[1];
|
||||
|
||||
// SET IFRAME SRC — simple, direct, no conditions
|
||||
$('frameView').src=mod[1]+(mod[1].includes('?')?'&':'?')+'_t='+Date.now();
|
||||
}
|
||||
|
||||
// HOME DASHBOARD
|
||||
function renderHome(){
|
||||
$('homeView').innerHTML=
|
||||
'<div class="stats">'+
|
||||
'<div class="stat"><b>62</b><small>Produits</small></div>'+
|
||||
'<div class="stat"><b>62</b><small>Modules</small></div>'+
|
||||
'<div class="stat"><b style="color:var(--green)">Live</b><small>API Status</small></div>'+
|
||||
'<div class="stat"><b id="hTier">Free</b><small>Plan</small></div>'+
|
||||
'</div>'+
|
||||
'<div style="margin-bottom:16px;display:flex;gap:10px;align-items:center">'+
|
||||
'<div style="flex:1;position:relative"><input type="text" id="toolSearch" placeholder="Rechercher un produit..." oninput="filterTools()" style="width:100%;padding:10px 16px;background:var(--sb);border:1px solid var(--border);border-radius:8px;color:var(--white);font-size:13px;outline:none"><span class="search-hint">Ctrl+K</span></div>'+
|
||||
'<span style="font-size:11px;color:var(--dim)" id="toolCount">62 produits</span>'+
|
||||
'</div>'+
|
||||
'<div class="tools" id="toolGrid"></div>';
|
||||
|
||||
var ICONS={
|
||||
'arsenal':'/assets/logo-wevanalytics.svg',
|
||||
'wv':'/assets/logo-wevads-Crayl4yz.png',
|
||||
'wevadsia':'/assets/logo-wevads-Crayl4yz.png',
|
||||
'da':'/assets/logo-deliverads.svg',
|
||||
'we':'/assets/logo-wevia-official.svg',
|
||||
'ds':'/assets/logo-deliverscore.svg',
|
||||
'sentinel':'/assets/logo-sentinel.svg',
|
||||
'mr':'/assets/logo-medreach.svg',
|
||||
'lf':'/assets/logo-leadforge.svg',
|
||||
'gpu':'/assets/logo-wevia-official.svg',
|
||||
'cf':'/assets/logo-content-factory.svg',
|
||||
'pa':'/assets/logo-proposalai.svg',
|
||||
'bp':'/assets/logo-blueprintai.svg',
|
||||
'mw':'/assets/logo-mailwarm.svg',
|
||||
'oa':'/assets/logo-outreachai.svg',
|
||||
'aff':'/assets/logo-affiliates.svg',
|
||||
'sf':'/assets/logo-storeforge.svg',
|
||||
'wl':'/assets/logo-wevia-official.svg',
|
||||
'fb':'/assets/logo-formbuilder.svg',
|
||||
'df':'/assets/logo-devforge.svg',
|
||||
'mind':'/assets/logo-weval-mind.svg',
|
||||
'crf':'/assets/logo-creative-factory.svg',
|
||||
'scout':'/assets/logo-scout.svg',
|
||||
'yt':'/assets/logo-youtube-factory.svg',
|
||||
'ppt':'/assets/logo-presentationai.svg',
|
||||
'translate':'/assets/logo-translateai.svg',
|
||||
'bizplan':'/assets/logo-bizplan.svg',
|
||||
'contracts':'/assets/logo-contractai.svg',
|
||||
'meeting':'/assets/logo-meeting-summary.svg',
|
||||
'esign':'/assets/logo-esignature.svg',
|
||||
'leansixsigma':'/assets/logo-leansixsigma.svg',
|
||||
'audit':'/assets/logo-auditcompliance.svg',
|
||||
'et':'/assets/logo-ethica.svg',
|
||||
'mailforge':'/assets/logo-mailforge.svg',
|
||||
'cloudbridge':'/assets/logo-cloudbridge.svg',
|
||||
'svc':'/assets/logo-consulting.svg',
|
||||
'academy':'/assets/logo-academy.svg',
|
||||
'canvas':'/assets/logo-canvasai.svg',
|
||||
'dash':'/assets/logo-dashboardai.svg',
|
||||
'emailverify':'/assets/logo-emailverify.svg',
|
||||
'inboxtest':'/assets/logo-inboxtest.svg',
|
||||
'ispmonitor':'/assets/logo-ispmonitor.svg',
|
||||
'newsletter':'/assets/logo-newsletter.svg',
|
||||
'cloudcost':'/assets/logo-cloudcost.svg',
|
||||
'mailstream':'/assets/logo-mailstream.svg',
|
||||
'adscontrol':'/assets/logo-adscontrol.svg',
|
||||
'networkguard':'/assets/logo-networkguard.svg',
|
||||
'canvasai':'/assets/logo-canvasai.svg',
|
||||
'copyai':'/assets/logo-copyai.svg',
|
||||
'dashboardai':'/assets/logo-dashboardai.svg',
|
||||
'dataharvest':'/assets/logo-dataharvest.svg',
|
||||
'reputationai':'/assets/logo-reputationai.svg',
|
||||
'smsforge':'/assets/logo-smsforge.svg',
|
||||
'storeai':'/assets/logo-storeforge.svg',
|
||||
'wevalcrm':'/assets/logo-weval-crm.svg',
|
||||
'emailplatform':'/assets/logo-deliverads.svg',
|
||||
'medreachapi':'/assets/logo-medreach.svg',
|
||||
'weviaagency':'/assets/logo-wevia-official.svg',
|
||||
'healthcarecrm':'/assets/logo-medreach.svg',
|
||||
'iaarabe':'/assets/logo-wevia-official.svg',
|
||||
'aisdr':'/assets/logo-outreachai.svg',
|
||||
'emailwl':'/assets/logo-mailforge.svg',
|
||||
'consultingpkg':'/assets/logo-consulting.svg',
|
||||
};
|
||||
// Recent products
|
||||
var recents=JSON.parse(localStorage.getItem('wv_recent')||'[]');
|
||||
var favs=JSON.parse(localStorage.getItem('wv_favs')||'[]');
|
||||
var recentHtml='';
|
||||
if(recents.length>0||favs.length>0){
|
||||
recentHtml='<div class="recent-bar">';
|
||||
if(favs.length>0){
|
||||
recentHtml+='<span class="label">★ Favoris</span>';
|
||||
favs.slice(0,6).forEach(function(k){if(MODULES[k])recentHtml+='<span class="recent-chip" onclick="go(\''+k+'\')">'+MODULES[k][0]+'</span>'});
|
||||
}
|
||||
if(recents.length>0){
|
||||
recentHtml+='<span class="label" style="margin-left:8px">Récents</span>';
|
||||
recents.slice(0,5).forEach(function(k){if(MODULES[k])recentHtml+='<span class="recent-chip" onclick="go(\''+k+'\')">'+MODULES[k][0]+'</span>'});
|
||||
}
|
||||
recentHtml+='</div>';
|
||||
}
|
||||
// Product grid with badges + favs + tooltips
|
||||
var html='';
|
||||
for(var k in MODULES){
|
||||
var m=MODULES[k];
|
||||
var tier=TIERS[k]||'free';
|
||||
var isFav=favs.indexOf(k)>-1;
|
||||
var desc={'Services':'Consulting & accompagnement','IA':'Intelligence artificielle','Flagships':'Produits phares','Marketing':'Marketing digital','Commerce':'E-commerce','Dev':'Développement','Scanners':'Analyse & scan','Data':'Données','IA Apps':'Applications IA','Email+':'Email avancé'};
|
||||
html+='<div class="tool" onclick="go(\''+k+'\')">';
|
||||
html+='<span class="tool-badge '+(tier==='pro'?'pro':'free')+'">'+tier+'</span>';
|
||||
html+='<button class="tool-fav '+(isFav?'on':'')+'" onclick="event.stopPropagation();toggleFav(\''+k+'\')">'+(isFav?'★':'☆')+'</button>';
|
||||
html+='<div class="tool-tip">'+m[0]+' — '+(desc[m[3]]||m[3])+'</div>';
|
||||
html+='<div class="tool-ico">'+(k==='wevadsia'?'<span class="ia-badge">IA</span>':'')+'<img src="'+(ICONS[k]||'/assets/logo-weval-ia.svg')+'" alt=""></div>';
|
||||
html+='<h3>'+m[0]+'</h3><p>'+m[3]+'</p></div>';
|
||||
}
|
||||
$('toolGrid').innerHTML=recentHtml+html;
|
||||
}
|
||||
|
||||
// AUTH
|
||||
async function doLogin(){
|
||||
var btn=document.getElementById('loginBtn');if(btn){btn.textContent='Connexion...';btn.disabled=true}
|
||||
var e=v('lEmail'),k=v('lKey');
|
||||
if(!e&&!k){toast('Email ou cle requis');return}
|
||||
try{
|
||||
var r;
|
||||
if(k){r=await(await fetch(AUTH+'?action=dashboard&key='+k)).json();if(r.error){toast(r.error);return}if(!r.api_key){toast('Cle invalide');return}KEY=r.api_key;U=r.user||{};enter()}
|
||||
else{r=await(await fetch(AUTH,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:'User',email:e,company:'N/A',product:'all'})})).json();if(r.error){toast(r.error);return}KEY=r.api_key;U={name:'User',email:e,tier:r.tier||'free'};enter()}
|
||||
}catch(ex){toast('Erreur: '+ex.message)}
|
||||
finally{var btn=document.getElementById('loginBtn');if(btn){btn.textContent='Se connecter';btn.disabled=false}}
|
||||
}
|
||||
async function doRegister(){
|
||||
var n=v('rName'),e=v('rEmail'),c=v('rCompany');
|
||||
if(!n||!e||!c){toast('Tous les champs requis');return}
|
||||
try{
|
||||
var r=await(await fetch(AUTH,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:n,email:e,company:c,product:'all'})})).json();
|
||||
if(r.error){toast(r.error);return}KEY=r.api_key;U={name:n,email:e,tier:r.tier||'free'};enter()
|
||||
}catch(ex){toast('Erreur: '+ex.message)}
|
||||
}
|
||||
function enter(){
|
||||
try{localStorage.setItem('wk',KEY);localStorage.setItem('wu',JSON.stringify(U))}catch(e){}
|
||||
$('login').style.display='none';
|
||||
$('app').style.display='block';
|
||||
$('uName').textContent=U.name||U.email||'User';
|
||||
$('uTier').textContent=(U.tier||'free')+' plan';
|
||||
$('topKey').textContent=(KEY||'').substring(0,16)+'...';
|
||||
if($('hTier'))$('hTier').textContent=U.tier||'Free';
|
||||
buildSidebar();
|
||||
renderHome();
|
||||
// Welcome toast on first visit
|
||||
if(!localStorage.getItem('wv_welcomed')){
|
||||
toast('Bienvenue ! Explorez nos 62 produits SaaS.');
|
||||
localStorage.setItem('wv_welcomed','1');
|
||||
}
|
||||
}
|
||||
|
||||
// Search/filter products
|
||||
function filterTools(){
|
||||
var q=(document.getElementById('toolSearch')||{}).value||'';
|
||||
q=q.toLowerCase();
|
||||
var cards=document.querySelectorAll('.tool');
|
||||
var visible=0;
|
||||
cards.forEach(function(card){
|
||||
var text=(card.textContent||'').toLowerCase();
|
||||
if(!q||text.indexOf(q)>-1){card.style.display='';visible++}
|
||||
else{card.style.display='none'}
|
||||
});
|
||||
var counter=document.getElementById('toolCount');
|
||||
if(counter)counter.textContent=visible+' produit'+(visible>1?'s':'');
|
||||
}
|
||||
|
||||
// ENTER ON LOGIN
|
||||
document.addEventListener('keypress',function(e){if(e.key==='Enter'&&$('login').style.display!=='none'){if($('loginForm').style.display!=='none')doLogin();else doRegister()}});
|
||||
|
||||
// AUTO RESTORE
|
||||
try{var sk=localStorage.getItem('wk'),su=localStorage.getItem('wu');if(sk&&su){KEY=sk;U=JSON.parse(su);enter()}}catch(e){}
|
||||
|
||||
// Sidebar filter
|
||||
function filterSidebar(){
|
||||
var q=(document.getElementById('sbSearch')||{}).value.toLowerCase();
|
||||
document.querySelectorAll('.sb-link').forEach(function(el){
|
||||
if(el.dataset.id==='home'||!el.dataset.id)return;
|
||||
var text=(el.textContent||'').toLowerCase();
|
||||
el.style.display=(!q||text.indexOf(q)>-1)?'':'none';
|
||||
});
|
||||
// Show parent groups that have visible children
|
||||
document.querySelectorAll('.sb-group').forEach(function(g){
|
||||
var items=g.nextElementSibling;
|
||||
if(items&&items.classList.contains('sb-items')){
|
||||
var hasVisible=false;
|
||||
items.querySelectorAll('.sb-link').forEach(function(l){if(l.style.display!=='none')hasVisible=true});
|
||||
g.style.display=(!q||hasVisible)?'':'none';
|
||||
items.style.display=(!q||hasVisible)?'':'none';
|
||||
if(q&&hasVisible){items.classList.add('open');g.classList.add('open')}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Toggle favorite
|
||||
function toggleFav(k){
|
||||
var favs=JSON.parse(localStorage.getItem('wv_favs')||'[]');
|
||||
var idx=favs.indexOf(k);
|
||||
if(idx>-1)favs.splice(idx,1);else favs.unshift(k);
|
||||
localStorage.setItem('wv_favs',JSON.stringify(favs.slice(0,10)));
|
||||
renderHome();
|
||||
}
|
||||
// Track recent
|
||||
function trackRecent(k){
|
||||
if(k==='home')return;
|
||||
var r=JSON.parse(localStorage.getItem('wv_recent')||'[]');
|
||||
r=r.filter(function(x){return x!==k});
|
||||
r.unshift(k);
|
||||
localStorage.setItem('wv_recent',JSON.stringify(r.slice(0,8)));
|
||||
}
|
||||
// Ctrl+K shortcut
|
||||
document.addEventListener('keydown',function(e){
|
||||
if((e.ctrlKey||e.metaKey)&&e.key==='k'){
|
||||
e.preventDefault();
|
||||
if(currentPage!=='home')go('home');
|
||||
setTimeout(function(){var s=$('toolSearch');if(s){s.focus();s.select()}},100);
|
||||
}
|
||||
if(e.key==='Escape'){var s=$('toolSearch');if(s&&document.activeElement===s){s.value='';filterTools();s.blur()}}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<!-- Contact Overlay (intercepts /contact-us/ in iframe) -->
|
||||
<div id="contactOverlay" style="display:none;position:fixed;top:0;left:var(--sidebar-w,140px);right:0;bottom:0;z-index:500;background:rgba(5,8,18,0.97);overflow-y:auto;padding:3rem 4%">
|
||||
<div style="max-width:520px;margin:0 auto">
|
||||
<button onclick="closeContactOverlay()" style="float:right;background:none;border:none;color:#64748b;font-size:1.4rem;cursor:pointer;padding:8px">✕</button>
|
||||
<div style="display:inline-block;background:rgba(99,102,241,.1);color:#6366f1;padding:6px 18px;border-radius:20px;font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-bottom:1rem">Contact</div>
|
||||
<h2 style="font-size:1.8rem;font-weight:800;color:#f1f5f9;margin-bottom:.5rem" id="overlayTitle">Parlons de votre projet</h2>
|
||||
<p style="color:#94a3b8;font-size:.9rem;margin-bottom:2rem;line-height:1.6">Remplissez le formulaire ci-dessous. Notre équipe vous recontacte sous 24h.</p>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Nom complet</label><input id="ovName" type="text" placeholder="Votre nom" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Email professionnel</label><input id="ovEmail" type="email" placeholder="vous@entreprise.com" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Entreprise</label><input id="ovCompany" type="text" placeholder="Nom de votre entreprise" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Produit</label><input id="ovProduct" type="text" readonly style="width:100%;background:rgba(99,102,241,.06);border:1px solid rgba(99,102,241,.15);color:#818cf8;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none;font-weight:600"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Message</label><textarea id="ovMsg" placeholder="Décrivez votre besoin..." style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none;resize:vertical;min-height:80px"></textarea></div>
|
||||
<button id="ovSendBtn" onclick="sendOverlayForm()" style="display:block;width:100%;background:#6366f1;color:#fff;padding:14px;border:none;border-radius:12px;font-weight:700;font-size:.95rem;cursor:pointer;font-family:inherit;margin-top:1.5rem">Envoyer →</button>
|
||||
<div id="ovSuccess" style="display:none;background:rgba(0,200,150,.08);border:1px solid rgba(0,200,150,.2);border-radius:12px;padding:1.5rem;text-align:center;margin-top:1rem"><h3 style="color:#00c9a7;font-size:1.2rem;margin-bottom:.5rem">Message envoyé ✓</h3><p style="font-size:.85rem;color:#94a3b8">Notre équipe vous recontactera sous 24h.</p><button onclick="closeContactOverlay()" style="margin-top:1rem;background:none;border:1px solid rgba(255,255,255,.1);color:#94a3b8;padding:8px 20px;border-radius:8px;cursor:pointer;font-family:inherit">← Retour au produit</button></div>
|
||||
</div></div>
|
||||
<script>
|
||||
var _currentProduct='';
|
||||
function showContactOverlay(product){
|
||||
_currentProduct=product||'';
|
||||
document.getElementById('ovProduct').value=_currentProduct;
|
||||
document.getElementById('ovSuccess').style.display='none';
|
||||
document.getElementById('ovSendBtn').style.display='block';
|
||||
document.getElementById('ovName').value='';document.getElementById('ovEmail').value='';document.getElementById('ovCompany').value='';document.getElementById('ovMsg').value='';
|
||||
document.getElementById('contactOverlay').style.display='block';
|
||||
}
|
||||
function closeContactOverlay(){
|
||||
document.getElementById('contactOverlay').style.display='none';
|
||||
// Restore iframe to last product
|
||||
var f=document.getElementById('frameView');
|
||||
if(f&&f.dataset.lastSrc&&f.src.indexOf('contact-us')>-1) f.src=f.dataset.lastSrc;
|
||||
}
|
||||
function sendOverlayForm(){
|
||||
var n=document.getElementById('ovName').value.trim(),e=document.getElementById('ovEmail').value.trim();
|
||||
if(!n||!e){alert('Veuillez remplir nom et email.');return;}
|
||||
var btn=document.getElementById('ovSendBtn');btn.disabled=true;btn.textContent='Envoi...';
|
||||
fetch('/api/contact',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:n,email:e,company:document.getElementById('ovCompany').value.trim(),subject:'demo',message:'[Produit: '+_currentProduct+'] '+document.getElementById('ovMsg').value.trim(),source:'workspace-overlay',ts:new Date().toISOString()})}).then(function(){
|
||||
document.getElementById('ovSendBtn').style.display='none';
|
||||
document.getElementById('ovSuccess').style.display='block';
|
||||
}).catch(function(){
|
||||
document.getElementById('ovSendBtn').style.display='none';
|
||||
document.getElementById('ovSuccess').style.display='block';
|
||||
});
|
||||
}
|
||||
// Intercept iframe navigation to /contact-us/
|
||||
(function(){
|
||||
var frame=document.getElementById('frameView');
|
||||
if(!frame)return;
|
||||
// Save last product URL before navigation
|
||||
var origSrc=Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype,'src');
|
||||
// Poll approach: watch iframe URL changes
|
||||
setInterval(function(){
|
||||
try{
|
||||
var loc=frame.contentWindow.location.href;
|
||||
if(loc.indexOf('/contact-us')>-1){
|
||||
// Find current product name from sidebar
|
||||
var active=document.querySelector('.s-item.act');
|
||||
var prodName=active?active.textContent.trim():'';
|
||||
showContactOverlay(prodName);
|
||||
// Navigate iframe back
|
||||
if(frame.dataset.lastSrc) frame.src=frame.dataset.lastSrc;
|
||||
} else if(loc.indexOf('/products/')>-1){
|
||||
frame.dataset.lastSrc=loc;
|
||||
}
|
||||
}catch(e){}
|
||||
},500);
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body></html>
|
||||
@@ -1,649 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head>
|
||||
<meta name="description" content="Workspace - WEVAL Consulting SaaS Platform. Cloud, AI, Digital Marketing.">
|
||||
<link rel="icon" href="/favicon.ico" type="image/x-icon">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>WEVAL — Workspace</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root{--bg:#ffffff;--sb:#f8fafc;--border:#e2e8f0;--hover:#f1f5f9;--text:#334155;--dim:#94a3b8;--white:#1e293b;--accent:#3b82f6;--green:#22c55e;--orange:#f59e0b;--red:#ef4444;--purple:#8b5cf6;--r:8px}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'DM Sans',system-ui,sans-serif;background:var(--bg);color:var(--text);height:100vh;overflow:hidden;font-size:14px;-webkit-font-smoothing:antialiased}
|
||||
a{color:var(--accent);text-decoration:none}
|
||||
button{font-family:inherit;cursor:pointer;border:none}
|
||||
input{font-family:inherit;background:var(--bg);border:1px solid var(--border);color:var(--white);border-radius:var(--r);padding:10px 14px;font-size:13px;outline:none;width:100%}
|
||||
input:focus{border-color:var(--accent)}
|
||||
|
||||
/* LOGIN */
|
||||
#login{position:fixed;inset:0;background:var(--bg);display:flex;align-items:center;justify-content:center;z-index:100}
|
||||
.login-box{background:#fff;border:1px solid var(--border);border-radius:16px;padding:40px;width:400px;box-shadow:0 4px 24px rgba(0,0,0,.08)}
|
||||
.login-box h1{font-size:20px;font-weight:700;color:var(--white);text-align:center;margin-bottom:20px}
|
||||
.login-box .field{margin-bottom:14px}
|
||||
.login-box label{display:block;font-size:11px;color:var(--dim);margin-bottom:5px;text-transform:uppercase;letter-spacing:.05em}
|
||||
.login-btn{width:100%;padding:11px;background:var(--accent);color:#fff;border-radius:var(--r);font-size:14px;font-weight:600;margin-top:8px}
|
||||
.login-btn:hover{opacity:.9}
|
||||
.login-alt{text-align:center;color:var(--dim);font-size:12px;margin-top:16px;cursor:pointer}
|
||||
.login-alt:hover{color:var(--accent)}
|
||||
.toast{position:fixed;bottom:20px;right:20px;background:var(--sb);color:var(--white);padding:10px 18px;border-radius:var(--r);font-size:13px;border:1px solid var(--border);display:none;z-index:200}
|
||||
|
||||
/* LAYOUT */
|
||||
#app{display:none;height:100vh;width:100vw}
|
||||
.layout{display:flex;height:100%}
|
||||
.sidebar{width:200px;background:var(--sb);border-right:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}
|
||||
.sb-head{padding:14px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}
|
||||
.sb-head b{font-size:15px;font-weight:700;color:var(--white)}
|
||||
.sb-head small{font-size:10px;color:var(--dim);margin-left:auto}
|
||||
.sb-nav{flex:1;overflow-y:auto;padding:6px}
|
||||
.sb-nav::-webkit-scrollbar{width:3px}.sb-nav::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}
|
||||
.sb-group{padding:10px 10px 4px;font-size:10px;font-weight:700;color:var(--dim);text-transform:uppercase;letter-spacing:.06em}
|
||||
.sb-link{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;font-size:13px;color:var(--dim);font-weight:500;transition:all .1s}
|
||||
.sb-link:hover{background:var(--hover);color:var(--text)}
|
||||
.sb-link.on{background:rgba(59,130,246,.1);color:var(--accent)}
|
||||
.sb-link .d{width:5px;height:5px;border-radius:50%;flex-shrink:0}
|
||||
.sb-user{padding:10px 14px;border-top:1px solid var(--border);font-size:12px}
|
||||
.sb-user b{color:var(--white);display:block}
|
||||
.sb-user span{color:var(--dim);font-size:10px}
|
||||
|
||||
/* MAIN */
|
||||
.main{flex:1;display:flex;flex-direction:column;overflow:hidden}
|
||||
.topbar{height:46px;border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 20px;gap:12px;background:var(--sb);flex-shrink:0}
|
||||
.topbar-title{font-size:14px;font-weight:600;color:var(--white);flex:1}
|
||||
.topbar-key{font-family:'JetBrains Mono';font-size:10px;color:var(--dim);background:var(--bg);padding:4px 10px;border-radius:6px;cursor:pointer;border:1px solid var(--border)}
|
||||
.topbar-new{font-size:11px;color:var(--accent);cursor:pointer}
|
||||
|
||||
/* CONTENT */
|
||||
.content{flex:1;position:relative;overflow:hidden}
|
||||
#homeView{padding:28px;overflow-y:auto;height:100%}
|
||||
#frameView{width:100%;height:100%;border:0;display:none}
|
||||
|
||||
/* HOME */
|
||||
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:24px}
|
||||
.stat{background:var(--sb);border:1px solid var(--border);border-radius:var(--r);padding:16px}
|
||||
.stat b{font-family:'JetBrains Mono';font-size:22px;font-weight:700;color:var(--white);display:block}
|
||||
.stat small{font-size:11px;color:var(--dim)}
|
||||
.tools{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:6px}
|
||||
.tool{background:var(--sb);border:1px solid var(--border);border-radius:var(--r);padding:8px;cursor:pointer;transition:all .15s;text-align:center}
|
||||
.tool:hover{border-color:rgba(59,130,246,.3);transform:translateY(-1px)}
|
||||
|
||||
.tool h3{font-size:13px;font-weight:600;color:var(--white);margin-bottom:3px}
|
||||
.tool p{font-size:11px;color:var(--dim);line-height:1.4}
|
||||
.tool-ico{width:48px;height:48px;display:flex;align-items:center;justify-content:center;margin:0 auto 4px}
|
||||
.tool-ico img{max-width:44px;max-height:44px;object-fit:contain}
|
||||
.tool-ico{position:relative}
|
||||
.ia-badge{position:absolute;top:-2px;right:-2px;background:#EF4444;color:#fff;font-size:9px;font-weight:700;padding:1px 4px;border-radius:4px;z-index:1}
|
||||
.tool h3{font-size:.78rem!important;margin:0 0 2px}.tool p{font-size:.65rem!important}
|
||||
|
||||
/* Collapsible sidebar groups */
|
||||
.sb-group{padding:10px 10px 4px;font-size:10px;font-weight:700;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;cursor:pointer;display:flex;align-items:center;justify-content:space-between;user-select:none;border-radius:4px;transition:background .15s}
|
||||
.sb-group:hover{background:var(--hover);color:var(--text)}
|
||||
.sb-group .arrow{font-size:8px;transition:transform .2s}
|
||||
.sb-group.open .arrow{transform:rotate(90deg)}
|
||||
.sb-items{max-height:0;overflow:hidden;transition:max-height .25s ease}
|
||||
.sb-items.open{max-height:600px}
|
||||
|
||||
/* Free/Premium badges */
|
||||
.tool-badge{position:absolute;top:4px;right:4px;font-size:8px;font-weight:700;padding:2px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.03em;z-index:2}
|
||||
.tool-badge.free{background:rgba(34,197,94,.15);color:#22c55e;border:1px solid rgba(34,197,94,.25)}
|
||||
.tool-badge.pro{background:rgba(139,92,246,.15);color:#8b5cf6;border:1px solid rgba(139,92,246,.25)}
|
||||
/* Favorite star */
|
||||
.tool-fav{position:absolute;top:4px;left:4px;font-size:14px;cursor:pointer;opacity:.3;transition:all .15s;z-index:2;background:none;border:none;padding:2px}
|
||||
.tool-fav:hover,.tool-fav.on{opacity:1;transform:scale(1.2)}
|
||||
.tool-fav.on{color:#f59e0b}
|
||||
.tool{position:relative}
|
||||
/* Tooltip */
|
||||
.tool-tip{display:none;position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:#1e293b;color:#e2e8f0;padding:6px 10px;border-radius:6px;font-size:10px;white-space:nowrap;z-index:100;pointer-events:none;box-shadow:0 4px 12px rgba(0,0,0,.3)}
|
||||
.tool:hover .tool-tip{display:block}
|
||||
/* Recent section */
|
||||
.recent-bar{display:flex;gap:6px;margin-bottom:16px;flex-wrap:wrap;align-items:center}
|
||||
.recent-bar .label{font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;font-weight:700;margin-right:4px}
|
||||
.recent-chip{font-size:11px;padding:4px 10px;background:var(--sb);border:1px solid var(--border);border-radius:6px;cursor:pointer;color:var(--text);transition:all .15s}
|
||||
.recent-chip:hover{border-color:var(--accent);color:var(--accent)}
|
||||
/* Ctrl+K hint */
|
||||
.search-hint{font-size:10px;color:var(--dim);position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;background:var(--bg);padding:2px 6px;border-radius:4px;border:1px solid var(--border)}
|
||||
/* Mobile responsive */
|
||||
@media(max-width:768px){
|
||||
.layout{flex-direction:column!important}
|
||||
.sidebar{width:100%!important;height:auto!important;max-height:50vh;border-right:none!important;border-bottom:1px solid var(--border)}
|
||||
.sb-nav{max-height:200px}
|
||||
.tools{grid-template-columns:repeat(auto-fill,minmax(90px,1fr))!important;gap:4px!important}
|
||||
.tool{padding:6px!important}
|
||||
.tool-ico{width:36px!important;height:36px!important}
|
||||
.tool-ico img{max-width:32px!important;max-height:32px!important}
|
||||
.tool h3{font-size:.7rem!important}
|
||||
.tool p{font-size:.55rem!important}
|
||||
.stats{grid-template-columns:repeat(2,1fr)!important}
|
||||
.topbar{padding:0 12px!important}
|
||||
#homeView{padding:16px!important}
|
||||
.recent-bar{display:none!important}
|
||||
}
|
||||
@media(max-width:480px){
|
||||
.tools{grid-template-columns:repeat(3,1fr)!important}
|
||||
.sidebar{max-height:40vh}
|
||||
}
|
||||
|
||||
.in-iframe nav{display:none!important}.in-iframe .hero{padding-top:3rem!important;min-height:auto!important}.in-iframe footer{display:none!important}.in-iframe .cta{display:none!important}.in-iframe .wv-links{display:none!important}
|
||||
.suite-header{width:100%;padding:16px 0 8px;font-size:16px;font-weight:700;color:var(--white);display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--border);margin:8px 0}
|
||||
.suite-header .suite-icon{font-size:18px}
|
||||
.suite-header .suite-count{font-size:11px;color:var(--dim);font-weight:500;background:var(--hover);padding:2px 8px;border-radius:10px}
|
||||
.suite-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px;width:100%;margin-bottom:12px}
|
||||
</style>
|
||||
<link rel="alternate" hreflang="fr" href="https://weval-consulting.com/products/workspace.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://weval-consulting.com/products/workspace.html">
|
||||
<script>if(window!==window.top)document.documentElement.classList.add("in-iframe")</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- LOGIN -->
|
||||
<div id="login">
|
||||
<div class="login-box">
|
||||
<h1>WEVAL Workspace</h1>
|
||||
<div id="loginForm">
|
||||
<div class="field"><label>Email</label><input type="email" id="lEmail" placeholder="you@company.com"></div>
|
||||
<div class="field"><label>Cle API</label><input id="lKey" placeholder="wv_..."></div>
|
||||
<button class="login-btn" id="loginBtn" onclick="doLogin()">Se connecter</button>
|
||||
<div class="login-alt" onclick="showReg()">Créer un compte</div>
|
||||
</div>
|
||||
<div id="regForm" style="display:none">
|
||||
<div class="field"><label>Nom</label><input id="rName" placeholder="Nom complet"></div>
|
||||
<div class="field"><label>Email</label><input type="email" id="rEmail" placeholder="you@company.com"></div>
|
||||
<div class="field"><label>Entreprise</label><input id="rCompany" placeholder="Entreprise"></div>
|
||||
<button class="login-btn" onclick="doRegister()">Créer un compte gratuit</button>
|
||||
<div class="login-alt" onclick="showLogin()">Déjà un compte</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- APP -->
|
||||
<div id="app">
|
||||
<div class="layout">
|
||||
<div class="sidebar">
|
||||
<div class="sb-head"><b>WEVAL</b><small>workspace</small></div>
|
||||
<div style="padding:6px 8px"><input id="sbSearch" placeholder="Filtrer..." oninput="filterSidebar()" style="width:100%;padding:6px 10px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:11px;outline:none"></div>
|
||||
<div class="sb-nav" id="nav"></div>
|
||||
<div class="sb-user"><b id="uName">—</b><span id="uTier">Free plan</span></div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="topbar">
|
||||
<div class="topbar-title" id="pageTitle">Dashboard</div>
|
||||
<div class="topbar-new" id="newTab" style="display:none" onclick="window.open(currentUrl,'_blank')">↗ Nouvel onglet</div>
|
||||
<div class="topbar-key" id="topKey" onclick="navigator.clipboard.writeText(KEY);toast('Cle API copiee !')"></div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div id="homeView"></div>
|
||||
<iframe id="frameView" sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-top-navigation allow-top-navigation-by-user-activation" referrerpolicy="strict-origin-when-cross-origin"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script>
|
||||
var KEY='',U={},currentUrl='',currentPage='home';
|
||||
var AUTH='/api/products/auth.php';
|
||||
var $=function(id){return document.getElementById(id)};
|
||||
var v=function(id){return $(id)?$(id).value.trim():''};
|
||||
|
||||
// MODULES CONFIG — slug: [title, url, color, suite]
|
||||
var MODULES = {
|
||||
// ━━━ WEVAL SUITE — Consulting & Services ━━━
|
||||
svc: ['Consulting','/products/services.html','#6366f1','WEVAL Suite','svc'],
|
||||
cloudcost: ['CloudCost','/products/cloudcost.html','#22c55e','WEVAL Suite'],
|
||||
academy: ['Academy','/products/academy.html','#6366f1','WEVAL Suite','academy'],
|
||||
wevalcrm: ['Weval CRM','/products/wevalcrm.html','#3b82f6','WEVAL Suite','wevalcrm'],
|
||||
weviaagency: ['WEVIA Agency','/products/wevia-agency.html','#8b5cf6','WEVAL Suite','weviaagency'],
|
||||
consultingpkg: ['Consulting Pro','/products/consulting.html','#3b82f6','WEVAL Suite','consultingpkg'],
|
||||
leansixsigma: ['Lean Six Sigma','/products/leansixsigma.html','#22c55e','WEVAL Suite','leansixsigma'],
|
||||
audit: ['Audit & Compliance','/products/auditai.html','#ef4444','WEVAL Suite','audit'],
|
||||
|
||||
// ━━━ WEVIA SUITE — Intelligence Artificielle ━━━
|
||||
gpu: ['Wevia Inference','/products/gpu-inference.html','#8b5cf6','WEVIA Suite','gpu'],
|
||||
we: ['Wevia Enterprise','/products/wevia-enterprise.html','#8b5cf6','WEVIA Suite','we'],
|
||||
wl: ['Wevia WL','/products/wevia-whitelabel.html','#8b5cf6','WEVIA Suite','wl'],
|
||||
cf: ['Content Factory','/products/content-factory.html','#f59e0b','WEVIA Suite','cf'],
|
||||
pa: ['ProposalAI','/products/proposalai.html','#8b5cf6','WEVIA Suite','pa'],
|
||||
bp: ['BlueprintAI','/products/blueprintai.html','#8b5cf6','WEVIA Suite','bp'],
|
||||
canvasai: ['CanvasAI','/products/canvasai.html','#8b5cf6','WEVIA Suite','canvasai'],
|
||||
copyai: ['CopyAI','/products/copyai.html','#8b5cf6','WEVIA Suite','copyai'],
|
||||
iaarabe: ['IA Arabe FR','/products/ia-arabe.html','#8b5cf6','WEVIA Suite','iaarabe'],
|
||||
ppt: ['PresentationAI','/products/presentationai.html','#8b5cf6','WEVIA Suite','ppt'],
|
||||
translate: ['TranslateAI','/products/translateai.html','#22c55e','WEVIA Suite','translate'],
|
||||
bizplan: ['Business Plan','/products/bizplan.html','#f59e0b','WEVIA Suite','bizplan'],
|
||||
contracts: ['ContractAI','/products/contractai.html','#8b5cf6','WEVIA Suite','contracts'],
|
||||
meeting: ['Meeting Summary','/products/meetingai.html','#ef4444','WEVIA Suite','meeting'],
|
||||
esign: ['eSignature','/products/esignature.html','#f59e0b','WEVIA Suite','esign'],
|
||||
dashboardai: ['DashboardAI','/products/dashboardai.html','#3b82f6','WEVIA Suite','dashboardai'],
|
||||
|
||||
// ━━━ WEVADS SUITE — Email & Delivery ━━━
|
||||
arsenal: ['Wevanalytics','/products/arsenal.html','#ef4444','WEVADS Suite','arsenal'],
|
||||
wv: ['Wevads','/products/wevads.html','#ef4444','WEVADS Suite','wv'],
|
||||
wevadsia: ['Wevads IA','/products/wevads-ia.html','#ef4444','WEVADS Suite','wevadsia'],
|
||||
da: ['DeliverAds','/products/deliverads.html','#3b82f6','WEVADS Suite','da'],
|
||||
emailplatform: ['Digital Platform','/products/email-platform.html','#ef4444','WEVADS Suite','emailplatform'],
|
||||
mailstream: ['MailStream','/products/mailstream.html','#3b82f6','WEVADS Suite','mailstream'],
|
||||
mw: ['MailWarm','/products/mailwarm.html','#f59e0b','WEVADS Suite','mw'],
|
||||
mailforge: ['MailForge','/products/mailforge.html','#f59e0b','WEVADS Suite','mailforge'],
|
||||
cloudbridge: ['CloudBridge','/products/cloud-providers.html','#3b82f6','WEVADS Suite','cloudbridge'],
|
||||
emailverify: ['EmailVerify','/products/emailverify.html','#22c55e','WEVADS Suite'],
|
||||
inboxtest: ['InboxTest','/products/inboxtest.html','#3b82f6','WEVADS Suite'],
|
||||
ds: ['DeliverScore','/products/deliverscore.html','#22c55e','WEVADS Suite','ds'],
|
||||
ispmonitor: ['Network Monitor','/products/ispmonitor.html','#8b5cf6','WEVADS Suite'],
|
||||
networkguard: ['NetworkGuard','/products/networkguard.html','#ef4444','WEVADS Suite','networkguard'],
|
||||
emailwl: ['Email WL','/products/email-whitelabel.html','#ef4444','WEVADS Suite','emailwl'],
|
||||
|
||||
// ━━━ OUTREACH SUITE — Marketing & Growth ━━━
|
||||
oa: ['OutreachAI','/products/outreachai.html','#f59e0b','Outreach Suite','oa'],
|
||||
aisdr: ['AI SDR Agent','/products/ai-sdr.html','#f59e0b','Outreach Suite','aisdr'],
|
||||
aff: ['Partner Program','/products/affiliates.html','#8b5cf6','Outreach Suite','aff'],
|
||||
adscontrol: ['AdsControl','/products/adscontrol.html','#ef4444','Outreach Suite','adscontrol'],
|
||||
reputationai: ['ReputationAI','/products/reputationai.html','#f59e0b','Outreach Suite','reputationai'],
|
||||
smsforge: ['SMSForge','/products/smsforge.html','#f59e0b','Outreach Suite','smsforge'],
|
||||
newsletter: ['NewsletterInsight','/products/newsletterinsight.html','#f59e0b','Outreach Suite'],
|
||||
|
||||
// ━━━ DATA SUITE — Data & Healthcare ━━━
|
||||
mr: ['MedReach','/products/medreach.html','#22c55e','Data Suite','mr'],
|
||||
et: ['MedReach HCP','/products/medreachhcp.html','#22c55e','Data Suite','et'],
|
||||
medreachapi: ['MedReach API','/products/medreach-api.html','#22c55e','Data Suite','medreachapi'],
|
||||
healthcarecrm: ['Healthcare CRM','/products/healthcare-crm.html','#22c55e','Data Suite','healthcarecrm'],
|
||||
lf: ['LeadForge','/products/leadforge.html','#f59e0b','Data Suite','lf'],
|
||||
dataharvest: ['DataHarvest','/products/dataharvest.html','#22c55e','Data Suite','dataharvest'],
|
||||
sentinel: ['Sentinel','/products/sentinel.html','#3b82f6','Data Suite','sentinel'],
|
||||
|
||||
// ━━━ DEV SUITE — Engineering & Commerce ━━━
|
||||
df: ['DevForge AI','/products/devforge.html','#3b82f6','Dev Suite','df'],
|
||||
mind: ['Wedroid','/products/wevalmind.html','#8b5cf6','Dev Suite','mind'],
|
||||
crf: ['Creative Factory','/products/creativefactory.html','#f59e0b','Dev Suite','crf'],
|
||||
scout: ['Scout Intelligence','/products/scoutai.html','#3b82f6','Dev Suite','scout'],
|
||||
yt: ['YouTube Factory','/products/youtubefactory.html','#ef4444','Dev Suite','yt'],
|
||||
sf: ['StoreForge','/products/storeforge.html','#f59e0b','Dev Suite','sf'],
|
||||
fb: ['FormBuilder','/products/formbuilder.html','#f59e0b','Dev Suite','fb'],
|
||||
storeai: ['StoreAI','/products/storeai.html','#f59e0b','Dev Suite','storeai'],
|
||||
};
|
||||
|
||||
|
||||
var TIERS
|
||||
|
||||
var TIERS={
|
||||
svc:'free',academy:'free',mailstream:'free',gpu:'pro',cf:'pro',pa:'free',bp:'free',
|
||||
arsenal:'pro',wv:'pro',wevadsia:'pro',da:'pro',we:'pro',
|
||||
ds:'free',sentinel:'free',mr:'free',lf:'pro',
|
||||
mw:'free',oa:'pro',aff:'free',sf:'pro',wl:'pro',fb:'free',
|
||||
df:'free',mind:'free',crf:'free',scout:'free',yt:'free',
|
||||
ppt:'free',translate:'free',bizplan:'free',contracts:'free',meeting:'free',
|
||||
esign:'free',leansixsigma:'free',audit:'free',et:'pro',
|
||||
mailforge:'pro',cloudbridge:'pro',emailverify:'free',inboxtest:'free',
|
||||
ispmonitor:'free',newsletter:'free',cloudcost:'free',
|
||||
adscontrol:'pro',networkguard:'free',canvasai:'free',copyai:'free',
|
||||
dashboardai:'free',dataharvest:'pro',reputationai:'free',
|
||||
smsforge:'pro',storeai:'free',wevalcrm:'free',
|
||||
emailplatform:'pro',medreachapi:'pro',weviaagency:'pro',healthcarecrm:'free',iaarabe:'pro',aisdr:'pro',emailwl:'pro',consultingpkg:'free'
|
||||
};
|
||||
|
||||
function toast(m){var t=$('toast');t.textContent=m;t.style.display='block';setTimeout(function(){t.style.display='none'},3000)}
|
||||
function showReg(){$('loginForm').style.display='none';$('regForm').style.display=''}
|
||||
function showLogin(){$('regForm').style.display='none';$('loginForm').style.display=''}
|
||||
|
||||
// BUILD SIDEBAR
|
||||
function buildSidebar(){
|
||||
var nav=$('nav');
|
||||
var groups={};var gOrder=[];
|
||||
for(var k in MODULES){
|
||||
var g=MODULES[k][3];
|
||||
if(!groups[g]){groups[g]=[];gOrder.push(g)}
|
||||
groups[g].push(k);
|
||||
}
|
||||
var html='<div class="sb-link on" onclick="go(\'home\')"><div class="d" style="background:var(--accent)"></div>Dashboard</div>';
|
||||
for(var gi=0;gi<gOrder.length;gi++){
|
||||
var g=gOrder[gi];
|
||||
html+='<div class="sb-group" onclick="toggleGroup(this)"><span>'+g+'</span><span class="arrow">▶</span></div>';
|
||||
html+='<div class="sb-items">';
|
||||
for(var i=0;i<groups[g].length;i++){
|
||||
var k=groups[g][i];
|
||||
var m=MODULES[k];
|
||||
html+='<div class="sb-link" data-id="'+k+'" onclick="go(\''+k+'\')"><div class="d" style="background:'+m[2]+'"></div>'+m[0]+'</div>';
|
||||
}
|
||||
html+='</div>';
|
||||
}
|
||||
nav.innerHTML=html;
|
||||
}
|
||||
function toggleGroup(el){
|
||||
el.classList.toggle('open');
|
||||
var items=el.nextElementSibling;
|
||||
if(items)items.classList.toggle('open');
|
||||
}
|
||||
|
||||
// NAVIGATE
|
||||
function go(page){
|
||||
if(!KEY&&page!=='home'){toast('Connectez-vous');return}
|
||||
currentPage=page;
|
||||
|
||||
// Sidebar active
|
||||
document.querySelectorAll('.sb-link').forEach(function(l){l.classList.remove('on')});
|
||||
var active=document.querySelector('.sb-link[data-id="'+page+'"]');
|
||||
if(active)active.classList.add('on');
|
||||
if(page==='home')document.querySelector('.sb-link[onclick*="home"]').classList.add('on');
|
||||
|
||||
if(page==='home'){
|
||||
$('homeView').style.display='';trackRecent(id);
|
||||
$('frameView').style.display='none';
|
||||
$('pageTitle').textContent='Dashboard';
|
||||
$('newTab').style.display='none';
|
||||
return;
|
||||
}
|
||||
|
||||
var mod=MODULES[page];
|
||||
if(!mod){toast('Module inconnu');return}
|
||||
|
||||
$('pageTitle').textContent=mod[0];
|
||||
$('homeView').style.display='none';
|
||||
$('frameView').style.display='block';
|
||||
$('newTab').style.display='';
|
||||
currentUrl=mod[1];
|
||||
|
||||
// SET IFRAME SRC — simple, direct, no conditions
|
||||
$('frameView').src=mod[1]+(mod[1].includes('?')?'&':'?')+'_t='+Date.now();
|
||||
}
|
||||
|
||||
// HOME DASHBOARD
|
||||
function renderHome(){
|
||||
$('homeView').innerHTML=
|
||||
'<div class="stats">'+
|
||||
'<div class="stat"><b>62</b><small>Produits</small></div>'+
|
||||
'<div class="stat"><b>62</b><small>Modules</small></div>'+
|
||||
'<div class="stat"><b style="color:var(--green)">Live</b><small>API Status</small></div>'+
|
||||
'<div class="stat"><b id="hTier">Free</b><small>Plan</small></div>'+
|
||||
'</div>'+
|
||||
'<div style="margin-bottom:16px;display:flex;gap:10px;align-items:center">'+
|
||||
'<div style="flex:1;position:relative"><input type="text" id="toolSearch" placeholder="Rechercher un produit..." oninput="filterTools()" style="width:100%;padding:10px 16px;background:var(--sb);border:1px solid var(--border);border-radius:8px;color:var(--white);font-size:13px;outline:none"><span class="search-hint">Ctrl+K</span></div>'+
|
||||
'<span style="font-size:11px;color:var(--dim)" id="toolCount">62 produits</span>'+
|
||||
'</div>'+
|
||||
'<div class="tools" id="toolGrid"></div>';
|
||||
|
||||
var ICONS={
|
||||
'arsenal':'/assets/logo-wevanalytics.svg',
|
||||
'wv':'/assets/logo-wevads-Crayl4yz.png',
|
||||
'wevadsia':'/assets/logo-wevads-Crayl4yz.png',
|
||||
'da':'/assets/logo-deliverads.svg',
|
||||
'we':'/assets/logo-wevia-official.svg',
|
||||
'ds':'/assets/logo-deliverscore.svg',
|
||||
'sentinel':'/assets/logo-sentinel.svg',
|
||||
'mr':'/assets/logo-medreach.svg',
|
||||
'lf':'/assets/logo-leadforge.svg',
|
||||
'gpu':'/assets/logo-wevia-official.svg',
|
||||
'cf':'/assets/logo-content-factory.svg',
|
||||
'pa':'/assets/logo-proposalai.svg',
|
||||
'bp':'/assets/logo-blueprintai.svg',
|
||||
'mw':'/assets/logo-mailwarm.svg',
|
||||
'oa':'/assets/logo-outreachai.svg',
|
||||
'aff':'/assets/logo-affiliates.svg',
|
||||
'sf':'/assets/logo-storeforge.svg',
|
||||
'wl':'/assets/logo-wevia-official.svg',
|
||||
'fb':'/assets/logo-formbuilder.svg',
|
||||
'df':'/assets/logo-devforge.svg',
|
||||
'mind':'/assets/logo-weval-mind.svg',
|
||||
'crf':'/assets/logo-creative-factory.svg',
|
||||
'scout':'/assets/logo-scout.svg',
|
||||
'yt':'/assets/logo-youtube-factory.svg',
|
||||
'ppt':'/assets/logo-presentationai.svg',
|
||||
'translate':'/assets/logo-translateai.svg',
|
||||
'bizplan':'/assets/logo-bizplan.svg',
|
||||
'contracts':'/assets/logo-contractai.svg',
|
||||
'meeting':'/assets/logo-meeting-summary.svg',
|
||||
'esign':'/assets/logo-esignature.svg',
|
||||
'leansixsigma':'/assets/logo-leansixsigma.svg',
|
||||
'audit':'/assets/logo-auditcompliance.svg',
|
||||
'et':'/assets/logo-ethica.svg',
|
||||
'mailforge':'/assets/logo-mailforge.svg',
|
||||
'cloudbridge':'/assets/logo-cloudbridge.svg',
|
||||
'svc':'/assets/logo-consulting.svg',
|
||||
'academy':'/assets/logo-academy.svg',
|
||||
'canvas':'/assets/logo-canvasai.svg',
|
||||
'dash':'/assets/logo-dashboardai.svg',
|
||||
'emailverify':'/assets/logo-emailverify.svg',
|
||||
'inboxtest':'/assets/logo-inboxtest.svg',
|
||||
'ispmonitor':'/assets/logo-ispmonitor.svg',
|
||||
'newsletter':'/assets/logo-newsletter.svg',
|
||||
'cloudcost':'/assets/logo-cloudcost.svg',
|
||||
'mailstream':'/assets/logo-mailstream.svg',
|
||||
'adscontrol':'/assets/logo-adscontrol.svg',
|
||||
'networkguard':'/assets/logo-networkguard.svg',
|
||||
'canvasai':'/assets/logo-canvasai.svg',
|
||||
'copyai':'/assets/logo-copyai.svg',
|
||||
'dashboardai':'/assets/logo-dashboardai.svg',
|
||||
'dataharvest':'/assets/logo-dataharvest.svg',
|
||||
'reputationai':'/assets/logo-reputationai.svg',
|
||||
'smsforge':'/assets/logo-smsforge.svg',
|
||||
'storeai':'/assets/logo-storeforge.svg',
|
||||
'wevalcrm':'/assets/logo-weval-crm.svg',
|
||||
'emailplatform':'/assets/logo-deliverads.svg',
|
||||
'medreachapi':'/assets/logo-medreach.svg',
|
||||
'weviaagency':'/assets/logo-wevia-official.svg',
|
||||
'healthcarecrm':'/assets/logo-medreach.svg',
|
||||
'iaarabe':'/assets/logo-wevia-official.svg',
|
||||
'aisdr':'/assets/logo-outreachai.svg',
|
||||
'emailwl':'/assets/logo-mailforge.svg',
|
||||
'consultingpkg':'/assets/logo-consulting.svg',
|
||||
};
|
||||
// Recent products
|
||||
var recents=JSON.parse(localStorage.getItem('wv_recent')||'[]');
|
||||
var favs=JSON.parse(localStorage.getItem('wv_favs')||'[]');
|
||||
var recentHtml='';
|
||||
if(recents.length>0||favs.length>0){
|
||||
recentHtml='<div class="recent-bar">';
|
||||
if(favs.length>0){
|
||||
recentHtml+='<span class="label">★ Favoris</span>';
|
||||
favs.slice(0,6).forEach(function(k){if(MODULES[k])recentHtml+='<span class="recent-chip" onclick="go(\''+k+'\')">'+MODULES[k][0]+'</span>'});
|
||||
}
|
||||
if(recents.length>0){
|
||||
recentHtml+='<span class="label" style="margin-left:8px">Récents</span>';
|
||||
recents.slice(0,5).forEach(function(k){if(MODULES[k])recentHtml+='<span class="recent-chip" onclick="go(\''+k+'\')">'+MODULES[k][0]+'</span>'});
|
||||
}
|
||||
recentHtml+='</div>';
|
||||
}
|
||||
// Product grid with badges + favs + tooltips
|
||||
// Group by suite
|
||||
var suites={},sOrder=[];
|
||||
for(var k in MODULES){
|
||||
var g=MODULES[k][3];
|
||||
if(!suites[g]){suites[g]=[];sOrder.push(g)}
|
||||
suites[g].push(k);
|
||||
}
|
||||
var SUITE_ICONS={'WEVAL Suite':'🏢','WEVIA Suite':'🤖','WEVADS Suite':'📧','Outreach Suite':'📣','Data Suite':'📊','Dev Suite':'⚡'};
|
||||
var html='';
|
||||
for(var si=0;si<sOrder.length;si++){
|
||||
var g=sOrder[si];
|
||||
html+='<div class="suite-header"><span class="suite-icon">'+(SUITE_ICONS[g]||'📦')+'</span>'+g+' <span class="suite-count">'+suites[g].length+'</span></div>';
|
||||
html+='<div class="suite-grid">';
|
||||
for(var i=0;i<suites[g].length;i++){
|
||||
var k=suites[g][i];
|
||||
var m=MODULES[k];
|
||||
var tier=TIERS[k]||'free';
|
||||
var isFav=favs.indexOf(k)>-1;
|
||||
html+='<div class="tool" onclick="go(\''+k+'\')">';
|
||||
html+='<span class="tool-badge '+(tier==='pro'?'pro':'free')+'">'+tier+'</span>';
|
||||
html+='<button class="tool-fav '+(isFav?'on':'')+'" onclick="event.stopPropagation();toggleFav(\''+k+'\')">'+(isFav?'★':'☆')+'</button>';
|
||||
html+='<div class="tool-ico">'+(k==='wevadsia'?'<span class="ia-badge">IA</span>':'')+'<img src="'+(ICONS[k]||'/assets/logo-weval-ia.svg')+'" alt=""></div>';
|
||||
html+='<h3>'+m[0]+'</h3><p>'+g+'</p></div>';
|
||||
}
|
||||
html+='</div>';
|
||||
}
|
||||
$('toolGrid').innerHTML=recentHtml+html;
|
||||
}
|
||||
|
||||
// AUTH
|
||||
async function doLogin(){
|
||||
var btn=document.getElementById('loginBtn');if(btn){btn.textContent='Connexion...';btn.disabled=true}
|
||||
var e=v('lEmail'),k=v('lKey');
|
||||
if(!e&&!k){toast('Email ou cle requis');return}
|
||||
try{
|
||||
var r;
|
||||
if(k){r=await(await fetch(AUTH+'?action=dashboard&key='+k)).json();if(r.error){toast(r.error);return}if(!r.api_key){toast('Cle invalide');return}KEY=r.api_key;U=r.user||{};enter()}
|
||||
else{r=await(await fetch(AUTH,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:'User',email:e,company:'N/A',product:'all'})})).json();if(r.error){toast(r.error);return}KEY=r.api_key;U={name:'User',email:e,tier:r.tier||'free'};enter()}
|
||||
}catch(ex){toast('Erreur: '+ex.message)}
|
||||
finally{var btn=document.getElementById('loginBtn');if(btn){btn.textContent='Se connecter';btn.disabled=false}}
|
||||
}
|
||||
async function doRegister(){
|
||||
var n=v('rName'),e=v('rEmail'),c=v('rCompany');
|
||||
if(!n||!e||!c){toast('Tous les champs requis');return}
|
||||
try{
|
||||
var r=await(await fetch(AUTH,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:n,email:e,company:c,product:'all'})})).json();
|
||||
if(r.error){toast(r.error);return}KEY=r.api_key;U={name:n,email:e,tier:r.tier||'free'};enter()
|
||||
}catch(ex){toast('Erreur: '+ex.message)}
|
||||
}
|
||||
function enter(){
|
||||
try{localStorage.setItem('wk',KEY);localStorage.setItem('wu',JSON.stringify(U))}catch(e){}
|
||||
$('login').style.display='none';
|
||||
$('app').style.display='block';
|
||||
$('uName').textContent=U.name||U.email||'User';
|
||||
$('uTier').textContent=(U.tier||'free')+' plan';
|
||||
$('topKey').textContent=(KEY||'').substring(0,16)+'...';
|
||||
if($('hTier'))$('hTier').textContent=U.tier||'Free';
|
||||
buildSidebar();
|
||||
renderHome();
|
||||
// Welcome toast on first visit
|
||||
if(!localStorage.getItem('wv_welcomed')){
|
||||
toast('Bienvenue ! Explorez nos 62 produits SaaS.');
|
||||
localStorage.setItem('wv_welcomed','1');
|
||||
}
|
||||
}
|
||||
|
||||
// Search/filter products
|
||||
function filterTools(){
|
||||
var q=(document.getElementById('toolSearch')||{}).value||'';
|
||||
q=q.toLowerCase();
|
||||
var cards=document.querySelectorAll('.tool');
|
||||
var visible=0;
|
||||
cards.forEach(function(card){
|
||||
var text=(card.textContent||'').toLowerCase();
|
||||
if(!q||text.indexOf(q)>-1){card.style.display='';visible++}
|
||||
else{card.style.display='none'}
|
||||
});
|
||||
var counter=document.getElementById('toolCount');
|
||||
if(counter)counter.textContent=visible+' produit'+(visible>1?'s':'');
|
||||
}
|
||||
|
||||
// ENTER ON LOGIN
|
||||
document.addEventListener('keypress',function(e){if(e.key==='Enter'&&$('login').style.display!=='none'){if($('loginForm').style.display!=='none')doLogin();else doRegister()}});
|
||||
|
||||
// AUTO RESTORE
|
||||
try{var sk=localStorage.getItem('wk'),su=localStorage.getItem('wu');if(sk&&su){KEY=sk;U=JSON.parse(su);enter()}}catch(e){}
|
||||
|
||||
// Sidebar filter
|
||||
function filterSidebar(){
|
||||
var q=(document.getElementById('sbSearch')||{}).value.toLowerCase();
|
||||
document.querySelectorAll('.sb-link').forEach(function(el){
|
||||
if(el.dataset.id==='home'||!el.dataset.id)return;
|
||||
var text=(el.textContent||'').toLowerCase();
|
||||
el.style.display=(!q||text.indexOf(q)>-1)?'':'none';
|
||||
});
|
||||
// Show parent groups that have visible children
|
||||
document.querySelectorAll('.sb-group').forEach(function(g){
|
||||
var items=g.nextElementSibling;
|
||||
if(items&&items.classList.contains('sb-items')){
|
||||
var hasVisible=false;
|
||||
items.querySelectorAll('.sb-link').forEach(function(l){if(l.style.display!=='none')hasVisible=true});
|
||||
g.style.display=(!q||hasVisible)?'':'none';
|
||||
items.style.display=(!q||hasVisible)?'':'none';
|
||||
if(q&&hasVisible){items.classList.add('open');g.classList.add('open')}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Toggle favorite
|
||||
function toggleFav(k){
|
||||
var favs=JSON.parse(localStorage.getItem('wv_favs')||'[]');
|
||||
var idx=favs.indexOf(k);
|
||||
if(idx>-1)favs.splice(idx,1);else favs.unshift(k);
|
||||
localStorage.setItem('wv_favs',JSON.stringify(favs.slice(0,10)));
|
||||
renderHome();
|
||||
}
|
||||
// Track recent
|
||||
function trackRecent(k){
|
||||
if(k==='home')return;
|
||||
var r=JSON.parse(localStorage.getItem('wv_recent')||'[]');
|
||||
r=r.filter(function(x){return x!==k});
|
||||
r.unshift(k);
|
||||
localStorage.setItem('wv_recent',JSON.stringify(r.slice(0,8)));
|
||||
}
|
||||
// Ctrl+K shortcut
|
||||
document.addEventListener('keydown',function(e){
|
||||
if((e.ctrlKey||e.metaKey)&&e.key==='k'){
|
||||
e.preventDefault();
|
||||
if(currentPage!=='home')go('home');
|
||||
setTimeout(function(){var s=$('toolSearch');if(s){s.focus();s.select()}},100);
|
||||
}
|
||||
if(e.key==='Escape'){var s=$('toolSearch');if(s&&document.activeElement===s){s.value='';filterTools();s.blur()}}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<!-- Contact Overlay (intercepts /contact-us/ in iframe) -->
|
||||
<div id="contactOverlay" style="display:none;position:fixed;top:0;left:var(--sidebar-w,140px);right:0;bottom:0;z-index:500;background:rgba(5,8,18,0.97);overflow-y:auto;padding:3rem 4%">
|
||||
<div style="max-width:520px;margin:0 auto">
|
||||
<button onclick="closeContactOverlay()" style="float:right;background:none;border:none;color:#64748b;font-size:1.4rem;cursor:pointer;padding:8px">✕</button>
|
||||
<div style="display:inline-block;background:rgba(99,102,241,.1);color:#6366f1;padding:6px 18px;border-radius:20px;font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-bottom:1rem">Contact</div>
|
||||
<h2 style="font-size:1.8rem;font-weight:800;color:#f1f5f9;margin-bottom:.5rem" id="overlayTitle">Parlons de votre projet</h2>
|
||||
<p style="color:#94a3b8;font-size:.9rem;margin-bottom:2rem;line-height:1.6">Remplissez le formulaire ci-dessous. Notre équipe vous recontacte sous 24h.</p>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Nom complet</label><input id="ovName" type="text" placeholder="Votre nom" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Email professionnel</label><input id="ovEmail" type="email" placeholder="vous@entreprise.com" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Entreprise</label><input id="ovCompany" type="text" placeholder="Nom de votre entreprise" style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Produit</label><input id="ovProduct" type="text" readonly style="width:100%;background:rgba(99,102,241,.06);border:1px solid rgba(99,102,241,.15);color:#818cf8;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none;font-weight:600"></div>
|
||||
<div style="margin-bottom:1rem"><label style="display:block;font-size:.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px">Message</label><textarea id="ovMsg" placeholder="Décrivez votre besoin..." style="width:100%;background:rgba(0,0,0,.3);border:1px solid rgba(255,255,255,.06);color:#f1f5f9;border-radius:8px;padding:.7rem 1rem;font-size:.88rem;font-family:inherit;outline:none;resize:vertical;min-height:80px"></textarea></div>
|
||||
<button id="ovSendBtn" onclick="sendOverlayForm()" style="display:block;width:100%;background:#6366f1;color:#fff;padding:14px;border:none;border-radius:12px;font-weight:700;font-size:.95rem;cursor:pointer;font-family:inherit;margin-top:1.5rem">Envoyer →</button>
|
||||
<div id="ovSuccess" style="display:none;background:rgba(0,200,150,.08);border:1px solid rgba(0,200,150,.2);border-radius:12px;padding:1.5rem;text-align:center;margin-top:1rem"><h3 style="color:#00c9a7;font-size:1.2rem;margin-bottom:.5rem">Message envoyé ✓</h3><p style="font-size:.85rem;color:#94a3b8">Notre équipe vous recontactera sous 24h.</p><button onclick="closeContactOverlay()" style="margin-top:1rem;background:none;border:1px solid rgba(255,255,255,.1);color:#94a3b8;padding:8px 20px;border-radius:8px;cursor:pointer;font-family:inherit">← Retour au produit</button></div>
|
||||
</div></div>
|
||||
<script>
|
||||
var _currentProduct='';
|
||||
function showContactOverlay(product){
|
||||
_currentProduct=product||'';
|
||||
document.getElementById('ovProduct').value=_currentProduct;
|
||||
document.getElementById('ovSuccess').style.display='none';
|
||||
document.getElementById('ovSendBtn').style.display='block';
|
||||
document.getElementById('ovName').value='';document.getElementById('ovEmail').value='';document.getElementById('ovCompany').value='';document.getElementById('ovMsg').value='';
|
||||
document.getElementById('contactOverlay').style.display='block';
|
||||
}
|
||||
function closeContactOverlay(){
|
||||
document.getElementById('contactOverlay').style.display='none';
|
||||
// Restore iframe to last product
|
||||
var f=document.getElementById('frameView');
|
||||
if(f&&f.dataset.lastSrc&&f.src.indexOf('contact-us')>-1) f.src=f.dataset.lastSrc;
|
||||
}
|
||||
function sendOverlayForm(){
|
||||
var n=document.getElementById('ovName').value.trim(),e=document.getElementById('ovEmail').value.trim();
|
||||
if(!n||!e){alert('Veuillez remplir nom et email.');return;}
|
||||
var btn=document.getElementById('ovSendBtn');btn.disabled=true;btn.textContent='Envoi...';
|
||||
fetch('/api/contact',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:n,email:e,company:document.getElementById('ovCompany').value.trim(),subject:'demo',message:'[Produit: '+_currentProduct+'] '+document.getElementById('ovMsg').value.trim(),source:'workspace-overlay',ts:new Date().toISOString()})}).then(function(){
|
||||
document.getElementById('ovSendBtn').style.display='none';
|
||||
document.getElementById('ovSuccess').style.display='block';
|
||||
}).catch(function(){
|
||||
document.getElementById('ovSendBtn').style.display='none';
|
||||
document.getElementById('ovSuccess').style.display='block';
|
||||
});
|
||||
}
|
||||
// Intercept iframe navigation to /contact-us/
|
||||
(function(){
|
||||
var frame=document.getElementById('frameView');
|
||||
if(!frame)return;
|
||||
// Save last product URL before navigation
|
||||
var origSrc=Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype,'src');
|
||||
// Poll approach: watch iframe URL changes
|
||||
setInterval(function(){
|
||||
try{
|
||||
var loc=frame.contentWindow.location.href;
|
||||
if(loc.indexOf('/contact-us')>-1){
|
||||
// Find current product name from sidebar
|
||||
var active=document.querySelector('.s-item.act');
|
||||
var prodName=active?active.textContent.trim():'';
|
||||
showContactOverlay(prodName);
|
||||
// Navigate iframe back
|
||||
if(frame.dataset.lastSrc) frame.src=frame.dataset.lastSrc;
|
||||
} else if(loc.indexOf('/products/')>-1){
|
||||
frame.dataset.lastSrc=loc;
|
||||
}
|
||||
}catch(e){}
|
||||
},500);
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body></html>
|
||||
@@ -1,151 +0,0 @@
|
||||
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><title>WEVAL Master Inventory — All Screens 3 Servers</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Outfit:wght@300;500;700;900&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'Outfit',sans-serif;background:#06080f;color:#c8d0e0;min-height:100vh}
|
||||
.header{background:linear-gradient(135deg,#0d1117 0%,#161b28 100%);padding:24px 32px;border-bottom:1px solid #1e293b;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:100}
|
||||
.header h1{font-size:1.5em;font-weight:900;background:linear-gradient(90deg,#818cf8,#a78bfa,#c084fc);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
||||
.header .stats{display:flex;gap:16px}
|
||||
.stat-box{background:#111827;padding:8px 16px;border-radius:8px;text-align:center;border:1px solid #1e293b}
|
||||
.stat-box b{display:block;font-size:1.3em;font-family:'JetBrains Mono',monospace}
|
||||
.stat-box span{font-size:.7em;color:#64748b;text-transform:uppercase;letter-spacing:1px}
|
||||
.pass b{color:#34d399}.fail b{color:#f87171}.warn b{color:#fbbf24}
|
||||
.container{max-width:1400px;margin:0 auto;padding:24px}
|
||||
.section{margin-bottom:32px}
|
||||
.section-title{font-size:1.1em;font-weight:700;color:#818cf8;margin-bottom:12px;display:flex;align-items:center;gap:8px;padding-bottom:8px;border-bottom:1px solid #1e293b}
|
||||
table{width:100%;border-collapse:collapse;font-size:.85em}
|
||||
th{text-align:left;padding:8px 12px;background:#111827;color:#64748b;font-size:.75em;text-transform:uppercase;letter-spacing:1px;position:sticky;top:70px;z-index:10}
|
||||
td{padding:7px 12px;border-bottom:1px solid #111827}
|
||||
tr:hover td{background:#0d1117}
|
||||
.url{font-family:'JetBrains Mono',monospace;font-size:.8em}
|
||||
.url a{color:#818cf8;text-decoration:none}
|
||||
.url a:hover{text-decoration:underline}
|
||||
.cred{font-family:'JetBrains Mono',monospace;font-size:.75em;color:#fbbf24;background:#1a1a2e;padding:2px 6px;border-radius:3px}
|
||||
.s200{color:#34d399;font-weight:700}.s301{color:#60a5fa;font-weight:700}.s302{color:#60a5fa}.s404{color:#f87171}.s500{color:#f87171;font-weight:700}.s000{color:#6b7280}
|
||||
.tag{display:inline-block;padding:2px 8px;border-radius:4px;font-size:.7em;font-weight:700;text-transform:uppercase}
|
||||
.tag-prod{background:#065f46;color:#34d399}.tag-tool{background:#1e1b4b;color:#a78bfa}.tag-api{background:#1c1917;color:#fb923c}
|
||||
.tag-docker{background:#0c4a6e;color:#38bdf8}.tag-cli{background:#3f3f46;color:#d4d4d8}.tag-ext{background:#4c1d95;color:#c4b5fd}
|
||||
.tag-s204{background:#1e293b;color:#94a3b8}.tag-s95{background:#172554;color:#60a5fa}.tag-s151{background:#1a2e05;color:#84cc16}
|
||||
.filter-bar{display:flex;gap:8px;margin-bottom:16px;flex-wrap:wrap}
|
||||
.filter-btn{padding:6px 14px;border:1px solid #1e293b;background:#111827;color:#94a3b8;border-radius:6px;cursor:pointer;font-size:.8em;transition:.2s}
|
||||
.filter-btn:hover,.filter-btn.active{background:#818cf8;color:#fff;border-color:#818cf8}
|
||||
#search{background:#111827;border:1px solid #1e293b;color:#e2e8f0;padding:8px 14px;border-radius:6px;width:300px;font-size:.85em}
|
||||
</style>
|
||||
</head><body>
|
||||
<div class="header">
|
||||
<h1>WEVAL MASTER INVENTORY — ALL SCREENS</h1>
|
||||
<div class="stats">
|
||||
<div class="stat-box pass"><b id="totalPass">-</b><span>Pass</span></div>
|
||||
<div class="stat-box fail"><b id="totalFail">-</b><span>Fail</span></div>
|
||||
<div class="stat-box"><b id="totalScreens">-</b><span>Total</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="filter-bar">
|
||||
<input type="text" id="search" placeholder="Search screens..." oninput="filterRows()">
|
||||
<button class="filter-btn active" onclick="filterCat(this,'all')">All</button>
|
||||
<button class="filter-btn" onclick="filterCat(this,'s204')">S204</button>
|
||||
<button class="filter-btn" onclick="filterCat(this,'s95')">S95</button>
|
||||
<button class="filter-btn" onclick="filterCat(this,'s151')">S151</button>
|
||||
<button class="filter-btn" onclick="filterCat(this,'docker')">Docker</button>
|
||||
<button class="filter-btn" onclick="filterCat(this,'cli')">CLI/Tools</button>
|
||||
<button class="filter-btn" onclick="filterCat(this,'ext')">External</button>
|
||||
</div>
|
||||
|
||||
<div class="section"><div class="section-title">🌐 S204 — Site Public (116 pages)</div>
|
||||
<table id="mainTable"><thead><tr><th>Server</th><th>Cat</th><th>Screen</th><th>URL</th><th>Credentials</th><th>Status</th></tr></thead>
|
||||
<tbody id="rows">
|
||||
<!-- S204 CORE -->
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>Homepage</td><td class="url"><a href="https://weval-consulting.com/" target="_blank">weval-consulting.com/</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>Workspace</td><td class="url"><a href="https://weval-consulting.com/products/workspace.html" target="_blank">/products/workspace.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>Trust Center</td><td class="url"><a href="https://weval-consulting.com/products/trust-center.html" target="_blank">/products/trust-center.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>Consulting SAP</td><td class="url"><a href="https://weval-consulting.com/products/consulting.html" target="_blank">/products/consulting.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>Ethica Platform</td><td class="url"><a href="https://weval-consulting.com/products/ethica.html" target="_blank">/products/ethica.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>WEVADS Platform</td><td class="url"><a href="https://weval-consulting.com/products/wevads.html" target="_blank">/products/wevads.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>WEVIA Enterprise</td><td class="url"><a href="https://weval-consulting.com/products/wevia-enterprise.html" target="_blank">/products/wevia-enterprise.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>GPU Inference</td><td class="url"><a href="https://weval-consulting.com/products/gpu-inference.html" target="_blank">/products/gpu-inference.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="prod"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-prod">PROD</span></td><td>Lean Six Sigma</td><td class="url"><a href="https://weval-consulting.com/products/leansixsigma.html" target="_blank">/products/leansixsigma.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<!-- S204 TOOLS -->
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>WEVIA Chatbot</td><td class="url"><a href="https://weval-consulting.com/wevia" target="_blank">/wevia</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>WEDROID v5</td><td class="url"><a href="https://weval-consulting.com/wevia-ia/droid.html" target="_blank">/wevia-ia/droid.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Mega Command Center</td><td class="url"><a href="https://weval-consulting.com/mega-command-center.html" target="_blank">/mega-command-center.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Command Center (32)</td><td class="url"><a href="https://weval-consulting.com/command-center.html" target="_blank">/command-center.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Cyber Command v5</td><td class="url"><a href="https://weval-consulting.com/wevia-ia/wevia-cyber-monitor.php" target="_blank">/wevia-ia/wevia-cyber-monitor.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Code Review 3 Serveurs</td><td class="url"><a href="https://weval-consulting.com/wevia-ia/code-review-22mars.html" target="_blank">/wevia-ia/code-review-22mars.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>GoLive Dashboard</td><td class="url"><a href="https://weval-consulting.com/golive.html" target="_blank">/golive.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Master Test</td><td class="url"><a href="https://weval-consulting.com/master-test.html" target="_blank">/master-test.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>NonReg OPUS</td><td class="url"><a href="https://weval-consulting.com/nonreg.html" target="_blank">/nonreg.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Ethica Monitor</td><td class="url"><a href="https://weval-consulting.com/ethica-monitor.html" target="_blank">/ethica-monitor.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>GWS OAuth Setup</td><td class="url"><a href="https://weval-consulting.com/gws-setup.html" target="_blank">/gws-setup.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Solution Finder</td><td class="url"><a href="https://weval-consulting.com/solution-finder.html" target="_blank">/solution-finder.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="tool"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Technology Radar</td><td class="url"><a href="https://weval-consulting.com/technology-radar.html" target="_blank">/technology-radar.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<!-- S204 APIs -->
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Health Chatbot</td><td class="url"><a href="https://weval-consulting.com/api/health-chatbot.php" target="_blank">/api/health-chatbot.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Capabilities Core</td><td class="url"><a href="https://weval-consulting.com/api/wevia-capabilities.php?cap=health" target="_blank">/api/wevia-capabilities.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Capabilities Ext</td><td class="url"><a href="https://weval-consulting.com/api/wevia-capabilities-ext.php?cap=list" target="_blank">/api/wevia-capabilities-ext.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Providers Registry</td><td class="url"><a href="https://weval-consulting.com/api/wevia-providers.php" target="_blank">/api/wevia-providers.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Skills (27)</td><td class="url"><a href="https://weval-consulting.com/api/wevia-skills.php?action=status" target="_blank">/api/wevia-skills.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Cron Control Proxy</td><td class="url"><a href="https://weval-consulting.com/api/cron-control-api.php?action=list" target="_blank">/api/cron-control-api.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Google API</td><td class="url"><a href="https://weval-consulting.com/api/google-api.php?action=test" target="_blank">/api/google-api.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Stripe Webhook</td><td class="url"><a href="https://weval-consulting.com/api/stripe-webhook.php" target="_blank">/api/stripe-webhook.php</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="api"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-api">API</span></td><td>Chatbot API</td><td class="url"><a href="https://weval-consulting.com/api/weval-ia" target="_blank">/api/weval-ia (POST)</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<!-- DOCKER APPS -->
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Uptime Kuma</td><td class="url"><a href="https://monitor.weval-consulting.com" target="_blank">monitor.weval-consulting.com</a></td><td class="cred">admin / (set on first login)</td><td class="s302">302</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Plausible Analytics</td><td class="url"><a href="https://analytics.weval-consulting.com" target="_blank">analytics.weval-consulting.com</a></td><td class="cred">WEVAL Admin (OAuth)</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Authentik SSO</td><td class="url"><a href="https://auth.weval-consulting.com" target="_blank">auth.weval-consulting.com</a></td><td class="cred">akadmin / (set on install)</td><td class="s302">302</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>n8n Automation</td><td class="url"><a href="https://weval-consulting.com:5678" target="_blank">:5678 (internal)</a></td><td class="cred">via Authentik SSO</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Vaultwarden</td><td class="url"><a href="https://weval-consulting.com:8222" target="_blank">:8222 (internal)</a></td><td class="cred">via email invite</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Mattermost</td><td class="url"><a href="https://weval-consulting.com:8065" target="_blank">:8065 (internal)</a></td><td class="cred">admin / (set on first login)</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>SearXNG Search</td><td class="url"><a href="http://127.0.0.1:8080" target="_blank">:8080 (localhost only)</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Qdrant Vector DB</td><td class="url"><a href="http://127.0.0.1:6333" target="_blank">:6333 (localhost only)</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Loki Logs</td><td class="url"><a href="http://127.0.0.1:3100" target="_blank">:3100 (localhost only)</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Twenty CRM</td><td class="url"><a href="http://127.0.0.1:3333" target="_blank">:3333 (internal)</a></td><td class="cred">needs APP_SECRET fix</td><td class="s500">BROKEN</td></tr>
|
||||
<tr data-srv="s204" data-cat="docker"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-docker">DOCKER</span></td><td>Ollama (9 models)</td><td class="url"><a href="http://127.0.0.1:11434" target="_blank">:11434 (localhost)</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<!-- CLI TOOLS -->
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Kilo CLI 7.1.0</td><td class="url">sudo HOME=/root kilo</td><td class="cred">SSH root@204.168.152.13 -p 49222</td><td class="s200">OK</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Hermes Agent (27 skills)</td><td class="url">sudo HOME=/root hermes</td><td class="cred">SSH root / FLVhtCX47w3e</td><td class="s200">OK</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — granite4</td><td class="url">sudo ollama run granite4</td><td class="cred">IBM function calling, RAG</td><td class="s200">2.1GB</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — glm4:9b</td><td class="url">sudo ollama run glm4:9b</td><td class="cred">Zhipu open-source</td><td class="s200">5.5GB</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — meditron:7b</td><td class="url">sudo ollama run meditron:7b</td><td class="cred">Medical LLM Ethica</td><td class="s200">3.8GB</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — medllama2</td><td class="url">sudo ollama run medllama2</td><td class="cred">Medical diagnostics</td><td class="s200">3.8GB</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — qwen3:8b</td><td class="url">sudo ollama run qwen3:8b</td><td class="cred">General reasoning</td><td class="s200">5.2GB</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — qwen3:4b</td><td class="url">sudo ollama run qwen3:4b</td><td class="cred">Fast general</td><td class="s200">2.5GB</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — qwen3.5:0.8b</td><td class="url">sudo ollama run qwen3.5:0.8b</td><td class="cred">201 langues, edge</td><td class="s200">1.0GB</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — qwen2.5:7b</td><td class="url">sudo ollama run qwen2.5:7b</td><td class="cred">Legacy</td><td class="s200">4.7GB</td></tr>
|
||||
<tr data-srv="s204" data-cat="cli"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-cli">CLI</span></td><td>Ollama — mistral</td><td class="url">sudo ollama run mistral</td><td class="cred">Multilingual</td><td class="s200">4.4GB</td></tr>
|
||||
<!-- S95 -->
|
||||
<tr data-srv="s95" data-cat="prod"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-prod">PROD</span></td><td>WEVADS Login</td><td class="url"><a href="https://wevads.weval-consulting.com/auth/login.html" target="_blank">wevads.weval-consulting.com/auth/login.html</a></td><td class="cred">admin@local.com / Wevads2026</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="prod"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-prod">PROD</span></td><td>Arsenal (190 screens)</td><td class="url"><a href="https://wevads.weval-consulting.com/brain-central.html" target="_blank">wevads..com/:5890 (190 HTML)</a></td><td class="cred">admin@local.com / Wevads2026</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="prod"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-prod">PROD</span></td><td>ADX iResponse (168 screens)</td><td class="url"><a href="https://wevads.weval-consulting.com/" target="_blank">:5821 via CF proxy</a></td><td class="cred">admin@local.com / Wevads2026</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="tool"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Cron Control All</td><td class="url"><a href="https://wevads.weval-consulting.com/cron-control-all.html" target="_blank">wevads..com/cron-control-all.html</a></td><td class="cred">68 crons (63+5+0)</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="tool"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-tool">TOOL</span></td><td>CEO Dashboard</td><td class="url"><a href="https://wevads.weval-consulting.com/ceo-dashboard.html" target="_blank">wevads..com/ceo-dashboard.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="tool"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-tool">TOOL</span></td><td>Brain Central</td><td class="url"><a href="https://wevads.weval-consulting.com/brain-central.html" target="_blank">wevads..com/brain-central.html</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="prod"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-prod">PROD</span></td><td>FMG App (:5822)</td><td class="url">10.1.0.3:5822 (internal)</td><td class="cred">via Arsenal auth</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="prod"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-prod">PROD</span></td><td>BCG App (:5823)</td><td class="url">10.1.0.3:5823 (internal)</td><td class="cred">via Arsenal auth</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="prod"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-prod">PROD</span></td><td>DKIM Manager (:5824)</td><td class="url">10.1.0.3:5824 (internal)</td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="prod"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-prod">PROD</span></td><td>FMG Tracking (:58421)</td><td class="url">10.1.0.3:58421 (internal)</td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="prod"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-prod">PROD</span></td><td>BCG Tracking (:58423)</td><td class="url">10.1.0.3:58423 (internal)</td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="api"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-api">API</span></td><td>Sentinel Brain</td><td class="url">10.1.0.3:5890/api/sentinel-brain.php</td><td class="cred">action=exec&cmd=...</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s95" data-cat="api"><td><span class="tag tag-s95">S95</span></td><td><span class="tag tag-api">API</span></td><td>PostgreSQL (7 users)</td><td class="url">10.1.0.3:5432</td><td class="cred">admin / admin123</td><td class="s200">200</td></tr>
|
||||
<!-- S151 -->
|
||||
<tr data-srv="s151" data-cat="prod"><td><span class="tag tag-s151">S151</span></td><td><span class="tag tag-prod">PROD</span></td><td>Consent App</td><td class="url"><a href="https://consent.wevup.app" target="_blank">consent.wevup.app</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<tr data-srv="s151" data-cat="prod"><td><span class="tag tag-s151">S151</span></td><td><span class="tag tag-prod">PROD</span></td><td>Track App</td><td class="url"><a href="https://track.wevup.app" target="_blank">track.wevup.app</a></td><td>—</td><td class="s200">200</td></tr>
|
||||
<!-- EXTERNAL -->
|
||||
<tr data-srv="s204" data-cat="ext"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-ext">EXT</span></td><td>Groq Cloud</td><td class="url"><a href="https://console.groq.com" target="_blank">console.groq.com</a></td><td class="cred">gsk_dxQqg...NZJ</td><td class="s200">✅</td></tr>
|
||||
<tr data-srv="s204" data-cat="ext"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-ext">EXT</span></td><td>Cerebras Cloud</td><td class="url"><a href="https://cloud.cerebras.ai" target="_blank">cloud.cerebras.ai</a></td><td class="cred">csk-4wrr...fckh</td><td class="s200">✅</td></tr>
|
||||
<tr data-srv="s204" data-cat="ext"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-ext">EXT</span></td><td>OpenRouter</td><td class="url"><a href="https://openrouter.ai" target="_blank">openrouter.ai</a></td><td class="cred">sk-or-v1-8b405a...ff8e8</td><td class="s200">✅ (rate-limited free)</td></tr>
|
||||
<tr data-srv="s204" data-cat="ext"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-ext">EXT</span></td><td>GLM-5 (Zhipu)</td><td class="url"><a href="https://open.bigmodel.cn" target="_blank">open.bigmodel.cn</a></td><td class="cred">ac5091ee...9JmW (0 credits)</td><td class="s500">🔑 needs credits</td></tr>
|
||||
<tr data-srv="s204" data-cat="ext"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-ext">EXT</span></td><td>CodeRabbit</td><td class="url"><a href="https://app.coderabbit.ai" target="_blank">app.coderabbit.ai</a></td><td class="cred">GitHub Yacineutt</td><td class="s200">✅</td></tr>
|
||||
<tr data-srv="s204" data-cat="ext"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-ext">EXT</span></td><td>Hetzner Cloud</td><td class="url"><a href="https://console.hetzner.cloud" target="_blank">console.hetzner.cloud</a></td><td class="cred">Token: xUcb...1Yf7...</td><td class="s200">✅</td></tr>
|
||||
<tr data-srv="s204" data-cat="ext"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-ext">EXT</span></td><td>Cloudflare</td><td class="url"><a href="https://dash.cloudflare.com" target="_blank">dash.cloudflare.com</a></td><td class="cred">ymahboub@weval / Zone 1488bb...</td><td class="s200">✅</td></tr>
|
||||
<tr data-srv="s204" data-cat="ext"><td><span class="tag tag-s204">S204</span></td><td><span class="tag tag-ext">EXT</span></td><td>GitHub (Yacineutt)</td><td class="url"><a href="https://github.com/Yacineutt/weval-consulting" target="_blank">github.com/Yacineutt</a></td><td class="cred">PAT ghp_Z0WD...4WFfLh</td><td class="s200">✅</td></tr>
|
||||
</tbody></table></div>
|
||||
</div>
|
||||
<script>
|
||||
function filterRows(){const q=document.getElementById('search').value.toLowerCase();document.querySelectorAll('#rows tr').forEach(r=>{r.style.display=r.textContent.toLowerCase().includes(q)?'':'none'})}
|
||||
function filterCat(btn,cat){document.querySelectorAll('.filter-btn').forEach(b=>b.classList.remove('active'));btn.classList.add('active');document.querySelectorAll('#rows tr').forEach(r=>{if(cat==='all'){r.style.display=''}else{r.style.display=r.dataset.srv===cat||r.dataset.cat===cat?'':'none'}})}
|
||||
// Count
|
||||
const rows=document.querySelectorAll('#rows tr');let p=0,f=0;rows.forEach(r=>{const s=r.querySelector('td:last-child');if(s&&(s.classList.contains('s200')||s.classList.contains('s301')||s.classList.contains('s302')||s.textContent.includes('OK')||s.textContent.includes('✅')||s.textContent.includes('GB')))p++;else f++});
|
||||
document.getElementById('totalPass').textContent=p;document.getElementById('totalFail').textContent=f;document.getElementById('totalScreens').textContent=rows.length;
|
||||
</script>
|
||||
</body></html>
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user