Drop a PDF here or click to upload
+ +diff --git a/unredact/static/app.js b/unredact/static/app.js new file mode 100644 index 0000000..13b17f9 --- /dev/null +++ b/unredact/static/app.js @@ -0,0 +1,84 @@ +const dropZone = document.getElementById("drop-zone"); +const fileInput = document.getElementById("file-input"); +const uploadSection = document.getElementById("upload-section"); +const viewerSection = document.getElementById("viewer-section"); +const docImage = document.getElementById("doc-image"); +const pageInfo = document.getElementById("page-info"); +const prevBtn = document.getElementById("prev-page"); +const nextBtn = document.getElementById("next-page"); +const overlayToggle = document.getElementById("show-overlay"); +const fontInfo = document.getElementById("font-info"); + +let state = { + docId: null, + pageCount: 0, + currentPage: 1, + pageData: {}, +}; + +// Drag and drop +dropZone.addEventListener("click", () => fileInput.click()); +dropZone.addEventListener("dragover", (e) => { + e.preventDefault(); + dropZone.classList.add("dragover"); +}); +dropZone.addEventListener("dragleave", () => dropZone.classList.remove("dragover")); +dropZone.addEventListener("drop", (e) => { + e.preventDefault(); + dropZone.classList.remove("dragover"); + if (e.dataTransfer.files.length) uploadFile(e.dataTransfer.files[0]); +}); +fileInput.addEventListener("change", () => { + if (fileInput.files.length) uploadFile(fileInput.files[0]); +}); + +async function uploadFile(file) { + uploadSection.innerHTML = '
Analyzing document...
'; + + const form = new FormData(); + form.append("file", file); + + const resp = await fetch("/api/upload", { method: "POST", body: form }); + const data = await resp.json(); + + state.docId = data.doc_id; + state.pageCount = data.page_count; + state.currentPage = 1; + + uploadSection.hidden = true; + viewerSection.hidden = false; + + await loadPage(1); +} + +async function loadPage(page) { + state.currentPage = page; + updateControls(); + + const showOverlay = overlayToggle.checked; + const endpoint = showOverlay ? "overlay" : "original"; + docImage.src = `/api/doc/${state.docId}/page/${page}/${endpoint}`; + + // Load page data (font info, lines) + if (!state.pageData[page]) { + const resp = await fetch(`/api/doc/${state.docId}/page/${page}/data`); + state.pageData[page] = await resp.json(); + } + + const pd = state.pageData[page]; + fontInfo.textContent = `${pd.font.name} ~${pd.font.size}px (score: ${pd.font.score.toFixed(1)})`; +} + +function updateControls() { + pageInfo.textContent = `Page ${state.currentPage} / ${state.pageCount}`; + prevBtn.disabled = state.currentPage <= 1; + nextBtn.disabled = state.currentPage >= state.pageCount; +} + +prevBtn.addEventListener("click", () => { + if (state.currentPage > 1) loadPage(state.currentPage - 1); +}); +nextBtn.addEventListener("click", () => { + if (state.currentPage < state.pageCount) loadPage(state.currentPage + 1); +}); +overlayToggle.addEventListener("change", () => loadPage(state.currentPage)); diff --git a/unredact/static/index.html b/unredact/static/index.html new file mode 100644 index 0000000..21ca9eb --- /dev/null +++ b/unredact/static/index.html @@ -0,0 +1,42 @@ + + + + + +Epstein Files Redaction Analysis
+Drop a PDF here or click to upload
+ +