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_리본_접힘_모드에서_탭으로_편_것은_밖을_누르면_다시_접힘():