From 23d8e2d7a2e310d2feab403a48051dce93c3df5a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 1 Nov 2026 21:59:18 +0900 Subject: [PATCH] =?UTF-8?q?fix(720-4):=20=EB=8F=84=EB=A9=B4=20=EC=96=91?= =?UTF-8?q?=EC=8B=9D=20=EC=B9=B8=20=3D=20=EB=88=84=EA=B5=AC=EB=82=98=20?= =?UTF-8?q?=EB=8A=98=20=EB=B3=B4=EC=9E=84(=EC=9D=BD=EA=B8=B0=20=C2=B7=20?= =?UTF-8?q?=EA=B3=A0=EB=A5=B4=EA=B8=B0)=20=C2=B7=20=EC=83=88=EB=A1=9C=20?= =?UTF-8?q?=C2=B7=20=EB=B3=B8=EB=96=A0=20=C2=B7=20=EC=A7=80=EC=9A=B0?= =?UTF-8?q?=EA=B8=B0=20=EB=8B=A8=EC=B6=94=EB=A7=8C=20=EC=8B=9C=EC=8A=A4?= =?UTF-8?q?=ED=85=9C=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=C2=B7=20=EC=8B=A4?= =?UTF-8?q?=EB=AC=B4=EB=AC=B8=EC=84=9C=20=EA=B7=B8=EB=8C=80=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- M02_MasterTemplete/M02_MasterTemplete_UI_Side.ts | 10 ++++------ resources/tester/test_720_m02_folder_layer.py | 8 ++++++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_UI_Side.ts b/M02_MasterTemplete/M02_MasterTemplete_UI_Side.ts index 53f3955cc..fd83c0998 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_UI_Side.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_UI_Side.ts @@ -161,10 +161,8 @@ export function buildSide(opt: SideOptions): SideHandle { ? void Promise.all([precombo.refresh(), sangeun.refresh()]) : document.removeEventListener(HOPYO_BUILT, onBuilt); document.addEventListener(HOPYO_BUILT, onBuilt); - // 도면 양식은 시스템 층(마스터 템플릿)에만 — 시스템 관리자면 늘(720-4) - const drawing = opt.isSystem - ? section(L("M02_KindDrawing"), bodies.get("drawing")!, ...actionRow("drawing")) - : null; + // 도면 양식 칸 = 누구나 늘(읽기 · 고르기) · 새로 · 본떠 · 지우기 단추만 시스템 관리자 + const drawing = section(L("M02_KindDrawing"), bodies.get("drawing")!, ...actionRow("drawing")); // 실무문서(옛 마스터 일위대가 조합 · PLAN 39-2) — 구조물 조합 밖 · 도면 양식 아래 · 시스템 관리자만 const practice = opt.isSystem ? buildPracticeSection({ @@ -188,7 +186,7 @@ export function buildSide(opt: SideOptions): SideHandle { summary, createDivider(), section(hopyo.title, hopyo.body), - ...(drawing ? [drawing] : []), + drawing, ...(practice ? [section(practice.title, practice.body)] : []), ], }); @@ -259,7 +257,7 @@ export function buildSide(opt: SideOptions): SideHandle { const mine = ++seq; paintButtons(); try { - items = opt.isSystem ? await listTemplates(layer, null) : []; // 도면 양식 목록 — 시스템 관리자만 + items = await listTemplates(layer, null); // 도면 양식 목록 — 누구나 } catch (error) { items = []; showToast(L("M02_LoadFailed").replace("{value}", why(error)), "error"); diff --git a/resources/tester/test_720_m02_folder_layer.py b/resources/tester/test_720_m02_folder_layer.py index 511e97ab0..a22252dab 100644 --- a/resources/tester/test_720_m02_folder_layer.py +++ b/resources/tester/test_720_m02_folder_layer.py @@ -78,7 +78,7 @@ def test_화면_층_단추_최상위_폴더_이름_바꾸기(): def test_구조물_조합_층_제자리_바꿈(): """720-4 — 해시 이동 없음 · replaceState · 나무 · 층 줄 · 띠를 감싼 칸에 갈아 끼움 · 권한 = 함수 · - 도면 양식 · 실무문서 = 시스템 관리자면 늘 · 불러오기 장부 = 열 때 층 · 권한.""" + 도면 양식 = 누구나(단추는 관리자) · 실무문서 = 시스템 관리자 · 불러오기 장부 = 열 때 층 · 권한.""" page = _text("M02_MasterTemplete_UI_Page.ts") assert "navigateTo" not in page switch = page.split("const switchStructure = async")[1].split("const go =")[0] @@ -91,6 +91,10 @@ def test_구조물_조합_층_제자리_바꿈(): assert "() => isAdmin," in page and 'isSystem: user?.role === "SYSTEM_ADMIN",' in page assert "main.root.isConnected ? void afterItem()" in page # 나무를 갈아도 듣기 그대로 side = _text("M02_MasterTemplete_UI_Side.ts") - assert "const drawing = opt.isSystem" in side and "const practice = opt.isSystem" in side + assert "const drawing = section(" in side and "const practice = opt.isSystem" in side + # 도면 양식 칸 = 누구나 · 단추만 관리자(720-4 덧) + assert "const drawing = opt.isSystem" not in side + assert 'if (!opt.isSystem) return [];' in side + assert "items = await listTemplates(layer, null);" in side hopyo = _text("M02_MasterTemplete_Hopyo_Side.ts") assert "buildHopyoLedger({ scope: pageScope(), canWrite: opt.canWrite() })" in hopyo