Post-Surgery Rehabilitation Progress Tracker

Log your daily progress to track your recovery journey. You can download a summary to share with your healthcare provider.

5

Completed Exercises Today

${ex.desc}

${ex.sets}

`; }); html += `

Disclaimer: This is a sample guide. Always follow the specific exercises and instructions provided by your doctor or physical therapist.

`; container.innerHTML = html; } function saveEntry() { const entry = { date: document.getElementById('entry-date').value, pain: parseInt(painSlider.value), rom: parseInt(document.getElementById('range-of-motion').value) || 0, notes: document.getElementById('entry-notes').value, exercises: [] }; if (!entry.date) { alert('Please select a date.'); return; } document.querySelectorAll('#exercise-checklist input:checked').forEach(checkbox => { entry.exercises.push(checkbox.dataset.exerciseName); }); rehabData.push(entry); rehabData.sort((a, b) => new Date(a.date) - new Date(b.date)); // Keep data sorted localStorage.setItem('rehabTrackerData', JSON.stringify(rehabData)); alert('Entry saved successfully!'); resetForm(); } function resetForm() { document.getElementById('entry-date').valueAsDate = new Date(); painSlider.value = 5; painDisplay.textContent = '5'; document.getElementById('range-of-motion').value = ''; document.getElementById('entry-notes').value = ''; document.querySelectorAll('#exercise-checklist input:checked').forEach(checkbox => checkbox.checked = false); } function renderDashboard() { renderCharts(); renderLogTable(); } function renderCharts() { const labels = rehabData.map(d => new Date(d.date).toLocaleDateString()); const painData = rehabData.map(d => d.pain); const romData = rehabData.map(d => d.rom); if (painChart) painChart.destroy(); if (romChart) romChart.destroy(); painChart = new Chart(document.getElementById('pain-chart').getContext('2d'), { type: 'line', data: { labels, datasets: [{ label: 'Pain Level (0-10)', data: painData, borderColor: '#ef4444', tension: 0.1 }] }, options: { responsive: true } }); romChart = new Chart(document.getElementById('rom-chart').getContext('2d'), { type: 'line', data: { labels, datasets: [{ label: 'Range of Motion (°)', data: romData, borderColor: '#4f46e5', tension: 0.1 }] }, options: { responsive: true } }); } function renderLogTable() { const container = document.getElementById('log-table-container'); if (rehabData.length === 0) { container.innerHTML = `

No entries yet. Add one from the 'Log Today's Entry' tab.

`; return; } let tableHTML = ``; [...rehabData].reverse().forEach(entry => { // Show most recent first tableHTML += ``; }); tableHTML += `
Date Pain ROM (°) Notes
${new Date(entry.date).toLocaleDateString()} ${entry.pain} ${entry.rom} ${entry.notes || '-'}
`; container.innerHTML = tableHTML; } function downloadPdf() { const { jsPDF } = window.jspdf; const doc = new jsPDF(); // Header doc.setFontSize(22); doc.setFont('helvetica', 'bold'); doc.text('Rehabilitation Progress Report', 105, 20, { align: 'center' }); doc.setFontSize(11); doc.text(`Report Generated: ${new Date().toLocaleDateString()}`, 105, 28, { align: 'center' }); // Charts if (painChart && romChart) { doc.setFontSize(16); doc.text('Progress Charts', 14, 45); const painImg = painChart.toBase64Image(); const romImg = romChart.toBase64Image(); doc.addImage(painImg, 'PNG', 14, 50, 90, 60); doc.addImage(romImg, 'PNG', 108, 50, 90, 60); } // Log Table if (rehabData.length > 0) { doc.addPage(); doc.setFontSize(16); doc.text('Detailed Log Entries', 14, 20); const tableData = rehabData.map(entry => [ new Date(entry.date).toLocaleDateString(), entry.pain, entry.rom, entry.exercises.join(', ') || '-', entry.notes || '-' ]); doc.autoTable({ startY: 25, head: [['Date', 'Pain', 'ROM (°)', 'Exercises', 'Notes']], body: tableData, theme: 'grid', headStyles: { fillColor: [79, 70, 229] } }); } doc.save('Rehab-Progress-Report.pdf'); } // --- EVENT LISTENERS --- Object.keys(tabButtons).forEach(key => { tabButtons[key].addEventListener('click', () => switchTab(key)); }); painSlider.addEventListener('input', (e) => painDisplay.textContent = e.target.value); saveBtn.addEventListener('click', saveEntry); downloadBtn.addEventListener('click', downloadPdf); // --- INITIALIZATION --- document.getElementById('entry-date').valueAsDate = new Date(); populateExerciseChecklist(); populateExerciseGuide(); });
Scroll to Top