<html>

🔧 Dashboard Operativa – Masticationpedia

Centro di comando per progetti, API, file e backup

 <button class="dashboard-toggle" onclick="toggleDashboardBox('api-settings')">⚙️ Connessione API</button>
 <button class="dashboard-toggle" onclick="toggleDashboardBox('project-status')">📊 Stato Progetti</button>
 <button class="dashboard-toggle" onclick="toggleDashboardBox('chatgpt-plus')">🤖 ChatGPT plus</button>
 <button class="dashboard-toggle" onclick="toggleDashboardBox('test-tools')">🧪 Strumenti di Test</button>
 <button class="dashboard-toggle" onclick="toggleDashboardBox('activity-log')">📘 Registro Attività</button>
 <button class="dashboard-toggle" onclick="uploadToOpenAI()">📄 Carica in OpenAI</button>

📁 Importa file dal server (semplificata)

   <label for="sourcePathInput">📂 Percorso Assoluto del file sorgente:</label>
<input type="text" id="sourcePathInput" placeholder="/percorso/assoluto/file.php" style="width:100%; margin-bottom:0.5rem;">
<label for="projectNameInput">📁 Cartella di destinazione nel progetto:</label>
<input type="text" id="projectNameInput" placeholder="nome_progetto/">

📁 Carica File GPT

 <label>📁 Project: <input type="text" id="gpt-load-project" value="SSO_LinkedIn" /></label>
 <label>📂 Subfolder: <input type="text" id="gpt-load-subfolder" value="php" /></label>
 <label>📄 Filename: <input type="text" id="gpt-load-filename" placeholder="es: testGPT.php" /></label>
 <button onclick="caricaFileGPT()">📁 Carica file</button>

<script src="/dashboard/api/dashboard.js?v=20250907a"></script>

<script> (function(hook){

 // Esegui sia con DOM standard sia con il ricarico di MediaWiki
 hook(() => {
   const refreshBtn = document.getElementById('mpChatRefresh');
   const listBox    = document.getElementById('mpSavedList');
   const answerBox  = document.getElementById('mpChatAnswer');
   const projectSel = document.getElementById('mpChatProject');
   function currentProject(){
     return (projectSel?.value || 'Generazione_capitoli').trim();
   }
   async function refreshList(){
     console.log('[DEBUG] refreshList() start');
     if (!listBox) { console.warn('[DEBUG] listBox #mpSavedList assente'); return; }
     listBox.innerHTML = 'Aggiorno…';
     const prj = currentProject();
     console.log('[DEBUG] project =', prj);
     try {
       const url = '/dashboard/api/list_saved_output.php?project=' + encodeURIComponent(prj) + '&sub=output';
       console.log('[DEBUG] fetch URL =', url);
       const r   = await fetch(url, { cache:'no-store' });
       const txt = await r.text();
       console.log('[DEBUG] raw response (head)=', txt.slice(0,120).replace(/\n/g,' '));
       let j;
       try {
         j = JSON.parse(txt);
       } catch(e){
         console.error('[DEBUG] NON JSON, stampo i primi 400 caratteri:\n', txt.slice(0,400));

listBox.innerHTML = 'Risposta non-JSON

'+
                               txt.substring(0,400)+'

';

         return;
       }
       if (!j.ok) {
         console.error('[DEBUG] ok=false:', j);
         listBox.textContent = 'Errore: ' + (j.error || 'sconosciuto');
         return;
       }
       if (!j.files || !j.files.length) {
         console.log('[DEBUG] nessun file');
         listBox.innerHTML = 'Nessun file salvato.';
         return;
       }
       console.log('[DEBUG] files =', j.files.length);
       listBox.innerHTML = j.files.map(f => `
           ${f.name} (${f.size} B)
           <button class="mpOpen" data-name="${f.name}">Apri</button>
       `).join();
       // wiring del bottone Apri (carica contenuto nel box Risposta)
       listBox.querySelectorAll('.mpOpen').forEach(btn => {
         btn.addEventListener('click', async () => {
           const name = btn.getAttribute('data-name');
           console.log('[DEBUG] click Apri:', name);
           try {
             const rr = await fetch('/dashboard/api/read_saved_output.php', {
               method:'POST',
               headers:{'Content-Type':'application/json'},
               body: JSON.stringify({ project: prj, file: name })
             });
             const jj = await rr.json();
             if (!jj.ok) { alert('Errore lettura: ' + (jj.error||)); return; }
             if (answerBox) answerBox.textContent = jj.content || ;
             console.log('[DEBUG] file aperto OK');
           } catch(e){
             console.error('[DEBUG] errore apertura', e);
             alert('Errore apertura file: ' + e.message);
           }
         });
       });
     } catch (e) {
       console.error('[DEBUG] errore generale refreshList:', e);
       listBox.textContent = 'Errore JS: ' + e.message;
     }
   }
   // click su Aggiorna → refreshList
   refreshBtn?.addEventListener('click', () => {
     console.log('[DEBUG] click Aggiorna OK');
     refreshList();
   });
   // carica subito all’apertura della dashboard
   refreshList();
 });

})(

 (window.mw && mw.hook) 
   ? (fn)=>mw.hook('wikipage.content').add(fn)
   : (fn)=>document.addEventListener('DOMContentLoaded', fn)

); </script>