refactor(785-7): 옛 맞춤 화면 TS 지움 · 옛 [저장] · [모두 고정] 단추 걷음 · 390 줄 판 높이
- 지움(git rm) 15 파일 3,318 줄: Hopyo_Check · CheckRows · Choose · WizardSk · SkApi · SkLines · logic/SkPick · logic/Draft · Left · Lost · Pick · SheetMake · Kids · ToItem · Compare(모두 옛 확인 창 · 마법사 단가산출 · 안 이은 줄 길 몫 · 부르는 곳 0) - 단추 판단: 엑셀 보기 [저장](체크 호표) · [모두 고정으로 들여오기] 화면 단추 걷음 → 만들기 = [옮기기] 하나 · 모두 고정 서버 길(Builder · build_all)은 B09 · 붙여넣기가 써서 남김 · 목록 체크 칸 · 모달 껍데기(openHopyoSheet · raise · lower) 걷음 - Import: 「안 이은 줄」 띠 · [안 이은 줄 고르기] · 남은 줄 셈 걷음 · [끝내기] = 물음(확인하고 안 옮긴 수 = 판정 고름 캐시 moveBody) - Api: 옛 맞춤 타입 · 길(readHopyoOne · guessHopyo · buildHopyo · buildHopyoAll · leftHopyo · listHopyoPicks · hopyoSiblings · buildHopyoItem …) 걷음 · POLL_MS · HOPYO_BUILT 옮겨 옴 · 목록 꼴 = 1차 판정 줄상태(Judge.view) - Labor_Pick: withHopyo(실무 호표 덧줄) → withSangeun(찾아 넣기 창 표시만) · Detail · Table 부름 바꿈 - Ledger: unitField 옮겨 옴 · SheetNav: 옛 확인 캐시 칠 걷음 · UI_Page: [구조물 조합으로] 듣기 걷음 - CSS: 옛 확인 창 · 고르기 창 규칙 34 걷음(481 → 287 줄) · 390 폭 = 줄 판 열리면 위 칸 넓힘 · 줄 판 높이 바닥 16rem 시험 정리(까닭 = 지운 화면 파일만 읽음): - 지움: test_729_3_hopyo_left_screen · test_746_2_hopyo_compare_screen · test_778_5_sk_pick_screen · helper_729_3 · helper_m02_hopyo_check · pick · seam - test_m02_hopyo_screen = 좌측 판 · 끝내기 둘만 · 627 · helper_778_5 = SheetSk 판 바꿈만 · 785_4 · 721 · 717_4 · 720 · 739_1 = 지금 꼴로 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,37 +2,22 @@
|
||||
* M02_MasterTemplete_Hopyo_Import.ts
|
||||
* 일위대가 불러오기 본 칸 보기(PLAN 785-4 · 요구 642-11 — 마법사 `Hopyo_Wizard` 갈음 · 가운데 상세 페이지 없음) —
|
||||
* 왼쪽 [불러오기] → 층 · 파일 고름 → 올림(`Hopyo_Side`) → 바로 이 보기:
|
||||
* · 머리 막대 = 엑셀 보기 몸(`Hopyo_Sheet` — 시트 · 호표 · 검산 · 제안)의 머리에 층 · 안 이은 줄 배지 ·
|
||||
* [안 이은 줄 고르기] · [끝내기]를 덧붙임
|
||||
* · 아래 = 엑셀(탭 셋) + 오른쪽 호표 · 단가산출 목록(`Hopyo_Sheet` · `Hopyo_SheetSk`) · 만들기 = 목록 아래 막대
|
||||
* · 안 이은 줄 수 = 엑셀 보기가 읽은 호표 번으로 셈([끝내기] 전 「0」 오표시 흠 고침 — 빈 호표 번 안 씀)
|
||||
* · [끝내기] = 남은 줄 다시 셈 → 있으면 막음(배지 · 남은 수 · 표) · 없으면 물음 → 서버가 이번 HP · 격자 · 맞춤셈 캐시 지움 ·
|
||||
* 만든 일위대가 · 단가산출(엑셀 사본 걷고 출처만) · 별칭 장부 남음
|
||||
* · 머리 막대 = 엑셀 보기 몸(`Hopyo_Sheet` — 시트 · 호표 · 검산 · 제안)의 머리에 층 · [끝내기]를 덧붙임
|
||||
* · 아래 = 엑셀(탭 셋) + 오른쪽 호표 · 단가산출 목록(`Hopyo_Sheet` · `Hopyo_SheetSk`) · 만들기 = 목록 아래 [옮기기]
|
||||
* · [끝내기] = 물음(확인하고 안 옮긴 수 · 안 옮긴 단가산출 알림) → 서버가 이번 HP · 격자 · 블록 풀이 저장본 지움 ·
|
||||
* 만든 일위대가 · 단가산출(엑셀 사본 걷고 출처만) · 별칭 장부 남음 · 옛 「안 이은 줄」 띠는 785-7 에서 지움(판정 「고를 것」)
|
||||
* · 작업 중 = 이 화면 동안만(743-1) — 화면 떠남(`leave` · 페이지 닫음) = 이 화면에서 올리거나 이은 파일 지움 ·
|
||||
* 하루 지난 것은 서버가 지움 · 엑셀 자료는 보관하지 않음(필요하면 다시 올림)
|
||||
* ========================================================================== */
|
||||
|
||||
import { createBadge, type BadgeTone } from "@ui/ui_template_badge";
|
||||
import { createBadge } from "@ui/ui_template_badge";
|
||||
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 { fetchSessionUser } from "../A06_Login/A06_Login_Api_Fetch";
|
||||
import {
|
||||
deleteHopyo,
|
||||
readHopyo,
|
||||
type HopyoFile,
|
||||
type HopyoScope,
|
||||
type HopyoView,
|
||||
} from "./M02_MasterTemplete_Hopyo_Api";
|
||||
import { draftKey, hasDraft } from "./M02_MasterTemplete_Hopyo_Check";
|
||||
import { deleteHopyo, type HopyoFile, type HopyoScope } from "./M02_MasterTemplete_Hopyo_Api";
|
||||
import type { HopyoSheetBody } from "./M02_MasterTemplete_Hopyo_Sheet";
|
||||
import {
|
||||
countLeft,
|
||||
leftCount,
|
||||
openLeft,
|
||||
type LeftMap,
|
||||
type LeftScope,
|
||||
} from "./M02_MasterTemplete_Hopyo_Left";
|
||||
import { draftKey, moveBody, parseDraft } from "./logic/M02_MasterTemplete_Hopyo_Picks";
|
||||
import { accessFor, type ManageLayer } from "./M02_MasterTemplete_Layer";
|
||||
import "./M02_MasterTemplete_Hopyo.css";
|
||||
|
||||
@@ -63,16 +48,13 @@ export interface HopyoImport {
|
||||
root: HTMLElement;
|
||||
/** 화면 떠남 — 이 화면에서 올리거나 이은 파일 지움(743-1) */
|
||||
leave: () => void;
|
||||
/** 고른 뒤 안 만든 확인 창 캐시가 있음 — 다른 엑셀로 옮기기 전 물음 */
|
||||
/** 확인하고 안 옮긴 판정 고름이 있음 — 다른 엑셀로 옮기기 전 물음 */
|
||||
dirty: () => boolean;
|
||||
}
|
||||
|
||||
export function buildHopyoImport(a: HopyoImportArgs): HopyoImport {
|
||||
const { layer, file } = a;
|
||||
const scope: HopyoScope = { layer, owner: null };
|
||||
const at: LeftScope = { scope, target: scope, key: file.키 };
|
||||
let nos: number[] = [];
|
||||
let map: LeftMap | null = null;
|
||||
let held = true;
|
||||
let body: HopyoSheetBody | null = null;
|
||||
|
||||
@@ -91,88 +73,26 @@ export function buildHopyoImport(a: HopyoImportArgs): HopyoImport {
|
||||
window.addEventListener("pagehide", leave);
|
||||
|
||||
// ── 머리 막대에 덧붙일 것 ──
|
||||
const badge = el("span", { attrs: { "data-hopyo-left": "" } });
|
||||
const finish = createButton({ label: "끝내기", variant: "filled", size: 28, onClick: () => void end() }); // prettier-ignore
|
||||
finish.dataset.hopyoFinish = "";
|
||||
const onSk = (번: number): void => body?.showSk(번);
|
||||
const pickBtn = createButton({
|
||||
label: L("M02_LeftOpen"),
|
||||
variant: "ghost",
|
||||
size: 28,
|
||||
onClick: () => void openPick(),
|
||||
});
|
||||
pickBtn.dataset.hopyoLeftOpen = "";
|
||||
const layerNote = createBadge(`${layerText(layer)} 층`, "neutral");
|
||||
|
||||
/** 안 이은 줄 창 — 호표 번이 아직 없으면 먼저 읽음(빈 번으로 열면 「0」 오표시) */
|
||||
async function openPick(): Promise<void> {
|
||||
try {
|
||||
await ensureNos();
|
||||
} catch (error) {
|
||||
return void showToast(why(error), "error");
|
||||
}
|
||||
openLeft({ ...at, 파일: file.파일, nos, onSk, ...(map ? { map } : {}) }, paint);
|
||||
}
|
||||
|
||||
async function ensureNos(): Promise<void> {
|
||||
if (!nos.length) nos = (await readHopyo(scope, file.키)).호표.map((h) => h.번);
|
||||
}
|
||||
|
||||
/** 배지 — 남은 줄 있으면 [끝내기] 막음 · 까닭 · 남은 수 */
|
||||
function paint(got: LeftMap | null): void {
|
||||
map = got;
|
||||
const n = got ? leftCount(got) : null;
|
||||
const w = body?.skCount();
|
||||
const skLeft = w?.블록 ? `${L("M02_SkLeft").replace("{n}", String(w.블록)).replace("{m}", String(w.줄))} · ` : ""; // prettier-ignore
|
||||
finish.disabled = !!n?.줄;
|
||||
finish.title = n?.줄 ? skLeft + L("M02_LeftBlocked") : "";
|
||||
badge.dataset.left = n ? String(n.줄) : "";
|
||||
const tone: BadgeTone = !n ? "info" : n.줄 ? "warning" : "success";
|
||||
const text = !n
|
||||
? L("M02_LeftUnknown")
|
||||
: n.줄
|
||||
? L("M02_LeftBand").replace("{n}", String(n.줄)).replace("{h}", String(n.호표))
|
||||
: L("M02_LeftZero");
|
||||
badge.replaceChildren(createBadge(text, tone));
|
||||
}
|
||||
paint(null);
|
||||
|
||||
async function recount(): Promise<LeftMap> {
|
||||
await ensureNos();
|
||||
const got = await countLeft(at, nos, (i, all) =>
|
||||
badge.replaceChildren(createText(`${L("M02_LeftCounting")} ${i + 1} / ${all}`, "muted", 14)),
|
||||
);
|
||||
paint(got);
|
||||
return got;
|
||||
}
|
||||
/** 확인하고 안 옮긴 줄 · 블록 수(판정 고름 캐시 — 옮기면 캐시에서 빠짐) */
|
||||
const unmoved = (): number =>
|
||||
moveBody(parseDraft(sessionStorage.getItem(draftKey(layer, null, file.키))), scope).수;
|
||||
|
||||
async function end(): Promise<void> {
|
||||
finish.disabled = true;
|
||||
let got: LeftMap;
|
||||
try {
|
||||
got = await recount();
|
||||
} catch (error) {
|
||||
showToast(why(error), "error");
|
||||
finish.disabled = false;
|
||||
return;
|
||||
}
|
||||
if (leftCount(got).줄) {
|
||||
showToast(L("M02_LeftBlocked"), "warning");
|
||||
return openLeft({ ...at, 파일: file.파일, nos, onSk, map: got }, paint);
|
||||
}
|
||||
const loose = [...got.values()].filter(
|
||||
(x) => !x.one.호표.만든?.확인 && hasDraft(draftKey(scope, file.키, x.one.호표.번)),
|
||||
).length;
|
||||
const loose = unmoved();
|
||||
const w = body?.skCount(); // 안 옮긴 단가산출(일위대가 밖 포함) — 묻기만
|
||||
const ok = await showConfirmDialog(
|
||||
`「${file.파일}」 불러오기를 끝냄 — 올린 파일(엑셀 결과 · 격자 · 맞춤 캐시)을 지움 · 만든 일위대가 · 단가산출(출처만 남김)과 별칭 장부는 남음 · 같은 엑셀은 필요하면 다시 올림` +
|
||||
(loose ? ` · ${L("M02_LeftLoose").replace("{n}", String(loose))}` : "") +
|
||||
`「${file.파일}」 불러오기를 끝냄 — 올린 파일(엑셀 결과 · 격자 · 블록 풀이)을 지움 · 만든 일위대가 · 단가산출(출처만 남김)과 별칭 장부는 남음 · 같은 엑셀은 필요하면 다시 올림` +
|
||||
(loose ? ` · 확인하고 안 옮긴 줄 · 블록 ${loose} 개는 빠짐` : "") +
|
||||
(w?.블록
|
||||
? ` · ${L("M02_SkUnmoved").replace("{n}", String(w.블록)).replace("{m}", String(w.밖))}`
|
||||
: ""), // 780-2 막지 않음
|
||||
"끝내기",
|
||||
);
|
||||
if (!ok) return paint(map);
|
||||
if (!ok) return void (finish.disabled = false);
|
||||
try {
|
||||
const out = (await deleteHopyo(scope, file.키)) as { 만든?: number };
|
||||
held = false;
|
||||
@@ -181,7 +101,8 @@ export function buildHopyoImport(a: HopyoImportArgs): HopyoImport {
|
||||
showToast(`끝냄 — 만든 일위대가 · 단가산출 ${out.만든 ?? 0} · 올린 파일 지움`, "success");
|
||||
} catch (error) {
|
||||
showToast(why(error), "error");
|
||||
return paint(map);
|
||||
finish.disabled = false;
|
||||
return;
|
||||
}
|
||||
a.onEnded();
|
||||
}
|
||||
@@ -196,9 +117,7 @@ export function buildHopyoImport(a: HopyoImportArgs): HopyoImport {
|
||||
파일: file.파일,
|
||||
target: scope,
|
||||
canWrite: true,
|
||||
headExtra: [layerNote, badge, pickBtn, finish],
|
||||
onSkChange: () => paint(map),
|
||||
onRead: (got: HopyoView) => void (nos = got.호표.map((h) => h.번)),
|
||||
headExtra: [layerNote, finish],
|
||||
});
|
||||
body = view;
|
||||
root.replaceChildren(...view.parts);
|
||||
@@ -208,6 +127,6 @@ export function buildHopyoImport(a: HopyoImportArgs): HopyoImport {
|
||||
return {
|
||||
root,
|
||||
leave,
|
||||
dirty: () => nos.some((no) => hasDraft(draftKey(scope, file.키, no))),
|
||||
dirty: () => unmoved() > 0,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user