Online Team Communication Enhancement System

Team Communication Hub

Share announcements, spark discussions, and centralize resources.

Latest Announcements

${item.desc}

${item.replies.length} replies

`; }); }; const renderResources = () => { const table = document.getElementById('resourceTable'); table.innerHTML = ''; data.resources.forEach(item => { table.innerHTML += `${item.title}Open Link${item.desc}`; }); }; // --- MODAL & FORM LOGIC --- app.showModal = (type) => { const modal = document.getElementById('itemModal'); const title = document.getElementById('modalTitle'); document.getElementById('modalTypeInput').value = type; document.getElementById('modalTitleInput').value = ''; document.getElementById('modalDescInput').value = ''; document.getElementById('modalLinkInput').value = ''; if (type === 'announcement') { title.textContent = 'New Announcement'; document.getElementById('modalDescContainer').classList.remove('hidden'); document.getElementById('modalLinkContainer').classList.add('hidden'); } else if (type === 'discussion') { title.textContent = 'Start New Discussion Topic'; document.getElementById('modalDescContainer').classList.remove('hidden'); document.getElementById('modalLinkContainer').classList.add('hidden'); } else if (type === 'resource') { title.textContent = 'Add New Resource'; document.getElementById('modalDescContainer').classList.remove('hidden'); document.getElementById('modalLinkContainer').classList.remove('hidden'); } modal.classList.remove('hidden'); }; app.showDiscussionDetails = (id) => { activeDiscussionId = id; const discussion = data.discussions.find(d => d.id === id); document.getElementById('discussionDetailTitle').textContent = discussion.title; document.getElementById('discussionDetailDesc').textContent = discussion.desc; const repliesDiv = document.getElementById('discussionReplies'); repliesDiv.innerHTML = ''; discussion.replies.forEach(reply => { repliesDiv.innerHTML += `

${reply.text}

${reply.date}

`; }); document.getElementById('discussionDetailModal').classList.remove('hidden'); }; app.hideModal = (modalId = 'itemModal') => document.getElementById(modalId).classList.add('hidden'); // --- CORE LOGIC --- app.saveItem = () => { const type = document.getElementById('modalTypeInput').value; const title = document.getElementById('modalTitleInput').value; const desc = document.getElementById('modalDescInput').value; if (!title.trim()) { alert('Title is required.'); return; } const newItem = { id: Date.now(), title, desc, date: new Date().toLocaleDateString() }; if (type === 'announcement') { data.announcements.push(newItem); renderAnnouncements(); } else if (type === 'discussion') { data.discussions.push({ ...newItem, replies: [] }); renderDiscussions(); } else if (type === 'resource') { newItem.link = document.getElementById('modalLinkInput').value; if (!newItem.link.trim()) { alert('Link is required for resources.'); return; } data.resources.push(newItem); renderResources(); } saveData(); app.hideModal(); }; app.addReply = () => { const replyText = document.getElementById('replyInput').value; if (!replyText.trim()) return; const discussion = data.discussions.find(d => d.id === activeDiscussionId); discussion.replies.push({ text: replyText, date: new Date().toLocaleString() }); saveData(); app.showDiscussionDetails(activeDiscussionId); // Re-render the details document.getElementById('replyInput').value = ''; }; app.deleteItem = (type, id) => { if (confirm(`Are you sure you want to delete this ${type}?`)) { if (type === 'resource') { data.resources = data.resources.filter(item => item.id !== id); renderResources(); } saveData(); } }; // --- UTILS & HELPERS --- app.changeTab = (tabIndex) => { document.querySelectorAll('[id^="tabContent-"]').forEach(el => el.classList.add('hidden')); document.querySelectorAll('[id^="tab-"]').forEach(el => el.classList.replace('tab-active', 'tab-inactive')); document.getElementById(`tabContent-${tabIndex}`).classList.remove('hidden'); document.getElementById(`tab-${tabIndex}`).classList.replace('tab-inactive', 'tab-active'); }; app.downloadReportPDF = () => { const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(20); doc.text('Team Communication Report', 105, 15, { align: 'center' }); doc.setFontSize(12); doc.text(`Generated on: ${new Date().toLocaleDateString()}`, 105, 22, { align: 'center' }); // Announcements doc.setFontSize(16); doc.text('Announcements', 15, 35); doc.autoTable({ startY: 40, head: [['Date', 'Title', 'Details']], body: data.announcements.map(a => [a.date, a.title, a.desc]), theme: 'striped' }); // Discussions doc.addPage(); doc.setFontSize(16); doc.text('Discussions', 15, 20); const discussionBody = data.discussions.flatMap(d => [ [{ content: d.title, colSpan: 2, styles: { fontStyle: 'bold', fillColor: [230, 230, 230] } }], ...d.replies.map(r => [r.date, r.text]) ]); doc.autoTable({ startY: 25, head: [['Date/Time', 'Reply']], body: discussionBody, theme: 'grid' }); // Resources doc.addPage(); doc.setFontSize(16); doc.text('Shared Resources', 15, 20); doc.autoTable({ startY: 25, head: [['Title', 'Description', 'Link']], body: data.resources.map(r => [r.title, r.desc, r.link]), theme: 'striped' }); doc.save('team_communication_report.pdf'); }; // --- INITIALIZATION --- loadData(); renderAnnouncements(); renderDiscussions(); renderResources(); });
Scroll to Top