Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_Sangeun_Tabs.ts
T
eomsangdonandClaude Sonnet 5.5 39338d9e33 refactor(840-1): 상세 보기에만 있던 기능 넷 판정 · 죽은 코드 걷음 — 수식 보기가 대신하는 것 지움
- 판정 = 자체 로직 편집 · 시험 값 고침 · M02 줄 덮음 · 비목 박스 소계 모두 수식 보기로 됨(살릴 것 없음)
- M01 상세: 숨은 단가산출 상세 덩이 · 자체 로직 시트 편집기 · 시험 고침 · 셈 구동(createDrive) · 보기 이름표(View.ts) · data-view CSS 걷음
- M02 불러오기 모달 머리 [항목 추가] · [율 줄 추가] 단추와 그 창(Rate.ts · openSangeunLinePicker) 걷음
- 글 정리 = Info_Own 새 뜻 · 죽은 글 키 · No_Key · 항목 추가 글 걷음
- 낡은 시험 고침 = 722(시험 고침 · 덮기 셈) · 799-2 · 804-2 · 804-6 · 804-7 · 806-1 · 717-2b · 717-4 · 721 · 728-2 — 걷은 것이 없음 확인으로
- 남김 = M02 수식 문서 없는 줄의 단가산출 상세 몸(cover · buildHo)

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

83 lines
3.8 KiB
TypeScript

/* =============================================================================
* M02_MasterTemplete_Sangeun_Tabs.ts
* M02 단가산출(SK) 상세 보기(PLAN 799-2 · 804-2 · 804-6 · 836-3) — 수식(줄 쌓기) 하나 · 보기 고르기 단추 없음.
* 수식 = 공용 줄 쌓기 화면(`A00_Common/line_stack_screen.ts` · M01 과 같은 꼴) — 길 앞머리만 M02 사본 길
* (`/m02/layers/{층}/sangeun/{키}/doc` · 802-4a) · 층 쓰기 권한 없으면 읽기만
* 저장(804-8 · `page` 있음 = 단가산출 화면) = 페이지 [저장] · [되돌림] 한 번에 — 탭 위 저장 단추 없음(M01 과 같음)
* 수식 문서 없는 줄(일위대가 줄 모달 등) = 상세가 쥔 `editor`(단가산출 상세 몸)만 보임 — 빈 화면 없음
* 저장 안 한 SK(일위대가 줄 모달 · 새 SK) = 「저장한 단가산출만」 글
* [단가 갱신] · [재생성](808-1 · 요구 701-3) = `tools` — 머리 줄(수식 보기일 때만)
* ========================================================================== */
import { createStackScreen } from "../A00_Common/line_stack_screen";
import { el } from "@ui/ui_template_elements";
import type { Layer } from "./M02_MasterTemplete_Api_Fetch";
export interface SkEquationOptions {
scope: { layer: Layer; owner: string | null };
edit: boolean;
/** 수식 저장 · [단가 갱신] · [재생성] 뒤 그 SK 새 판 */
onSaved: (version: string) => void;
/** 페이지가 저장 · 되돌림을 맡음(804-8) — 수식 고침 있음이 바뀔 때 부름 */
page?: () => void;
/** 저장 전 불러온 단가산출 문서(836-5 · 미리 보기 835-1) — 있으면 그 문서째 수식 보기 · 없으면 null */
memory?: () => Record<string, unknown> | null;
}
/** SK 수식 길 — 꼬리 물음(`/table?key=…`)에 주인 물음을 이어 붙임 */
export function skDocPath(scope: SkEquationOptions["scope"], key: string, path: string): string {
const [tail, query] = path.split("?");
const ask = [query, scope.owner ? `owner=${encodeURIComponent(scope.owner)}` : ""]
.filter(Boolean)
.join("&");
const at = `/m02/layers/${scope.layer}/sangeun/${encodeURIComponent(key)}/doc${tail}`;
return ask ? `${at}?${ask}` : at;
}
/** 수식 그릇 — `editor` = 단가산출 상세 그릇(수식 문서 있을 때 숨김) */
export function createSangeunTabs(
editor: HTMLElement,
opt: SkEquationOptions,
): {
/** 수식 화면 단추([단가 갱신] · [재생성]) — 머리 줄 */
tools: HTMLElement;
host: HTMLElement;
/** 저장한 SK 키(빈 키 = 저장 전) */
draw: (key: string) => void;
canLeave: () => Promise<boolean>;
dirty: () => boolean;
save: () => Promise<boolean>;
discard: () => Promise<void>;
} {
const tools = el("span", { className: "m02-sk__tools", attrs: { "data-sk-tools": "" } }); // [단가 갱신] · [재생성](808-1)
const stack = createStackScreen({
base: "",
admin: opt.edit,
cache: "m02_sk_doc_drafts",
copy: { route: (k, p) => skDocPath(opt.scope, k, p), onSaved: opt.onSaved },
scope: opt.scope, // 804-4 다른 단가산출 · 일위대가 복사
page: opt.page,
tools,
memory: opt.memory,
});
const show = (doc: boolean): void => {
stack.root.hidden = tools.hidden = !doc;
editor.hidden = doc;
};
show(true);
return {
tools,
host: el("div", { className: "m02-sk__views", children: [stack.root] }),
draw: (k: string) => {
// 문서 없는 줄(일위대가 로직 줄 모달 등 · 페이지 아님) = 단가산출 상세 몸만(808-1 · 수식은 문서가 있어야)
const doc = !!k || !!opt.page || !!opt.memory?.();
show(doc);
if (doc) stack.draw(k);
},
canLeave: () => stack.canLeave(),
dirty: () => stack.dirty(),
save: () => stack.save(),
discard: () => stack.discard(),
};
}