Cross-Team Coordination Tool

Cross-Team Coordination Tool

Streamline projects, tasks, and communication across teams.

Project Overview

${p.completion}% Complete

`; }); } function renderCalendar() { const calendarView = document.getElementById('calendar-view'); // This is a simplified calendar view for demonstration calendarView.innerHTML = `

Upcoming Deadlines & Milestones

`; const calendarEvents = [ { date: '2025-08-18', event: 'Q4 Campaign Ad Copy Due' }, { date: '2025-08-20', event: 'Website Staging Deployment' }, { date: '2025-08-22', event: 'Alpha Testing Begins' } ]; calendarEvents.forEach(e => { calendarView.innerHTML += `

${e.date}

${e.event}

`; }); } function renderTaskBoard() { const taskBoard = document.getElementById('task-board'); taskBoard.innerHTML = ''; const statuses = ['To Do', 'In Progress', 'Done']; statuses.forEach(status => { const column = document.createElement('div'); column.className = 'bg-gray-100 rounded-lg p-3'; column.innerHTML = `

${status}

`; const taskList = document.createElement('div'); taskList.className = 'task-list space-y-3 min-h-[100px]'; taskList.dataset.status = status; state.tasks.filter(t => t.status === status).forEach(task => { const teamColor = task.team === 'Marketing' ? 'pink' : task.team === 'Engineering' ? 'blue' : 'yellow'; const taskCard = document.createElement('div'); taskCard.className = 'task-card bg-white p-3 rounded-md shadow border-l-4 border-' + teamColor + '-400'; taskCard.draggable = true; taskCard.dataset.id = task.id; taskCard.innerHTML = `

${task.text}

${task.team}

`; taskList.appendChild(taskCard); }); column.appendChild(taskList); taskBoard.appendChild(column); }); setupDragAndDrop(); } function renderMessages() { const messageWindow = document.getElementById('message-window'); messageWindow.innerHTML = ''; state.messages.forEach(msg => { messageWindow.innerHTML += `

${msg.user}

${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