From fbb3b7f05737f9571b04b0a8f4f15c0928de8545 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 7 Jul 2025 01:43:36 +0000 Subject: (대표님) 변경사항 20250707 10시 43분 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech-vendor-possible-items-container.tsx | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 components/tech-vendor-possible-items/tech-vendor-possible-items-container.tsx (limited to 'components/tech-vendor-possible-items') diff --git a/components/tech-vendor-possible-items/tech-vendor-possible-items-container.tsx b/components/tech-vendor-possible-items/tech-vendor-possible-items-container.tsx new file mode 100644 index 00000000..90b28176 --- /dev/null +++ b/components/tech-vendor-possible-items/tech-vendor-possible-items-container.tsx @@ -0,0 +1,102 @@ +"use client" + +import * as React from "react" +import { useRouter, usePathname, useSearchParams } from "next/navigation" +import { ChevronDown } from "lucide-react" + +import { Button } from "@/components/ui/button" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu" + +interface VendorType { + id: string; + name: string; + value: string; +} + +interface TechVendorPossibleItemsContainerProps { + vendorTypes: VendorType[]; + children: React.ReactNode; +} + +export function TechVendorPossibleItemsContainer({ + vendorTypes, + children, +}: TechVendorPossibleItemsContainerProps) { + const router = useRouter(); + const pathname = usePathname(); + const searchParamsObj = useSearchParams(); + + // useSearchParams를 메모이제이션하여 안정적인 참조 생성 + const searchParams = React.useMemo( + () => searchParamsObj || new URLSearchParams(), + [searchParamsObj] + ); + + // URL에서 현재 선택된 벤더 타입 가져오기 + const vendorType = searchParams.get("vendorType") || "all"; + + // 선택한 벤더 타입에 해당하는 이름 찾기 + const selectedVendor = vendorTypes.find((vendor) => vendor.id === vendorType)?.name || "전체"; + + // 벤더 타입 변경 핸들러 + const handleVendorTypeChange = React.useCallback((value: string) => { + const params = new URLSearchParams(searchParams.toString()); + if (value === "all") { + params.delete("vendorType"); + } else { + params.set("vendorType", value); + } + + router.push(`${pathname}?${params.toString()}`); + }, [router, pathname, searchParams]); + + + + return ( + <> + {/* 상단 영역: 제목 왼쪽 / 벤더 타입 선택기 오른쪽 */} +
+ {/* 왼쪽: 타이틀 & 설명 */} +
+

기술영업 벤더 아이템 관리

+

+ 기술영업 벤더별 가능 아이템을 관리합니다. +

+
+ + {/* 오른쪽: 벤더 타입 드롭다운 */} + + + + + + {vendorTypes.map((vendor) => ( + handleVendorTypeChange(vendor.id)} + className={vendor.id === vendorType ? "bg-muted" : ""} + > + {vendor.name} + + ))} + + +
+ + {/* 컨텐츠 영역 */} +
+
+ {children} +
+
+ + ); +} \ No newline at end of file -- cgit v1.2.3