No collections yet.
';
return;
}
collectionNames.forEach(name => {
const collectionEl = document.createElement('div');
collectionEl.className = 'bg-gray-50 p-4 rounded-lg';
let itemsHtml = bujoData.collections[name].map(item => `
${item.content}`).join('');
collectionEl.innerHTML = `
${name}
`;
collectionsList.appendChild(collectionEl);
});
};
// --- Global Action Functions ---
window.deleteEntry = (dateKey, id) => {
bujoData.entries[dateKey] = bujoData.entries[dateKey].filter(e => e.id !== id);
saveData();
renderDailyLog();
};
window.toggleTaskStatus = (dateKey, id) => {
const entry = bujoData.entries[dateKey].find(e => e.id === id);
if (entry) {
if (entry.status === 'incomplete') entry.status = 'complete';
else if (entry.status === 'complete') entry.status = 'incomplete';
}
saveData();
renderDailyLog();
};
window.deleteCollection = (name) => {
delete bujoData.collections[name];
saveData();
renderCollections();
};
window.deleteCollectionItem = (collectionName, itemId) => {
bujoData.collections[collectionName] = bujoData.collections[collectionName].filter(item => item.id !== itemId);
saveData();
renderCollections();
};
// --- Event Listeners ---
Object.keys(tabs).forEach(key => tabs[key].addEventListener('click', () => switchTab(key)));
document.getElementById('prev-day-btn').addEventListener('click', () => { currentDate.setDate(currentDate.getDate() - 1); renderDailyLog(); });
document.getElementById('next-day-btn').addEventListener('click', () => { currentDate.setDate(currentDate.getDate() + 1); renderDailyLog(); });
document.getElementById('prev-month-btn').addEventListener('click', () => { currentMonthDate.setMonth(currentMonthDate.getMonth() - 1); renderMonthlyView(); });
document.getElementById('next-month-btn').addEventListener('click', () => { currentMonthDate.setMonth(currentMonthDate.getMonth() + 1); renderMonthlyView(); });
dailyEntryForm.addEventListener('submit', (e) => {
e.preventDefault();
const textInput = document.getElementById('entry-text');
const typeInput = document.getElementById('entry-type');
const dateKey = toISODateString(currentDate);
if (!bujoData.entries[dateKey]) bujoData.entries[dateKey] = [];
const newEntry = { id: Date.now(), type: typeInput.value, content: textInput.value };
if (newEntry.type === 'task') newEntry.status = 'incomplete';
bujoData.entries[dateKey].push(newEntry);
saveData();
renderDailyLog();
textInput.value = '';
});
collectionForm.addEventListener('submit', (e) => {
e.preventDefault();
const nameInput = document.getElementById('collection-name');
if (!bujoData.collections[nameInput.value]) {
bujoData.collections[nameInput.value] = [];
saveData();
renderCollections();
nameInput.value = '';
}
});
collectionsList.addEventListener('submit', (e) => {
if (e.target.classList.contains('collection-item-form')) {
e.preventDefault();
const input = e.target.querySelector('.collection-item-input');
const collectionName = e.target.closest('div').querySelector('h3').textContent;
bujoData.collections[collectionName].push({ id: Date.now(), content: input.value });
saveData();
renderCollections();
}
});
document.getElementById('save-settings-btn').addEventListener('click', () => {
bujoData.username = usernameInput.value.trim() || 'User';
saveData();
settingsSavedMsg.classList.remove('hidden');
setTimeout(() => settingsSavedMsg.classList.add('hidden'), 2000);
});
document.getElementById('pdf-download-btn').addEventListener('click', () => {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
let yPos = 40;
doc.setFontSize(20);
doc.text(`${bujoData.username}'s Bullet Journal`, 105, 20, null, null, 'center');
// Daily Logs
doc.setFontSize(16);
doc.text("Daily Logs", 14, yPos);
yPos += 10;
Object.keys(bujoData.entries).sort().forEach(dateKey => {
if (yPos > 260) { doc.addPage(); yPos = 20; }
doc.setFontSize(12);
doc.setFont(undefined, 'bold');
doc.text(new Date(dateKey).toLocaleDateString(), 14, yPos);
yPos += 7;
doc.setFont(undefined, 'normal');
bujoData.entries[dateKey].forEach(entry => {
doc.text(`- [${entry.type}] ${entry.content}`, 18, yPos);
yPos += 6;
});
});
// Collections
yPos += 10;
doc.setFontSize(16);
doc.text("Collections", 14, yPos);
yPos += 10;
Object.keys(bujoData.collections).forEach(name => {
if (yPos > 260) { doc.addPage(); yPos = 20; }
doc.setFontSize(12);
doc.setFont(undefined, 'bold');
doc.text(name, 14, yPos);
yPos += 7;
doc.setFont(undefined, 'normal');
bujoData.collections[name].forEach(item => {
doc.text(`- ${item.content}`, 18, yPos);
yPos += 6;
});
});
doc.save(`${bujoData.username}_Bullet_Journal.pdf`);
});
// --- Initial Load ---
loadData();
renderDailyLog();
});