`;
taskListDiv.appendChild(taskEl);
});
};
// --- EVENT LISTENERS ---
addBtn.addEventListener('click', () => {
const desc = descInput.value.trim();
const subject = subjectInput.value.trim();
const date = dateInput.value;
const time = timeInput.value;
const priority = prioritySelect.value;
if (!desc || !subject || !date || !time) {
alert('Please fill out all task details.');
return;
}
tasks.push({ id: Date.now(), desc, subject, date, time, priority, completed: false, notified: false });
descInput.value = '';
subjectInput.value = '';
dateInput.value = '';
timeInput.value = '';
renderTasks();
});
taskListDiv.addEventListener('click', e => {
const id = parseInt(e.target.dataset.id);
if (e.target.classList.contains('delete-btn')) {
tasks = tasks.filter(task => task.id !== id);
}
if (e.target.classList.contains('toggle-complete-btn')) {
const task = tasks.find(task => task.id === id);
if (task) task.completed = e.target.checked;
}
renderTasks();
});
// --- PDF DOWNLOAD ---
downloadPdfBtn.addEventListener('click', () => {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
doc.setFontSize(22);
doc.text('Student Task & Deadline List', 105, 20, { align: 'center' });
const tableData = tasks.map(t => [
t.desc,
t.subject,
new Date(`${t.date}T${t.time}`).toLocaleString(),
t.priority.charAt(0).toUpperCase() + t.priority.slice(1),
t.completed ? 'Yes' : 'No'
]);
doc.autoTable({
head: [['Task', 'Subject', 'Due Date & Time', 'Priority', 'Completed']],
body: tableData,
startY: 30,
theme: 'grid'
});
doc.save('task-list.pdf');
});
// --- INITIALIZATION ---
requestNotificationPermission();
renderTasks();
setInterval(checkDeadlines, 60000); // Check for deadlines every minute
});