From 4a5b00d72d27a25e420ed156e392628bdb5f66b2 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 30 Sep 2026 15:17:56 +0900 Subject: [PATCH] =?UTF-8?q?fix(M02):=20=EC=9D=BC=EC=9C=84=EB=8C=80?= =?UTF-8?q?=EA=B0=80=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=BF=8C=EB=A6=AC=EB=A5=BC=20=EB=B0=94?= =?UTF-8?q?=EA=BF=94=EB=8F=84=20=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=9C=A0=EC=A7=80=20=C2=B7=20=EC=A2=8C?= =?UTF-8?q?=EC=B8=A1=EC=9C=BC=EB=A1=9C=20=EC=97=B4=EB=A9=B4=20=ED=95=B4?= =?UTF-8?q?=EC=8B=9C=20open=3D=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80(PLAN=20?= =?UTF-8?q?27-2b=20=ED=9D=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 원인: 뿌리 줄이 두 벌(구조물 조합 쪽은 숨김) — 숨은 줄이 눌리면 go 기본값 open=구조물조합 · 좌측 열기는 해시를 안 바꿈 - 고침: 페이지가 지금 화면(view)을 쥐고 go 기본값을 그것으로 · 일위대가를 열면 history.replaceState 로 해시만 open=일위대가 · 일위대가에서 양식으로 가면 구조물조합 - 시험: test_m02_labor_tree 한 건 더함 · test_m02_structure_panel 콜백 모양 맞춤 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01BU9gbNE3aWFUvE61pS2WGt --- .../M02_MasterTemplete_UI_Page.ts | 23 +++++++++++++++---- resources/tester/test_m02_labor_tree.py | 13 +++++++++++ resources/tester/test_m02_structure_panel.py | 3 ++- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts b/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts index cdb0e2d9..ec5f7c37 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts @@ -57,10 +57,18 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise main.settle(), onChanged: (colId) => main.openTable(layer, colId, true), }); + // 일위대가 화면이 떠 있나 — 뿌리를 바꿔도(어느 뿌리 줄을 누르든) 일위대가로 다시 엶 · + // 해시 `open` 도 맞춤(새로 고침 · 카드 진입과 같게) · 옵션 · 도면은 옛 규칙(구조물 조합으로) + let view: OpenTarget = entry.open; + const mark = (open: OpenTarget): void => { + view = open; + const query = new URLSearchParams(entryQuery({ ...entry, open })); + history.replaceState(history.state, "", `#/${ROUTES.M02_MASTER_TEMPLATE}?${query}`); + }; const go = async ( next: Root, nextOwner: string | null, - open: OpenTarget = "구조물조합", + open: OpenTarget = view === "일위대가" ? "일위대가" : "구조물조합", ): Promise => { // 같은 주소 안 이동은 머리 가드가 안 물음 — 저장 안 한 고침은 여기서 if (!(await main.confirmLeave())) return; @@ -75,7 +83,7 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise void go(next, nextOwner, "일위대가"), + go: (next, nextOwner) => void go(next, nextOwner), }); const roots = createLibraryRoots({ user, @@ -90,7 +98,11 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise void Promise.all([side.refresh(), tree.refresh()]), - () => side.paint(), + () => { + side.paint(); + // 일위대가 화면에서 양식으로 옮김(일위대가 · 옵션 화면은 current 없음) + if (main.current() && view === "일위대가") mark("구조물조합"); + }, { top: readOnlyBar?.root, aside, @@ -118,7 +130,10 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise { + onOpen(); + mark("일위대가"); + }, make: () => buildLaborLibrary({ scope: { layer, owner }, canEdit: isAdmin, roots: laborRoots }), }), diff --git a/resources/tester/test_m02_labor_tree.py b/resources/tester/test_m02_labor_tree.py index f766acf5..2b643578 100644 --- a/resources/tester/test_m02_labor_tree.py +++ b/resources/tester/test_m02_labor_tree.py @@ -74,3 +74,16 @@ def test_나무_고침_알림(got): assert rename_item["경로"] == ["석축", "나나"] assert "열" not in delete_item and delete_item["지운항목"] == ["UP1-000002"] assert "경로" not in delete_folder + + +def test_뿌리를_바꿔도_일위대가_화면_유지_해시도_맞춤(): + """브레인 검증 흠(27-2b) — 뿌리 줄은 두 벌(구조물 · 일위대가) · 어느 줄을 누르든 지금 화면 · + 좌측 「일위대가 라이브러리」를 열면 해시 `open=일위대가`(다시 그리지 않고 주소만).""" + page = (ROOT / "M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts").read_text("utf-8") + assert 'open: OpenTarget = view === "일위대가" ? "일위대가" : "구조물조합"' in page + assert page.count("go: (next, nextOwner) => void go(next, nextOwner),") == 2 # 두 벌 같은 길 + assert '"일위대가")' not in page.split("const laborRoots")[1].split("const roots")[0] + labor = page.split("buildLaborSection({")[1].split("make:")[0] + assert 'mark("일위대가")' in labor # 여는 순간 해시 open + assert "history.replaceState" in page # hashchange 없이(화면 다시 안 그림) + assert 'if (main.current() && view === "일위대가") mark("구조물조합")' in page diff --git a/resources/tester/test_m02_structure_panel.py b/resources/tester/test_m02_structure_panel.py index 1df1c34d..2a7c7d9b 100644 --- a/resources/tester/test_m02_structure_panel.py +++ b/resources/tester/test_m02_structure_panel.py @@ -188,7 +188,8 @@ def test_좌측_고름_표시는_열린_것_한_줄뿐(): # 자재 조합 상세도 같은 한 곳 — 열면 양식 · 열 줄 고름 지움 · 양식을 열면 자재 조합 고름 지움 assert re.search(r"sel = null;\s*onOpened\?\.\(\);", _text(MAIN)) assert "if (opt.getOpen()) matset.clear();" in side.split("function paint(): void {")[1] - assert "() => side.paint()" in _text(M02 / "M02_MasterTemplete_UI_Page.ts") + # 편집 칸이 열 때마다 좌측 `paint`(27-2b 뒤 = 일위대가 화면 해시 맞춤도 같은 자리) + assert re.search(r"\(\) => \{\s*side\.paint\(\);", _text(M02 / "M02_MasterTemplete_UI_Page.ts")) def test_리본_접힘_모드에서_탭으로_편_것은_밖을_누르면_다시_접힘():