Online Secure Digital Company Bulletin Board

Digital Company Bulletin Board

Your central hub for company announcements and updates.

${category ? category.name : 'Uncategorized'}

${post.title}

${DOMPurify.sanitize(post.content)}
By ${user ? user.name : 'Unknown'} on ${post.date}
`; }).join(''); } function handlePostAction(e) { const button = e.target.closest('button[data-action]'); if (!button) return; const id = parseInt(button.dataset.id); const action = button.dataset.action; if (action === 'edit') { const post = posts.find(p => p.id === id); if (post) { loadPostIntoForm(post); setActiveTab(1); } } else if (action === 'delete') { if (confirm('Are you sure you want to delete this post?')) { posts = posts.filter(p => p.id !== id); saveDataToStorage(); renderPosts(); } } } // --- POST MANAGEMENT LOGIC --- // function renderManagementDropdowns() { categoryFilter.innerHTML = '' + categories.map(c => ``).join(''); postCategorySelect.innerHTML = categories.map(c => ``).join(''); postAuthorSelect.innerHTML = users.map(u => ``).join(''); } function handleSavePost() { const id = postIdInput.value; const postData = { id: id ? parseInt(id) : Date.now(), title: postTitleInput.value.trim(), categoryId: parseInt(postCategorySelect.value), userId: parseInt(postAuthorSelect.value), date: id ? posts.find(p=>p.id==id).date : new Date().toISOString().split('T')[0], expiry: postExpiryInput.value, content: DOMPurify.sanitize(postContentEl.innerHTML) }; if (!postData.title || !postData.content) { showNotification('Post title and content are required.', 'warning'); return; } if (id) { // Update const index = posts.findIndex(p => p.id === postData.id); if (index > -1) posts[index] = postData; } else { // Create posts.push(postData); } saveDataToStorage(); renderPosts(); resetPostForm(); setActiveTab(0); showNotification('Post saved successfully!', 'success'); } function resetPostForm() { postFormTitle.textContent = 'Create a New Post'; postIdInput.value = ''; postTitleInput.value = ''; postContentEl.innerHTML = ''; postExpiryInput.value = ''; cancelPostBtn.classList.add('hidden'); } function loadPostIntoForm(post) { postFormTitle.textContent = 'Edit Post'; postIdInput.value = post.id; postTitleInput.value = post.title; postCategorySelect.value = post.categoryId; postAuthorSelect.value = post.userId; postExpiryInput.value = post.expiry; postContentEl.innerHTML = post.content; cancelPostBtn.classList.remove('hidden'); } // --- CONFIGURATION LOGIC --- // function renderConfigLists() { categoriesListEl.innerHTML = categories.map(c => `
${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(); });
Scroll to Top