`;
return;
}
entriesForDate.forEach((entry) => {
const entryDiv = document.createElement('div');
entryDiv.className = 'ptsl-log-entry';
entryDiv.dataset.id = entry.id;
// Sanitize output by creating text nodes
const createTextNode = (text) => document.createTextNode(text || '');
const header = document.createElement('div');
header.className = 'ptsl-entry-header';
const titleDiv = document.createElement('div');
const titleH4 = document.createElement('h4');
titleH4.appendChild(createTextNode(entry.taskName));
const pomsP = document.createElement('p');
pomsP.className = 'ptsl-entry-poms';
pomsP.appendChild(createTextNode(`${entry.pomodoros} Pomodoro(s)`));
titleDiv.appendChild(titleH4);
titleDiv.appendChild(pomsP);
const deleteBtn = document.createElement('button');
deleteBtn.type = 'button';
deleteBtn.className = 'ptsl-btn-delete';
deleteBtn.textContent = 'Delete';
deleteBtn.onclick = () => deleteSession(entry.id);
header.appendChild(titleDiv);
header.appendChild(deleteBtn);
const bodyDiv = document.createElement('div');
bodyDiv.className = 'ptsl-entry-body';
const distractionsP = document.createElement('p');
const distractionsStrong = document.createElement('strong');
distractionsStrong.textContent = 'Distractions: ';
distractionsP.appendChild(distractionsStrong);
distractionsP.appendChild(createTextNode(entry.distractions));
const reflectionP = document.createElement('p');
const reflectionStrong = document.createElement('strong');
reflectionStrong.textContent = 'Reflection: ';
reflectionP.appendChild(reflectionStrong);
reflectionP.appendChild(createTextNode(entry.reflection));
bodyDiv.appendChild(distractionsP);
bodyDiv.appendChild(reflectionP);
entryDiv.appendChild(header);
entryDiv.appendChild(bodyDiv);
logEntriesContainer.appendChild(entryDiv);
});
}
function addSession() {
const taskName = taskNameInput.value.trim();
const pomodoros = parseInt(pomodorosInput.value, 10);
if (!taskName) {
alert('Please enter a task name.');
return;
}
if (isNaN(pomodoros) || pomodoros < 1) {
alert('Please enter a valid number of Pomodoros (1 or more).');
return;
}
const newSession = {
id: Date.now(),
date: logDateInput.value,
taskName: taskName,
pomodoros: pomodoros,
distractions: distractionsInput.value.trim(),
reflection: reflectionInput.value.trim(),
};
sessionLog.push(newSession);
saveToStorage();
renderLogEntries();
// Reset form
taskNameInput.value = '';
pomodorosInput.value = '1';
distractionsInput.value = '';
reflectionInput.value = '';
}
function deleteSession(id) {
if (confirm('Are you sure you want to delete this session log?')) {
sessionLog = sessionLog.filter(entry => entry.id !== id);
saveToStorage();
renderLogEntries();
}
}
// --- PDF DOWNLOAD ---
async function downloadPdf() {
if (typeof jspdf === 'undefined' || typeof html2canvas === 'undefined') {
alert('PDF libraries are still loading. Please try again.');
return;
}
const entriesForDate = sessionLog.filter(entry => entry.date === logDateInput.value);
if (entriesForDate.length === 0) {
alert('There are no log entries for this date to download.');
return;
}
const { jsPDF } = jspdf;
const pdf = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' });
// Create a temporary, printable version of the log
const tempPrintDiv = document.createElement('div');
const header = document.createElement('div');
header.className = 'ptsl-pdf-header';
header.innerHTML = `
