From d17ede799d08dee741c79e733a9d6dd3d0b4d769 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 30 Sep 2026 17:47:30 +0900 Subject: [PATCH] =?UTF-8?q?fix(M02):=20=E3=80=8C=EC=82=AC=EB=9E=8C=20?= =?UTF-8?q?=EA=B3=A0=EB=A5=B4=EA=B8=B0=E3=80=8D=EB=8A=94=20=EC=8B=9C?= =?UTF-8?q?=EC=8A=A4=ED=85=9C=20=EA=B4=80=EB=A6=AC=EC=9E=90=EC=97=90?= =?UTF-8?q?=EA=B2=8C=EB=A7=8C=20=E2=80=94=20=ED=9A=8C=EC=82=AC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=9E=90=EC=97=90=EA=B2=8C=EB=8A=94=20=EC=88=A8?= =?UTF-8?q?=EA=B9=80=20(PLAN=2029-2=20=EB=92=B7=EC=86=90=EC=A7=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 회사 관리자의 남의 개인 층 읽기 길(해시 owner · 서버 권한)은 그대로 - 시험 한 줄 맞춤 Co-Authored-By: Claude Opus 5.5 --- M02_MasterTemplete/M02_MasterTemplete_TreePanel_Roots.ts | 5 ++--- resources/tester/test_m02_layer_screen.py | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_TreePanel_Roots.ts b/M02_MasterTemplete/M02_MasterTemplete_TreePanel_Roots.ts index 57eeb3f1..679bd808 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_TreePanel_Roots.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_TreePanel_Roots.ts @@ -4,7 +4,7 @@ * 「구조물 조합」 아래 한 줄 · 나무 종류와 무관한 공용 부품. 고른 층의 나무는 부르는 쪽이 이 줄 아래에 붙임. * 권한 없는 층 = 단추 글 끝에 「읽기」(권한 = `accessFor` · 서버 `M02_Layer_Access` 와 짝) * 회사 = 볼 회사(`viewCompany` — 시스템 관리자는 해시 `company` · `aislo.adminCompany` · 자기 회사) - * 「사람 고르기」(같은 줄 select · 회사 관리자 · 시스템 관리자) = 그 회사 사람의 개인 층 · 고르면 해시 `owner` + * 「사람 고르기」(같은 줄 select · 시스템 관리자만) = 고른 회사 사람의 개인 층 · 고르면 해시 `owner` * 누르면 `go`(부르는 쪽이 해시로 다시 엶). * ========================================================================== */ @@ -37,7 +37,6 @@ export const companyOwner = (company: string | null, user: SessionUser | null): export function createLayerBar(opt: LayerBarOptions): HTMLElement { const { user, active } = opt; const isSystem = user?.role === "SYSTEM_ADMIN"; - const companyAdmin = isSystem || user?.role === "ADMIN" || !!user?.is_master; const ownPersonal = ownOwner("personal", user); if (!opt.company && !isSystem) { return el("div", { @@ -74,7 +73,7 @@ export function createLayerBar(opt: LayerBarOptions): HTMLElement { ]; const row = el("div", { className: "m02-layers__row", children: buttons }); const bar = el("div", { className: "m02-layers", children: [row] }); - if (companyAdmin && opt.company) row.append(buildPeople(opt)); // 같은 줄 + if (isSystem && opt.company) row.append(buildPeople(opt)); // 같은 줄 · 시스템 관리자만 return bar; } diff --git a/resources/tester/test_m02_layer_screen.py b/resources/tester/test_m02_layer_screen.py index f33898fe..2b00eddd 100644 --- a/resources/tester/test_m02_layer_screen.py +++ b/resources/tester/test_m02_layer_screen.py @@ -129,7 +129,10 @@ def test_층_단추_셋_사람_고르기(): roots = _text(M02 / "M02_MasterTemplete_TreePanel_Roots.ts") assert 'fetchOwners("company")' not in roots # 회사 목록 펼침 없앰 assert 'fetchOwners("personal", opt.company)' in roots - assert "if (companyAdmin && opt.company) row.append(buildPeople(opt)); // 같은 줄" in roots + assert ( + "if (isSystem && opt.company) row.append(buildPeople(opt)); // 같은 줄 · 시스템 관리자만" + in roots + ) assert 'if (select.value) opt.go("personal", select.value);' in roots panel = _text(M02 / "M02_MasterTemplete_TreePanel.ts") assert (