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",