Files
Aislo/tools/est-test/native-accom-view.js

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 };
})();