Cross-Team Coordination Tool

Cross-Team Coordination Tool

Streamline projects, tasks, and communication across teams.

Project Overview

${msg.text}

`; }); 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(); });
Scroll to Top