"use client"; import { useState, useEffect } from "react"; import { cn } from "@/lib/utils"; import { ChevronRight, ChevronDown, Monitor, FolderOpen, Folder } from "lucide-react"; import { ScreenDefinition } from "@/types/screen"; import { ScreenGroup, getScreenGroups } from "@/lib/api/screenGroup"; import { Badge } from "@/components/ui/badge"; interface ScreenGroupTreeViewProps { screens: ScreenDefinition[]; selectedScreen: ScreenDefinition | null; onScreenSelect: (screen: ScreenDefinition) => void; onScreenDesign: (screen: ScreenDefinition) => void; companyCode?: string; } interface TreeNode { type: "group" | "screen"; id: string; name: string; data?: ScreenDefinition | ScreenGroup; children?: TreeNode[]; expanded?: boolean; } export function ScreenGroupTreeView({ screens, selectedScreen, onScreenSelect, onScreenDesign, companyCode, }: ScreenGroupTreeViewProps) { const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(true); const [expandedGroups, setExpandedGroups] = useState>(new Set()); const [groupScreensMap, setGroupScreensMap] = useState>(new Map()); // 그룹 목록 로드 useEffect(() => { const loadGroups = async () => { try { setLoading(true); const response = await getScreenGroups({}); if (response.success && response.data) { setGroups(response.data); } } catch (error) { console.error("그룹 목록 로드 실패:", error); } finally { setLoading(false); } }; loadGroups(); }, [companyCode]); // 그룹에 속한 화면 ID들을 가져오기 const getGroupedScreenIds = (): Set => { const ids = new Set(); groupScreensMap.forEach((screenIds) => { screenIds.forEach((id) => ids.add(id)); }); return ids; }; // 미분류 화면들 (어떤 그룹에도 속하지 않은 화면) const getUngroupedScreens = (): ScreenDefinition[] => { const groupedIds = getGroupedScreenIds(); return screens.filter((screen) => !groupedIds.has(screen.screenId)); }; // 그룹에 속한 화면들 const getScreensInGroup = (groupId: number): ScreenDefinition[] => { const screenIds = groupScreensMap.get(groupId) || []; return screens.filter((screen) => screenIds.includes(screen.screenId)); }; const toggleGroup = (groupId: string) => { const newExpanded = new Set(expandedGroups); if (newExpanded.has(groupId)) { newExpanded.delete(groupId); } else { newExpanded.add(groupId); } setExpandedGroups(newExpanded); }; const handleScreenClick = (screen: ScreenDefinition) => { onScreenSelect(screen); }; const handleScreenDoubleClick = (screen: ScreenDefinition) => { onScreenDesign(screen); }; if (loading) { return (
로딩 중...
); } const ungroupedScreens = getUngroupedScreens(); return (
{/* 그룹화된 화면들 */} {groups.map((group) => { const groupId = String(group.id); const isExpanded = expandedGroups.has(groupId); const groupScreens = getScreensInGroup(group.id); return (
{/* 그룹 헤더 */}
toggleGroup(groupId)} > {isExpanded ? ( ) : ( )} {isExpanded ? ( ) : ( )} {group.groupName} {groupScreens.length}
{/* 그룹 내 화면들 */} {isExpanded && (
{groupScreens.length === 0 ? (
화면이 없습니다
) : ( groupScreens.map((screen) => (
handleScreenClick(screen)} onDoubleClick={() => handleScreenDoubleClick(screen)} > {screen.screenName} {screen.screenCode}
)) )}
)}
); })} {/* 미분류 화면들 */} {ungroupedScreens.length > 0 && (
toggleGroup("ungrouped")} > {expandedGroups.has("ungrouped") ? ( ) : ( )} 미분류 {ungroupedScreens.length}
{expandedGroups.has("ungrouped") && (
{ungroupedScreens.map((screen) => (
handleScreenClick(screen)} onDoubleClick={() => handleScreenDoubleClick(screen)} > {screen.screenName} {screen.screenCode}
))}
)}
)} {groups.length === 0 && ungroupedScreens.length === 0 && (

등록된 화면이 없습니다

)}
); }