"use client"; import React, { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; import { toast } from "sonner"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Search, Plus, X, Monitor, Settings } from "lucide-react"; import { menuScreenApi, screenApi } from "@/lib/api/screen"; import { ScreenDefinition } from "@/types/screen"; import type { MenuItem } from "@/lib/api/menu"; interface ScreenAssignmentTabProps { menus: MenuItem[]; } export const ScreenAssignmentTab: React.FC = ({ menus }) => { const [selectedMenuId, setSelectedMenuId] = useState(""); const [selectedMenu, setSelectedMenu] = useState(null); const [assignedScreens, setAssignedScreens] = useState([]); const [availableScreens, setAvailableScreens] = useState([]); const [loading, setLoading] = useState(false); const [searchTerm, setSearchTerm] = useState(""); const [showAssignDialog, setShowAssignDialog] = useState(false); const [showUnassignDialog, setShowUnassignDialog] = useState(false); const [selectedScreen, setSelectedScreen] = useState(null); // 디버그: 전달받은 메뉴 데이터 확인 // console.log("ScreenAssignmentTab - 전달받은 메뉴 데이터:", { // total: menus.length, // sample: menus.slice(0, 3), // keys: menus.length > 0 ? Object.keys(menus[0]) : [], // }); // 메뉴 선택 const handleMenuSelect = async (menuId: string) => { // console.log("메뉴 선택:", menuId); setSelectedMenuId(menuId); // 다양한 형식의 objid 대응 const menu = menus.find((m) => { const objid = m.objid || m.OBJID || (m as any).objid; return objid?.toString() === menuId; }); // console.log("선택된 메뉴:", menu); setSelectedMenu(menu || null); if (menu) { const objid = menu.objid || menu.OBJID || (menu as any).objid; if (objid) { await loadAssignedScreens(parseInt(objid.toString())); } } }; // 할당된 화면 목록 로드 const loadAssignedScreens = async (menuObjid: number) => { try { setLoading(true); const screens = await menuScreenApi.getScreensByMenu(menuObjid); setAssignedScreens(screens); } catch (error) { // console.error("할당된 화면 로드 실패:", error); toast.error("할당된 화면 목록을 불러오는데 실패했습니다."); } finally { setLoading(false); } }; // 할당 가능한 화면 목록 로드 const loadAvailableScreens = async () => { try { const response = await screenApi.getScreens({}); const allScreens = response.data; // 이미 할당된 화면 제외 const assignedScreenIds = assignedScreens.map((screen) => screen.screenId); const available = allScreens.filter((screen) => !assignedScreenIds.includes(screen.screenId)); setAvailableScreens(available); } catch (error) { // console.error("사용 가능한 화면 로드 실패:", error); toast.error("사용 가능한 화면 목록을 불러오는데 실패했습니다."); } }; // 화면 할당 const handleAssignScreen = async () => { if (!selectedScreen || !selectedMenu) return; try { const objid = selectedMenu.objid || selectedMenu.OBJID || (selectedMenu as any).objid; if (!objid) { toast.error("메뉴 ID를 찾을 수 없습니다."); return; } await menuScreenApi.assignScreenToMenu(selectedScreen.screenId, parseInt(objid.toString())); toast.success("화면이 메뉴에 성공적으로 할당되었습니다."); // 목록 새로고침 await loadAssignedScreens(parseInt(objid.toString())); setShowAssignDialog(false); setSelectedScreen(null); } catch (error) { // console.error("화면 할당 실패:", error); toast.error("화면 할당에 실패했습니다."); } }; // 화면 할당 해제 const handleUnassignScreen = async () => { if (!selectedScreen || !selectedMenu) return; try { const objid = selectedMenu.objid || selectedMenu.OBJID || (selectedMenu as any).objid; if (!objid) { toast.error("메뉴 ID를 찾을 수 없습니다."); return; } await menuScreenApi.unassignScreenFromMenu(selectedScreen.screenId, parseInt(objid.toString())); toast.success("화면-메뉴 할당이 해제되었습니다."); // 목록 새로고침 await loadAssignedScreens(parseInt(objid.toString())); setShowUnassignDialog(false); setSelectedScreen(null); } catch (error) { // console.error("화면 할당 해제 실패:", error); toast.error("화면 할당 해제에 실패했습니다."); } }; // 화면 할당 대화상자 열기 const openAssignDialog = async () => { await loadAvailableScreens(); setShowAssignDialog(true); }; // 필터된 사용 가능한 화면 const filteredAvailableScreens = availableScreens.filter( (screen) => screen.screenName.toLowerCase().includes(searchTerm.toLowerCase()) || screen.screenCode.toLowerCase().includes(searchTerm.toLowerCase()), ); // 단순화된 메뉴 옵션 생성 (모든 메뉴를 평면적으로 표시) const getMenuOptions = (menuList: MenuItem[]): JSX.Element[] => { // console.log("메뉴 옵션 생성:", { // total: menuList.length, // sample: menuList.slice(0, 3).map((m) => ({ // objid: m.objid || m.OBJID || (m as any).objid, // name: m.menu_name_kor || m.MENU_NAME_KOR || (m as any).menu_name_kor, // parent: m.parent_obj_id || m.PARENT_OBJ_ID || (m as any).parent_obj_id, // })), // }); if (!menuList || menuList.length === 0) { return [ 메뉴가 없습니다 , ]; } return menuList.map((menu, index) => { // 현재 메뉴의 ID와 이름 추출 (다양한 형식 대응) const menuObjid = menu.objid || menu.OBJID || (menu as any).objid; const menuName = menu.menu_name_kor || menu.MENU_NAME_KOR || (menu as any).menu_name_kor; const lev = menu.lev || menu.LEV || (menu as any).lev || 0; // 들여쓰기 (레벨에 따라) const indent = " ".repeat(Math.max(0, lev)); // console.log("메뉴 항목:", { index, menuObjid, menuName, lev }); return ( {indent} {menuName || `메뉴 ${index + 1}`} ); }); }; return (
{/* 메뉴 선택 */} 화면 할당 관리
{selectedMenu && (

{selectedMenu.menu_name_kor || selectedMenu.MENU_NAME_KOR || (selectedMenu as any).menu_name_kor || "메뉴"}

URL: {selectedMenu.menu_url || selectedMenu.MENU_URL || (selectedMenu as any).menu_url || "없음"}

설명:{" "} {selectedMenu.menu_desc || selectedMenu.MENU_DESC || (selectedMenu as any).menu_desc || "없음"}

{(selectedMenu.status || selectedMenu.STATUS || (selectedMenu as any).status) === "active" ? "활성" : "비활성"}
)}
{/* 할당된 화면 목록 */} {selectedMenu && (
할당된 화면 ({assignedScreens.length}개)
{loading ? (
로딩 중...
) : assignedScreens.length === 0 ? (
할당된 화면이 없습니다. 화면을 할당해보세요.
) : (
{assignedScreens.map((screen) => (

{screen.screenName}

{screen.screenCode} {screen.isActive === "Y" ? "활성" : "비활성"}

테이블: {screen.tableName} | 생성일: {screen.createdDate.toLocaleDateString()}

{screen.description &&

{screen.description}

}
))}
)}
)} {/* 화면 할당 대화상자 */} 화면 할당 {selectedMenu?.menu_name_kor}에 할당할 화면을 선택하세요.
{/* 검색 */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* 화면 목록 */}
{filteredAvailableScreens.length === 0 ? (
할당 가능한 화면이 없습니다.
) : ( filteredAvailableScreens.map((screen) => (
setSelectedScreen(screen)} >

{screen.screenName}

{screen.screenCode}

테이블: {screen.tableName}

)) )}
setSelectedScreen(null)}>취소 할당
{/* 화면 할당 해제 대화상자 */} 화면 할당 해제 "{selectedScreen?.screenName}" 화면의 메뉴 할당을 해제하시겠습니까? setSelectedScreen(null)}>취소 할당 해제
); };