${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();
});