319 lines
19 KiB
HTML
Executable File
319 lines
19 KiB
HTML
Executable File
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
|
<meta charset="UTF-8">
|
|
<title>Sidebar Admin - WEVADS</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
<style>
|
|
:root{--bg:#030308;--card:#0f0f1a;--hover:#1a1a2e;--cyan:#00ffff;--green:#00ff88;--purple:#bf00ff;--orange:#ff6600;--red:#ff3366;--text:#fff;--dim:#667;--border:rgba(0,255,255,0.25)}
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
body{font-family:system-ui,sans-serif;background:var(--bg);color:var(--text);min-height:100vh}
|
|
.header{display:flex;justify-content:space-between;align-items:center;padding:15px 20px;background:linear-gradient(135deg,rgba(0,255,255,0.06),rgba(191,0,255,0.06));border-bottom:1px solid var(--border)}
|
|
.header h1{font-size:1.3em;color:var(--cyan)}
|
|
.btn{padding:8px 16px;border:none;border-radius:6px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:6px;font-size:0.85em}
|
|
.btn-p{background:var(--cyan);color:var(--bg)}
|
|
.btn-g{background:var(--green);color:var(--bg)}
|
|
.btn-sec{background:transparent;border:1px solid var(--border);color:var(--text)}
|
|
.main{display:grid;grid-template-columns:1fr 60px 1fr;height:calc(100vh - 60px)}
|
|
.panel{background:var(--card);display:flex;flex-direction:column;overflow:hidden}
|
|
.panel-header{padding:10px 15px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}
|
|
.panel-title{font-size:0.9em;color:var(--cyan);display:flex;align-items:center;gap:8px}
|
|
.panel-body{flex:1;overflow-y:auto;padding:10px}
|
|
.search{width:100%;padding:8px 12px;background:rgba(0,0,0,0.4);border:1px solid var(--border);border-radius:6px;color:var(--text);margin-bottom:10px;font-size:0.85em}
|
|
.search:focus{outline:none;border-color:var(--cyan)}
|
|
.center{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:var(--bg);border-left:1px solid var(--border);border-right:1px solid var(--border)}
|
|
.tbtn{width:40px;height:40px;border:2px solid var(--cyan);border-radius:50%;background:rgba(0,255,255,0.1);color:var(--cyan);cursor:pointer;font-size:1em}
|
|
.tbtn:hover{background:var(--cyan);color:var(--bg)}
|
|
.item{display:flex;align-items:center;padding:8px 10px;background:rgba(0,0,0,0.2);border:1px solid transparent;border-radius:6px;margin-bottom:4px;cursor:pointer;font-size:0.85em}
|
|
.item:hover{border-color:var(--border);background:var(--hover)}
|
|
.item.selected{border-color:var(--cyan);background:rgba(0,255,255,0.1)}
|
|
.item-icon{width:24px;margin-right:8px;text-align:center}
|
|
.item-info{flex:1;min-width:0}
|
|
.item-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
.item-path{font-size:0.7em;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
.cat{font-size:0.75em;color:var(--cyan);padding:8px 5px 4px;font-weight:600;border-bottom:1px solid var(--border);margin-bottom:6px}
|
|
.menu-parent{background:rgba(0,255,255,0.05);border:1px solid var(--border);font-weight:600;margin-bottom:2px}
|
|
.menu-parent .item-icon{background:linear-gradient(135deg,var(--cyan),var(--purple));border-radius:4px;color:#fff}
|
|
.children{padding-left:15px;border-left:2px solid var(--border);margin-left:12px;margin-bottom:8px}
|
|
.mbtn{width:22px;height:22px;border:none;border-radius:4px;background:rgba(0,255,255,0.1);color:var(--cyan);cursor:pointer;font-size:0.7em;margin-left:3px}
|
|
.mbtn:hover{background:var(--cyan);color:var(--bg)}
|
|
.mbtn.del{background:rgba(255,51,102,0.1);color:var(--red)}
|
|
.mbtn.del:hover{background:var(--red);color:#fff}
|
|
.alert{position:fixed;top:70px;right:20px;padding:10px 15px;border-radius:6px;font-size:0.85em;z-index:100}
|
|
.alert-success{background:rgba(0,255,136,0.15);border:1px solid var(--green);color:var(--green)}
|
|
.alert-error{background:rgba(255,51,102,0.15);border:1px solid var(--red);color:var(--red)}
|
|
.instructions{background:rgba(255,102,0,0.1);border:1px solid var(--orange);border-radius:8px;padding:12px;margin-top:10px;font-size:0.8em}
|
|
.instructions h4{color:var(--orange);margin-bottom:8px}
|
|
.instructions li{margin-bottom:4px;color:var(--dim)}
|
|
|
|
.sc,.card,[class*="stat-card"]{transition:all .25s ease;position:relative;overflow:hidden}
|
|
.sc:hover,.card:hover,[class*="stat-card"]:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,0,0,.25)}
|
|
.sc::after,.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--cy,#22d3ee);opacity:0;transition:opacity .25s}
|
|
.sc:hover::after,.card:hover::after{opacity:.7}
|
|
.btn,.button,[class*="btn-"]{transition:all .2s ease}
|
|
.btn:hover,.button:hover{transform:translateY(-1px)}
|
|
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
|
|
.sc,.card{animation:fadeIn .4s ease both}
|
|
.sc:nth-child(2),.card:nth-child(2){animation-delay:.05s}
|
|
.sc:nth-child(3),.card:nth-child(3){animation-delay:.1s}
|
|
.sc:nth-child(4),.card:nth-child(4){animation-delay:.15s}
|
|
.sc:nth-child(5),.card:nth-child(5){animation-delay:.2s}
|
|
.sc:nth-child(6),.card:nth-child(6){animation-delay:.25s}
|
|
</style>
|
|
|
|
<link rel="stylesheet" href="wevads-global.css?v1770777318">
|
|
</head>
|
|
<body>
|
|
<header class="header">
|
|
<h1>🎛️ Sidebar Admin</h1>
|
|
<div style="display:flex;gap:8px">
|
|
<button class="btn btn-sec" onclick="location.reload()"><i class="fas fa-sync"></i> Refresh</button>
|
|
<button class="btn btn-g" onclick="saveMenu()"><i class="fas fa-save"></i> Sauvegarder</button>
|
|
</div>
|
|
</header>
|
|
<div class="main">
|
|
<div class="panel">
|
|
<div class="panel-header">
|
|
<div class="panel-title"><i class="fas fa-folder-open"></i> Fichiers Serveur</div>
|
|
<span style="font-size:0.75em;color:var(--dim)" id="cnt">0</span>
|
|
</div>
|
|
<div class="panel-body">
|
|
<input type="text" class="search" placeholder="🔍 Rechercher..." onkeyup="filter(this.value)">
|
|
<div id="files"></div>
|
|
</div>
|
|
</div>
|
|
<div class="center">
|
|
<button class="tbtn" onclick="addSel()" title="Ajouter →"><i class="fas fa-chevron-right"></i></button>
|
|
<button class="tbtn" onclick="remSel()" title="← Retirer"><i class="fas fa-chevron-left"></i></button>
|
|
</div>
|
|
<div class="panel">
|
|
<div class="panel-header">
|
|
<div class="panel-title"><i class="fas fa-sitemap"></i> Structure Menu</div>
|
|
<button class="btn btn-sec" style="padding:4px 10px;font-size:0.75em" onclick="addParent()"><i class="fas fa-plus"></i> Parent</button>
|
|
</div>
|
|
<div class="panel-body">
|
|
<div id="menu"></div>
|
|
<div class="instructions">
|
|
<h4><i class="fas fa-info-circle"></i> Instructions</h4>
|
|
<ul>
|
|
<li><b>Ajouter:</b> Cliquez sur une page puis sur → dans un menu</li>
|
|
<li><b>Supprimer:</b> Cliquez sur 🗑️ à côté de l'élément</li>
|
|
<li><b>Réorganiser:</b> Glissez-déposez les éléments</li>
|
|
<li><b>3 niveaux:</b> Parent → Enfant → Sous-enfant</li>
|
|
<li><b>Sauvegarder:</b> Cliquez sur le bouton vert</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="alerts"></div>
|
|
<script>
|
|
const F=[
|
|
// HAMID Principal
|
|
{n:'HAMID Fullscreen',p:'/hamid-fullscreen.php',i:'💬',c:'HAMID Chat'},
|
|
{n:'HAMID Widget',p:'/hamid-widget.php',i:'📦',c:'HAMID Chat'},
|
|
{n:'HAMID Index',p:'/hamid-index.php',i:'🏠',c:'HAMID Chat'},
|
|
{n:'HAMID Stream',p:'/hamid-stream.php',i:'🌊',c:'HAMID Chat'},
|
|
// HAMID CLI/Code
|
|
{n:'HAMID CLI',p:'/hamid-cli.php',i:'📟',c:'HAMID CLI'},
|
|
{n:'HAMID Code (Full)',p:'/hamid-code.php',i:'💻',c:'HAMID CLI'},
|
|
{n:'HAMID Code (Light)',p:'/hamid-code/',i:'💻',c:'HAMID CLI'},
|
|
{n:'HAMID Execute',p:'/hamid-execute.php',i:'▶️',c:'HAMID CLI'},
|
|
{n:'HAMID Claude',p:'/hamid-claude.php',i:'🤖',c:'HAMID CLI'},
|
|
{n:'HAMID GPTs',p:'/hamid-gpts.php',i:'🤖',c:'HAMID CLI'},
|
|
// HAMID SSH
|
|
{n:'HAMID SSH',p:'/hamid-ssh.php',i:'🔌',c:'HAMID SSH'},
|
|
{n:'HAMID SSH Server',p:'/hamid-ssh-server.php',i:'🖥️',c:'HAMID SSH'},
|
|
{n:'HAMID WEVADS API',p:'/hamid-wevads-api.php',i:'📡',c:'HAMID SSH'},
|
|
{n:'HAMID Repair API',p:'/hamid-repair-api.php',i:'🔧',c:'HAMID SSH'},
|
|
{n:'HAMID Test API',p:'/hamid-test-api.php',i:'🧪',c:'HAMID SSH'},
|
|
// HAMID Visual
|
|
{n:'HAMID Canvas',p:'/hamid-canvas.php',i:'🎨',c:'HAMID Visual'},
|
|
{n:'HAMID Image',p:'/hamid-image.php',i:'🖼️',c:'HAMID Visual'},
|
|
{n:'HAMID Voice',p:'/hamid-voice.php',i:'🎤',c:'HAMID Visual'},
|
|
// HAMID Search/Gen
|
|
{n:'HAMID Search',p:'/hamid-search.php',i:'🔍',c:'HAMID Search'},
|
|
{n:'HAMID Generate',p:'/hamid-generate.php',i:'✨',c:'HAMID Search'},
|
|
{n:'HAMID Generate Long',p:'/hamid-generate-long.php',i:'📝',c:'HAMID Search'},
|
|
{n:'HAMID Memory',p:'/hamid-memory.php',i:'💾',c:'HAMID Search'},
|
|
{n:'HAMID KB API',p:'/hamid-kb-api.php',i:'📚',c:'HAMID Search'},
|
|
// HAMID Admin
|
|
{n:'HAMID Dashboard',p:'/hamid-dashboard.php',i:'📊',c:'HAMID Admin'},
|
|
{n:'HAMID Admin',p:'/hamid-admin.php',i:'⚙️',c:'HAMID Admin'},
|
|
{n:'HAMID Control Center',p:'/hamid-control-center.php',i:'🎛️',c:'HAMID Admin'},
|
|
{n:'HAMID Providers',p:'/hamid-providers.php',i:'🔌',c:'HAMID Admin'},
|
|
{n:'HAMID Providers Config',p:'/hamid-providers-config.php',i:'⚙️',c:'HAMID Admin'},
|
|
{n:'HAMID Brain Config',p:'/hamid-brain-config.php',i:'🧠',c:'HAMID Admin'},
|
|
{n:'HAMID Brain Monitor',p:'/hamid-brain-monitor.php',i:'👁️',c:'HAMID Admin'},
|
|
{n:'HAMID Failover',p:'/hamid-failover.php',i:'🔄',c:'HAMID Admin'},
|
|
{n:'HAMID Failover Monitor',p:'/hamid-failover-monitor.php',i:'🔄',c:'HAMID Admin'},
|
|
{n:'HAMID Health',p:'/hamid-health.php',i:'🩺',c:'HAMID Admin'},
|
|
{n:'HAMID Status',p:'/hamid-status.php',i:'📶',c:'HAMID Admin'},
|
|
{n:'HAMID Monitor',p:'/hamid-monitor.php',i:'👁️',c:'HAMID Admin'},
|
|
{n:'HAMID Monitor API',p:'/hamid-monitor-api.php',i:'📡',c:'HAMID Admin'},
|
|
{n:'HAMID Personas',p:'/hamid-personas.php',i:'🎭',c:'HAMID Admin'},
|
|
{n:'HAMID History',p:'/hamid-history.php',i:'📜',c:'HAMID Admin'},
|
|
{n:'HAMID Selector',p:'/hamid-selector.php',i:'🎯',c:'HAMID Admin'},
|
|
{n:'HAMID Login',p:'/hamid-login.php',i:'🔐',c:'HAMID Admin'},
|
|
{n:'HAMID Auth',p:'/hamid-auth.php',i:'🔑',c:'HAMID Admin'},
|
|
{n:'HAMID Maintenance',p:'/hamid-maintenance.php',i:'🔧',c:'HAMID Admin'},
|
|
{n:'HAMID Router Dashboard',p:'/hamid-router-dashboard.php',i:'🔀',c:'HAMID Admin'},
|
|
// Brain IA
|
|
{n:'Brain Central',p:'/brain-central.html',i:'🧠',c:'Brain IA'},
|
|
{n:'Brain Editor',p:'/brain_editor.php',i:'✏️',c:'Brain IA'},
|
|
{n:'Brain Manager',p:'/brain-manager.php',i:'🧠',c:'Brain IA'},
|
|
{n:'Process Supervision',p:'/process-supervision.php',i:'👁️',c:'Brain IA'},
|
|
// Widgets
|
|
{n:'IA Routines Monitor',p:'/widgets/routines_dashboard.html',i:'🔄',c:'Widgets'},
|
|
{n:'IA Routines v2',p:'/widgets/routines_dashboard_v2.html',i:'🔄',c:'Widgets'},
|
|
{n:'Cloud Health',p:'/widgets/cloud_health.html',i:'☁️',c:'Widgets'},
|
|
// Deliverads
|
|
{n:'Brain Admin',p:'/deliverads/brain-admin.php',i:'👑',c:'Deliverads'},
|
|
{n:'Brain Dashboard',p:'/deliverads/brain-dashboard.php',i:'📊',c:'Deliverads'},
|
|
{n:'Brain Engine',p:'/deliverads/brain-engine.php',i:'⚙️',c:'Deliverads'},
|
|
{n:'Brain Engine Open',p:'/deliverads/brain-engine-open.php',i:'🔓',c:'Deliverads'},
|
|
{n:'Brain Auto',p:'/deliverads/brain-auto.php',i:'🤖',c:'Deliverads'},
|
|
{n:'HAMID Deliverads',p:'/deliverads/hamid.php',i:'💬',c:'Deliverads'},
|
|
{n:'HAMID Orchestrator',p:'/deliverads/hamid-orchestrator.php',i:'🎭',c:'Deliverads'},
|
|
{n:'HAMID Control',p:'/deliverads/hamid-control.php',i:'🎛️',c:'Deliverads'},
|
|
// Deliverads API
|
|
{n:'Brain Test Engine',p:'/deliverads/api/brain_test_engine.php',i:'🧪',c:'Deliverads API'},
|
|
{n:'Brain Control API',p:'/deliverads/api/brain_control.php',i:'🎛️',c:'Deliverads API'},
|
|
{n:'HAMID Bridge',p:'/deliverads/api/hamid-bridge.php',i:'🔗',c:'Deliverads API'},
|
|
{n:'HAMID Brain Connect',p:'/deliverads/api/hamid_brain_connect.php',i:'🔗',c:'Deliverads API'},
|
|
// Commonia
|
|
{n:'Commonia Brain',p:'/commonia/commonia-brain.php',i:'🧠',c:'Commonia'},
|
|
{n:'Commonia Engine',p:'/commonia/hamid-engine.php',i:'⚙️',c:'Commonia'},
|
|
{n:'Commonia Search',p:'/commonia/hamid-search.php',i:'🔍',c:'Commonia'},
|
|
{n:'Commonia Tools',p:'/commonia/hamid-tools.php',i:'🔧',c:'Commonia'},
|
|
{n:'Mini Claude Engine',p:'/commonia/mini-claude-engine.php',i:'🤖',c:'Commonia'},
|
|
{n:'Commonia Providers',p:'/commonia/providers.php',i:'🔌',c:'Commonia'},
|
|
// APIs
|
|
{n:'Brain Core API',p:'/api/brain-core.php',i:'🧠',c:'APIs'},
|
|
{n:'Brain API',p:'/api/brain.php',i:'📧',c:'APIs'},
|
|
{n:'Brain Engine API',p:'/api/brain-engine.php',i:'⚙️',c:'APIs'},
|
|
{n:'Brain Config API',p:'/api/brain_config.php',i:'⚙️',c:'APIs'},
|
|
{n:'HAMID API',p:'/api/hamid-api.php',i:'🤖',c:'APIs'},
|
|
{n:'HAMID Brain API',p:'/api/hamid-brain.php',i:'🔗',c:'APIs'},
|
|
// Admin
|
|
{n:'Sidebar Admin',p:'/sidebar-admin.html',i:'🎛️',c:'Admin'},
|
|
{n:'Adminer DB',p:'/0adminer.php',i:'🗄️',c:'Admin'},
|
|
// N8N
|
|
{n:'N8N Interface',p:'/n8n-interface.php',i:'🚀',c:'N8N'},
|
|
{n:'N8N Orchestrator',p:'/n8n-orchestrator.php',i:'⚙️',c:'N8N'},
|
|
{n:'N8N Workflows',p:'/n8n-workflows.php',i:'🔄',c:'N8N'},
|
|
// Main Pages
|
|
{n:'Dashboard',p:'/dashboard.php',i:'🏠',c:'Main'},
|
|
{n:'Index',p:'/index.php',i:'🏠',c:'Main'},
|
|
];
|
|
let M=[
|
|
{t:'Brain IA',i:'fas fa-brain',ch:[
|
|
{t:'Brain Central',u:'/brain-central.html',i:'🧠'},
|
|
{t:'Process Supervision',u:'/process-supervision.php',i:'👁️'},
|
|
{t:'IA Routines Monitor',u:'/widgets/routines_dashboard.html',i:'🔄'},
|
|
{t:'Cloud Health',u:'/widgets/cloud_health.html',i:'☁️'},
|
|
{t:'Brain Config Editor',u:'/brain_editor.php',i:'✏️'},
|
|
{t:'Sidebar Admin',u:'/sidebar-admin.html',i:'🎛️'},
|
|
]},
|
|
{t:'WEVAL IA',i:'fas fa-robot',ch:[
|
|
{t:'💬 Chat IA',u:'/hamid-fullscreen.php',i:'💬'},
|
|
{t:'📟 CLI Web',u:'/hamid-cli.php',i:'📟'},
|
|
{t:'💻 Code Editor',u:'/hamid-code.php',i:'💻'},
|
|
{t:'🔌 IA SSH',u:'/hamid-ssh.php',i:'🔌'},
|
|
{t:'📊 Dashboard',u:'/hamid-dashboard.php',i:'📊'},
|
|
]},
|
|
];
|
|
let selF=null,selM=null,selP=null;
|
|
|
|
function render(){
|
|
let h='',cc='';
|
|
F.forEach((f,i)=>{
|
|
if(f.c!==cc){cc=f.c;h+='<div class="cat"><i class="fas fa-folder"></i> '+cc+'</div>';}
|
|
h+='<div class="item" id="f'+i+'" onclick="selFile('+i+')"><span class="item-icon">'+f.i+'</span><div class="item-info"><div class="item-name">'+f.n+'</div><div class="item-path">'+f.p+'</div></div></div>';
|
|
});
|
|
document.getElementById('files').innerHTML=h;
|
|
document.getElementById('cnt').textContent=F.length+' fichiers';
|
|
renderMenu();
|
|
}
|
|
|
|
function renderMenu(){
|
|
let h='';
|
|
M.forEach((p,pi)=>{
|
|
h+='<div class="item menu-parent" id="p'+pi+'" onclick="selParent('+pi+')"><span class="item-icon"><i class="'+p.i+'"></i></span><div class="item-info"><div class="item-name">'+p.t+'</div></div><button class="mbtn" onclick="event.stopPropagation();addToParent('+pi+')" title="+ Ajouter"><i class="fas fa-plus"></i></button><button class="mbtn" onclick="event.stopPropagation();editP('+pi+')"><i class="fas fa-edit"></i></button><button class="mbtn del" onclick="event.stopPropagation();delP('+pi+')"><i class="fas fa-trash"></i></button></div>';
|
|
h+='<div class="children">';
|
|
if(p.ch)p.ch.forEach((c,ci)=>{
|
|
h+='<div class="item" id="c'+pi+'_'+ci+'" onclick="selChild('+pi+','+ci+')"><span class="item-icon">'+c.i+'</span><div class="item-info"><div class="item-name">'+c.t+'</div><div class="item-path">'+c.u+'</div></div><button class="mbtn" onclick="event.stopPropagation();editC('+pi+','+ci+')"><i class="fas fa-edit"></i></button><button class="mbtn del" onclick="event.stopPropagation();delC('+pi+','+ci+')"><i class="fas fa-trash"></i></button></div>';
|
|
});
|
|
h+='</div>';
|
|
});
|
|
document.getElementById('menu').innerHTML=h;
|
|
}
|
|
|
|
function filter(q){q=q.toLowerCase();document.querySelectorAll('#files .item').forEach(e=>{const n=e.querySelector('.item-name').textContent.toLowerCase();e.style.display=n.includes(q)?'flex':'none';});}
|
|
|
|
function selFile(i){document.querySelectorAll('.item').forEach(e=>e.classList.remove('selected'));document.getElementById('f'+i).classList.add('selected');selF=F[i];selM=null;}
|
|
function selParent(i){document.querySelectorAll('.item').forEach(e=>e.classList.remove('selected'));document.getElementById('p'+i).classList.add('selected');selP=i;selM={t:'p',i:i};selF=null;}
|
|
function selChild(pi,ci){document.querySelectorAll('.item').forEach(e=>e.classList.remove('selected'));document.getElementById('c'+pi+'_'+ci).classList.add('selected');selP=pi;selM={t:'c',pi:pi,ci:ci};selF=null;}
|
|
|
|
function addSel(){
|
|
if(!selF){alert('Sélectionnez un fichier à gauche!');return;}
|
|
if(selP===null){alert('Sélectionnez un menu parent à droite!');return;}
|
|
M[selP].ch.push({t:selF.n,u:selF.p,i:selF.i});
|
|
renderMenu();
|
|
showAlert('Ajouté: '+selF.n,'success');
|
|
selF=null;document.querySelectorAll('.item').forEach(e=>e.classList.remove('selected'));
|
|
}
|
|
|
|
function addToParent(pi){
|
|
if(!selF){alert('Sélectionnez d\'abord un fichier à gauche!');return;}
|
|
M[pi].ch.push({t:selF.n,u:selF.p,i:selF.i});
|
|
renderMenu();
|
|
showAlert('Ajouté à '+M[pi].t,'success');
|
|
selF=null;document.querySelectorAll('.item').forEach(e=>e.classList.remove('selected'));
|
|
}
|
|
|
|
function remSel(){
|
|
if(!selM){alert('Sélectionnez un élément du menu!');return;}
|
|
if(selM.t==='p'){if(confirm('Supprimer "'+M[selM.i].t+'" et tous ses enfants?')){M.splice(selM.i,1);renderMenu();showAlert('Supprimé','success');}}
|
|
else{M[selM.pi].ch.splice(selM.ci,1);renderMenu();showAlert('Supprimé','success');}
|
|
selM=null;
|
|
}
|
|
|
|
function addParent(){
|
|
const t=prompt('Nom du menu parent:');
|
|
if(t){M.push({t:t,i:'fas fa-folder',ch:[]});renderMenu();showAlert('Parent créé: '+t,'success');}
|
|
}
|
|
|
|
function editP(i){const t=prompt('Nouveau titre:',M[i].t);if(t){M[i].t=t;renderMenu();}}
|
|
function delP(i){if(confirm('Supprimer "'+M[i].t+'"?')){M.splice(i,1);renderMenu();showAlert('Supprimé','success');}}
|
|
function editC(pi,ci){const c=M[pi].ch[ci];const t=prompt('Titre:',c.t);if(t){c.t=t;const u=prompt('URL:',c.u);if(u)c.u=u;renderMenu();}}
|
|
function delC(pi,ci){if(confirm('Supprimer?')){M[pi].ch.splice(ci,1);renderMenu();showAlert('Supprimé','success');}}
|
|
|
|
function saveMenu(){
|
|
let h='';
|
|
M.forEach(p=>{
|
|
h+='<li class="nav-item"><a href="javascript:;" class="nav-link nav-toggle"><i class="'+p.i+'"></i><span class="title">'+p.t+'</span><span class="arrow"></span></a><ul class="sub-menu">';
|
|
p.ch.forEach(c=>{h+='<li><a href="'+c.u+'" class="nav-link"><span class="title">'+c.t+'</span></a></li>';});
|
|
h+='</ul></li>';
|
|
});
|
|
console.log('=== MENU HTML ===\n'+h);
|
|
navigator.clipboard.writeText(h).then(()=>showAlert('Copié! Voir console F12','success')).catch(()=>showAlert('Voir console F12','success'));
|
|
alert('Menu HTML copié!\n\n1. Éditez /opt/wevads/app/views/includes/menu.html\n2. Remplacez les sections Brain IA et WEVAL IA\n3. systemctl restart apache2');
|
|
}
|
|
|
|
function showAlert(m,t){
|
|
const a=document.createElement('div');
|
|
a.className='alert alert-'+t;
|
|
a.innerHTML='<i class="fas fa-'+(t==='success'?'check':'info')+'-circle"></i> '+m;
|
|
document.getElementById('alerts').appendChild(a);
|
|
setTimeout(()=>a.remove(),3000);
|
|
}
|
|
|
|
render();
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|