"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Search, Loader2 } from "lucide-react"; import { materialApi } from "@/lib/api/yardLayoutApi"; interface TempMaterial { id: number; material_code: string; material_name: string; category: string; unit: string; default_color: string; description: string; } interface MaterialLibraryProps { isOpen: boolean; onClose: () => void; onSelect: (material: TempMaterial) => void; } export default function MaterialLibrary({ isOpen, onClose, onSelect }: MaterialLibraryProps) { const [materials, setMaterials] = useState([]); const [categories, setCategories] = useState([]); const [searchText, setSearchText] = useState(""); const [selectedCategory, setSelectedCategory] = useState(""); const [isLoading, setIsLoading] = useState(false); const [selectedMaterial, setSelectedMaterial] = useState(null); // 자재 목록 로드 const loadMaterials = async () => { try { setIsLoading(true); const [materialsResponse, categoriesResponse] = await Promise.all([ materialApi.getTempMaterials({ search: searchText || undefined, category: selectedCategory || undefined, page: 1, limit: 50, }), materialApi.getCategories(), ]); if (materialsResponse.success) { setMaterials(materialsResponse.data); } if (categoriesResponse.success) { setCategories(categoriesResponse.data); } } catch (error) { console.error("자재 목록 조회 실패:", error); } finally { setIsLoading(false); } }; useEffect(() => { if (isOpen) { loadMaterials(); } }, [isOpen, searchText, selectedCategory]); // 자재 선택 및 추가 const handleSelectMaterial = () => { if (selectedMaterial) { onSelect(selectedMaterial); setSelectedMaterial(null); onClose(); } }; // 모달 닫기 const handleClose = () => { setSelectedMaterial(null); setSearchText(""); setSelectedCategory(""); onClose(); }; return ( 자재 선택
{/* 검색 및 필터 */}
setSearchText(e.target.value)} className="pl-9" />
{/* 자재 목록 */} {isLoading ? (
) : materials.length === 0 ? (
{searchText || selectedCategory ? "검색 결과가 없습니다" : "등록된 자재가 없습니다"}
) : (
색상 자재 코드 자재 이름 카테고리 단위 {materials.map((material) => ( setSelectedMaterial(material)} >
{material.material_code} {material.material_name} {material.category} {material.unit} ))}
)} {/* 선택된 자재 정보 */} {selectedMaterial && (
선택된 자재
{selectedMaterial.material_name}
{selectedMaterial.material_code}
{selectedMaterial.description && (
{selectedMaterial.description}
)}
)}
); }