`;
countdownGrid.appendChild(card);
startCountdown(deadline);
});
};
// --- EVENT LISTENERS ---
addDeadlineBtn.addEventListener('click', () => {
const title = deadlineTitleInput.value.trim();
const datetime = deadlineDatetimeInput.value;
if (!title || !datetime) {
showMessage('Please provide both a title and a date/time.');
return;
}
if (new Date(datetime) < new Date()) {
showMessage('The deadline cannot be in the past.');
return;
}
const newDeadline = {
id: Date.now(),
title,
datetime
};
appData.deadlines.push(newDeadline);
saveData();
renderAllDeadlines();
deadlineTitleInput.value = '';
deadlineDatetimeInput.value = '';
showMessage('Deadline added successfully!', false);
});
countdownGrid.addEventListener('click', (e) => {
if (e.target.classList.contains('delete-deadline-btn')) {
const deadlineId = parseInt(e.target.dataset.deadlineId, 10);
if (confirm('Are you sure you want to delete this deadline?')) {
appData.deadlines = appData.deadlines.filter(d => d.id !== deadlineId);
saveData();
renderAllDeadlines();
}
}
});
// --- PDF DOWNLOAD ---
downloadPdfBtn.addEventListener('click', () => {
if (appData.deadlines.length === 0) {
showMessage('There are no deadlines to export.');
return;
}
showMessage('Preparing PDF...', false);
const { jsPDF } = window.jspdf;
const element = document.getElementById('pdf-export-area');
html2canvas(element, { scale: 2, useCORS: true }).then(canvas => {
const imgData = canvas.toDataURL('image/png');
const pdf = new jsPDF({ orientation: 'portrait', unit: 'in', format: 'letter' });
const pdfWidth = pdf.internal.pageSize.getWidth() - 1;
const pdfHeight = (canvas.height * pdfWidth) / canvas.width;
pdf.text('Active Deadlines', 0.5, 0.5);
pdf.addImage(imgData, 'PNG', 0.5, 0.8, pdfWidth, pdfHeight);
pdf.save('Deadline_Countdown_Summary.pdf');
showMessage('PDF downloaded successfully!', false);
}).catch(err => {
console.error("PDF Generation Error:", err);
showMessage("An error occurred during PDF generation.");
});
});
// --- INITIALIZATION ---
const initializeApp = () => {
loadData();
renderAllDeadlines();
};
initializeApp();
});