Shared Work Journal for Teams

Shared Work Journal

A central place for teams to log updates, progress, and blockers.

No entries to manage.

`; return; } let tableHTML = ``; journalEntries.forEach(entry => { tableHTML += ` `; }); tableHTML += `
Date User Entry Actions
${entry.date} ${entry.user} ${entry.text.substring(0, 100)}...
`; container.innerHTML = tableHTML; } function populateFilters() { const users = [...new Set(journalEntries.map(entry => entry.user))]; userFilter.innerHTML = ''; users.sort().forEach(user => { userFilter.innerHTML += ``; }); } function applyFilters() { const selectedUser = userFilter.value; const selectedDate = dateFilter.value; let filteredEntries = journalEntries; if (selectedUser !== 'all') { filteredEntries = filteredEntries.filter(e => e.user === selectedUser); } if (selectedDate) { filteredEntries = filteredEntries.filter(e => e.date === selectedDate); } renderJournalFeed(filteredEntries); } function switchTab(tabName) { tabPanes.forEach(pane => pane.classList.add('hidden')); document.getElementById(tabName).classList.remove('hidden'); tabBtns.forEach(btn => { btn.classList.toggle('tab-active', btn.dataset.tab === tabName); btn.classList.toggle('tab-inactive', btn.dataset.tab !== tabName); }); } // SECTION: PDF GENERATION // ======================= function generatePDF() { const { jsPDF } = window.jspdf; const doc = new jsPDF(); const selectedUser = userFilter.value; const selectedDate = dateFilter.value; let filteredEntries = journalEntries; if (selectedUser !== 'all') filteredEntries = filteredEntries.filter(e => e.user === selectedUser); if (selectedDate) filteredEntries = filteredEntries.filter(e => e.date === selectedDate); doc.setFont('helvetica', 'bold'); doc.setFontSize(22); doc.text('Shared Work Journal Report', doc.internal.pageSize.getWidth() / 2, 20, { align: 'center' }); doc.setFontSize(11); doc.setTextColor('#6b7280'); let filterText = `Filters: User - ${selectedUser}, Date - ${selectedDate || 'All'}`; doc.text(filterText, doc.internal.pageSize.getWidth() / 2, 28, { align: 'center' }); const tableColumn = ["Date", "User", "Entry", "Tags"]; const tableRows = []; filteredEntries.forEach(entry => { const entryData = [ entry.date, entry.user, entry.text, entry.tags.join(', ') ]; tableRows.push(entryData); }); doc.autoTable({ head: [tableColumn], body: tableRows, startY: 40, theme: 'grid', styles: { cellPadding: 2 }, columnStyles: { 2: { cellWidth: 'auto' } // Allow 'Entry' column to wrap } }); doc.save(`Work_Journal_${new Date().toISOString().split('T')[0]}.pdf`); } // SECTION: EVENT LISTENERS // ======================== function setupEventListeners() { tabBtns.forEach(btn => btn.addEventListener('click', () => switchTab(btn.dataset.tab))); submitEntryBtn.addEventListener('click', addEntry); downloadPdfBtn.addEventListener('click', generatePDF); userFilter.addEventListener('change', applyFilters); dateFilter.addEventListener('change', applyFilters); document.getElementById('manage-table-container').addEventListener('click', (e) => { if (e.target.classList.contains('delete-btn')) { deleteEntry(parseInt(e.target.dataset.id)); } }); } // Initial Load loadState(); setupEventListeners(); });
Scroll to Top