From 36d93d91cff70f3deea2af78fe0ab0f608d84801 Mon Sep 17 00:00:00 2001 From: johngreen Date: Mon, 11 May 2026 11:10:01 +0900 Subject: [PATCH] =?UTF-8?q?fix(layout):=20admin=20=ED=83=AD=20=EC=98=81?= =?UTF-8?q?=EC=96=B4=20fallback=20title=20=EC=9D=84=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=20=ED=95=9C=EA=B8=80=EB=AA=85=EC=9C=BC=EB=A1=9C=20=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit URL 직접 진입 / sessionStorage 복원 시 AppLayout 의 fallback (pathname.split('/').pop()) 이 path segment 를 그대로 탭 title 로 사용해서 '부서관리' 대신 'deptMngList' 같은 영어가 표시되던 문제. - tabStore: updateTabTitle(tabId, title) 추가 - AppLayout: uiMenus 로드 후 admin 탭들의 admin_url 매칭하여 menu_name_kor (tabTitle/label/name) 로 갱신 Co-Authored-By: Claude Opus 4.7 (1M context) --- frontend/components/layout/AppLayout.tsx | 16 ++++++++++++++++ frontend/stores/tabStore.ts | 11 +++++++++++ 2 files changed, 27 insertions(+) diff --git a/frontend/components/layout/AppLayout.tsx b/frontend/components/layout/AppLayout.tsx index e8732639..0ceb247b 100644 --- a/frontend/components/layout/AppLayout.tsx +++ b/frontend/components/layout/AppLayout.tsx @@ -902,6 +902,22 @@ function AppLayoutInner({ children }: AppLayoutProps) { } }, [activeTab, uiMenus, isMenuActive]); + // URL 직접 진입 / sessionStorage 복원 시 admin 탭의 영어 path-segment title 을 + // menu_name_kor (uiMenus 의 tabTitle/label/name) 로 한 번만 갱신. + useEffect(() => { + if (uiMenus.length === 0) return; + const store = useTabStore.getState(); + for (const tab of store.admin.tabs) { + if (tab.type !== "admin" || !tab.admin_url) continue; + const matched = uiMenus.find((m: any) => m.url === tab.admin_url); + const koreanTitle: string | undefined = + matched?.tabTitle || matched?.label || matched?.name; + if (koreanTitle && tab.title !== koreanTitle) { + store.updateTabTitle(tab.id, koreanTitle); + } + } + }, [uiMenus]); + if (!user) { return (
diff --git a/frontend/stores/tabStore.ts b/frontend/stores/tabStore.ts index fba73bab..a103f4cf 100644 --- a/frontend/stores/tabStore.ts +++ b/frontend/stores/tabStore.ts @@ -41,6 +41,7 @@ interface TabState { closeAllTabs: () => void; updateTabOrder: (fromIndex: number, toIndex: number) => void; + updateTabTitle: (tabId: string, title: string) => void; } // --- 헬퍼 함수 --- @@ -195,6 +196,16 @@ export const useTabStore = create()( newTabs.splice(toIndex, 0, moved); set({ [mk]: { ...modeData, tabs: newTabs } }); }, + + updateTabTitle: (tabId, title) => { + const mk = modeKey(get()); + const modeData = get()[mk]; + const idx = modeData.tabs.findIndex((t) => t.id === tabId); + if (idx === -1 || modeData.tabs[idx].title === title) return; + const newTabs = [...modeData.tabs]; + newTabs[idx] = { ...newTabs[idx], title }; + set({ [mk]: { ...modeData, tabs: newTabs } }); + }, }), { name: "erp-tab-store",