Nessun oggetto della modifica
Nessun oggetto della modifica
 
(77 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
<html>
<html>
<h2>🔧 Dashboard Operativa – Masticationpedia</h2>
  <h2>🔧 Dashboard Operativa – Masticationpedia</h2>
<p><em>Centro di comando per progetti, API, file e backup</em></p>
  <p><em>Centro di comando per progetti, API, file e backup</em></p>


<!-- 🔘 Pulsanti di navigazione -->
   <a href="/dashboard/api/log_view.php" target="_blank">🧾 Apri Log Dashboard</a>
<div style="margin: 2rem 0; display: flex; flex-wrap: wrap; gap: 1rem;">
   <button onclick="clearServerLog()">🧹 Svuota Log</button>
   <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('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>
</div>


<!-- 📂 Importa file dal server -->
  <div style="margin: 2rem 0; display: flex; flex-wrap: wrap; gap: 1rem;">
<div id="serverFileImportContainer"></div>
    <button class="dashboard-toggle" onclick="toggleDashboardBox('api-settings')">⚙️ Connessione API</button>
<script>window.setupServerFileImporter();</script>


    <button class="dashboard-toggle"
      onclick="(window.showMpAI ? showMpAI() : (function(){var el=document.getElementById('mpAI'); if(el){ el.style.display='block'; el.scrollIntoView({behavior:'smooth'});} else { alert('#mpAI non trovato'); } })())">
      🤖 Masticationpedia AI
    </button>
  </div>


  <!-- ============== MASTICATIONPEDIA AI ============== -->
  <div id="mpAI" class="mpai-root" style="display:none">
    <div class="mpai-header">
      <div class="mpai-title">🤖 Masticationpedia <b>AI</b></div>
      <div class="mpai-actions">
        <button id="mpai-new-chat" class="mpai-btn ghost">Nuova chat</button>
        <button id="mpai-clear" class="mpai-btn danger">Pulisci conversazione</button>
        <button id="mpai-save-as-project" class="mpai-btn">💾 Salva come progetto</button>
      </div>
    </div>


    <div class="mpai-grid">
      <aside class="mpai-col mpai-left">
        <h4>📂 Progetti</h4>
        <div id="mpai-project-list" class="mpai-projects">
          <em class="muted">Carico progetti…</em>
        </div>
        <div class="mpai-new-project">
          <input id="mpai-project-name" type="text" placeholder="Nuovo progetto (A-Z 0-9 _ -)" />
          <button id="mpai-project-create" class="mpai-btn">Crea</button>
        </div>
        <div class="mpai-help muted">
          Ogni progetto mantiene la sua cronologia locale (browser).
        </div>
      </aside>


      <main class="mpai-col mpai-center">
        <div id="mpai-uploads" class="mpai-uploads" data-state="idle">
          <div class="mpai-dropzone" id="mpai-dropzone">
            <div>
              <div class="muted" style="margin-bottom:6px;">Trascina qui file <b>sanificati</b> oppure</div>
              <label class="mpai-file-label">
                <input id="mpai-file-input" type="file" multiple style="display:none;">
                <span class="mpai-btn">📂 Aggiungi file</span>
              </label>
            </div>
          </div>
          <div id="mpai-file-list" class="mpai-filelist"></div>
        </div>


        <div id="mpai-chat" class="mpai-chat">
          <div class="mpai-msg mpai-hint">
            Benvenuto. Seleziona un progetto a sinistra, oppure scrivi subito: se non c’è un progetto creo una conversazione locale. Le risposte appariranno qui sotto in ordine, come in ChatGPT.
          </div>
        </div>


        <div class="mpai-composer">
          <textarea id="mpai-input" rows="3" placeholder="Scrivi qui la tua domanda..."></textarea>


          <div class="mpai-composer-right">
            <label class="mpai-check" style="margin:0 0 6px 0;">
              <input id="mpai-drop-urls" type="checkbox">
              Ignora/Cancella URL e allegati per questo invio
            </label>
            <button id="mpai-send" class="mpai-btn primary">Invia</button>
          </div>
        </div>
      </main>


      <aside class="mpai-col mpai-right">
        <h4>⚙️ Impostazioni</h4>
        <label class="mpai-field">Modello
          <select id="mpai-model">
            <option value="gpt-4o-2024-05-13" selected>gpt-4o-2024-05-13</option>
            <option value="gpt-4-turbo-2024-04-09">gpt-4-turbo-2024-04-09</option>
          </select>
        </label>
        <label class="mpai-field">Temperatura
          <input id="mpai-temp" type="number" min="0" max="1" step="0.1" value="0.7">
        </label>
        <label class="mpai-check">
          <input id="mpai-sanitized-only" type="checkbox" checked>
          Usa solo file <b>sanificati</b> come contesto
        </label>
        <div class="mpai-help muted">
          Le API key restano lato server (file sicuro). Il browser non vede mai le chiavi.
        </div>
      </aside>
    </div>
  </div>


  <!-- ============ STILI (CSS) ============ -->
  <style>
    .mpai-root{--bg:#f7f8fa;--card:#fff;--muted:#6b7280;--line:#e5e7eb;--text:#111827;--primary:#0a7cff;--danger:#e74c3c;--accent:#eef2ff;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;color:var(--text)}
    .mpai-header{display:flex;align-items:center;justify-content:space-between;margin:8px 0 12px}
    .mpai-title{font-size:20px;font-weight:700}
    .mpai-actions{display:flex;gap:8px}
    .mpai-btn{border:1px solid var(--line);background:#fff;padding:.45rem .8rem;border-radius:8px;cursor:pointer}
    .mpai-btn:hover{background:#f3f4f6}
    .mpai-btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}
    .mpai-btn.danger{background:var(--danger);border-color:var(--danger);color:#fff}
    .mpai-btn.ghost{background:transparent}
    .muted{color:var(--muted)}
    .mpai-grid{display:grid;grid-template-columns:260px minmax(0,1fr) 260px;gap:12px}
    .mpai-col{background:#fff;border:1px solid var(--line);border-radius:12px;padding:12px}
    .mpai-left,.mpai-right{max-height:75vh;overflow:auto}
    .mpai-projects{display:flex;flex-direction:column;gap:6px;margin:8px 0}
    .mpai-projects .row{display:flex;align-items:center;gap:6px;justify-content:space-between;border:1px solid var(--line);border-radius:8px;padding:6px 8px}
    .mpai-projects .row .title{font-family:monospace;font-size:12px}
    .mpai-new-project{display:flex;gap:6px;margin-top:8px}
    .mpai-new-project input{flex:1 1 auto;padding:.45rem .6rem;border:1px solid var(--line);border-radius:8px}
    .mpai-field{display:flex;flex-direction:column;gap:4px;margin:8px 0}
    .mpai-field input,.mpai-field select{padding:.45rem .6rem;border:1px solid var(--line);border-radius:8px}
    .mpai-check{display:flex;align-items:center;gap:8px;margin:8px 0}
    .mpai-center{display:flex;flex-direction:column;gap:10px}
    .mpai-uploads{border:1px dashed var(--line);border-radius:12px;padding:10px;background:#fafafa}
    .mpai-dropzone{display:flex;align-items:center;justify-content:center;border-radius:10px;padding:12px;background:var(--accent);text-align:center}
    .mpai-filelist{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
    .mpai-filepill{display:flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:999px;padding:4px 8px;background:#fff;font-size:12px}
    .mpai-filepill button{border:none;background:transparent;cursor:pointer;color:#c00}
    .mpai-chat{display:flex;flex-direction:column;gap:10px;max-height:50vh;overflow:auto;border:1px solid var(--line);border-radius:12px;padding:10px;background:#fff}
    .mpai-msg{border:1px solid var(--line);border-radius:12px;padding:10px;background:#fff}
    .mpai-msg.user{border-color:#bee3f8;background:#eff6ff}
    .mpai-msg.assistant{border-color:#d1fae5;background:#f0fdf4}
    .mpai-msg.error{border-color:#fecaca;background:#fff1f2}
    .mpai-msg .role{font-weight:600;margin-bottom:4px}
    .mpai-hint{border-style:dashed;color:var(--muted)}
    .mpai-composer{display:flex;gap:8px;align-items:flex-end}
    .mpai-composer textarea{flex:1 1 auto;min-height:90px;border:1px solid var(--line);border-radius:12px;padding:10px}
    .mpai-composer-right{display:flex;flex-direction:column;gap:6px}


<!-- 📦 Connessione API -->
    /* --- Blocchi codice nelle risposte + copia --- */
<div id="api-settings" style="display:none; padding:1rem; border:1px solid #ccc; border-radius:8px; background:#f9f9f9;">
    .mp-code{border:1px solid #e5e7eb;border-radius:10px;overflow:hidden;margin:.5rem 0;background:#fff}
  <strong>Connessione API:</strong><br><br>
    .mp-code__hdr{display:flex;justify-content:space-between;align-items:center;padding:.5rem .75rem;border-bottom:1px solid #e5e7eb;background:#f8fafc}
  <input id="api-key" placeholder="🔑 Inserisci API Key" style="width:100%; margin-bottom:0.5rem;"><br>
    .mp-code__lang{font-family:ui-monospace, Menlo, Consolas, monospace;color:#334155}
    .mp-copy{border:1px solid #e5e7eb;background:#fff;border-radius:8px;padding:.25rem .5rem;cursor:pointer}
    .mp-copy:hover{background:#f1f5f9}
    .mp-code pre{margin:0;padding:.75rem 1rem;overflow:auto;font-family:ui-monospace, Menlo, Consolas, monospace;font-size:13px}
    @media (max-width:1100px){.mpai-grid{grid-template-columns:1fr}.mpai-left,.mpai-right{max-height:none}}
  </style>


   <!-- ✅ Hidden input per il model, richiesto da CommonDashboard.js -->
   <!-- ========= SEZIONI LEGACY (nascoste) ========= -->
   <input type="hidden" id="gptModel" value="gpt-4o">
   <div id="api-settings" style="display:none; padding:1rem; border:1px solid #ccc; border-radius:8px; background:#f9f9f9;">
    <strong>Connessione API (protetta dal server)</strong><br><br>


  <select id="model-select" style="width:100%; margin-bottom:0.5rem;">
    <label>Modello</label>
    <option value="gpt-4">gpt-4</option>
    <select id="model-select" style="width:100%; margin-bottom:0.5rem;">
    <option value="gpt-3.5-turbo">gpt-3.5-turbo</option>
      <option value="gpt-4o-2024-05-13" selected>gpt-4o-2024-05-13</option>
    <option value="gpt-4o-2024-05-13" selected></option>
      <option value="gpt-4-turbo-2024-04-09">gpt-4-turbo-2024-04-09</option>
  </select><br>
    </select>


  <textarea id="test-prompt" rows="3" style="width:100%; margin-bottom:0.5rem;">Dimmi una curiosità sulla mandibola</textarea><br>
    <label>Prompt di test</label>
  <button onclick="testAPIConnection()">▶️ Testa connessione</button>
    <textarea id="test_prompt" rows="3" style="width:100%; margin-bottom:0.5rem;">Dimmi una curiosità sulla mandibola</textarea>


  <pre id="api-result" style="background:#f0f0f0; padding:1rem; border:1px solid #ccc; margin-top:1rem; white-space:pre-wrap;"></pre>
    <label style="display:inline-flex; gap:.4rem; align-items:center; margin:.25rem 0 .75rem;">
</div>
      <input id="test_drop_urls" type="checkbox">
      Ignora/Cancella URL e allegati per questo invio
    </label><br>


<!-- 📊 Stato Progetti -->
    <button id="test_run">Esegui</button>
<div id="project-status" style="display:none; padding:1rem; border:1px solid #ccc; border-radius:8px; background:#f9f9f9;">
  <strong>Stato Progetti:</strong><br><br>
  <button onclick="openProjectDialog()" style="margin-bottom:1rem; background:#007bff; color:white; border:none; padding:0.5rem 1rem; border-radius:5px; font-weight:bold;">➕ Nuovo Progetto</button>


<div id="newProjectDialog" style="display:none; padding:1rem; border:1px solid #ccc; margin-top:1rem;">
    <pre id="api-result" style="background:#f0f0f0; padding:1rem; border:1px solid #ccc; margin-top:1rem; white-space:pre-wrap;"></pre>
  <h4>➕ Crea Nuovo Progetto</h4>
   </div>
  <input id="newProjectTitle" placeholder="Titolo progetto" style="width:100%; margin-bottom:0.5rem;" />
<script>
  <input id="newProjectNotes" placeholder="Note (opzionale)" style="width:100%; margin-bottom:0.5rem;" />
// JS minimo temporaneo per sbloccare la pagina
  <button onclick="addNewProject()">💾 Salva</button>
// (serve solo a NON avere errori di sintassi)
   <button onclick="closeProjectDialog()">❌ Chiudi</button>
</script>
</div>
 
 
 
 
  <table id="projectTable" style="width:100%; border-collapse: collapse; font-size: 0.95rem;">
    <thead>
      <tr style="background:#eaeaea;">
        <th>🧱 Modulo</th><th>📊 Stato</th><th>📅 Data</th><th>🔍 Note</th>
      </tr>
    </thead>
    <tbody id="projectRows">
      <tr>
        <td>Connessione API</td>
        <td style="color:green; font-weight:bold;">✅ Completato</td>
        <td>6 apr 2025</td>
        <td>Setup funzionante</td>
      </tr>
    </tbody>
  </table>


<!-- 🧠 Risposta GPT Analisi Progetto -->
<div style="margin-top: 1rem;">
  <label for="response"><strong>🧠 Risposta GPT – Analisi progetto:</strong></label><br>
  <textarea id="response" rows="8" style="width: 100%; margin-top: 6px; margin-bottom: 15px; padding: 8px; font-family: monospace; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 6px;" placeholder="Qui apparirà la risposta generata da GPT sull’analisi del progetto..."></textarea>
</div>
 
 
</div>
 
<!-- 📄 Prompt + Risposta GPT + Salvataggio -->
<div style="margin-top:2rem;">
  <h3>📄 Prompt attuale:</h3>
  <textarea id="promptArea" style="width:100%; height:200px; font-family:monospace;"></textarea><br>
  <button onclick="loadPrompt()">📂 Carica prompt.txt</button>
  <button onclick="savePrompt()">💾 Salva prompt.txt</button>
</div>
 
<div style="margin-top:2rem;">
  <h3>📥 Risposta GPT da salvare:</h3>
  <textarea id="gpt-response-area" rows="8" style="width:100%; margin-bottom:0.5rem;" placeholder="Inserisci qui la risposta generata da GPT"></textarea><br>
  <input type="text" id="gpt-filename" placeholder="Nome file (es: login.php)" style="width:60%;">
  <select id="gpt-subfolder">
    <option value="php">php</option>
    <option value="docs">docs</option>
    <option value="json">json</option>
  </select>
  <input type="text" id="newProjectTitle" value="SSO_LinkedIn" placeholder="Project">
  <button onclick="salvaFileDaTextarea()" style="background:#28a745; color:white; border:none; padding:0.4rem 1rem; border-radius:5px; font-weight:bold;">💾 Salva nel progetto</button>
</div>
 
<!-- 📂 Caricamento File GPT -->
<div style="margin-top:2rem;">
  <h3>📂 Carica File GPT</h3>
  <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>
</div>
 
<!-- 🧪 Console JS -->
<div id="test-tools" style="display:none; padding:1rem; border:1px solid #ccc; border-radius:8px; background:#f9f9f9;">
  <strong>Console JS:</strong><br>
  <textarea id="codeArea" placeholder="Scrivi codice JS da testare..." style="width:100%; height:100px;"></textarea><br>
  <button onclick="runTestCode()">▶️ Esegui</button>
  <pre id="consoleOutput" style="background:#000; color:#0f0; padding:1rem; border-radius:8px; font-family:monospace;"></pre>
</div>
 
<!-- 📘 Registro Attività -->
<div id="activity-log" style="display:none; padding:1rem; border:1px solid #ccc; border-radius:8px; background:#fdfdfd;">
  <strong>📘 Registro attività:</strong>
  <button onclick="clearActivityLog()" style="float:right; background:#e74c3c; color:white; border:none; padding:0.4rem 1rem; border-radius:6px; font-weight:bold;">🧹 Svuota</button>
  <div id="activityLogContent" style="margin-top:1rem; max-height:250px; overflow-y:auto; background:#f0f0f0; padding:1rem; border:1px solid #ccc; border-radius:6px; font-family:monospace; font-size:0.85rem;">
    <em><span style="color:#888;">Registro avviato...</span></em>
  </div>
</div>
</html>
</html>

Versione attuale delle 15:48, 19 ott 2025

🔧 Dashboard Operativa – Masticationpedia

Centro di comando per progetti, API, file e backup

🧾 Apri Log Dashboard