`;
return;
}
// Sort by date, newest first
filteredLessons.sort((a, b) => new Date(b.date) - new Date(a.date));
filteredLessons.forEach(lesson => {
const card = elements.cardTemplate.content.cloneNode(true);
card.querySelector('.pld-lesson-card').dataset.id = lesson.id;
card.querySelector('.pld-card-title').textContent = lesson.projectName;
card.querySelector('.pld-card-date').textContent = new Date(lesson.date).toLocaleDateString();
card.querySelector('.pld-card-description').textContent = lesson.description;
card.querySelector('.pld-card-positives').textContent = lesson.positives;
card.querySelector('.pld-card-negatives').textContent = lesson.negatives;
card.querySelector('.pld-card-recommendations').textContent = lesson.recommendations;
elements.lessonsGrid.appendChild(card);
});
}
// --- EVENT HANDLERS --- //
elements.addLessonForm.addEventListener('submit', function(e) {
e.preventDefault();
const newLesson = {
id: Date.now(),
projectName: document.getElementById('pld-project-name').value,
date: document.getElementById('pld-lesson-date').value,
description: document.getElementById('pld-description').value,
positives: document.getElementById('pld-positives').value,
negatives: document.getElementById('pld-negatives').value,
recommendations: document.getElementById('pld-recommendations').value
};
lessons.push(newLesson);
pld_saveLessons();
pld_renderLessons();
alert('Lesson saved successfully!');
elements.addLessonForm.reset();
// Switch to dashboard view
elements.tabs[0].click();
});
elements.searchInput.addEventListener('input', pld_renderLessons);
elements.lessonsGrid.addEventListener('click', function(e) {
if (e.target.closest('.pld-delete-btn')) {
const card = e.target.closest('.pld-lesson-card');
const lessonId = parseInt(card.dataset.id);
if (confirm('Are you sure you want to delete this lesson?')) {
lessons = lessons.filter(l => l.id !== lessonId);
pld_saveLessons();
pld_renderLessons();
}
}
});
elements.downloadPdfBtn.addEventListener('click', function() {
const { jsPDF } = window.jspdf;
const exportArea = document.getElementById('pld-pdf-export-area');
if (!exportArea || elements.lessonsGrid.children.length === 0) {
alert('No lessons to export.');
return;
}
html2canvas(exportArea, { scale: 2, windowWidth: 1200 }).then(canvas => {
const imgData = canvas.toDataURL('image/png');
const pdf = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' });
const pdfWidth = pdf.internal.pageSize.getWidth();
const pdfHeight = pdf.internal.pageSize.getHeight();
const imgWidth = pdfWidth - 20;
const imgHeight = (canvas.height * imgWidth) / canvas.width;
let heightLeft = imgHeight;
let position = 15;
pdf.setFont('helvetica', 'bold');
pdf.setFontSize(18);
pdf.setTextColor(getComputedStyle(document.documentElement).getPropertyValue('--pld-primary-color').trim());
pdf.text("Project Lessons Learned", pdfWidth / 2, position, { align: 'center' });
position = 25; // Initial Y position for the image
pdf.addImage(imgData, 'PNG', 10, position, imgWidth, imgHeight);
heightLeft -= (pdfHeight - position - 10);
while (heightLeft > 0) {
position = heightLeft - imgHeight;
pdf.addPage();
pdf.addImage(imgData, 'PNG', 10, position, imgWidth, imgHeight);
heightLeft -= pdfHeight;
}
pdf.save('Project-Learnings-Dashboard.pdf');
});
});
// --- TAB NAVIGATION --- //
let currentTabIndex = 0;
const updateNavButtons = () => {
elements.prevBtn.disabled = currentTabIndex === 0;
elements.nextBtn.disabled = currentTabIndex === elements.tabs.length - 1;
};
window.pld_changeTab = (event, tabName) => {
elements.tabContents.forEach(content => content.classList.remove('active'));
elements.tabs.forEach(button => button.classList.remove('active'));
document.getElementById(tabName).classList.add('active');
event.currentTarget.classList.add('active');
currentTabIndex = Array.from(elements.tabs).findIndex(btn => btn === event.currentTarget);
updateNavButtons();
};
window.pld_navigateTabs = (direction) => {
const newIndex = currentTabIndex + direction;
if (newIndex >= 0 && newIndex < elements.tabs.length) {
elements.tabs[newIndex].click();
}
};
// --- INITIALIZATION --- //
pld_loadLessons();
pld_renderLessons();
document.getElementById('pld-lesson-date').valueAsDate = new Date();
updateNavButtons();
});
})();
