By ${user ? user.name : 'Unknown'} on ${post.date}
${c.name}
`).join('');
usersListEl.innerHTML = users.map(u => `${u.name}
`).join('');
}
function handleAddCategory() {
const name = newCategoryNameInput.value.trim();
if (name) {
categories.push({ id: Date.now(), name });
saveDataToStorage();
renderConfigLists();
renderManagementDropdowns();
newCategoryNameInput.value = '';
}
}
function handleRemoveCategory(e) {
if (e.target.classList.contains('remove-category-btn')) {
const id = parseInt(e.target.dataset.id);
if (posts.some(p => p.categoryId === id)) {
showNotification('Cannot delete category with active posts.', 'warning');
return;
}
categories = categories.filter(c => c.id !== id);
saveDataToStorage();
renderConfigLists();
renderManagementDropdowns();
}
}
function handleAddUser() {
const name = newUserNameInput.value.trim();
if (name) {
users.push({ id: Date.now(), name });
saveDataToStorage();
renderConfigLists();
renderManagementDropdowns();
newUserNameInput.value = '';
}
}
function handleRemoveUser(e) {
if (e.target.classList.contains('remove-user-btn')) {
const id = parseInt(e.target.dataset.id);
if (posts.some(p => p.userId === id)) {
showNotification('Cannot delete author with active posts.', 'warning');
return;
}
users = users.filter(u => u.id !== id);
saveDataToStorage();
renderConfigLists();
renderManagementDropdowns();
}
}
// --- PDF GENERATION --- //
function generatePDF() {
const { jsPDF } = window.jspdf;
const pdf = new jsPDF({ unit: 'pt', format: 'a4' });
let y = 40;
const margin = 40;
const pdfWidth = pdf.internal.pageSize.getWidth();
pdf.setFontSize(20);
pdf.setFont('helvetica', 'bold');
pdf.text('Company Bulletin Board Summary', pdfWidth / 2, y, { align: 'center' });
y += 40;
categories.forEach(category => {
const categoryPosts = posts.filter(p => p.categoryId === category.id);
if (categoryPosts.length > 0) {
pdf.setFontSize(14);
pdf.setFont('helvetica', 'bold');
pdf.text(category.name, margin, y);
y += 20;
const headers = [['Date', 'Title', 'Author']];
const body = categoryPosts.map(p => {
const user = users.find(u => u.id === p.userId);
return [p.date, p.title, user ? user.name : 'N/A'];
});
pdf.autoTable({
startY: y,
head: headers,
body: body,
theme: 'grid',
headStyles: { fillColor: [30, 64, 175] }
});
y = pdf.autoTable.previous.finalY + 30;
}
});
pdf.save('Bulletin-Board-Report.pdf');
}
// --- TAB NAVIGATION --- //
function setActiveTab(index) {
tabs.forEach((tab, i) => tab.classList.toggle('active', i === index));
tabPanels.forEach((panel, i) => panel.classList.toggle('hidden', i !== index));
}
// --- KICK IT OFF --- //
initializeApp();
});
