From 1200a4d681e9ee353ca729ee7f210a249c6a7400 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 8 Oct 2026 19:27:29 +0900 Subject: [PATCH] =?UTF-8?q?feat(B01):=20=EA=B5=AC=EC=A1=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=A1=B0=ED=95=A9=20=EC=B9=B4=EB=93=9C=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=B8=B5=20=3D=20=EA=B0=9C=EC=9D=B8=20=E2=80=94=20=ED=9A=8C?= =?UTF-8?q?=EC=82=AC=20=EC=9E=88=EB=8A=94=20=EC=82=AC=EB=9E=8C=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=20=EB=AC=B4=EA=B4=80=20=C2=B7=20=ED=9A=8C=EC=82=AC=20?= =?UTF-8?q?=EC=97=86=EC=9C=BC=EB=A9=B4=20=EC=98=9B=20=EA=B7=9C=EC=B9=99(12?= =?UTF-8?q?3-1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01W4uKaV4ZBhsJN4GHG7yRj4 --- B01_Dashboard/B01_Dashboard_UI_Page.ts | 6 +++-- resources/tester/test_b01_settings_cards.py | 29 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/B01_Dashboard/B01_Dashboard_UI_Page.ts b/B01_Dashboard/B01_Dashboard_UI_Page.ts index 75d0905ad..4278b4777 100644 --- a/B01_Dashboard/B01_Dashboard_UI_Page.ts +++ b/B01_Dashboard/B01_Dashboard_UI_Page.ts @@ -173,13 +173,15 @@ function buildSystemSettingsPanel(user: DashboardUser, companyId: number | null) settingCard(title, desc, () => navigateTo(ROUTES.M02_MASTER_TEMPLATE, { open, root, ...company }), ); + // 구조물 조합 기본 층 = 개인(123-1 · 누구든) · 개인 층 없음(회사 없음) = 아래 역할 규칙 + const comboRoot = (fallback: string): string => (user.company_id ? "personal" : fallback); if (user.role === "SYSTEM_ADMIN") { const desc = L("B01_Dashboard_PermMasterWrite"); wrap.append( settingCard(L("B01_Dashboard_MasterElements"), L("B01_Dashboard_PermSourceRead"), () => navigateTo(ROUTES.M01_MASTER_DATA), ), - m02(L("B01_Dashboard_CardStructCombo"), "구조물조합", "master", desc), + m02(L("B01_Dashboard_CardStructCombo"), "구조물조합", comboRoot("master"), desc), m02(L("B01_Dashboard_CardStructOption"), "옵션", "master", desc), m02(L("B01_Dashboard_CardDrawing"), "도면", "master", desc), ); @@ -193,7 +195,7 @@ function buildSystemSettingsPanel(user: DashboardUser, companyId: number | null) L(companyAdmin ? "B01_Dashboard_PermCompanyWrite" : "B01_Dashboard_PermCompanyRead"), L("B01_Dashboard_PermPersonalWrite"), ].join(" · "); - wrap.append(m02(L("B01_Dashboard_CardStructCombo"), "구조물조합", root, desc)); + wrap.append(m02(L("B01_Dashboard_CardStructCombo"), "구조물조합", comboRoot(root), desc)); return wrap; } diff --git a/resources/tester/test_b01_settings_cards.py b/resources/tester/test_b01_settings_cards.py index f5872516f..82c61a547 100644 --- a/resources/tester/test_b01_settings_cards.py +++ b/resources/tester/test_b01_settings_cards.py @@ -213,3 +213,32 @@ def test_회사_찾기_거르기(): assert result.returncode == 0, result.stderr assert json.loads(result.stdout) == [[1, 3, 4], [1, 4], [4], [1], [1], [], [1, 3, 4]] assert "const LIMIT = 50;" in src and "found.slice(0, LIMIT)" in src + + +@pytest.mark.skipif(shutil.which("node") is None, reason="node 가 없음") +def test_구조물_조합_기본_층_개인(): + """123-1 — 회사 있는 사람은 역할 무관 구조물 조합 = 개인 · 회사 없으면 지금 규칙 · 다른 곳 그대로.""" + m = "B01_Dashboard_PermMasterWrite" + combo = f"{M02}?open=구조물조합&root=personal" + assert _cards({"role": "SYSTEM_ADMIN", "is_master": False, "company_id": 1}, 3) == [ + ["B01_Dashboard_MasterElements", "B01_Dashboard_PermSourceRead", "m01-master-data"], + ["B01_Dashboard_CardStructCombo", m, f"{combo}&company=3"], + ["B01_Dashboard_CardStructOption", m, f"{M02}?open=옵션&root=master&company=3"], + ["B01_Dashboard_CardDrawing", m, f"{M02}?open=도면&root=master&company=3"], + ] + assert _cards({"role": "ADMIN", "is_master": False, "company_id": 1}) == [ + ["B01_Dashboard_CardStructCombo", WRITE_CO, combo], + ] + assert _cards({"role": "USER", "is_master": True, "company_id": 1})[0][2] == combo + assert _cards({"role": "USER", "is_master": False, "company_id": 1})[0][2] == combo + # 개인 층 없음(회사 없음) = 지금 규칙 + assert _cards({"role": "SYSTEM_ADMIN", "is_master": False, "company_id": None})[1][2] == ( + f"{M02}?open=구조물조합&root=master" + ) + assert _cards({"role": "ADMIN", "is_master": False, "company_id": None})[0][2] == ( + f"{M02}?open=구조물조합&root=company" + ) + # 다른 곳 기본 그대로 — 고르기 탭(일위대가 · 복사 생성 · 복사해 가져오기) · 층 없는 주소 + layer = _text(ROOT / "M02_MasterTemplete" / "M02_MasterTemplete_Layer.ts") + assert 'return { tabs, first: isSystem || !own ? "master" : "personal" };' in layer + assert 'raw === "company" || raw === "personal" ? raw : "master";' in layer