`;
});
}
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 += `
`;
});
}
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 += `
`;
});
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();
});