summaryrefslogtreecommitdiff
path: root/components/layout
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-10-15 12:52:11 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-10-15 12:52:11 +0000
commitb54f6f03150dd78d86db62201b6386bf14b72394 (patch)
treeb3092bb34805fdc65eee5282e86a9fb90ba20d6e /components/layout
parentc1bd1a2f499ee2f0742170021b37dab410983ab7 (diff)
(대표님) 커버, 데이터룸, 파일매니저, 담당자할당 등
Diffstat (limited to 'components/layout')
-rw-r--r--components/layout/HeaderDataroom.tsx202
-rw-r--r--components/layout/HeaderSimple.tsx2
2 files changed, 203 insertions, 1 deletions
diff --git a/components/layout/HeaderDataroom.tsx b/components/layout/HeaderDataroom.tsx
new file mode 100644
index 00000000..333e3768
--- /dev/null
+++ b/components/layout/HeaderDataroom.tsx
@@ -0,0 +1,202 @@
+"use client";
+
+import * as React from "react";
+import Link from "next/link";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Avatar, AvatarImage, AvatarFallback } from "@/components/ui/avatar";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+import {
+ NavigationMenu,
+ NavigationMenuContent,
+ NavigationMenuItem,
+ NavigationMenuLink,
+ NavigationMenuList,
+ NavigationMenuTrigger,
+ navigationMenuTriggerStyle,
+} from "@/components/ui/navigation-menu";
+import { SearchIcon, BellIcon, Menu } from "lucide-react";
+import { useParams, usePathname, useSearchParams } from "next/navigation";
+import { cn } from "@/lib/utils";
+import Image from "next/image";
+import { MobileMenu } from "./MobileMenu";
+import { CommandMenu } from "./command-menu";
+import { useSession, signOut } from "next-auth/react";
+import { NotificationDropdown } from "./NotificationDropdown";
+
+// 간단한 메뉴 배열
+const simpleMenus = [
+ { title: "발주처 목록", href: "/evcp/data-room/owner-companies" },
+ { title: "데이터룸", href: "/evcp/data-room" }
+];
+export function HeaderDataRoom() {
+ const params = useParams();
+ const lng = params?.lng as string;
+ const pathname = usePathname();
+ const { data: session } = useSession();
+
+ const userName = session?.user?.name || "";
+ const domain = session?.user?.domain || "";
+ const initials = userName
+ .split(" ")
+ .map((word) => word[0]?.toUpperCase())
+ .join("");
+
+ const [isMobileMenuOpen, setIsMobileMenuOpen] = React.useState(false);
+
+ const toggleMobileMenu = () => {
+ setIsMobileMenuOpen(!isMobileMenuOpen);
+ };
+
+ return (
+ <>
+ <header className="border-grid sticky top-0 z-40 w-full border-b bg-slate-100 backdrop-blur supports-[backdrop-filter]:bg-background/60">
+ <div className="container-wrapper">
+ <div className="container flex h-14 items-center">
+ {/* 햄버거 메뉴 버튼 (모바일) */}
+ <Button
+ onClick={toggleMobileMenu}
+ variant="ghost"
+ className="-ml-2 mr-2 h-8 w-8 px-0 text-base hover:bg-transparent focus-visible:bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 md:hidden"
+ >
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ fill="none"
+ viewBox="0 0 24 24"
+ strokeWidth="1.5"
+ stroke="currentColor"
+ className="!size-6"
+ >
+ <path
+ strokeLinecap="round"
+ strokeLinejoin="round"
+ d="M3.75 9h16.5m-16.5 6.75h16.5"
+ />
+ </svg>
+ <span className="sr-only">메뉴 토글</span>
+ </Button>
+
+ {/* 로고 영역 */}
+ <div className="mr-4 flex-shrink-0 flex items-center gap-2 lg:mr-6">
+ <Link href={`/${lng}/evcp`} className="flex items-center gap-2">
+ <Image
+ className="dark:invert"
+ src="/images/vercel.svg"
+ alt="EVCP Logo"
+ width={20}
+ height={20}
+ />
+ <span className="hidden font-bold lg:inline-block">
+ EVCP
+ </span>
+ </Link>
+ </div>
+
+ {/* 네비게이션 메뉴 - 간단한 배열 */}
+ <div className="hidden md:block flex-1 min-w-0">
+ <nav className="flex items-center space-x-6">
+ {simpleMenus.map((menu) => (
+ <Link
+ key={menu.href}
+ href={`/${lng}${menu.href}`}
+ className="text-sm font-medium transition-colors hover:text-primary"
+ >
+ {menu.title}
+ </Link>
+ ))}
+ </nav>
+</div>
+
+ {/* 우측 영역 */}
+ <div className="ml-auto flex flex-shrink-0 items-center space-x-2">
+ {/* 데스크탑에서는 CommandMenu, 모바일에서는 검색 아이콘만 */}
+
+ {/* 알림 버튼 */}
+ <NotificationDropdown />
+
+ {/* 사용자 메뉴 */}
+ <DropdownMenu>
+ <DropdownMenuTrigger asChild>
+ <Avatar className="cursor-pointer h-8 w-8">
+ <AvatarImage src={`${session?.user?.image}` || "/user-avatar.jpg"} alt="User Avatar" />
+ <AvatarFallback>
+ {initials || "?"}
+ </AvatarFallback>
+ </Avatar>
+ </DropdownMenuTrigger>
+ <DropdownMenuContent className="w-48" align="end">
+ <DropdownMenuLabel>내 계정</DropdownMenuLabel>
+ <DropdownMenuSeparator />
+ <DropdownMenuItem asChild>
+ <Link href={`/${lng}/evcp/settings`}>설정</Link>
+ </DropdownMenuItem>
+ <DropdownMenuSeparator />
+ <DropdownMenuItem onSelect={() => signOut({ callbackUrl: `/${lng}/${domain}` })}>
+ 로그아웃
+ </DropdownMenuItem>
+ </DropdownMenuContent>
+ </DropdownMenu>
+ </div>
+ </div>
+ </div>
+
+ {/* 모바일 메뉴 */}
+ {isMobileMenuOpen && (
+ <MobileMenu
+ lng={lng}
+ onClose={toggleMobileMenu}
+ activeMenus={[]}
+ domainMain={simpleMenus}
+ domainAdditional={[]}
+ t={(key: string) => key}
+ />
+ )}
+ </header>
+ </>
+ );
+}
+
+const ListItem = React.forwardRef<
+ React.ElementRef<"a">,
+ React.ComponentPropsWithoutRef<"a">
+>(({ className, title, children, ...props }, ref) => {
+ return (
+ <li>
+ <NavigationMenuLink asChild>
+ <a
+ ref={ref}
+ className={cn(
+ "block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
+ className
+ )}
+ {...props}
+ >
+ <div className="text-sm font-medium leading-none">{title}</div>
+ {children && (
+ <p className="line-clamp-2 text-sm leading-snug text-muted-foreground">
+ {children}
+ </p>
+ )}
+ </a>
+ </NavigationMenuLink>
+ </li>
+ );
+});
+ListItem.displayName = "ListItem";
+
+
+export function RouteLogger() {
+ const path = usePathname();
+ const qs = useSearchParams().toString();
+ React.useEffect(() => {
+ console.log("[URL]", path + (qs ? "?" + qs : ""));
+ }, [path, qs]);
+ return null;
+} \ No newline at end of file
diff --git a/components/layout/HeaderSimple.tsx b/components/layout/HeaderSimple.tsx
index f099d3ef..989929ae 100644
--- a/components/layout/HeaderSimple.tsx
+++ b/components/layout/HeaderSimple.tsx
@@ -100,7 +100,7 @@ export function HeaderSimple() {
/>
<span className="hidden font-bold lg:inline-block">
{isPartnerRoute
- ? "eVCP Partners"
+ ? "Data Room"
: pathname?.includes("/evcp")
? "eVCP 삼성중공업"
: "eVCP"}