direito

Repositório direito
git clone git://git.sivaldodavi.com/direito.git
Log | Files | Refs

dashboard.js (3692B)


      1 /**
      2  * Dashboard de Progresso
      3  * Lê dados do localStorage e mostra estatísticas de estudo
      4  */
      5 
      6 var PROGRESS_PREFIX = window.PROGRESS_PREFIX || 'quiz_progress_';
      7 
      8 function initDashboard() {
      9   const dashboard = document.getElementById('dashboard-stats');
     10   if (!dashboard) return;
     11 
     12   const stats = calculateStats();
     13   renderDashboard(stats);
     14 }
     15 
     16 function calculateStats() {
     17   const allKeys = Object.keys(localStorage);
     18   const progressKeys = allKeys.filter((k) => k.startsWith(PROGRESS_PREFIX));
     19 
     20   const stats = {
     21     totalQuizzes: progressKeys.length,
     22     totalAcertos: 0,
     23     totalErros: 0,
     24     disciplinas: {},
     25   };
     26 
     27   progressKeys.forEach((key) => {
     28     try {
     29       const data = JSON.parse(localStorage.getItem(key));
     30       if (!data || !data.questions) return;
     31 
     32       const disciplina = key.replace(PROGRESS_PREFIX, '').split('_')[0];
     33       if (!stats.disciplinas[disciplina]) {
     34         stats.disciplinas[disciplina] = {
     35           acertos: 0,
     36           erros: 0,
     37           total: 0,
     38         };
     39       }
     40 
     41       stats.disciplinas[disciplina].acertos += data.acertos || 0;
     42       stats.disciplinas[disciplina].erros += data.erros || 0;
     43       stats.disciplinas[disciplina].total += data.questions.length;
     44 
     45       stats.totalAcertos += data.acertos || 0;
     46       stats.totalErros += data.erros || 0;
     47     } catch (e) {}
     48   });
     49 
     50   return stats;
     51 }
     52 
     53 function renderDashboard(stats) {
     54   const dashboard = document.getElementById('dashboard-stats');
     55   if (!dashboard) return;
     56 
     57   const totalQuestoes = stats.totalAcertos + stats.totalErros;
     58   const pctGeral = totalQuestoes > 0 ? Math.round((stats.totalAcertos / totalQuestoes) * 100) : 0;
     59 
     60   let html = `
     61     <div class="dashboard-container">
     62       <h2>📊 Seu Progresso de Estudo</h2>
     63       
     64       <div class="dashboard-overview">
     65         <div class="stat-card">
     66           <div class="stat-label">Quizzes Iniciados</div>
     67           <div class="stat-value">${stats.totalQuizzes}</div>
     68         </div>
     69         <div class="stat-card">
     70           <div class="stat-label">Taxa de Acerto Geral</div>
     71           <div class="stat-value">${pctGeral}%</div>
     72         </div>
     73         <div class="stat-card">
     74           <div class="stat-label">Questões Respondidas</div>
     75           <div class="stat-value">${totalQuestoes}</div>
     76         </div>
     77       </div>
     78 
     79       <div class="dashboard-disciplines">
     80         <h3>Por Disciplina</h3>
     81   `;
     82 
     83   Object.entries(stats.disciplinas).forEach(([disc, data]) => {
     84     const pct = data.total > 0 ? Math.round((data.acertos / data.total) * 100) : 0;
     85     const nivel = pct >= 80 ? '🟢 Dominado' : pct >= 60 ? '🟡 Bom' : '🔴 Revisar';
     86 
     87     html += `
     88       <div class="disc-stat">
     89         <div class="disc-name">${disc}</div>
     90         <div class="disc-bar">
     91           <div class="disc-progress" style="width: ${pct}%"></div>
     92         </div>
     93         <div class="disc-info">
     94           <span>${data.acertos}/${data.total}</span>
     95           <span>${pct}%</span>
     96           <span>${nivel}</span>
     97         </div>
     98       </div>
     99     `;
    100   });
    101 
    102   html += `
    103       </div>
    104       <div class="dashboard-actions">
    105         <button class="btn" onclick="clearAllProgress()">Limpar Histórico</button>
    106       </div>
    107     </div>
    108   `;
    109 
    110   dashboard.innerHTML = html;
    111 }
    112 
    113 function clearAllProgress() {
    114   if (confirm('Tem certeza que quer limpar todo o histórico de progresso?')) {
    115     const allKeys = Object.keys(localStorage);
    116     allKeys.forEach((key) => {
    117       if (key.startsWith(PROGRESS_PREFIX)) {
    118         localStorage.removeItem(key);
    119       }
    120     });
    121     initDashboard();
    122   }
    123 }
    124 
    125 // Inicializar quando o DOM estiver pronto
    126 if (document.readyState === 'loading') {
    127   document.addEventListener('DOMContentLoaded', initDashboard);
    128 } else {
    129   initDashboard();
    130 }