Work Session Optimizer
Plan & Schedule
Execute Current Session
Session Log & History
Schedule New Optimized Session
Upcoming Scheduled Sessions
No active session. Schedule one from the 'Plan & Schedule' tab or select an upcoming session to start.
Completed Session Log
×
Optimizer Settings
Manage Global Pre-Session Rituals
×
Brain Dump
Jot down any distracting thoughts to address later.
Your Rituals & Notes:
- ${(session.prepRitualItemsApplied && session.prepRitualItemsApplied.length > 0 ? session.prepRitualItemsApplied.map(item => `
- ${item} `).join('') : '
- No specific ritual items selected. ')}
Specific Prep: ${session.prepNotes}
` : ''}Work Session In Progress
${session.objective}
${formatTimeMMSS(sessionTimeLeftSeconds)}
Post-Session Review
Session: ${session.objective} (Completed in ${formatDuration(actualDurationMinutes)})
`; let reviewFocusRating = 0; const stars = executeSessionViewDiv.querySelectorAll('#reviewFocusRatingStars span'); stars.forEach(star => { star.onmouseover = () => stars.forEach((s,i) => s.classList.toggle('selected', i < star.dataset.value)); star.onmouseout = () => stars.forEach((s,i) => s.classList.toggle('selected', i < reviewFocusRating)); star.onclick = () => { reviewFocusRating = parseInt(star.dataset.value); executeSessionViewDiv.querySelector('#reviewFocusRatingInput').value = reviewFocusRating; stars.forEach((s,i) => s.classList.toggle('selected', i < reviewFocusRating)); }; }); executeSessionViewDiv.querySelector('#postSessionReviewForm').onsubmit = (e) => { e.preventDefault(); savePostSessionReview(session.id); resetExecuteView(); renderUpcomingSessionsList(); // Refresh main list as session is now completed // Optionally switch tab or show a "well done" message. alert("Session review saved! Well done."); // Switch to log tab to see it tabs.forEach(t => t.classList.remove('active')); tabContents.forEach(tc => tc.classList.remove('active')); document.querySelector('.tab-link[data-tab="sessionLogTab"]').classList.add('active'); document.getElementById('sessionLogTab').classList.add('active'); filterLogBtn.click(); // Refresh log }; } } saveBrainDumpBtn.addEventListener('click', () => { currentSessionBrainDump = brainDumpTextarea.value; // No immediate save to localStorage, saved with post-session review. brainDumpModal.style.display = 'none'; }); function startSessionTimer() { if (sessionTimerInterval) clearInterval(sessionTimerInterval); sessionTimerInterval = setInterval(() => { sessionTimeLeftSeconds--; executeSessionViewDiv.querySelector('#sessionTimerDisplay').textContent = formatTimeMMSS(sessionTimeLeftSeconds); if (sessionTimeLeftSeconds <= 0) { endSessionTimer(false); // false for not ended early } }, 1000); } function pauseSessionTimer() { // Example: if user navigates away if(sessionTimerInterval) clearInterval(sessionTimerInterval); // Could add a "Paused" state if needed, but for now, switching tab implies pausing. } function endSessionTimer(endedEarly) { clearInterval(sessionTimerInterval); sessionTimerInterval = null; const sessionIndex = scheduledSessions.findIndex(s => s.id === currentExecutingSessionId); if (sessionIndex === -1) { resetExecuteView(); return; } const session = scheduledSessions[sessionIndex]; session.actualDurationMinutes = endedEarly ? (session.plannedDurationMinutes - Math.floor(sessionTimeLeftSeconds / 60)) : session.plannedDurationMinutes; session.distractionsLogged = currentSessionDistractions; // Capture from the live counter session.brainDump = currentSessionBrainDump; // Capture from live var currentSessionPhase = 'review'; renderExecuteView(); if (settings.soundEnabled) alertSound.play().catch(e=>console.warn(e)); if (settings.notificationPermission === 'granted') { new Notification('Work Session Ended!', { body: `Time to review your session: "${session.objective}"` }); } else { alert(`Work session "${session.objective}" ended. Please complete your review.`); } } function savePostSessionReview(sessionId) { const sessionIndex = scheduledSessions.findIndex(s => s.id === sessionId); if (sessionIndex === -1) return; scheduledSessions[sessionIndex].status = 'completed'; scheduledSessions[sessionIndex].reviewData = { objectiveAchieved: document.getElementById('reviewObjectiveAchieved').value, focusLevel: parseInt(document.getElementById('reviewFocusRatingInput').value) || 0, // distractions already set on session.distractionsLogged improvements: document.getElementById('reviewImprovements').value.trim() || null, }; // brainDump is already on scheduledSessions[sessionIndex].brainDump saveScheduledSessions(); } function resetExecuteView() { currentExecutingSessionId = null; currentSessionPhase = 'idle'; clearInterval(sessionTimerInterval); sessionTimerInterval = null; executeSessionViewDiv.innerHTML = ''; // Clear it noActiveSessionMsgP.style.display = 'block'; } // --- Session Log & History --- filterLogBtn.addEventListener('click', renderCompletedSessionsLog); function renderCompletedSessionsLog() { const startFilter = logFilterDateStartInput.value; const endFilter = logFilterDateEndInput.value; const completed = scheduledSessions.filter(s => { if (s.status !== 'completed') return false; if (startFilter && s.date < startFilter) return false; if (endFilter && s.date > endFilter) return false; return true; }).sort((a,b) => new Date(`${b.date}T${b.startTime}`) - new Date(`${a.date}T${a.startTime}`)); // Recent first completedSessionsLogUL.innerHTML = ''; if(completed.length === 0) { completedSessionsLogUL.innerHTML = '
${session.objective}
${formatDate(session.date)} @ ${formatTimeSimple(session.startTime)} (${formatDuration(session.actualDurationMinutes || session.plannedDurationMinutes)})
Objective Achieved: ${review.objectiveAchieved || 'N/A'}
Focus Level: ${review.focusLevel > 0 ? '★'.repeat(review.focusLevel)+'☆'.repeat(5-review.focusLevel) : 'N/A'}
Distractions Logged: ${session.distractionsLogged !== undefined ? session.distractionsLogged : 'N/A'}
${review.improvements ? `Insights/Improvements: ${review.improvements}
` : ''} ${session.brainDump ? `Brain Dump during session:
${session.brainDump}` : ''}
