'use client' import { useState, useEffect } from "react" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { ScrollArea } from "@/components/ui/scroll-area" import { Search, X, Filter, Sparkles } from "lucide-react" import { geneApi, type MarkerModel } from "@/lib/api/gene.api" import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs" interface GeneSearchDrawerProps { open: boolean onOpenChange: (open: boolean) => void selectedGenes: string[] onGenesChange: (genes: string[]) => void } export function GeneSearchModal({ open, onOpenChange, selectedGenes, onGenesChange }: GeneSearchDrawerProps) { const [allGenes, setAllGenes] = useState([]) const [loading, setLoading] = useState(false) const [searchQuery, setSearchQuery] = useState("") const [filterType, setFilterType] = useState<'ALL' | 'QTY' | 'QLT'>('ALL') // 모달 열릴 때 전체 유전자 로드 useEffect(() => { if (open) { loadAllGenes() } }, [open]) const loadAllGenes = async () => { try { setLoading(true) const genes = await geneApi.getAllMarkers() setAllGenes(genes) } catch { // 유전자 로드 실패 시 빈 배열 유지 } finally { setLoading(false) } } // 검색 및 필터링 const filteredGenes = allGenes.filter((gene) => { // 타입 필터 if (filterType !== 'ALL' && gene.markerTypeCd !== filterType) { return false } // 검색어 필터 if (searchQuery) { const query = searchQuery.toLowerCase() return ( gene.markerNm.toLowerCase().includes(query) || gene.markerDesc?.toLowerCase().includes(query) || gene.relatedTrait?.toLowerCase().includes(query) ) } return true }) const toggleGene = (markerNm: string) => { if (selectedGenes.includes(markerNm)) { onGenesChange(selectedGenes.filter(g => g !== markerNm)) } else { onGenesChange([...selectedGenes, markerNm]) } } const selectAllFiltered = () => { const newGenes = [...selectedGenes] filteredGenes.forEach(gene => { if (!newGenes.includes(gene.markerNm)) { newGenes.push(gene.markerNm) } }) onGenesChange(newGenes) } const clearAll = () => { onGenesChange([]) } return ( {/* 헤더 */}
유전자 검색 및 선택 전체 {allGenes.length.toLocaleString()}개 / 선택 {selectedGenes.length}
{/* 검색 및 필터 */}
{/* 검색바 */}
setSearchQuery(e.target.value)} className="pl-9 pr-9 h-10 text-sm bg-background" autoFocus /> {searchQuery && ( )}
{/* 필터 탭 및 액션 버튼 */}
setFilterType(v as any)} className="flex-1"> 전체 ({allGenes.length})
육량 ({allGenes.filter(g => g.markerTypeCd === 'QTY').length})
육질 ({allGenes.filter(g => g.markerTypeCd === 'QLT').length})
{/* 유전자 목록 */}
{loading ? (

유전자 데이터 로딩 중...

) : filteredGenes.length > 0 ? (
{filteredGenes.map((gene) => { const isSelected = selectedGenes.includes(gene.markerNm) const isQuantity = gene.markerTypeCd === 'QTY' return ( toggleGene(gene.markerNm)} title={`${gene.markerNm}\n${gene.markerDesc || ''}\n${gene.relatedTrait ? `관련 형질: ${gene.relatedTrait}` : ''}`} > {gene.markerNm} ) })}
) : (

검색 결과가 없습니다

다른 검색어나 필터를 시도해보세요

)}
{/* 하단 버튼 */}
{searchQuery && ( 검색: {filteredGenes.length.toLocaleString()} )} 선택: {selectedGenes.length}
) }