Smart Self-Improvement Feedback System
All data is stored securely in your browser. Nothing is ever uploaded.
Feedback by Category
AI-Powered Theme Analysis
Improvement Goals
Manage Feedback Categories
Log Feedback
${line}
`; } if (line.toLowerCase().includes('goal:')) { const goalText = line.replace(/goal:/i, '').trim(); return `${line}
${line}
`; }).join(''); } catch (error) { console.error("AI Analysis Error:", error); document.getElementById('ai-themes').textContent = "Sorry, an error occurred during analysis."; } finally { btnText.classList.remove('hidden'); btnLoader.classList.add('hidden'); aiAnalysisBtn.disabled = false; } }; // --- GOAL MANAGEMENT --- const addGoal = (text) => { goals.push({ id: Date.now(), text, completed: false }); saveData(); renderGoals(); }; const toggleGoal = (id) => { const goal = goals.find(g => g.id == id); if (goal) goal.completed = !goal.completed; saveData(); renderGoals(); }; const removeGoal = (id) => { goals = goals.filter(g => g.id != id); saveData(); renderGoals(); }; // --- TAB MANAGEMENT & PDF --- 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') renderDashboard(); 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 = () => changeTab(['tab1', 'tab2', 'tab3'][['tab1', 'tab2', 'tab3'].indexOf(currentTab) + 1]); window.handlePrev = () => changeTab(['tab1', 'tab2', 'tab3'][['tab1', 'tab2', 'tab3'].indexOf(currentTab) - 1]); window.downloadPDF = async () => { try { const canvas = await html2canvas(document.getElementById('insights-content'), { scale: 2 }); const pdf = new jspdf.jsPDF({ orientation: 'portrait', unit: 'px', format: 'a4' }); const newWidth = pdf.internal.pageSize.getWidth() - 80; const newHeight = (canvas.height * newWidth) / canvas.width; pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 40, 40, newWidth, newHeight); pdf.save('self-improvement-insights.pdf'); } catch (e) { alert("Error generating PDF."); } }; // --- EVENT LISTENERS --- document.getElementById('add-feedback-btn').addEventListener('click', () => openModal()); feedbackLogContainer.addEventListener('click', (e) => { if (e.target.tagName === 'BUTTON' && e.target.dataset.id) openModal(parseInt(e.target.dataset.id)); }); modalSaveBtn.addEventListener('click', saveFeedback); modalCancelBtn.addEventListener('click', closeModal); modalDeleteBtn.addEventListener('click', deleteFeedback); addCategoryBtn.addEventListener('click', addCategory); categoryList.addEventListener('click', (e) => { if (e.target.tagName === 'BUTTON' && e.target.dataset.name) deleteCategory(e.target.dataset.name); }); aiAnalysisBtn.addEventListener('click', analyzeThemes); document.getElementById('insights-content').addEventListener('click', (e) => { if (e.target.classList.contains('add-goal-btn')) addGoal(e.target.dataset.goal); if (e.target.tagName === 'INPUT' && e.target.type === 'checkbox') toggleGoal(e.target.dataset.id); if (e.target.tagName === 'BUTTON' && !e.target.classList.contains('add-goal-btn')) removeGoal(e.target.dataset.id); }); // --- INITIALIZATION --- loadData(); renderFeedbackLog(); renderCategories(); updateButtonVisibility(); });