Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts
T
eomsangdonandClaude Opus 5.5 a6ddc84f1b feat(m02): 상세 머리 이동 단추 — 지금 페이지 숨김 · 이동 단추 · 머리 [?] 보통 크기(113-2)
- DetailNav 지금 상세 단추 hidden · size sm 지움 · 눌림 CSS 지움
- 머리 [?] 만 ui-btn--sm 뺌 · 카드 [?] 는 작게 그대로
- test_m02_detail_nav 기대 고침 · test_m02_layer_screen 머리 줄 정규식에 nav.root

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4uKaV4ZBhsJN4GHG7yRj4
2026-10-08 18:24:16 +09:00

72 lines
2.7 KiB
TypeScript

/* =============================================================================
* M02_MasterTemplete_DetailNav.ts
* 상세 머리 제목과 [?] 사이 [도면][일위대가][면적산출] 묶음(105-4) — 같은 열의 다른 상세로 옮겨 감.
* 지금 상세 단추 = 숨김(113-2) · 단추 크기 = 머리 [다시 열기]와 같은 보통 · 그 열 문서가 없으면 그 단추 꺼짐(번호 목록에 번호 없음).
* 보임 조건 · 옮겨 가기(confirmLeave → open)는 부른 쪽(`UI_Main`) 몫.
* ========================================================================== */
import { createButton, el } from "@ui/ui_template_elements";
import {
fetchStructureNumbers,
getActiveLayer,
type Kind,
type Layer,
type StructureNumbers,
} from "./M02_MasterTemplete_Api_Fetch";
type DetailKind = "structure" | "labor" | "area";
const ITEMS: [DetailKind, string, keyof StructureNumbers][] = [
["structure", "도면", "도번"],
["labor", "일위대가", "일위대가번"],
["area", "면적산출", "면적번"],
];
const TIP = "같은 열의 다른 상세로 — 저장 안 한 고침이 있으면 물음";
const NONE = "이 열은 문서가 없음";
export interface DetailNav {
root: HTMLElement;
/** 연 상세 — null 이면 숨김 · 지금 상세 단추 숨김 · 꺼짐을 새로 */
update: (at: { layer: Layer; kind: Kind; name: string } | null) => void;
}
export function createDetailNav(go: (kind: DetailKind) => void): DetailNav {
const buttons = ITEMS.map(([kind, label]) => {
const button = createButton({ label, variant: "ghost", onClick: () => go(kind) });
button.dataset.detailNav = kind;
return button;
});
const root = el("div", {
className: "ui-btn-group m02-main__nav",
attrs: { role: "group", "aria-label": TIP },
children: buttons,
});
let ask = 0;
const update: DetailNav["update"] = (at) => {
root.hidden = !at;
const mine = ++ask;
buttons.forEach((button, i) => {
const on = ITEMS[i][0] === at?.kind;
button.hidden = on; // 지금 상세 단추는 숨김(113-2)
button.disabled = false;
button.title = TIP;
});
// 번호 목록은 지금 층만(프로젝트 층 · 남의 층이면 안 끔)
if (!at || at.layer === "project" || at.layer !== getActiveLayer()) return;
void fetchStructureNumbers().then(
(numbers) => {
if (mine !== ask) return;
buttons.forEach((button, i) => {
const [kind, , field] = ITEMS[i];
if (kind === at.kind || numbers[at.name]?.[field]) return;
button.disabled = true;
button.title = NONE;
});
},
() => undefined,
);
};
return { root, update };
}