Online Automated Sleep Pattern & Rest Tracker

Online Automated Sleep Pattern & Rest Tracker

Log your sleep to understand patterns and improve your rest.

No sleep data logged. Go to 'Data Configuration' to add your first entry.

Log Your Sleep

No sleep data logged. Go to 'Data Configuration' to add your first entry.

`; return; } const totalDuration = sleepData.reduce((sum, entry) => sum + entry.duration, 0); const avgDuration = totalDuration / sleepData.length; const totalQuality = sleepData.reduce((sum, entry) => sum + entry.qualityValue, 0); const avgQualityValue = totalQuality / sleepData.length; const qualityReverseMap = ['N/A', 'Poor', 'Fair', 'Good', 'Excellent']; const avgQualityText = qualityReverseMap[Math.round(avgQualityValue)] || 'N/A'; let dashboardHTML = `

Sleep Summary

Average Sleep

${avgDuration.toFixed(1)} hrs

Average Quality

${avgQualityText}

Total Nights Logged

${sleepData.length}

Sleep Log

`; sleepData.forEach(entry => { const qualityClass = `quality-${entry.quality.toLowerCase()}`; dashboardHTML += ` `; }); dashboardHTML += `
Date Bedtime Wake-up Duration Quality
${entry.date} ${entry.bedTime} ${entry.wakeTime} ${entry.duration.toFixed(1)} hrs ${entry.quality}
`; dashboardOutput.innerHTML = dashboardHTML; } function downloadPDF() { const { jsPDF } = window.jspdf; const sleepData = getSleepData(); if (sleepData.length === 0) { console.warn("No data to export."); return; } const doc = new jsPDF(); const tableData = sleepData.map(entry => [ entry.date, entry.bedTime, entry.wakeTime, `${entry.duration.toFixed(1)} hrs`, entry.quality ]); doc.setFontSize(18); doc.text('Sleep Pattern Log', 14, 22); doc.setFontSize(11); doc.setTextColor(100); doc.text(`Report generated on: ${new Date().toLocaleDateString()}`, 14, 30); doc.autoTable({ head: [['Date', 'Bedtime', 'Wake-up Time', 'Duration', 'Quality']], body: tableData, startY: 35, theme: 'grid', headStyles: { fillColor: [79, 70, 229] }, // Indigo-600 }); doc.save('Sleep-Pattern-Log.pdf'); } // --- Event Listeners --- addLogBtn.addEventListener('click', addLogForm); downloadPdfBtn.addEventListener('click', downloadPDF); // --- Initial Setup --- updateNavButtons(); generateDashboard(); });
Scroll to Top