Merge remote-tracking branch 'origin/sub_laptop_6' into main_laptop_1

This commit is contained in:
2026-09-30 15:21:48 +09:00
3 changed files with 34 additions and 5 deletions
@@ -57,10 +57,18 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise<Mounte
settle: () => 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<void> => {
// 같은 주소 안 이동은 머리 가드가 안 물음 — 저장 안 한 고침은 여기서
if (!(await main.confirmLeave())) return;
@@ -75,7 +83,7 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise<Mounte
user,
active: { root: entry.root, owner },
panel,
go: (next, nextOwner) => 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<Mounte
const main = createMain(
isAdmin,
() => 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<Mounte
buildLaborSection({
show: main.showView,
confirmLeave: main.confirmLeave,
onOpen,
onOpen: () => {
onOpen();
mark("일위대가");
},
make: () =>
buildLaborLibrary({ scope: { layer, owner }, canEdit: isAdmin, roots: laborRoots }),
}),
+13
View File
@@ -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
+2 -1
View File
@@ -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_리본_접힘_모드에서_탭으로_편_것은_밖을_누르면_다시_접힘():