Film Photography Tracker Generator

Film Photography Tracker Generator

Tracker Setup

Single Roll Details

Tracker Preview (Dashboard)

Please select at least one column in the "Bulk Log Setup".

'; return; } tableHtml = ``; selectedCols.forEach(col => tableHtml += ``); tableHtml += ``; for (let i = 0; i < numRows; i++) { tableHtml += ``; selectedCols.forEach(() => tableHtml += ``); tableHtml += ``; } tableHtml += `
${col}
`; } preview.sheet.innerHTML = headerHtml + tableHtml; } function toggleOptions() { const type = controls.trackerType.value; controls.singleRollOptions.style.display = (type === 'single_roll') ? 'block' : 'none'; controls.bulkRollOptions.style.display = (type === 'bulk_roll') ? 'block' : 'none'; generateTracker(); } // 7. USA-relevant sample data function loadSampleData() { controls.projectName.value = "California Coast Trip"; controls.photographer.value = "Ansel Adams"; controls.trackerType.value = 'single_roll'; controls.rollId.value = "CA-01"; controls.filmStock.value = "Kodak Gold 200"; controls.format.value = "35mm"; controls.camera.value = "Minolta X-700"; controls.iso.value = "200 (Box)"; controls.numExposures.value = "24"; toggleOptions(); } async function handleDownloadPDF() { controls.pdfDownloadBtn.textContent = "Generating..."; controls.pdfDownloadBtn.disabled = true; try { const { jsPDF } = window.jspdf; container.classList.add("fptg-pdf-export-mode"); // V.A: Rigorous testing of PDF feature const canvas = await html2canvas(preview.sheet, { scale: 2 }); container.classList.remove("fptg-pdf-export-mode"); const imgData = canvas.toDataURL("image/png"); const pdf = new jsPDF({ orientation: "p", unit: "mm", format: "a4" }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const margin = 10; const contentWidth = pdfWidth - margin * 2; const imgHeight = (canvas.height * contentWidth) / canvas.width; let heightLeft = imgHeight; let position = margin; pdf.addImage(imgData, "PNG", margin, position, contentWidth, imgHeight); heightLeft -= (pdfHeight - margin*2); // Handle multi-page while (heightLeft > 0) { position = -heightLeft - margin; pdf.addPage(); pdf.addImage(imgData, "PNG", margin, position, contentWidth, imgHeight); heightLeft -= (pdfHeight - margin*2); } pdf.save(`${(controls.projectName.value || "Film_Tracker").replace(/ /g, "_")}.pdf`); } catch (error) { console.error("PDF Generation Error:", error); alert("An error occurred while creating the PDF."); } finally { controls.pdfDownloadBtn.textContent = "Download Tracker (PDF)"; controls.pdfDownloadBtn.disabled = false; } } // --- Initial Setup & Event Listeners --- // Listen to all inputs for live updates const allInputs = container.querySelectorAll('input, select, textarea'); allInputs.forEach(input => { if(input.id === 'fptg-tracker-type') { input.addEventListener('change', toggleOptions); } else { input.addEventListener('input', generateTracker); input.addEventListener('change', generateTracker); // For checkboxes } }); controls.loadSampleBtn.addEventListener('click', loadSampleData); controls.pdfDownloadBtn.addEventListener('click', handleDownloadPDF); // Initial render generateTracker(); });
Scroll to Top