64 lines
2.9 KiB
JavaScript
64 lines
2.9 KiB
JavaScript
// 원본 기성 파일은 표만 확인하며 현재 작업에 반영하지 않는다.
|
|
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 =
|
|
`<p>${esc(name)} · ${rows.length}행 · ${page + 1}/${pages}쪽</p>` +
|
|
`<p>원본 표의 내용만 표시합니다. 웹 기성 회차에 적용하거나 원본 파일을 수정하지 않습니다.</p>` +
|
|
warnings.map((warning) => `<p>${esc(warning)}</p>`).join("") +
|
|
`<button data-accom-page="-1" ${page === 0 ? "disabled" : ""}>이전</button>` +
|
|
`<button data-accom-page="1" ${page + 1 >= pages ? "disabled" : ""}>다음</button>` +
|
|
`<div style="overflow:auto;max-height:60vh"><table class="sheet"><thead><tr>${fields.map((field) => `<th>${esc(field)}</th>`).join("")}</tr></thead><tbody>${rows
|
|
.slice(page * pageSize, (page + 1) * pageSize)
|
|
.map(
|
|
(row) =>
|
|
`<tr>${fields.map((field) => `<td>${esc(value(row[field]))}</td>`).join("")}</tr>`,
|
|
)
|
|
.join("")}</tbody></table></div>`;
|
|
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 };
|
|
})();
|