"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { MoreHorizontal, Edit, Trash2, Copy, Eye, Plus, Search, Palette } from "lucide-react"; import { ScreenDefinition } from "@/types/screen"; import { screenApi } from "@/lib/api/screen"; import CreateScreenModal from "./CreateScreenModal"; import CopyScreenModal from "./CopyScreenModal"; interface ScreenListProps { onScreenSelect: (screen: ScreenDefinition) => void; selectedScreen: ScreenDefinition | null; onDesignScreen: (screen: ScreenDefinition) => void; } export default function ScreenList({ onScreenSelect, selectedScreen, onDesignScreen }: ScreenListProps) { const [screens, setScreens] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [isCreateOpen, setIsCreateOpen] = useState(false); const [isCopyOpen, setIsCopyOpen] = useState(false); const [screenToCopy, setScreenToCopy] = useState(null); // 화면 목록 로드 (실제 API) useEffect(() => { let abort = false; const load = async () => { try { setLoading(true); const resp = await screenApi.getScreens({ page: currentPage, size: 20, searchTerm }); if (abort) return; // 응답 표준: { success, data, total } setScreens(resp.data || []); setTotalPages(Math.max(1, Math.ceil((resp.total || 0) / 20))); } catch (e) { console.error("화면 목록 조회 실패", e); setScreens([]); setTotalPages(1); } finally { if (!abort) setLoading(false); } }; load(); return () => { abort = true; }; }, [currentPage, searchTerm]); const filteredScreens = screens; // 서버 필터 기준 사용 // 화면 목록 다시 로드 const reloadScreens = async () => { try { setLoading(true); const resp = await screenApi.getScreens({ page: currentPage, size: 20, searchTerm }); setScreens(resp.data || []); setTotalPages(Math.max(1, Math.ceil((resp.total || 0) / 20))); } catch (e) { console.error("화면 목록 조회 실패", e); } finally { setLoading(false); } }; const handleScreenSelect = (screen: ScreenDefinition) => { onScreenSelect(screen); }; const handleEdit = (screen: ScreenDefinition) => { // 편집 모달 열기 console.log("편집:", screen); }; const handleDelete = (screen: ScreenDefinition) => { if (confirm(`"${screen.screenName}" 화면을 삭제하시겠습니까?`)) { // 삭제 API 호출 console.log("삭제:", screen); } }; const handleCopy = (screen: ScreenDefinition) => { setScreenToCopy(screen); setIsCopyOpen(true); }; const handleView = (screen: ScreenDefinition) => { // 미리보기 모달 열기 console.log("미리보기:", screen); }; const handleCopySuccess = () => { // 복사 성공 후 화면 목록 다시 로드 reloadScreens(); }; if (loading) { return (
로딩 중...
); } return (
{/* 검색 및 필터 */}
setSearchTerm(e.target.value)} className="w-80 pl-10" />
{/* 화면 목록 테이블 */} 화면 목록 ({screens.length}) 화면명 화면 코드 테이블명 상태 생성일 작업 {screens.map((screen) => ( handleScreenSelect(screen)} >
{screen.screenName}
{screen.description &&
{screen.description}
}
{screen.screenCode} {screen.tableName} {screen.isActive === "Y" ? "활성" : "비활성"}
{screen.createdDate.toLocaleDateString()}
{screen.createdBy}
onDesignScreen(screen)}> 화면 설계 handleView(screen)}> 미리보기 handleEdit(screen)}> 편집 handleCopy(screen)}> 복사 handleDelete(screen)} className="text-red-600"> 삭제
))}
{filteredScreens.length === 0 &&
검색 결과가 없습니다.
}
{/* 페이지네이션 */} {totalPages > 1 && (
{currentPage} / {totalPages}
)} {/* 새 화면 생성 모달 */} { // 목록에 즉시 반영 (첫 페이지 기준 상단 추가) setScreens((prev) => [created, ...prev]); }} /> {/* 화면 복사 모달 */} setIsCopyOpen(false)} sourceScreen={screenToCopy} onCopySuccess={handleCopySuccess} />
); }