// 원본 기성 파일은 표만 확인하며 현재 작업에 반영하지 않는다. const EstAccomView = (() => { let current = null, page = 0; const pageSize = 200; const title = "원본 기성 표 확인"; function render() { const { esc, showDialog } = EstApp; const { fields, rows, warnings, name } = current; const pages = Math.max(1, Math.ceil(rows.length / pageSize)); const value = (item) => (item && typeof item === "object" ? "[바이너리]" : String(item ?? "")); const html = `

${esc(name)} · ${rows.length}행 · ${page + 1}/${pages}쪽

` + `

원본 표의 내용만 표시합니다. 웹 기성 회차에 적용하거나 원본 파일을 수정하지 않습니다.

` + warnings.map((warning) => `

${esc(warning)}

`).join("") + `` + `` + `
${fields.map((field) => ``).join("")}${rows .slice(page * pageSize, (page + 1) * pageSize) .map( (row) => `${fields.map((field) => ``).join("")}`, ) .join("")}
${esc(field)}
${esc(value(row[field]))}
`; const dialog = document.getElementById("dialog"); if (dialog.open && document.getElementById("dialog-title").textContent !== title) throw Error("다른 창을 닫은 뒤 기성 파일을 다시 확인하세요."); if (dialog.open) document.getElementById("dialog-content").innerHTML = html; else showDialog(title, html); } document.addEventListener("change", async (event) => { const input = event.target; if (input.dataset.accomInspect === undefined || !input.files?.length) return; const file = input.files[0]; try { if (file.size > 256 * 1024 * 1024) throw Error("파일은 256MB 이하만 열 수 있습니다."); const response = await fetch("/api/inspect-accom", { method: "POST", body: file }); const result = await response.json(); if (!response.ok) throw Error(result.error || "기성 파일을 읽지 못했습니다."); current = { ...result, name: file.name }; page = 0; render(); } catch (error) { if (document.getElementById("dialog").open) alert(error.message); else EstApp.showDialog("기성 파일 확인 오류", EstApp.esc(error.message)); } finally { input.value = ""; } }); document.addEventListener("click", (event) => { const button = event.target.closest("[data-accom-page]"); if (!button || !current) return; page = Math.max( 0, Math.min( Math.ceil(current.rows.length / pageSize) - 1, page + Number(button.dataset.accomPage), ), ); render(); }); return { render }; })();