Meeting Conflict Resolver
Schedule a New Meeting
Conflict Check
Fill out the form to check for conflicts.
Manage Teams
Manage Team Members
Manage Member Availability
Fill out the form to check for conflicts.
'; return; } const startDateTime = new Date(`${date}T${startTime}`); const endDateTime = new Date(`${date}T${endTime}`); let conflicts = { meetings: [], availability: [] }; // Check against other meetings const teamMeetings = state.meetings.filter(m => m.teamId === teamId); teamMeetings.forEach(m => { if (startDateTime < m.end && endDateTime > m.start) { conflicts.meetings.push(m.title); } }); // Check against member availability const teamMembers = state.members.filter(m => m.teamId === teamId); const meetingDay = startDateTime.getDay(); const startHour = startDateTime.getHours(); const endHour = endDateTime.getHours() + (endDateTime.getMinutes() > 0 ? 1 : 0); teamMembers.forEach(member => { const memberAvail = state.availability[member.id]?.[meetingDay]; if (memberAvail) { if (startHour < memberAvail[0] || endHour > memberAvail[1]) { conflicts.availability.push(member.name); } } else { // No availability set means unavailable conflicts.availability.push(member.name); } }); // Render conflict info if (conflicts.meetings.length === 0 && conflicts.availability.length === 0) { conflictInfo.innerHTML = '✅ No conflicts found. This time slot is available.
'; } else { let html = '🚨 Conflicts Detected!
'; if (conflicts.meetings.length > 0) { html += `Overlapping Meetings: ${conflicts.meetings.join(', ')}
`; } if (conflicts.availability.length > 0) { html += `Members Unavailable: ${conflicts.availability.join(', ')}
`; } conflictInfo.innerHTML = html; } } function handleScheduleSubmit(e) { e.preventDefault(); const newMeeting = { id: Date.now(), title: meetingTitle.value, teamId: parseInt(meetingTeam.value), start: new Date(`${meetingDate.value}T${meetingStartTime.value}`), end: new Date(`${meetingDate.value}T${meetingEndTime.value}`) }; state.meetings.push(newMeeting); saveState(); alert('Meeting scheduled successfully!'); state.activeTab = 'dashboard'; state.weekStartDate = getStartOfWeek(newMeeting.start); render(); } // ... other handlers for add/delete teams/members, tabs, filters ... // SECTION: Event Listeners Object.values(tabButtons).forEach(btn => btn.addEventListener('click', e => { state.activeTab = e.target.id.split('-')[1]; render(); })); teamFilter.addEventListener('change', e => { state.selectedTeamId = parseInt(e.target.value); renderDashboard(); }); weekStartFilter.addEventListener('change', e => { state.weekStartDate = getStartOfWeek(e.target.value); renderDashboard(); }); scheduleMeetingForm.addEventListener('submit', handleScheduleSubmit); ['team', 'date', 'start-time', 'end-time'].forEach(id => document.getElementById(`meeting-${id}`).addEventListener('change', checkConflicts)); // ... other event listeners ... // SECTION: Initial Load loadState(); render(); });