123321
This commit is contained in:
@@ -261,8 +261,6 @@ function AppLayoutInner({ children }: AppLayoutProps) {
|
||||
}
|
||||
return false;
|
||||
});
|
||||
const [collapsedHover, setCollapsedHover] = useState(false);
|
||||
const collapsedHoverTimer = useRef<NodeJS.Timeout | null>(null);
|
||||
const [hasPopMenus, setHasPopMenus] = useState(false);
|
||||
|
||||
const toggleSidebarCollapse = () => {
|
||||
@@ -271,18 +269,6 @@ function AppLayoutInner({ children }: AppLayoutProps) {
|
||||
localStorage.setItem("sidebarCollapsed", String(next));
|
||||
return next;
|
||||
});
|
||||
setCollapsedHover(false);
|
||||
};
|
||||
|
||||
const handleCollapsedMouseEnter = () => {
|
||||
if (!sidebarCollapsed || isMobile) return;
|
||||
if (collapsedHoverTimer.current) clearTimeout(collapsedHoverTimer.current);
|
||||
collapsedHoverTimer.current = setTimeout(() => setCollapsedHover(true), 200);
|
||||
};
|
||||
|
||||
const handleCollapsedMouseLeave = () => {
|
||||
if (collapsedHoverTimer.current) clearTimeout(collapsedHoverTimer.current);
|
||||
setCollapsedHover(false);
|
||||
};
|
||||
|
||||
// URL 직접 접근 시 탭 자동 열기
|
||||
@@ -781,96 +767,7 @@ function AppLayoutInner({ children }: AppLayoutProps) {
|
||||
} border-sidebar-border bg-sidebar flex flex-col border-r transition-all duration-300 flex-shrink-0 overflow-hidden ${
|
||||
!isMobile && sidebarCollapsed ? "w-16" : "w-[260px] sm:w-[220px] lg:w-[240px]"
|
||||
}`}
|
||||
onMouseEnter={handleCollapsedMouseEnter}
|
||||
onMouseLeave={handleCollapsedMouseLeave}
|
||||
>
|
||||
{/* 축소 hover 오버레이: 마우스 올리면 전체 메뉴 표시 */}
|
||||
{!isMobile && sidebarCollapsed && collapsedHover && (
|
||||
<>
|
||||
<div
|
||||
className="fixed inset-0 z-30"
|
||||
onMouseEnter={handleCollapsedMouseLeave}
|
||||
/>
|
||||
<div
|
||||
className="border-sidebar-border bg-sidebar fixed left-16 top-0 z-40 flex h-screen w-[240px] flex-col border-r shadow-xl animate-in slide-in-from-left-2 duration-200"
|
||||
onMouseEnter={() => { if (collapsedHoverTimer.current) clearTimeout(collapsedHoverTimer.current); setCollapsedHover(true); }}
|
||||
onMouseLeave={handleCollapsedMouseLeave}
|
||||
>
|
||||
<div className="border-border flex h-14 items-center justify-between border-b px-4">
|
||||
<Logo />
|
||||
<button
|
||||
onClick={toggleSidebarCollapse}
|
||||
className="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-border/50 transition-colors hover:bg-accent"
|
||||
title="사이드바 펼치기"
|
||||
>
|
||||
<PanelLeftOpen className="h-[18px] w-[18px] text-muted-foreground" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* 관리 회사 + 모드 전환 + 회사 선택 */}
|
||||
{(user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" && (
|
||||
<div className="border-border bg-muted/50 mx-3 mt-3 rounded-md border p-3">
|
||||
<div className="flex items-center gap-2">
|
||||
<Building2 className="text-primary h-4 w-4 shrink-0" />
|
||||
<div className="min-w-0 flex-1">
|
||||
<p className="text-muted-foreground text-[10px]">현재 관리 회사</p>
|
||||
<p className="truncate text-sm font-semibold" title={currentCompanyName || "로딩 중..."}>
|
||||
{currentCompanyName || "로딩 중..."}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{((user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" ||
|
||||
(user as ExtendedUserInfo)?.userType === "COMPANY_ADMIN" ||
|
||||
(user as ExtendedUserInfo)?.userType === "admin") && (
|
||||
<div className="border-border space-y-2 border-b p-3">
|
||||
<Button
|
||||
onClick={handleModeSwitch}
|
||||
className={`flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors duration-150 hover:cursor-pointer ${
|
||||
isAdminMode
|
||||
? "border border-amber-200 bg-amber-50 text-amber-700 hover:bg-amber-100 dark:border-amber-800 dark:bg-amber-950 dark:text-amber-400"
|
||||
: "border-primary/20 bg-primary/5 text-primary hover:bg-primary/10 border"
|
||||
}`}
|
||||
>
|
||||
{isAdminMode ? (
|
||||
<>
|
||||
<UserCheck className="h-4 w-4" />
|
||||
사용자 메뉴로 전환
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Shield className="h-4 w-4" />
|
||||
관리자 메뉴로 전환
|
||||
</>
|
||||
)}
|
||||
</Button>
|
||||
{(user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" && (
|
||||
<Button
|
||||
onClick={() => setShowCompanySwitcher(true)}
|
||||
className="border-primary/20 bg-primary/5 text-primary hover:bg-primary/10 flex w-full items-center justify-center gap-2 rounded-md border px-3 py-2 text-sm font-medium transition-colors duration-150 hover:cursor-pointer"
|
||||
>
|
||||
<Building2 className="h-4 w-4" />
|
||||
회사 선택
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="flex-1 overflow-y-auto py-4">
|
||||
<nav className="space-y-0.5 px-3">
|
||||
{uiMenus.map((menu) => renderMenu(menu))}
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
{/* 테마 토글 */}
|
||||
<div className="border-border border-t px-3 py-1">
|
||||
<ThemeToggle />
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
{/* 헤더: 로고 + 토글 버튼 */}
|
||||
{!isMobile && (
|
||||
<div className={`border-border flex h-14 items-center border-b overflow-hidden ${sidebarCollapsed ? "justify-center px-2" : "justify-between px-4"}`}>
|
||||
|
||||
Reference in New Issue
Block a user