"use client" import * as React from "react" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { ScrollArea } from "@/components/ui/scroll-area" import { Separator } from "@/components/ui/separator" import { Tooltip, TooltipTrigger, TooltipContent, } from "@/components/ui/tooltip" import { Package2, FormInput } from "lucide-react" import { useRouter, usePathname } from "next/navigation" import { Skeleton } from "@/components/ui/skeleton" import { type FormInfo } from "@/lib/forms/services" interface PackageData { itemId: number itemName: string } interface SidebarProps extends React.HTMLAttributes { isCollapsed: boolean packages: PackageData[] selectedPackageId: number | null selectedProjectId: number | null selectedContractId: number | null onSelectPackage: (itemId: number) => void forms?: FormInfo[] onSelectForm: (formName: string) => void isLoadingForms?: boolean mode: "IM" | "ENG" } export function Sidebar({ className, isCollapsed, packages, selectedPackageId, selectedProjectId, selectedContractId, onSelectPackage, forms, onSelectForm, isLoadingForms = false, mode = "IM", }: SidebarProps) { const router = useRouter() const rawPathname = usePathname() const pathname = rawPathname ?? "" /** * --------------------------- * 1) URL에서 현재 패키지 / 폼 코드 추출 * --------------------------- */ const segments = pathname.split("/").filter(Boolean) let currentItemId: number | null = null let currentFormCode: string | null = null const tagIndex = segments.indexOf("tag") if (tagIndex !== -1 && segments[tagIndex + 1]) { currentItemId = parseInt(segments[tagIndex + 1], 10) } const formIndex = segments.indexOf("form") if (formIndex !== -1) { const itemSegment = segments[formIndex + 1] const codeSegment = segments[formIndex + 2] if (itemSegment) { currentItemId = parseInt(itemSegment, 10) } if (codeSegment) { currentFormCode = codeSegment } } /** * --------------------------- * 2) 패키지 클릭 핸들러 (IM 모드) * --------------------------- */ const handlePackageClick = (itemId: number) => { // 상위 컴포넌트 상태 업데이트 onSelectPackage(itemId) // 해당 태그 페이지로 라우팅 // 예: /vendor-data-plant/tag/123 const baseSegments = segments.slice(0, segments.indexOf("vendor-data-plant") + 1).join("/") router.push(`/${baseSegments}/tag/${itemId}`) } /** * --------------------------- * 3) 폼 클릭 핸들러 (IM 모드만 사용) * --------------------------- */ const handleFormClick = (form: FormInfo) => { // IM 모드에서만 사용 if (selectedPackageId === null) return; onSelectForm(form.formName) const baseSegments = segments.slice(0, segments.indexOf("vendor-data-plant") + 1).join("/") router.push(`/${baseSegments}/form/${selectedPackageId}/${form.formCode}/${selectedProjectId}/${selectedContractId}?mode=${mode}`) } /** * --------------------------- * 4) 패키지 클릭 핸들러 (ENG 모드) * --------------------------- */ const handlePackageUnderFormClick = (form: FormInfo, pkg: PackageData) => { onSelectForm(form.formName) onSelectPackage(pkg.itemId) const baseSegments = segments.slice(0, segments.indexOf("vendor-data-plant") + 1).join("/") router.push(`/${baseSegments}/form/${pkg.itemId}/${form.formCode}/${selectedProjectId}/${selectedContractId}?mode=${mode}`) } return (
{/* ---------- 패키지(Items) 목록 - IM 모드에서만 표시 ---------- */} {mode === "IM" && ( <>

{isCollapsed ? "P" : "Package Lists"}

{packages.map((pkg) => { const isActive = pkg.itemId === currentItemId return (
{isCollapsed ? ( {pkg.itemName} ) : ( )}
) })}
)} {/* ---------- 폼 목록 (IM 모드) / 패키지와 폼 목록 (ENG 모드) ---------- */}

{isCollapsed ? (mode === "IM" ? "F" : "P") : (mode === "IM" ? "Form Lists" : "Package Lists") }

{isLoadingForms ? ( Array.from({ length: 3 }).map((_, index) => (
)) ) : mode === "IM" ? ( // =========== IM 모드: 폼만 표시 =========== !forms || forms.length === 0 ? (

(No forms loaded)

) : ( forms.map((form) => { const isFormActive = form.formCode === currentFormCode const isDisabled = currentItemId === null return isCollapsed ? ( {form.formName} ) : ( ) }) ) ) : ( // =========== ENG 모드: 패키지 > 폼 계층 구조 =========== packages.length === 0 ? (

(No packages loaded)

) : ( packages.map((pkg) => (
{isCollapsed ? (
{pkg.itemName}
) : ( <> {/* 패키지 이름 (클릭 불가능한 라벨) */}
{pkg.itemName}
{/* 폼 목록 바로 표시 */}
{!forms || forms.length === 0 ? (

No forms available

) : ( forms.map((form) => { const isFormPackageActive = pkg.itemId === currentItemId && form.formCode === currentFormCode return ( ) }) )}
)}
)) ) )}
) }