// ... (Garde tout ton code existant pour le Dark mode, Menu, Contact, etc.) ... // --- GESTION DU LAYOUT DYNAMIQUE --- let isPageAdmin = false; // 1. Vérification Admin et Initialisation fetch("/api/is_admin") .then(res => res.json()) .then(data => { isPageAdmin = data.admin; if (isPageAdmin) { document.getElementById("admin-panel").style.display = "block"; document.body.classList.add('admin-active'); initDragAndDrop(); // Afficher aussi les outils d'annonces si tu veux garder ça const tools = document.getElementById("admin-tools"); if(tools) tools.style.display = "block"; } loadLayout(); // Charger les blocs }); // 2. Chargement des blocs depuis l'API function loadLayout() { fetch('/api/layout') .then(res => res.json()) .then(blocks => { // Vider les colonnes ['left', 'center', 'right'].forEach(id => document.getElementById(id).innerHTML = ''); // Remettre le titre au centre (optionnel si tu veux qu'il soit un bloc aussi) document.getElementById('center').innerHTML = '

Gesthub

'; blocks.forEach(block => { const col = document.getElementById(block.column); if (col) { const el = createBlockElement(block); col.appendChild(el); } }); }); } // 3. Création du HTML d'un bloc function createBlockElement(block) { const div = document.createElement('div'); div.className = 'draggable-item'; div.dataset.id = block.id; div.style.marginBottom = "1rem"; div.style.background = block.type === 'buttons' ? 'transparent' : ''; // Barre de drag (visible seulement en admin via CSS) let html = `
:: Deplacer ::
`; if (block.type === 'iframe') { html += `
${block.data.title ? `

${block.data.title}

` : ''}
`; } else if (block.type === 'buttons') { // block.data.links doit être un tableau d'objets {label, url} let btns = ''; if(block.data.links) { block.data.links.forEach(link => { btns += ``; }); } html += `
${btns}
`; } else if (block.type === 'html') { html += `
${block.data.content}
`; } div.innerHTML = html; return div; } // 4. Initialisation Drag & Drop (SortableJS) function initDragAndDrop() { const containers = [document.getElementById('left'), document.getElementById('center'), document.getElementById('right')]; containers.forEach(container => { new Sortable(container, { group: 'shared', // Permet de déplacer entre les colonnes handle: '.drag-handle', // On ne peut attraper que par la poignée animation: 150, onEnd: function (evt) { saveLayoutPosition(); } }); }); } // 5. Sauvegarde de la position function saveLayoutPosition() { const layout = []; ['left', 'center', 'right'].forEach(colId => { const col = document.getElementById(colId); const items = col.querySelectorAll('.draggable-item'); items.forEach((item, index) => { layout.push({ id: item.dataset.id, column: colId, position: index }); }); }); fetch('/api/layout/save', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(layout) }); } // 6. Ajouter un Widget (Logique simple pour l'instant) window.addNewWidget = function(type) { let data = {}; if (type === 'iframe') { const url = prompt("URL de l'iframe (Mattermost/Trello) :"); const height = prompt("Hauteur (ex: 400) :", "400"); if (!url) return; data = { url: url, height: height, title: "Nouveau Widget" }; } else if (type === 'buttons') { // Pour faire simple, on ajoute un bouton par défaut, tu pourras éditer plus tard data = { links: [ { label: "Nouveau Bouton", url: "https://google.com" } ] }; } else if (type === 'html') { const text = prompt("Texte du Post-it :"); data = { content: text }; } fetch('/api/block/add', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ type: type, column: 'center', data: data }) }) .then(res => res.json()) .then(block => { location.reload(); // Recharge pour afficher le nouveau bloc proprement }); } window.deleteBlock = function(id) { if(confirm("Supprimer ce bloc ?")) { fetch(`/api/block/${id}`, { method: 'DELETE' }) .then(() => location.reload()); } }