Sprint Retrospective Dashboard

What Went Well?

What Could Be Improved?

Action Items

Retrospective Setup

Submit Feedback

All Submitted Items

CategoryFeedbackSubmitterActions

${item.text}

- ${item.submitter}

`; if (item.category === 'well') display.boardWell.appendChild(card); else if (item.category === 'improve') display.boardImprove.appendChild(card); else display.boardAction.appendChild(card); }); }; const renderTable = () => { feedbackForm.tableBody.innerHTML = ''; feedbackItems.forEach(item => { const row = feedbackForm.tableBody.insertRow(); row.innerHTML = ` ${item.category.charAt(0).toUpperCase() + item.category.slice(1)} ${item.text}${item.submitter} `; }); }; const downloadPDF = () => { const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(18); doc.text(`Retrospective Summary: ${retroDetails.sprintName || ''}`, 14, 22); doc.setFontSize(12); doc.text(`Date: ${retroDetails.date || ''}`, 14, 30); const wellItems = feedbackItems.filter(i => i.category === 'well').map(i => [i.text, i.submitter]); const improveItems = feedbackItems.filter(i => i.category === 'improve').map(i => [i.text, i.submitter]); const actionItems = feedbackItems.filter(i => i.category === 'action').map(i => [i.text, i.submitter]); let finalY = 35; if (wellItems.length > 0) { doc.autoTable({ startY: finalY + 10, head: [['What Went Well?', 'Submitter']], body: wellItems, headStyles: { fillColor: [46, 125, 50] } }); finalY = doc.lastAutoTable.finalY; } if (improveItems.length > 0) { doc.autoTable({ startY: finalY + 10, head: [['What Could Be Improved?', 'Submitter']], body: improveItems, headStyles: { fillColor: [251, 192, 45] } }); finalY = doc.lastAutoTable.finalY; } if (actionItems.length > 0) { doc.autoTable({ startY: finalY + 10, head: [['Action Items', 'Owner/Submitter']], body: actionItems, headStyles: { fillColor: [25, 118, 210] } }); } doc.save(`Retrospective-${retroDetails.sprintName || 'Summary'}.pdf`); }; feedbackForm.tableBody.addEventListener('click', (e) => { const target = e.target; if (target.tagName !== 'BUTTON' || !target.dataset.id) return; const id = parseInt(target.dataset.id); const action = target.dataset.action; if(action === 'edit') loadItemForEdit(id); if(action === 'delete') deleteItem(id); }); const saveData = () => localStorage.setItem('sr_data', JSON.stringify({retroDetails, feedbackItems})); const loadData = () => { const data = JSON.parse(localStorage.getItem('sr_data')) || {}; retroDetails = data.retroDetails || {}; feedbackItems = data.feedbackItems || []; setupForm.name.value = retroDetails.sprintName || 'July Sprint A'; setupForm.date.value = retroDetails.date || '2025-07-12'; }; let currentTabIndex = 0; const tabs = mainContainer.querySelectorAll('.sr-tab-link'); window.sr_changeTab = (event, tabName) => { currentTabIndex = Array.from(tabs).findIndex(t => t === event.currentTarget); Array.from(mainContainer.querySelectorAll('.sr-tab-content')).forEach(c => c.classList.remove('active')); tabs.forEach(t => t.classList.remove('active')); mainContainer.querySelector('#' + tabName).classList.add('active'); event.currentTarget.classList.add('active'); }; setupForm.btn.addEventListener('click', updateDetails); feedbackForm.btn.addEventListener('click', addOrUpdateFeedback); downloadBtn.addEventListener('click', downloadPDF); loadData(); updateDetails(); updateAllUI(); });
Scroll to Top