Online Smart Meeting & Collaboration Scheduler

Smart Meeting & Collaboration Scheduler

My Meetings

Schedule a New Meeting

Proposed Times

Attendees

Manage Team Members

Add/Edit Team Member

Current Team

NameEmailActions
×

No agenda items yet.

'; } agendaHtml += `
`; return agendaHtml; }, handleAvailabilityChange(e, meetingId) { const { checked, dataset } = e.target; const time = dataset.time; const meeting = this.state.meetings.find(m => m.id === meetingId); const slot = meeting.proposedTimes.find(s => s.time === time); if (checked) { if (!slot.available.includes(this.state.currentUser.id)) { slot.available.push(this.state.currentUser.id); } } else { slot.available = slot.available.filter(id => id !== this.state.currentUser.id); } this.openMeetingModal(meetingId); // Re-render modal }, confirmMeetingTime(meetingId) { const meeting = this.state.meetings.find(m => m.id === meetingId); let bestTime = null; let maxAvailable = -1; meeting.proposedTimes.forEach(slot => { if (slot.available.length > maxAvailable) { maxAvailable = slot.available.length; bestTime = slot.time; } }); if (bestTime) { meeting.confirmedTime = bestTime; meeting.proposedTimes = []; this.showNotification('Meeting time confirmed!', 'success'); this.closeMeetingModal(); this.renderAll(); } }, addAgendaItem(e, meetingId) { e.preventDefault(); const input = this.elements.modalBody.querySelector('#new-agenda-item'); const newItem = input.value.trim(); if (newItem) { const meeting = this.state.meetings.find(m => m.id === meetingId); meeting.agenda.push(newItem); input.value = ''; this.openMeetingModal(meetingId); // Re-render modal } }, // --- Data Config Handlers --- handleMemberFormSubmit(e) { e.preventDefault(); const form = this.elements.memberForm; const id = parseInt(this.elements.editId.value); const memberData = { name: form.querySelector('#member-name').value, email: form.querySelector('#member-email').value, }; if (id) { const index = this.state.teamMembers.findIndex(m => m.id === id); if (index > -1) { this.state.teamMembers[index] = { ...this.state.teamMembers[index], ...memberData }; this.showNotification('Member updated!', 'success'); } } else { memberData.id = this.getNextId(this.state.teamMembers); this.state.teamMembers.push(memberData); this.showNotification('Member added!', 'success'); } this.clearMemberForm(); this.renderAll(); }, clearMemberForm() { this.elements.memberForm.reset(); this.elements.editId.value = ''; }, handleMemberTableActions(e) { const target = e.target.closest('button'); if (!target) return; const action = target.dataset.action; const id = parseInt(target.dataset.id); if (action === 'edit') { const member = this.state.teamMembers.find(m => m.id === id); if (member) { const form = this.elements.memberForm; this.elements.editId.value = member.id; form.querySelector('#member-name').value = member.name; form.querySelector('#member-email').value = member.email; form.scrollIntoView({ behavior: 'smooth' }); } } else if (action === 'delete') { if (confirm('Are you sure?')) { this.state.teamMembers = this.state.teamMembers.filter(m => m.id !== id); this.showNotification('Member deleted.', 'success'); this.renderAll(); } } }, downloadMeetingPDF(meetingId) { if (typeof window.jspdf === 'undefined' || typeof window.jspdf.jsPDF === 'undefined') { this.showNotification('PDF generation is currently unavailable.', 'error'); return; } const { jsPDF } = window.jspdf; const doc = new jsPDF(); const meeting = this.state.meetings.find(m => m.id === meetingId); if (!meeting) return; doc.setFontSize(18); doc.text(`Meeting Summary: ${meeting.title}`, 105, 22, { align: 'center' }); doc.setFontSize(11); doc.setTextColor(100); doc.text(meeting.description, 14, 35); const status = meeting.confirmedTime ? `Confirmed for: ${new Date(meeting.confirmedTime).toLocaleString()}` : 'Status: Polling for availability'; doc.setFontSize(12); doc.setTextColor(0); doc.text(status, 14, 45); const attendees = meeting.attendees.map(id => this.state.teamMembers.find(m => m.id === id)?.name).filter(Boolean); doc.autoTable({ startY: 55, head: [['Attendees']], body: attendees.map(name => [name]), theme: 'striped', headStyles: { fillColor: [8, 145, 178] } }); if (meeting.agenda.length > 0) { doc.autoTable({ startY: doc.autoTable.previous.finalY + 10, head: [['Agenda / Tasks']], body: meeting.agenda.map(item => [item]), theme: 'striped', headStyles: { fillColor: [99, 102, 241] } }); } doc.save(`Meeting_${meeting.title.replace(/\s/g, '_')}.pdf`); this.showNotification('PDF download started.', 'success'); }, // --- UTILITY FUNCTIONS --- getNextId(array) { return array.length > 0 ? Math.max(...array.map(item => item.id)) + 1 : 1; }, showNotification(message, type = 'success') { const box = this.elements.notificationBox; if (!box) return; box.textContent = message; box.className = `smcs-notification ${type}`; box.classList.add('show'); setTimeout(() => { box.classList.remove('show'); }, 3000); } }; // Make SMCS object globally accessible for inline onclick handlers window.SMCS = SMCS; // Start the application SMCS.init(); });
Scroll to Top