Calendar Assistant

Sun
Mon
Tue
Wed
Thu
Fri
Sat

${e.time ? new Date(`1970-01-01T${e.time}`).toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) : 'All day'}

`).join(''); } // --- Modals and Forms --- const eventModal = document.getElementById('event-modal'); const eventForm = document.getElementById('event-form'); const deleteBtn = document.getElementById('delete-event-btn'); document.getElementById('add-event-btn').addEventListener('click', () => openEventModal()); document.getElementById('cancel-btn').addEventListener('click', () => eventModal.classList.add('hidden')); window.openEventModal = function(id = null) { eventForm.reset(); if (id) { const event = events.find(e => e.id === id); document.getElementById('modal-title').textContent = 'Edit Event'; document.getElementById('event-id').value = event.id; document.getElementById('event-title').value = event.title; document.getElementById('event-date').value = event.date; document.getElementById('event-time').value = event.time; document.getElementById('event-category').value = event.category; deleteBtn.classList.remove('hidden'); deleteBtn.onclick = () => handleDeleteEvent(id); } else { document.getElementById('modal-title').textContent = 'Add Event'; document.getElementById('event-id').value = ''; if (selectedDate) document.getElementById('event-date').value = selectedDate; deleteBtn.classList.add('hidden'); } eventModal.classList.remove('hidden'); } eventForm.addEventListener('submit', (e) => { e.preventDefault(); const id = document.getElementById('event-id').value; const eventData = { title: document.getElementById('event-title').value, date: document.getElementById('event-date').value, time: document.getElementById('event-time').value, category: document.getElementById('event-category').value, }; if (id) { const index = events.findIndex(event => event.id === parseInt(id)); events[index] = { ...events[index], ...eventData }; } else { eventData.id = Date.now(); events.push(eventData); } eventModal.classList.add('hidden'); renderCalendar(); renderAgenda(); }); function handleDeleteEvent(id) { if (confirm('Are you sure you want to delete this event?')) { events = events.filter(e => e.id !== id); eventModal.classList.add('hidden'); renderCalendar(); renderAgenda(); } } // --- Navigation and PDF --- document.getElementById('prev-month-btn').addEventListener('click', () => { currentDate.setMonth(currentDate.getMonth() - 1); renderCalendar(); }); document.getElementById('next-month-btn').addEventListener('click', () => { currentDate.setMonth(currentDate.getMonth() + 1); renderCalendar(); }); document.getElementById('today-btn').addEventListener('click', () => { currentDate = new Date(); selectDay(currentDate.toISOString().split('T')[0]); }); document.getElementById('download-pdf-btn').addEventListener('click', () => { const { jsPDF } = window.jspdf; const pdf = new jsPDF(); const monthName = currentDate.toLocaleString('default', { month: 'long', year: 'numeric' }); pdf.setFont('helvetica', 'bold'); pdf.setFontSize(20); pdf.text(`Event Schedule for ${monthName}`, 105, 15, { align: 'center' }); const monthEvents = events.filter(e => { const eventDate = new Date(e.date); return eventDate.getMonth() === currentDate.getMonth() && eventDate.getFullYear() === currentDate.getFullYear(); }).sort((a,b) => a.date.localeCompare(b.date) || a.time.localeCompare(b.time)); if (monthEvents.length === 0) { pdf.setFont('helvetica', 'normal'); pdf.setFontSize(12); pdf.text('No events scheduled for this month.', 105, 30, { align: 'center' }); } else { const body = monthEvents.map(e => [ new Date(`${e.date}T00:00:00`).toLocaleDateString(), e.time ? new Date(`1970-01-01T${e.time}`).toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}) : 'All Day', e.title, e.category.charAt(0).toUpperCase() + e.category.slice(1) ]); pdf.autoTable({ startY: 25, head: [['Date', 'Time', 'Title', 'Category']], body: body, theme: 'grid', headStyles: { fillColor: '#0d9488' } }); } pdf.save(`Schedule_${monthName.replace(' ', '_')}.pdf`); }); // --- Initial Load --- function loadInitialData() { const today = new Date(); const tomorrow = new Date(); tomorrow.setDate(today.getDate() + 1); const nextWeek = new Date(); nextWeek.setDate(today.getDate() + 7); events = [ { id: 1, title: 'Team Standup', date: today.toISOString().split('T')[0], time: '09:00', category: 'work' }, { id: 2, title: 'Dentist Appointment', date: today.toISOString().split('T')[0], time: '14:30', category: 'personal' }, { id: 3, title: 'Project Phoenix Kick-off', date: tomorrow.toISOString().split('T')[0], time: '11:00', category: 'meeting' }, { id: 4, title: 'Submit Q3 Report', date: nextWeek.toISOString().split('T')[0], time: '', category: 'work' }, ]; selectDay(today.toISOString().split('T')[0]); } loadInitialData(); });
Scroll to Top