`;
});
messageWindow.scrollTop = messageWindow.scrollHeight;
}
// SECTION: LOGIC & INTERACTIONS
// =============================
function sendMessage() {
const input = document.getElementById('message-input');
if (input.value.trim()) {
state.messages.push({ user: 'Me', text: input.value.trim() });
input.value = '';
renderMessages();
}
}
function switchTab(tabName) {
document.querySelectorAll('.tab-pane').forEach(p => p.classList.add('hidden'));
document.getElementById(tabName).classList.remove('hidden');
document.querySelectorAll('.tab-btn').forEach(b => {
b.classList.toggle('tab-active', b.dataset.tab === tabName);
b.classList.toggle('tab-inactive', b.dataset.tab !== tabName);
});
}
function setupDragAndDrop() {
document.querySelectorAll('.task-card').forEach(card => {
card.addEventListener('dragstart', e => {
state.draggedTaskId = parseInt(e.target.dataset.id);
e.target.classList.add('dragging');
});
card.addEventListener('dragend', e => e.target.classList.remove('dragging'));
});
document.querySelectorAll('.task-list').forEach(list => {
list.addEventListener('dragover', e => {
e.preventDefault();
list.classList.add('drag-over');
});
list.addEventListener('dragleave', e => list.classList.remove('drag-over'));
list.addEventListener('drop', e => {
e.preventDefault();
list.classList.remove('drag-over');
const task = state.tasks.find(t => t.id === state.draggedTaskId);
if(task) {
task.status = list.dataset.status;
renderTaskBoard();
}
});
});
}
function generatePDF() {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
doc.setFont('helvetica', 'bold');
doc.setFontSize(22);
doc.text('Project Summary Report', 105, 20, { align: 'center' });
const projectData = state.projects.map(p => [p.name, p.lead, p.team, p.status, `${p.completion}%`]);
doc.autoTable({
head: [['Project Name', 'Lead', 'Team', 'Status', 'Completion']],
body: projectData,
startY: 30
});
const taskData = state.tasks.map(t => [state.projects.find(p => p.id === t.projectId).name, t.text, t.status]);
doc.autoTable({
head: [['Project', 'Task', 'Status']],
body: taskData,
startY: doc.autoTable.previous.finalY + 10
});
doc.save('Cross-Team_Coordination_Report.pdf');
}
// SECTION: EVENT LISTENERS
// ========================
document.querySelectorAll('.tab-btn').forEach(btn => btn.addEventListener('click', e => switchTab(e.target.dataset.tab)));
document.getElementById('send-message-btn').addEventListener('click', sendMessage);
document.getElementById('download-pdf-btn').addEventListener('click', generatePDF);
// Initial Load
loadState();
});
