Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_Hopyo_Import.ts
T
eomsangdonandClaude Sonnet 5.5 a6b236f2b2 feat(837-1): 일위대가 불러오기 층 가르기 걷음 — 누가 하든 자기 개인 층
- 화면: 왼쪽 층 고름(개인·회사·마스터) · 머리 층 배지 · 작업 중 줄의 층 글 걷음(Hopyo_Side · Hopyo_Import)
- 서버: 불러오기 길(Hopyo_Router)은 경로 층 · 주인 · 몸 층을 무시하고 개인 층 고정 · 단산 블록 → 가져온 식(from-hopyo · preview)도 개인 층
- 시험: 새 지킴 시험 test_837_1 · 낡은 시험 고침(785_4 층 고름 → 층 가르기 없음 · dirty 글 / 705_2 남의 층 403 → 경로 층 무시 200)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-15 14:02:33 +09:00

111 lines
5.0 KiB
TypeScript

/* =============================================================================
* M02_MasterTemplete_Hopyo_Import.ts
* 일위대가 불러오기 본 칸 보기(PLAN 785-4 · 요구 642-11 — 마법사 `Hopyo_Wizard` 갈음 · 가운데 상세 페이지 없음) —
* 왼쪽 [불러오기] → 파일 고름 → 올림(`Hopyo_Side` · 층 가르기 없음 — 누가 하든 자기 개인 층 · 요구 855) → 바로 이 보기:
* · 머리 막대 = 엑셀 보기 몸(`Hopyo_Sheet` — 시트 · 호표 · 검산 · 연결)의 머리에 [끝내기]를 덧붙임
* · 아래 = 엑셀(탭 셋) + 오른쪽 호표 · 단가산출 목록(`Hopyo_Sheet` · `Hopyo_SheetSk`) · 만들기 = 호표 줄 [내 일위대가로](807-1)
* · [끝내기] = 물음(안 만든 단가산출 알림) → 서버가 이번 HP · 격자 저장본 지움 ·
* 만든 일위대가 · 단가산출(엑셀 사본 걷고 출처만) · 별칭 장부 남음 · 옛 「안 이은 줄」 띠는 785-7 에서 지움(판정 「고를 것」)
* · 작업 중 = 이 화면 동안만(743-1) — 화면 떠남(`leave` · 페이지 닫음) = 이 화면에서 올리거나 이은 파일 지움 ·
* 하루 지난 것은 서버가 지움 · 엑셀 자료는 보관하지 않음(필요하면 다시 올림)
* ========================================================================== */
import { createButton, el, showConfirmDialog, showToast } from "@ui/ui_template_elements";
import { t as L } from "@ui/ui_template_locale";
import { createText } from "@ui/ui_template_text";
import { deleteHopyo, type HopyoFile, type HopyoScope } from "./M02_MasterTemplete_Hopyo_Api";
import type { HopyoSheetBody } from "./M02_MasterTemplete_Hopyo_Sheet";
import "./M02_MasterTemplete_Hopyo.css";
/** 불러오기 자리 = 늘 자기 개인 층(요구 855 — 층 가르기 없음) */
export const MINE: HopyoScope = { layer: "personal", owner: null };
const why = (error: unknown): string => (error instanceof Error ? error.message : String(error));
export interface HopyoImportArgs {
file: HopyoFile;
/** [끝내기] 로 올린 파일을 지웠음 */
onEnded: () => void;
}
export interface HopyoImport {
root: HTMLElement;
/** 화면 떠남 — 이 화면에서 올리거나 이은 파일 지움(743-1) */
leave: () => void;
/** 저장 안 한 재료 고름(827-3) — 판정 고름 캐시는 809-1 에서 걷음 */
dirty: () => boolean;
}
export function buildHopyoImport(a: HopyoImportArgs): HopyoImport {
const { file } = a;
const scope = MINE;
let held = true;
let body: HopyoSheetBody | null = null;
const root = el("div", {
className: "m02-hopyo-import",
attrs: { "data-hopyo-import": file.키 },
children: [createText("엑셀을 읽는 중…", "muted", 14)],
});
const leave = (): void => {
window.removeEventListener("pagehide", leave);
if (!held) return;
held = false;
void deleteHopyo(scope, file.키, true).catch(() => {});
body?.destroy();
};
window.addEventListener("pagehide", leave);
// ── 머리 막대에 덧붙일 것 ──
const finish = createButton({ label: "끝내기", variant: "filled", size: 28, onClick: () => void end() }); // prettier-ignore
finish.dataset.hopyoFinish = "";
async function end(): Promise<void> {
finish.disabled = true;
const w = body?.skCount(); // 안 옮긴 단가산출(일위대가 밖 포함) — 묻기만
const ok = await showConfirmDialog(
`「${file.파일}」 불러오기를 끝냄 — 올린 파일(엑셀 결과 · 격자 · 블록 풀이)을 지움 · 만든 일위대가 · 단가산출(출처만 남김)과 별칭 장부는 남음 · 같은 엑셀은 필요하면 다시 올림` +
(w?.블록
? ` · ${L("M02_SkUnmoved").replace("{n}", String(w.블록)).replace("{m}", String(w.밖))}`
: ""), // 780-2 막지 않음
"끝내기",
);
if (!ok) return void (finish.disabled = false);
try {
const out = (await deleteHopyo(scope, file.키)) as { 만든?: number };
held = false;
window.removeEventListener("pagehide", leave);
body?.destroy();
showToast(`끝냄 — 만든 일위대가 · 단가산출 ${out.만든 ?? 0} · 올린 파일 지움`, "success");
} catch (error) {
showToast(why(error), "error");
finish.disabled = false;
return;
}
a.onEnded();
}
// ── 몸 — 엑셀 보기 몸을 바로 담음(스프레드시트는 열 때 불러옴) ──
void import("./M02_MasterTemplete_Hopyo_Sheet")
.then((m) => {
if (!held) return;
const view = m.buildHopyoSheet({
scope,
key: file.키,
파일: file.파일,
target: scope,
canWrite: true,
headExtra: [finish],
});
body = view;
root.replaceChildren(...view.parts);
})
.catch((error: unknown) => root.replaceChildren(createText(why(error), "muted", 14)));
return {
root,
leave,
dirty: () => body?.matDirty() ?? false, // 827-3 저장 안 한 재료 고름
};
}