Smart Mental Refreshment Tracker

Smart Mental Refreshment Tracker

Log a Mental Refreshment Activity

Recently Logged:

No activities logged in this session yet.

Refreshment Insights & Summary

No activities logged for this date in this session yet.

'; } else { activitiesForDisplay.forEach(act => { const div = document.createElement('div'); div.textContent = `${new Date(act.loggedAtTimestamp).toLocaleTimeString([], {hour:'2-digit', minute:'2-digit'})}: ${act.activityType} - Score: ${act.refreshmentScore}/5 ${act.durationMinutes ? `(${act.durationMinutes}min)` : ''}`; recentLogsList.appendChild(div); }); } } function smrtAnalyzeRefreshmentLog() { const currentAnalysisDate = document.getElementById('smrt-log-date').value; const activitiesToAnalyze = smrtRefreshmentLog.activities.filter(act => act.activityDate === currentAnalysisDate); const insightsArea = document.getElementById('smrt-insights-summary-area'); const pdfBtn = document.getElementById('smrt-pdf-download'); if (activitiesToAnalyze.length === 0) { insightsArea.innerHTML = "

No activities logged for this date to analyze. Please log some activities first.

"; insightsArea.style.display = 'block'; if(pdfBtn) pdfBtn.style.display = 'none'; smrtAnalysisResults = null; return; } let totalActivities = activitiesToAnalyze.length; let totalDuration = 0; let activityCounts = {}; let activityScores = {}; // To calculate average scores activitiesToAnalyze.forEach(act => { if (act.durationMinutes) totalDuration += act.durationMinutes; activityCounts[act.activityType] = (activityCounts[act.activityType] || 0) + 1; if (!activityScores[act.activityType]) { activityScores[act.activityType] = { totalScore: 0, count: 0 }; } activityScores[act.activityType].totalScore += act.refreshmentScore; activityScores[act.activityType].count++; }); const effectiveList = document.getElementById('smrt-effective-list'); effectiveList.innerHTML = ''; const sortedEffective = Object.entries(activityScores) .map(([type, data]) => ({ type, avgScore: data.totalScore / data.count })) .sort((a, b) => b.avgScore - a.avgScore) .slice(0, 3); // Top 3 if(sortedEffective.length > 0){ sortedEffective.forEach(item => { effectiveList.innerHTML += `
  • ${item.type} (Avg. Score: ${item.avgScore.toFixed(1)}/5)
  • `; }); } else { effectiveList.innerHTML = '
  • No activities rated yet.
  • '; } const frequencyList = document.getElementById('smrt-frequency-list'); frequencyList.innerHTML = ''; const sortedFrequency = Object.entries(activityCounts).sort(([,a],[,b]) => b-a); if(sortedFrequency.length > 0){ sortedFrequency.forEach(([type, count]) => { frequencyList.innerHTML += `
  • ${type}: ${count} time(s)
  • `; }); } else { frequencyList.innerHTML = '
  • No activities logged.
  • '; } document.getElementById('smrt-total-activities').textContent = totalActivities; document.getElementById('smrt-total-time').textContent = totalDuration > 0 ? `${totalDuration} minutes` : "N/A (durations not logged)"; // Simple Suggestion Logic const suggestionTextEl = document.getElementById('smrt-suggestion-text'); const suggestionBoxEl = document.getElementById('smrt-personalized-suggestion'); if (sortedEffective.length > 0 && sortedEffective[0].avgScore >= 4) { suggestionTextEl.textContent = `You rated "${sortedEffective[0].type}" highly! Remember to incorporate this effective refresher regularly.`; suggestionBoxEl.style.display = 'block'; } else if (totalActivities > 0 && sortedEffective.length > 0) { suggestionTextEl.textContent = `Keep exploring different refreshment activities to find what works best for you. You logged "${sortedFrequency[0][0]}" most often. How effective was it?`; suggestionBoxEl.style.display = 'block'; } else { suggestionBoxEl.style.display = 'none'; } insightsArea.style.display = 'block'; if(pdfBtn) pdfBtn.style.display = 'inline-block'; smrtAnalysisResults = { // Store for PDF dateAnalyzed: currentAnalysisDate, totalActivities, totalDuration, effectiveActivities: sortedEffective, activityFrequency: sortedFrequency, suggestion: suggestionBoxEl.style.display !== 'none' ? suggestionTextEl.textContent : "" }; } function smrtGetFormattedDateForPDF_context() { return new Date(2025, 4, 18).toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' }); } function smrtDownloadPDF() { if (!jsPDF_constructor_smrt) { alert("PDF library error."); return; } if (!smrtAnalysisResults) { alert("Please analyze your refreshment log first."); return; } const { dateAnalyzed, totalActivities, totalDuration, effectiveActivities, activityFrequency, suggestion } = smrtAnalysisResults; const activitiesForPDF = smrtRefreshmentLog.activities.filter(act => act.activityDate === dateAnalyzed); const doc = new jsPDF_constructor_smrt('p', 'pt', 'a4'); const FONT_FAMILY = "helvetica"; const ACCENT_COLOR_HEX = getComputedStyle(document.documentElement).getPropertyValue('--accent-color').trim(); const PRIMARY_TEXT_COLOR_HEX = getComputedStyle(document.documentElement).getPropertyValue('--primary-text').trim(); const SECTION_TITLE_COLOR_HEX = getComputedStyle(document.documentElement).getPropertyValue('--section-title-color').trim(); const BUTTON_TEXT_COLOR_HEX = getComputedStyle(document.documentElement).getPropertyValue('--button-text-color').trim(); let yPos = 40; const pageWidth = doc.internal.pageSize.getWidth(); const margin = 40; const usableWidth = pageWidth - (2 * margin); doc.setFillColor(ACCENT_COLOR_HEX); doc.rect(0, 0, pageWidth, yPos + 10, 'F'); doc.setFont(FONT_FAMILY, "bold"); doc.setFontSize(16); doc.setTextColor(BUTTON_TEXT_COLOR_HEX); doc.text("Mental Refreshment Log & Insights", pageWidth / 2, yPos, { align: "center" }); yPos += 25; doc.setFont(FONT_FAMILY, "normal"); doc.setFontSize(10); doc.setTextColor(PRIMARY_TEXT_COLOR_HEX); doc.text(`Log for Date: ${new Date(dateAnalyzed+'T00:00:00').toLocaleDateString(undefined, { weekday:'long',year: 'numeric', month: 'long', day: 'numeric' })}`, margin, yPos); doc.text(`Report Generated: ${smrtGetFormattedDateForPDF_context()}`, pageWidth - margin, yPos, { align: 'right'}); yPos += 25; doc.setFont(FONT_FAMILY, "bold"); doc.setFontSize(12); doc.setTextColor(SECTION_TITLE_COLOR_HEX); doc.text("Refreshment Summary:", margin, yPos); yPos += 18; doc.setFont(FONT_FAMILY, "normal"); doc.setFontSize(10); doc.text(`Total Activities Logged: ${totalActivities}`, margin, yPos); yPos += 14; doc.text(`Total Approx. Time on Refreshment: ${totalDuration > 0 ? totalDuration + " minutes" : "N/A (durations not consistently logged)"}`, margin, yPos); yPos += 20; doc.setFont(FONT_FAMILY, "bold"); doc.setFontSize(11); doc.setTextColor(ACCENT_COLOR_HEX); doc.text("Your Most Effective Refreshers (Self-Rated):", margin, yPos); yPos += 15; doc.setFont(FONT_FAMILY, "normal"); doc.setFontSize(9); if (effectiveActivities.length > 0) { effectiveActivities.forEach(item => { if (yPos > doc.internal.pageSize.getHeight() - 25) { doc.addPage(); yPos = margin; } doc.text(`• ${item.type} (Average Score: ${item.avgScore.toFixed(1)}/5)`, margin + 10, yPos); yPos += 12; }); } else { doc.text("No activities rated to determine effectiveness yet.", margin + 10, yPos); yPos += 12; } yPos += 8; doc.setFont(FONT_FAMILY, "bold"); doc.setFontSize(11); doc.setTextColor(ACCENT_COLOR_HEX); doc.text("Activity Frequency:", margin, yPos); yPos += 15; doc.setFont(FONT_FAMILY, "normal"); doc.setFontSize(9); if (activityFrequency.length > 0) { activityFrequency.forEach(([type, count]) => { if (yPos > doc.internal.pageSize.getHeight() - 25) { doc.addPage(); yPos = margin; } doc.text(`• ${type}: ${count} time(s)`, margin + 10, yPos); yPos += 12; }); } else { doc.text("No activities logged to show frequency.", margin + 10, yPos); yPos += 12; } yPos += 10; if (suggestion) { if (yPos > doc.internal.pageSize.getHeight() - 40) { doc.addPage(); yPos = margin; } doc.setFont(FONT_FAMILY, "bold"); doc.setFontSize(11); doc.setTextColor(ACCENT_COLOR_HEX); doc.text("Friendly Suggestion:", margin, yPos); yPos += 15; doc.setFont(FONT_FAMILY, "italic"); doc.setFontSize(9); const suggestionLines = doc.splitTextToSize(suggestion, usableWidth); doc.text(suggestionLines, margin, yPos); yPos += suggestionLines.length * 11 + 10; } if (yPos > doc.internal.pageSize.getHeight() - 60 && activitiesForPDF.length > 0) { doc.addPage(); yPos = margin; } doc.setFont(FONT_FAMILY, "bold"); doc.setFontSize(12); doc.setTextColor(SECTION_TITLE_COLOR_HEX); doc.text("Detailed Activity Log:", margin, yPos); yPos += 5; if (jsPDF_autoTable_plugin_smrt && activitiesForPDF.length > 0) { const activityTableBody = activitiesForPDF.map(act => [ act.activityType, act.durationMinutes || "N/A", new Date(act.loggedAtTimestamp).toLocaleTimeString([],{hour:'2-digit',minute:'2-digit'}), act.timeOfDay || "N/A", act.refreshmentScore, act.notes || "-" ]); doc.autoTable({ startY: yPos, head: [['Activity', 'Duration (min)', 'Logged At', 'Time of Day', 'Refresh Score (1-5)', 'Notes']], body: activityTableBody, theme: 'grid', margin: {left: margin, right: margin}, headStyles: { fillColor: ACCENT_COLOR_HEX, textColor: BUTTON_TEXT_COLOR_HEX, fontSize: 8, fontStyle:'bold'}, styles: { fontSize: 8, cellPadding: 2, overflow: 'linebreak' }, columnStyles: { 5: {cellWidth: 'auto'} } // Notes column }); yPos = doc.lastAutoTable.finalY + 15; } else if (activitiesForPDF.length > 0) { // Fallback for no autoTable doc.setFont(FONT_FAMILY, "normal"); doc.setFontSize(8); activitiesForPDF.forEach(act => { if (yPos > doc.internal.pageSize.getHeight() - 30) { doc.addPage(); yPos = margin; } let logEntry = `• ${act.activityType} (${act.durationMinutes || 'N/A'} min) - Score: ${act.refreshmentScore}/5. Notes: ${act.notes || "-"}`; doc.text(logEntry, margin, yPos, {maxWidth: usableWidth}); yPos += doc.splitTextToSize(logEntry, usableWidth).length * 10 + 2; }); yPos += 5; } else { doc.setFont(FONT_FAMILY, "normal"); doc.setFontSize(9); doc.text("No activities logged for this day.", margin, yPos); yPos += 15; } const pageCount = doc.internal.getNumberOfPages(); for (let i = 1; i <= pageCount; i++) { doc.setPage(i); const pageHeight = doc.internal.pageSize.getHeight(); doc.setLineWidth(0.5); doc.setDrawColor(ACCENT_COLOR_HEX); doc.line(margin, pageHeight - 30, pageWidth - margin, pageHeight - 30); doc.setFont(FONT_FAMILY, "normal"); doc.setFontSize(8); doc.setTextColor(PRIMARY_TEXT_COLOR_HEX); doc.text(`Page ${i} of ${pageCount}`, pageWidth / 2, pageHeight - 20, { align: "center" }); } doc.save("Mental_Refreshment_Log.pdf"); }
    Scroll to Top