Files
wevads-platform/scripts/sidebar-process.php
2026-02-26 04:53:11 +01:00

749 lines
28 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// ═══════════════════════════════════════════════════════════════════
// SIDEBAR ADMIN - PROCESS FLOW & SUPERVISION
// ═══════════════════════════════════════════════════════════════════
$menuFile = '/opt/wevads/app/views/includes/menu.html';
$apiFile = '/opt/wevads/public/api/save-menu.php';
$adminFile = '/opt/wevads/public/sidebar-admin.php';
// System checks
$checks = [
'menu_exists' => file_exists($menuFile),
'menu_writable' => is_writable($menuFile),
'api_exists' => file_exists($apiFile),
'admin_exists' => file_exists($adminFile),
];
// Menu stats
$menuStats = ['parents' => 0, 'children' => 0, 'lines' => 0, 'size' => 0];
if ($checks['menu_exists']) {
$html = file_get_contents($menuFile);
preg_match_all('/nav-toggle/', $html, $m);
$menuStats['parents'] = count($m[0]);
preg_match_all('/<li><a href/', $html, $c);
$menuStats['children'] = count($c[0]);
$menuStats['lines'] = count(file($menuFile));
$menuStats['size'] = filesize($menuFile);
}
// File count
$fileCount = 0;
$excludeDirs = ['plugins','css','js','images','uploads','chrome','tmp','storage','assets','styles','videos','media','data','config','fonts','webfonts'];
function countFiles($dir, $exDirs) {
$count = 0;
if (!is_dir($dir)) return 0;
foreach (scandir($dir) as $f) {
if ($f[0] === '.') continue;
$path = $dir . '/' . $f;
if (is_dir($path)) {
if (!in_array($f, $exDirs)) $count += countFiles($path, $exDirs);
} else {
$ext = pathinfo($f, PATHINFO_EXTENSION);
if (in_array($ext, ['php', 'html'])) $count++;
}
}
return $count;
}
$fileCount = countFiles('/opt/wevads/public', $excludeDirs);
// All checks passed?
$allOK = $checks['menu_exists'] && $checks['menu_writable'] && $checks['admin_exists'];
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Sidebar Admin - Process Flow & Supervision</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
@media print {
body { background: #fff !important; color: #000 !important; }
.no-print { display: none !important; }
.step-box { break-inside: avoid; }
.process-section { break-before: page; }
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: linear-gradient(180deg, #0a0a15 0%, #0f0f1a 100%);
color: #fff;
min-height: 100vh;
line-height: 1.5;
}
/* Header */
.header {
background: linear-gradient(135deg, rgba(0,255,255,0.1), rgba(191,0,255,0.1));
border-bottom: 2px solid rgba(0,255,255,0.3);
padding: 20px 30px;
display: flex;
justify-content: space-between;
align-items: center;
}
.header h1 {
font-size: 1.5em;
color: #00ffff;
display: flex;
align-items: center;
gap: 12px;
}
.header h1 i { color: #bf00ff; }
.header-info {
display: flex;
gap: 20px;
align-items: center;
}
.header-stat {
text-align: center;
padding: 8px 15px;
background: rgba(0,0,0,0.3);
border-radius: 8px;
border: 1px solid rgba(0,255,255,0.2);
}
.header-stat .val { font-size: 1.4em; font-weight: bold; color: #00ff88; }
.header-stat .lbl { font-size: 0.7em; color: #667; }
/* Actions */
.actions {
display: flex;
gap: 10px;
}
.btn {
padding: 10px 18px;
border: none;
border-radius: 6px;
cursor: pointer;
font-weight: 600;
font-size: 0.85em;
display: inline-flex;
align-items: center;
gap: 8px;
text-decoration: none;
transition: all 0.3s;
}
.btn-primary { background: linear-gradient(135deg, #00ffff, #00cc99); color: #000; }
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 5px 20px rgba(0,255,255,0.3); }
.btn-secondary { background: rgba(255,255,255,0.1); border: 1px solid rgba(0,255,255,0.3); color: #fff; }
.btn-secondary:hover { background: rgba(0,255,255,0.1); }
.btn-success { background: linear-gradient(135deg, #00ff88, #00cc6a); color: #000; }
.btn-print { background: rgba(191,0,255,0.2); border: 1px solid #bf00ff; color: #bf00ff; }
/* Container */
.container {
max-width: 1400px;
margin: 0 auto;
padding: 30px;
}
/* Section */
.section {
margin-bottom: 30px;
}
.section-title {
font-size: 1.2em;
color: #00ffff;
margin-bottom: 15px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(0,255,255,0.2);
display: flex;
align-items: center;
gap: 10px;
}
.section-title i { color: #bf00ff; }
/* Process Flow */
.process-flow {
display: flex;
align-items: flex-start;
gap: 0;
overflow-x: auto;
padding: 20px 0;
}
.step-box {
min-width: 180px;
max-width: 200px;
background: rgba(0,0,0,0.4);
border: 2px solid rgba(0,255,255,0.2);
border-radius: 12px;
padding: 15px;
text-align: center;
position: relative;
}
.step-box.active { border-color: #00ffff; box-shadow: 0 0 20px rgba(0,255,255,0.2); }
.step-box.ok { border-color: #00ff88; }
.step-box.error { border-color: #ff3366; }
.step-number {
position: absolute;
top: -12px;
left: 50%;
transform: translateX(-50%);
background: #bf00ff;
color: #fff;
width: 24px;
height: 24px;
border-radius: 50%;
font-size: 0.75em;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
}
.step-icon {
width: 50px;
height: 50px;
margin: 10px auto;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.3em;
}
.step-icon.ok { background: rgba(0,255,136,0.2); color: #00ff88; }
.step-icon.warn { background: rgba(255,170,0,0.2); color: #ffaa00; }
.step-icon.err { background: rgba(255,50,100,0.2); color: #ff3366; }
.step-icon.info { background: rgba(0,255,255,0.2); color: #00ffff; }
.step-icon.action { background: rgba(191,0,255,0.2); color: #bf00ff; }
.step-title { font-weight: 600; font-size: 0.9em; margin: 8px 0 5px; }
.step-desc { font-size: 0.7em; color: #888; margin-bottom: 8px; }
.step-status {
font-size: 0.65em;
padding: 3px 10px;
border-radius: 12px;
display: inline-block;
}
.step-status.ok { background: rgba(0,255,136,0.2); color: #00ff88; }
.step-status.warn { background: rgba(255,170,0,0.2); color: #ffaa00; }
.step-status.err { background: rgba(255,50,100,0.2); color: #ff3366; }
.arrow {
min-width: 40px;
height: 3px;
background: linear-gradient(90deg, #00ffff, #bf00ff);
margin-top: 50px;
position: relative;
}
.arrow::after {
content: '';
position: absolute;
right: -6px;
top: -5px;
border: 6px solid transparent;
border-left-color: #bf00ff;
}
/* Checklist */
.checklist {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 15px;
}
.check-item {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 15px;
background: rgba(0,0,0,0.3);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 8px;
}
.check-icon {
width: 30px;
height: 30px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9em;
}
.check-icon.ok { background: rgba(0,255,136,0.2); color: #00ff88; }
.check-icon.err { background: rgba(255,50,100,0.2); color: #ff3366; }
.check-info { flex: 1; }
.check-title { font-weight: 600; font-size: 0.85em; }
.check-path { font-size: 0.7em; color: #667; font-family: monospace; }
/* Detailed Steps */
.detailed-steps {
counter-reset: step-counter;
}
.detailed-step {
display: flex;
gap: 20px;
margin-bottom: 25px;
padding: 20px;
background: rgba(0,0,0,0.3);
border: 1px solid rgba(0,255,255,0.15);
border-radius: 10px;
counter-increment: step-counter;
}
.detailed-step::before {
content: counter(step-counter);
min-width: 40px;
height: 40px;
background: linear-gradient(135deg, #00ffff, #bf00ff);
color: #000;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 1.1em;
}
.step-content { flex: 1; }
.step-content h3 { color: #00ffff; font-size: 1em; margin-bottom: 8px; }
.step-content p { font-size: 0.85em; color: #aaa; margin-bottom: 10px; }
.step-content .code {
background: rgba(0,0,0,0.5);
border: 1px solid rgba(0,255,255,0.2);
border-radius: 5px;
padding: 10px;
font-family: monospace;
font-size: 0.8em;
color: #00ff88;
overflow-x: auto;
}
.step-content .note {
background: rgba(255,170,0,0.1);
border-left: 3px solid #ffaa00;
padding: 8px 12px;
font-size: 0.8em;
color: #ffaa00;
margin-top: 10px;
}
.step-content .tip {
background: rgba(0,255,136,0.1);
border-left: 3px solid #00ff88;
padding: 8px 12px;
font-size: 0.8em;
color: #00ff88;
margin-top: 10px;
}
/* Test Panel */
.test-panel {
background: rgba(0,0,0,0.4);
border: 1px solid rgba(0,255,255,0.2);
border-radius: 10px;
padding: 20px;
}
.test-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 12px;
margin-bottom: 20px;
}
.test-card {
background: rgba(0,0,0,0.3);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 8px;
padding: 15px;
text-align: center;
}
.test-card .icon { font-size: 1.5em; margin-bottom: 8px; }
.test-card .val { font-size: 1.8em; font-weight: bold; color: #00ff88; }
.test-card .lbl { font-size: 0.7em; color: #667; }
.test-actions {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
#result {
margin-top: 15px;
padding: 15px;
background: rgba(0,0,0,0.5);
border: 1px solid rgba(0,255,255,0.2);
border-radius: 8px;
font-family: monospace;
font-size: 0.8em;
display: none;
max-height: 200px;
overflow-y: auto;
}
#result.show { display: block; }
#result .ok { color: #00ff88; }
#result .err { color: #ff3366; }
#result .info { color: #00ffff; }
/* Footer */
.footer {
text-align: center;
padding: 20px;
color: #444;
font-size: 0.75em;
border-top: 1px solid rgba(255,255,255,0.05);
}
</style>
</head>
<body>
<!-- HEADER -->
<div class="header no-print">
<h1><i class="fas fa-project-diagram"></i> Sidebar Admin - Process Flow</h1>
<div class="header-info">
<div class="header-stat">
<div class="val"><?= $fileCount ?></div>
<div class="lbl">Fichiers</div>
</div>
<div class="header-stat">
<div class="val"><?= $menuStats['parents'] ?></div>
<div class="lbl">Menus</div>
</div>
<div class="header-stat">
<div class="val"><?= $menuStats['children'] ?></div>
<div class="lbl">Items</div>
</div>
</div>
<div class="actions">
<button class="btn btn-print" onclick="window.print()"><i class="fas fa-print"></i> Imprimer</button>
<a href="/sidebar-admin.php" class="btn btn-primary"><i class="fas fa-rocket"></i> Lancer Admin</a>
</div>
</div>
<div class="container">
<!-- ═══════════════════════════════════════════════════════════════════ -->
<!-- VISUAL PROCESS FLOW -->
<!-- ═══════════════════════════════════════════════════════════════════ -->
<div class="section">
<div class="section-title"><i class="fas fa-stream"></i> Process Flow Principal</div>
<div class="process-flow">
<!-- Step 1: Scan -->
<div class="step-box <?= $fileCount > 0 ? 'ok' : 'error' ?>">
<div class="step-number">1</div>
<div class="step-icon <?= $fileCount > 0 ? 'ok' : 'err' ?>">
<i class="fas fa-search"></i>
</div>
<div class="step-title">Scanner Fichiers</div>
<div class="step-desc">Scan récursif /public<br><?= $fileCount ?> fichiers PHP/HTML</div>
<div class="step-status <?= $fileCount > 0 ? 'ok' : 'err' ?>">
<?= $fileCount > 0 ? '✓ Complété' : '✗ Erreur' ?>
</div>
</div>
<div class="arrow"></div>
<!-- Step 2: Parse -->
<div class="step-box <?= $checks['menu_exists'] ? 'ok' : 'error' ?>">
<div class="step-number">2</div>
<div class="step-icon <?= $checks['menu_exists'] ? 'ok' : 'err' ?>">
<i class="fas fa-code"></i>
</div>
<div class="step-title">Parser Menu</div>
<div class="step-desc">Extraction menu.html<br><?= $menuStats['parents'] ?> parents, <?= $menuStats['children'] ?> enfants</div>
<div class="step-status <?= $checks['menu_exists'] ? 'ok' : 'err' ?>">
<?= $checks['menu_exists'] ? '✓ Parsé' : '✗ Manquant' ?>
</div>
</div>
<div class="arrow"></div>
<!-- Step 3: Display -->
<div class="step-box <?= $checks['admin_exists'] ? 'ok' : 'error' ?>">
<div class="step-number">3</div>
<div class="step-icon info">
<i class="fas fa-desktop"></i>
</div>
<div class="step-title">Afficher Interface</div>
<div class="step-desc">UI double panneau<br>Fichiers ↔ Menu</div>
<div class="step-status ok">✓ Prêt</div>
</div>
<div class="arrow"></div>
<!-- Step 4: Edit -->
<div class="step-box active">
<div class="step-number">4</div>
<div class="step-icon action">
<i class="fas fa-edit"></i>
</div>
<div class="step-title">Éditer Menu</div>
<div class="step-desc">Ajouter / Modifier<br>Supprimer / Réorganiser</div>
<div class="step-status ok">Interactif</div>
</div>
<div class="arrow"></div>
<!-- Step 5: Generate -->
<div class="step-box">
<div class="step-number">5</div>
<div class="step-icon info">
<i class="fas fa-file-code"></i>
</div>
<div class="step-title">Générer HTML</div>
<div class="step-desc">Construction du<br>nouveau menu.html</div>
<div class="step-status ok">Auto</div>
</div>
<div class="arrow"></div>
<!-- Step 6: Save -->
<div class="step-box <?= $checks['menu_writable'] ? 'ok' : 'error' ?>">
<div class="step-number">6</div>
<div class="step-icon <?= $checks['menu_writable'] ? 'ok' : 'err' ?>">
<i class="fas fa-save"></i>
</div>
<div class="step-title">Sauvegarder</div>
<div class="step-desc">Écriture menu.html<br><?= round($menuStats['size']/1024, 1) ?> KB</div>
<div class="step-status <?= $checks['menu_writable'] ? 'ok' : 'err' ?>">
<?= $checks['menu_writable'] ? '✓ Writable' : '✗ Read-only' ?>
</div>
</div>
<div class="arrow"></div>
<!-- Step 7: Apply -->
<div class="step-box">
<div class="step-number">7</div>
<div class="step-icon action">
<i class="fas fa-check-double"></i>
</div>
<div class="step-title">Appliquer</div>
<div class="step-desc">Rechargement<br>Apache/Sidebar</div>
<div class="step-status ok">Manuel/Auto</div>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════════════ -->
<!-- SYSTEM CHECKS -->
<!-- ═══════════════════════════════════════════════════════════════════ -->
<div class="section">
<div class="section-title"><i class="fas fa-clipboard-check"></i> Vérifications Système</div>
<div class="checklist">
<div class="check-item">
<div class="check-icon <?= $checks['menu_exists'] ? 'ok' : 'err' ?>">
<i class="fas fa-<?= $checks['menu_exists'] ? 'check' : 'times' ?>"></i>
</div>
<div class="check-info">
<div class="check-title">Fichier Menu</div>
<div class="check-path">/opt/wevads/app/views/includes/menu.html</div>
</div>
</div>
<div class="check-item">
<div class="check-icon <?= $checks['menu_writable'] ? 'ok' : 'err' ?>">
<i class="fas fa-<?= $checks['menu_writable'] ? 'check' : 'times' ?>"></i>
</div>
<div class="check-info">
<div class="check-title">Permissions Écriture</div>
<div class="check-path">chmod 644 / www-data</div>
</div>
</div>
<div class="check-item">
<div class="check-icon <?= $checks['admin_exists'] ? 'ok' : 'err' ?>">
<i class="fas fa-<?= $checks['admin_exists'] ? 'check' : 'times' ?>"></i>
</div>
<div class="check-info">
<div class="check-title">Sidebar Admin</div>
<div class="check-path">/opt/wevads/public/sidebar-admin.php</div>
</div>
</div>
<div class="check-item">
<div class="check-icon <?= $checks['api_exists'] ? 'ok' : 'err' ?>">
<i class="fas fa-<?= $checks['api_exists'] ? 'check' : 'times' ?>"></i>
</div>
<div class="check-info">
<div class="check-title">API Save</div>
<div class="check-path">/opt/wevads/public/api/save-menu.php</div>
</div>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════════════ -->
<!-- DETAILED STEPS -->
<!-- ═══════════════════════════════════════════════════════════════════ -->
<div class="section process-section">
<div class="section-title"><i class="fas fa-list-ol"></i> Procédure Détaillée</div>
<div class="detailed-steps">
<div class="detailed-step">
<div class="step-content">
<h3><i class="fas fa-folder-open"></i> Accéder au Sidebar Admin</h3>
<p>Ouvrir l'interface d'administration du menu sidebar.</p>
<div class="code">URL: http://<?= $_SERVER['HTTP_HOST'] ?>/sidebar-admin.php</div>
<div class="tip"><i class="fas fa-lightbulb"></i> L'interface charge automatiquement tous les fichiers serveur et le menu actuel.</div>
</div>
</div>
<div class="detailed-step">
<div class="step-content">
<h3><i class="fas fa-search"></i> Vérifier le Scan des Fichiers</h3>
<p>Le panneau gauche affiche tous les fichiers PHP/HTML disponibles sur le serveur.</p>
<div class="code">Fichiers scannés: <?= $fileCount ?><br>Répertoire: /opt/wevads/public/<br>Extensions: .php, .html</div>
<div class="note"><i class="fas fa-exclamation-triangle"></i> Les répertoires système (css, js, images, etc.) sont exclus du scan.</div>
</div>
</div>
<div class="detailed-step">
<div class="step-content">
<h3><i class="fas fa-sitemap"></i> Vérifier la Structure du Menu</h3>
<p>Le panneau droit affiche la structure actuelle du menu sidebar.</p>
<div class="code">Menus parents: <?= $menuStats['parents'] ?><br>Sous-menus: <?= $menuStats['children'] ?><br>Taille fichier: <?= round($menuStats['size']/1024, 1) ?> KB</div>
<div class="tip"><i class="fas fa-lightbulb"></i> Utilisez les boutons +/- pour déplier/replier les menus.</div>
</div>
</div>
<div class="detailed-step">
<div class="step-content">
<h3><i class="fas fa-plus-circle"></i> Ajouter un Élément au Menu</h3>
<p>Pour ajouter un fichier au menu:</p>
<div class="code">1. Cliquer sur un fichier dans le panneau GAUCHE (sélection bleue)<br>2. Cliquer sur un menu parent 📁 dans le panneau DROIT<br>3. Cliquer sur le bouton → ou sur le + du parent</div>
<div class="note"><i class="fas fa-exclamation-triangle"></i> Les liens directs 🔗 ne peuvent pas recevoir d'enfants.</div>
</div>
</div>
<div class="detailed-step">
<div class="step-content">
<h3><i class="fas fa-trash-alt"></i> Supprimer un Élément</h3>
<p>Pour supprimer un élément du menu:</p>
<div class="code">1. Cliquer sur l'élément à supprimer (parent ou enfant)<br>2. Cliquer sur le bouton × rouge<br> OU<br> Cliquer sur le bouton ← central</div>
<div class="tip"><i class="fas fa-lightbulb"></i> Les éléments supprimés apparaissent dans la section "Supprimés" en bas à gauche. Cliquez dessus pour les restaurer.</div>
</div>
</div>
<div class="detailed-step">
<div class="step-content">
<h3><i class="fas fa-edit"></i> Modifier un Élément</h3>
<p>Pour modifier le titre ou l'URL d'un élément:</p>
<div class="code">1. Cliquer sur le bouton ✏ de l'élément<br>2. Modifier le titre dans la boîte de dialogue<br>3. Modifier l'URL si demandé<br>4. Valider</div>
</div>
</div>
<div class="detailed-step">
<div class="step-content">
<h3><i class="fas fa-save"></i> Sauvegarder les Modifications</h3>
<p>Une fois les modifications terminées:</p>
<div class="code">1. Cliquer sur le bouton "💾 Appliquer" en haut à droite<br>2. Le HTML est généré et sauvegardé automatiquement<br>3. Un backup est créé avant chaque sauvegarde</div>
<div class="note"><i class="fas fa-exclamation-triangle"></i> Si l'API n'est pas disponible, le HTML sera copié dans le presse-papier pour collage manuel.</div>
</div>
</div>
<div class="detailed-step">
<div class="step-content">
<h3><i class="fas fa-sync-alt"></i> Appliquer les Changements</h3>
<p>Pour voir les changements dans l'application:</p>
<div class="code">Option 1 (Auto): Recharger la page de l'application<br><br>Option 2 (Manuel): systemctl restart apache2</div>
<div class="tip"><i class="fas fa-lightbulb"></i> Les backups sont stockés dans: menu.html.bak.[timestamp]</div>
</div>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════════════ -->
<!-- TEST PANEL -->
<!-- ═══════════════════════════════════════════════════════════════════ -->
<div class="section no-print">
<div class="section-title"><i class="fas fa-vial"></i> Tests & Diagnostics</div>
<div class="test-panel">
<div class="test-grid">
<div class="test-card">
<div class="icon" style="color:#00ffff"><i class="fas fa-file-code"></i></div>
<div class="val"><?= $fileCount ?></div>
<div class="lbl">Fichiers Scannés</div>
</div>
<div class="test-card">
<div class="icon" style="color:#00ff88"><i class="fas fa-folder-tree"></i></div>
<div class="val"><?= $menuStats['parents'] ?></div>
<div class="lbl">Menus Parents</div>
</div>
<div class="test-card">
<div class="icon" style="color:#bf00ff"><i class="fas fa-list"></i></div>
<div class="val"><?= $menuStats['children'] ?></div>
<div class="lbl">Sous-menus</div>
</div>
<div class="test-card">
<div class="icon" style="color:#ffaa00"><i class="fas fa-weight"></i></div>
<div class="val"><?= round($menuStats['size']/1024, 1) ?></div>
<div class="lbl">KB</div>
</div>
</div>
<div class="test-actions">
<a href="/sidebar-admin.php" class="btn btn-primary"><i class="fas fa-rocket"></i> Ouvrir Sidebar Admin</a>
<button class="btn btn-secondary" onclick="testScan()"><i class="fas fa-search"></i> Tester Scan</button>
<button class="btn btn-secondary" onclick="testParse()"><i class="fas fa-code"></i> Tester Parse</button>
<button class="btn btn-secondary" onclick="testAPI()"><i class="fas fa-plug"></i> Tester API</button>
<button class="btn btn-secondary" onclick="location.reload()"><i class="fas fa-sync"></i> Rafraîchir</button>
</div>
<div id="result"></div>
</div>
</div>
</div>
<div class="footer">
WEVADS - Sidebar Admin Process Flow v1.0 | <?= date('Y-m-d H:i:s') ?>
</div>
<script>
function showResult(html) {
const r = document.getElementById('result');
r.innerHTML = html;
r.classList.add('show');
}
function testScan() {
showResult('<span class="info">⏳ Test du scan des fichiers...</span>');
setTimeout(() => {
showResult(`<span class="ok">✅ Scan OK!</span><br>
Fichiers trouvés: <?= $fileCount ?><br>
Répertoire: /opt/wevads/public/<br>
Extensions: .php, .html`);
}, 500);
}
function testParse() {
showResult('<span class="info">⏳ Test du parsing menu.html...</span>');
setTimeout(() => {
showResult(`<span class="ok">✅ Parse OK!</span><br>
Fichier: menu.html (<?= $menuStats['lines'] ?> lignes)<br>
Parents (nav-toggle): <?= $menuStats['parents'] ?><br>
Enfants (sub-menu items): <?= $menuStats['children'] ?>`);
}, 500);
}
function testAPI() {
showResult('<span class="info">⏳ Test de l\'API save-menu...</span>');
fetch('/api/save-menu.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({test: true})
})
.then(r => r.json())
.then(d => {
if (d.error === 'No HTML provided') {
showResult(`<span class="ok">✅ API accessible!</span><br>
Endpoint: /api/save-menu.php<br>
Status: Prête à recevoir les données<br>
Mode: Sauvegarde automatique + backup`);
} else {
showResult(`<span class="err">❌ Erreur API: ${d.error}</span>`);
}
})
.catch(e => {
showResult(`<span class="err">❌ API non accessible</span><br>
<span class="info">Mode fallback: copie manuelle du HTML</span><br>
Erreur: ${e.message}`);
});
}
</script>
</body>
</html>