"use client"; import React, { useState, useEffect } from "react"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { Settings, Layout, ArrowRight, Database, Loader2, Check, ChevronsUpDown } from "lucide-react"; import { screenApi } from "@/lib/api/screen"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; interface ScreenSplitPanelConfigPanelProps { config: any; onChange: (newConfig: any) => void; } export function ScreenSplitPanelConfigPanel({ config = {}, onChange }: ScreenSplitPanelConfigPanelProps) { // 화면 목록 상태 const [screens, setScreens] = useState([]); const [isLoadingScreens, setIsLoadingScreens] = useState(true); // Combobox 상태 const [leftOpen, setLeftOpen] = useState(false); const [rightOpen, setRightOpen] = useState(false); const [localConfig, setLocalConfig] = useState({ screenId: config.screenId || 0, leftScreenId: config.leftScreenId || 0, rightScreenId: config.rightScreenId || 0, splitRatio: config.splitRatio || 50, resizable: config.resizable ?? true, buttonLabel: config.buttonLabel || "데이터 전달", buttonPosition: config.buttonPosition || "center", ...config, }); // 화면 목록 로드 useEffect(() => { const loadScreens = async () => { try { setIsLoadingScreens(true); const response = await screenApi.getScreens({ page: 1, size: 1000 }); if (response.data) { setScreens(response.data); } } catch (error) { console.error("화면 목록 로드 실패:", error); } finally { setIsLoadingScreens(false); } }; loadScreens(); }, []); const updateConfig = (key: string, value: any) => { const newConfig = { ...localConfig, [key]: value, }; setLocalConfig(newConfig); // 변경 즉시 부모에게 전달 if (onChange) { onChange(newConfig); } }; return (
레이아웃 화면 설정 {/* 레이아웃 탭 */} 분할 비율 좌측과 우측 패널의 너비 비율을 설정합니다
{localConfig.splitRatio}%
updateConfig("splitRatio", parseInt(e.target.value))} className="h-2" />
20% 50% 80%

사용자가 패널 크기를 조절할 수 있습니다

updateConfig("resizable", checked)} />
{/* 화면 설정 탭 */} 임베드할 화면 선택 좌측과 우측에 표시할 화면을 선택합니다 {isLoadingScreens ? (
화면 목록 로딩 중...
) : ( <>
화면을 찾을 수 없습니다. {screens.map((screen) => ( { updateConfig("leftScreenId", screen.screenId); setLeftOpen(false); }} className="text-xs" >
{screen.screenName} {screen.screenCode}
))}

데이터를 선택할 소스 화면

화면을 찾을 수 없습니다. {screens.map((screen) => ( { updateConfig("rightScreenId", screen.screenId); setRightOpen(false); }} className="text-xs" >
{screen.screenName} {screen.screenCode}
))}

데이터를 받을 타겟 화면

💡 데이터 전달 방법: 좌측 화면에 테이블과 버튼을 배치하고, 버튼의 액션을 "transferData"로 설정하세요.
버튼 설정에서 소스 컴포넌트(테이블), 타겟 화면, 필드 매핑을 지정할 수 있습니다.

)}
{/* 설정 요약 */} 현재 설정
좌측 화면: {localConfig.leftScreenId ? screens.find((s) => s.screenId === localConfig.leftScreenId)?.screenName || `ID: ${localConfig.leftScreenId}` : "미설정"}
우측 화면: {localConfig.rightScreenId ? screens.find((s) => s.screenId === localConfig.rightScreenId)?.screenName || `ID: ${localConfig.rightScreenId}` : "미설정"}
분할 비율: {localConfig.splitRatio}% / {100 - localConfig.splitRatio}%
크기 조절: {localConfig.resizable ? "가능" : "불가능"}
); }