No journal entries found for the selected filters.
`;
return;
}
entries.forEach(entry => {
const tagsHTML = entry.tags.map(tag => `
${tag}`).join('');
const entryDate = new Date(entry.date).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
feed.innerHTML += `
${entry.user}
${entryDate}
${entry.text}
${tagsHTML}
`;
});
}
function renderManageTable() {
const container = document.getElementById('manage-table-container');
if (journalEntries.length === 0) {
container.innerHTML = `
No entries to manage.
`;
return;
}
let tableHTML = `
| Date |
User |
Entry |
Actions |
`;
journalEntries.forEach(entry => {
tableHTML += `
| ${entry.date} |
${entry.user} |
${entry.text.substring(0, 100)}... |
|
`;
});
tableHTML += `
`;
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();
});