"use client"; import React, { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Checkbox } from "@/components/ui/checkbox"; import { Search, Loader2 } from "lucide-react"; import { useEntitySearch } from "../entity-search-input/useEntitySearch"; import { ItemSelectionModalProps } from "./types"; export function ItemSelectionModal({ open, onOpenChange, sourceTable, sourceColumns, sourceSearchFields = [], multiSelect = true, filterCondition = {}, modalTitle, alreadySelected = [], uniqueField, onSelect, }: ItemSelectionModalProps) { const [localSearchText, setLocalSearchText] = useState(""); const [selectedItems, setSelectedItems] = useState([]); const { results, loading, error, search, clearSearch } = useEntitySearch({ tableName: sourceTable, searchFields: sourceSearchFields.length > 0 ? sourceSearchFields : sourceColumns, filterCondition, }); // 모달 열릴 때 초기 검색 useEffect(() => { if (open) { search("", 1); // 빈 검색어로 전체 목록 조회 setSelectedItems([]); } else { clearSearch(); setLocalSearchText(""); setSelectedItems([]); } }, [open]); const handleSearch = () => { search(localSearchText, 1); }; const handleToggleItem = (item: any) => { if (!multiSelect) { setSelectedItems([item]); return; } const isSelected = selectedItems.some((selected) => uniqueField ? selected[uniqueField] === item[uniqueField] : selected === item ); if (isSelected) { setSelectedItems( selectedItems.filter((selected) => uniqueField ? selected[uniqueField] !== item[uniqueField] : selected !== item ) ); } else { setSelectedItems([...selectedItems, item]); } }; const handleConfirm = () => { onSelect(selectedItems); onOpenChange(false); }; // 이미 추가된 항목인지 확인 const isAlreadyAdded = (item: any): boolean => { if (!uniqueField) return false; return alreadySelected.some( (selected) => selected[uniqueField] === item[uniqueField] ); }; // 선택된 항목인지 확인 const isSelected = (item: any): boolean => { return selectedItems.some((selected) => uniqueField ? selected[uniqueField] === item[uniqueField] : selected === item ); }; return ( {modalTitle} 항목을 검색하고 선택하세요 {multiSelect && " (다중 선택 가능)"} {/* 검색 입력 */}
setLocalSearchText(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { handleSearch(); } }} className="h-8 text-xs sm:h-10 sm:text-sm" />
{/* 선택된 항목 수 */} {selectedItems.length > 0 && (
{selectedItems.length}개 항목 선택됨
)} {/* 오류 메시지 */} {error && (
{error}
)} {/* 검색 결과 테이블 */}
{multiSelect && ( )} {sourceColumns.map((col) => ( ))} {loading && results.length === 0 ? ( ) : results.length === 0 ? ( ) : ( results.map((item, index) => { const alreadyAdded = isAlreadyAdded(item); const selected = isSelected(item); return ( { if (!alreadyAdded) { handleToggleItem(item); } }} > {multiSelect && ( )} {sourceColumns.map((col) => ( ))} ); }) )}
선택 {col}

검색 중...

검색 결과가 없습니다
{ if (!alreadyAdded) { handleToggleItem(item); } }} /> {item[col] || "-"}
); }