diff --git a/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts b/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts index 3dd81ee7d..39ea53ed2 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts @@ -1,7 +1,7 @@ /* ============================================================================= * M02_MasterTemplete_DetailNav.ts * 상세 머리 제목과 [?] 사이 [도면][일위대가][면적산출] 묶음(105-4) — 같은 열의 다른 상세로 옮겨 감. - * 지금 상세 = 눌림(aria-pressed) · 그 열 문서가 없으면 그 단추 꺼짐(번호 목록에 번호 없음). + * 지금 상세 단추 = 숨김(113-2) · 단추 크기 = 머리 [다시 열기]와 같은 보통 · 그 열 문서가 없으면 그 단추 꺼짐(번호 목록에 번호 없음). * 보임 조건 · 옮겨 가기(confirmLeave → open)는 부른 쪽(`UI_Main`) 몫. * ========================================================================== */ @@ -26,13 +26,13 @@ const NONE = "이 열은 문서가 없음"; export interface DetailNav { root: HTMLElement; - /** 연 상세 — null 이면 숨김 · 눌림 · 꺼짐을 새로 */ + /** 연 상세 — 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, size: "sm", variant: "ghost", onClick: () => go(kind) }); + const button = createButton({ label, variant: "ghost", onClick: () => go(kind) }); button.dataset.detailNav = kind; return button; }); @@ -48,9 +48,9 @@ export function createDetailNav(go: (kind: DetailKind) => void): DetailNav { const mine = ++ask; buttons.forEach((button, i) => { const on = ITEMS[i][0] === at?.kind; - button.setAttribute("aria-pressed", String(on)); // 눌림 = 지금 상세(누르면 그대로) + button.hidden = on; // 지금 상세 단추는 숨김(113-2) button.disabled = false; - button.title = on ? "" : TIP; + button.title = TIP; }); // 번호 목록은 지금 층만(프로젝트 층 · 남의 층이면 안 끔) if (!at || at.layer === "project" || at.layer !== getActiveLayer()) return; diff --git a/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts b/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts index 4c8f5d10d..3135e033e 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts @@ -250,6 +250,7 @@ export function createMain( nav.update(back.hidden ? null : sel); // 보임 조건 = 뒤로 단추와 같음 const kind = sel && sel.kind in HELP_TITLE ? (sel.kind as keyof typeof HELP_TITLE) : null; const help = kind && helpParts(HELP_TITLE[kind], detailHelp(kind)); // 열 때마다 새로 — 상자는 닫힘 + help?.button.classList.remove("ui-btn--sm"); // 머리 [?] = [다시 열기]와 같은 보통 크기(113-2 · 카드 [?]는 작게) helpSlot.replaceChildren(...(help ? [help.button, help.box] : [])); }; diff --git a/M02_MasterTemplete/M02_MasterTemplete_UI_Style.css b/M02_MasterTemplete/M02_MasterTemplete_UI_Style.css index 18ed7f577..d3bf36606 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_UI_Style.css +++ b/M02_MasterTemplete/M02_MasterTemplete_UI_Style.css @@ -242,12 +242,7 @@ display: none; } -/* 상세 이동 [도면][일위대가][면적산출](105-4) — 지금 상세 = 눌림(강조색 · 밝음 · 어두움 같은 토큰) */ +/* 상세 이동 [도면][일위대가][면적산출](105-4) — 지금 상세 단추는 숨김(113-2) */ .m02-main__nav[hidden] { display: none; } - -.m02-main__nav .ui-btn[aria-pressed="true"] { - border-color: var(--color-accent); - color: var(--color-accent); -} diff --git a/resources/tester/test_m02_detail_nav.py b/resources/tester/test_m02_detail_nav.py index b1ff742f3..a21953374 100644 --- a/resources/tester/test_m02_detail_nav.py +++ b/resources/tester/test_m02_detail_nav.py @@ -1,7 +1,7 @@ """상세 이동 단추 · 도면 상세 → 면적산출(PLAN 105-2 · 105-4) — Node 로 판정 · 화면은 ORCA. 못박는 것 - - 머리 제목과 [?] 사이 [도면][일위대가][면적산출](`ui-btn-group`) · 지금 상세 = 눌림(aria-pressed) · + - 머리 제목과 [?] 사이 [도면][일위대가][면적산출](`ui-btn-group` · 보통 크기) · 지금 상세 단추 = 숨김(113-2) · 그 열 문서(번호)가 없으면 그 단추 꺼짐 · 프로젝트 층 · 남의 층은 번호를 안 읽고 다 켬 · 상세 아니면 숨김. - 보임 조건 = 뒤로 단추와 같음 · 누름 = confirmLeave → open({...sel, kind}) · 지금 것 누름 = 그대로. - 도면 상세 머리 [면적산출로 보내기] = CAD 요청 · 받은 표(TOAREA 도 같은 길) → 같은 열 면적 상세로 옮겨 가 @@ -27,7 +27,7 @@ const js = ts.transpileModule(src, { let fetched = 0; let numbers = {}; const button = (o) => { - const b = { label: o.label, size: o.size, dataset: {}, attrs: {}, disabled: false, title: "", onClick: o.onClick }; + const b = { label: o.label, size: o.size, dataset: {}, attrs: {}, disabled: false, hidden: false, title: "", onClick: o.onClick }; b.setAttribute = (k, v) => (b.attrs[k] = v); return b; }; @@ -47,12 +47,16 @@ const gone = []; const nav = box.exports.createDetailNav((kind) => gone.push(kind)); const view = () => ({ hidden: nav.root.hidden, - pressed: nav.root.children.map((b) => b.attrs["aria-pressed"]), + shown: nav.root.children.map((b) => !b.hidden), disabled: nav.root.children.map((b) => b.disabled), }); const tick = () => new Promise((r) => setTimeout(r, 0)); (async () => { - const out = { className: nav.root.className, labels: nav.root.children.map((b) => b.label) }; + const out = { + className: nav.root.className, + labels: nav.root.children.map((b) => b.label), + sizes: nav.root.children.map((b) => b.size ?? null), + }; numbers = { c1: { 도번: "SD-000001", 일위대가번: "", 면적번: "SA-000001" } }; nav.update({ layer: "system", kind: "area", name: "c1" }); out.before = view(); @@ -96,17 +100,18 @@ def _text(name: str) -> str: def test_단추_셋_묶음(run): assert run["labels"] == ["도면", "일위대가", "면적산출"] assert "ui-btn-group" in run["className"] + assert run["sizes"] == [None, None, None] # 113-2 — [다시 열기]와 같은 보통 크기 -def test_지금_것_눌림_없는_문서_꺼짐(run): - assert run["before"]["pressed"] == ["false", "false", "true"] +def test_지금_것_숨김_없는_문서_꺼짐(run): + assert run["before"]["shown"] == [True, True, False] # 113-2 — 지금 상세 단추 숨김 assert run["before"]["disabled"] == [False, False, False] # 번호 받기 전엔 켬 assert run["area"]["disabled"] == [False, True, False] # 일위대가번 없음 = 꺼짐 assert run["area"]["hidden"] is False def test_프로젝트_남의_층은_안_읽음(run): - assert run["project"]["pressed"] == ["true", "false", "false"] + assert run["project"]["shown"] == [False, True, True] assert run["project"]["disabled"] == [False, False, False] assert run["other"]["disabled"] == [False, False, False] assert run["fetched"] == 1 @@ -124,7 +129,11 @@ def test_머리_줄_자리와_보임_조건(): assert "if (!at || at.kind === kind || !(await confirmLeave())) return;" in main assert "void open({ ...at, kind });" in main css = (M02 / "M02_MasterTemplete_UI_Style.css").read_text(encoding="utf-8") - assert '.m02-main__nav .ui-btn[aria-pressed="true"]' in css + assert "aria-pressed" not in css # 113-2 — 눌림 대신 숨김 + # 머리 [?] 만 보통 크기 · 카드 [?] 는 작게 그대로(`helpParts` sm) + assert 'help?.button.classList.remove("ui-btn--sm");' in main + shell = _text("M02_MasterTemplete_CardShell.ts") + assert 'createButton({ label: CARD_TEXT.help, variant: "ghost", size: "sm" })' in shell def test_도면_상세에서_면적으로_보내기(): diff --git a/resources/tester/test_m02_layer_screen.py b/resources/tester/test_m02_layer_screen.py index 963adb174..a4e027391 100644 --- a/resources/tester/test_m02_layer_screen.py +++ b/resources/tester/test_m02_layer_screen.py @@ -305,7 +305,7 @@ def test_구조물_조합_제목_줄_새_항목(): main = _text(M02 / "M02_MasterTemplete_UI_Main.ts") assert "export function newItemButton(" in main and 'classList.add("m02-main__new")' in main assert re.search( - r"children: \[\s*back,\s*title,\s*helpSlot,\s*slot,\s*reload,\s*save," + r"children: \[\s*back,\s*title,\s*nav\.root,\s*helpSlot,\s*slot,\s*reload,\s*save," r"\s*\.\.\.\(extras\.newItem \? \[extras\.newItem\] : \[\]\),?\s*\]", main, )