Smart Habit Tracker & Review System

Smart Habit Tracker & Review System

${s.name}

Current Streak: ${s.currentStreak} days Best Streak: ${s.bestStreak} days Completions (90d): ${s.completions}
`).join(''); }; // --- CORE FUNCTIONALITY --- const toggleHabit = (habitId, dateKey) => { if (!log[dateKey]) log[dateKey] = []; const index = log[dateKey].indexOf(habitId); if (index > -1) { log[dateKey].splice(index, 1); } else { log[dateKey].push(habitId); } saveData(); renderHabitDashboard(); }; const addHabit = () => { const name = newHabitNameInput.value.trim(); if (name) { const newHabit = { id: Date.now(), name }; habits.push(newHabit); newHabitNameInput.value = ''; saveData(); renderConfiguration(); } }; const deleteHabit = (habitId) => { if (confirm("Are you sure you want to delete this habit? All its logged data will be kept but won't be displayed.")) { habits = habits.filter(h => h.id !== habitId); saveData(); renderConfiguration(); renderHabitDashboard(); } }; // --- TAB MANAGEMENT --- window.changeTab = (tabId) => { currentTab = tabId; ['tab1', 'tab2', 'tab3'].forEach(id => { document.getElementById(id).classList.toggle('hidden', id !== tabId); document.getElementById(`${id}-button`).classList.toggle('active', id === tabId); }); if (tabId === 'tab2') renderAnalytics(); updateButtonVisibility(); }; const updateButtonVisibility = () => { const prevBtn = document.getElementById('prev-button'); const nextBtn = document.getElementById('next-button'); const downloadBtn = document.getElementById('download-pdf-button'); prevBtn.classList.toggle('hidden', currentTab === 'tab1'); nextBtn.classList.toggle('hidden', currentTab === 'tab3'); downloadBtn.classList.toggle('hidden', currentTab !== 'tab2'); }; window.handleNext = () => { const tabs = ['tab1', 'tab2', 'tab3']; const currentIndex = tabs.indexOf(currentTab); if (currentIndex < 2) changeTab(tabs[currentIndex + 1]); }; window.handlePrev = () => { const tabs = ['tab1', 'tab2', 'tab3']; const currentIndex = tabs.indexOf(currentTab); if (currentIndex > 0) changeTab(tabs[currentIndex - 1]); }; // --- PDF DOWNLOAD --- window.downloadPDF = async () => { const { jsPDF } = window.jspdf; const analyticsEl = document.getElementById('analytics-content'); try { const canvas = await html2canvas(analyticsEl, { scale: 2 }); const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF({ orientation: 'portrait', unit: 'px', format: 'a4' }); pdf.setFontSize(18); pdf.text(`Habit Analytics Report`, 40, 40); const pdfWidth = pdf.internal.pageSize.getWidth(); const imgWidth = canvas.width; const imgHeight = canvas.height; const ratio = imgWidth / imgHeight; const newWidth = pdfWidth - 80; const newHeight = newWidth / ratio; pdf.addImage(imgData, 'PNG', 40, 60, newWidth, newHeight); pdf.save(`habit-analytics-report.pdf`); } catch (error) { console.error("PDF generation failed:", error); alert("Could not generate PDF."); } }; // --- EVENT LISTENERS --- prevWeekBtn.addEventListener('click', () => { currentDate.setDate(currentDate.getDate() - 7); renderHabitDashboard(); }); nextWeekBtn.addEventListener('click', () => { currentDate.setDate(currentDate.getDate() + 7); renderHabitDashboard(); }); dashboardGrid.addEventListener('click', (e) => { const check = e.target.closest('.habit-day-check'); if (check) { toggleHabit(parseInt(check.dataset.habitId), check.dataset.date); } }); addHabitBtn.addEventListener('click', addHabit); habitList.addEventListener('click', (e) => { if (e.target.tagName === 'BUTTON' && e.target.dataset.habitId) { deleteHabit(parseInt(e.target.dataset.habitId)); } }); // --- INITIALIZATION --- loadData(); renderHabitDashboard(); renderConfiguration(); updateButtonVisibility(); });
Scroll to Top