/** * 분할 패널 컴포넌트 * 좌측과 우측에 화면을 임베드합니다. * * 데이터 전달은 좌측 화면에 배치된 버튼의 transferData 액션으로 처리됩니다. * 예: 좌측 화면에 TableListComponent + Button(transferData 액션) 배치 */ "use client"; import React, { useState, useCallback, useMemo } from "react"; import { EmbeddedScreen } from "./EmbeddedScreen"; import { Columns2 } from "lucide-react"; import { SplitPanelProvider } from "@/contexts/SplitPanelContext"; interface ScreenSplitPanelProps { screenId?: number; config?: any; // 설정 패널에서 오는 config (leftScreenId, rightScreenId, splitRatio, resizable) initialFormData?: Record; // 🆕 수정 모드에서 전달되는 초기 데이터 groupedData?: Record[]; // 🆕 그룹 데이터 (수정 모드에서 원본 데이터 추적용) } /** * 분할 패널 컴포넌트 * 순수하게 화면 분할 기능만 제공합니다. */ export function ScreenSplitPanel({ screenId, config, initialFormData, groupedData }: ScreenSplitPanelProps) { // config에서 splitRatio 추출 (기본값 50) const configSplitRatio = config?.splitRatio ?? 50; // 드래그로 조절 가능한 splitRatio 상태 const [splitRatio, setSplitRatio] = useState(configSplitRatio); // config.splitRatio가 변경되면 동기화 (설정 패널에서 변경 시) React.useEffect(() => { setSplitRatio(configSplitRatio); }, [configSplitRatio]); // 설정 패널에서 오는 간단한 config를 임베딩 설정으로 변환 const leftEmbedding = config?.leftScreenId ? { id: 1, parentScreenId: screenId || 0, childScreenId: config.leftScreenId, position: "left" as const, mode: "view" as const, // 기본 view 모드 (select는 테이블 자체 설정) config: {}, companyCode: "*", createdAt: new Date(), updatedAt: new Date(), } : null; const rightEmbedding = config?.rightScreenId ? { id: 2, parentScreenId: screenId || 0, childScreenId: config.rightScreenId, position: "right" as const, mode: "view" as const, // 기본 view 모드 config: {}, companyCode: "*", createdAt: new Date(), updatedAt: new Date(), } : null; /** * 리사이저 드래그 핸들러 */ const handleResize = useCallback((newRatio: number) => { setSplitRatio(Math.max(20, Math.min(80, newRatio))); }, []); // config가 없는 경우 (디자이너 모드 또는 초기 상태) if (!config) { return (

화면 분할 패널

좌우로 화면을 나눕니다

우측 속성 패널 → 상세 설정에서 좌측/우측 화면을 선택하세요

💡 데이터 전달: 좌측 화면에 버튼 배치 후 transferData 액션 설정

); } // 좌측 또는 우측 화면이 설정되지 않은 경우 안내 메시지 표시 const hasLeftScreen = !!leftEmbedding; const hasRightScreen = !!rightEmbedding; // 분할 패널 고유 ID 생성 const splitPanelId = useMemo(() => `split-panel-${screenId || "unknown"}-${Date.now()}`, [screenId]); return (
{/* 좌측 패널 */}
{hasLeftScreen ? ( ) : (

좌측 화면을 선택하세요

)}
{/* 리사이저 */} {config?.resizable !== false && (
{ e.preventDefault(); const startX = e.clientX; const startRatio = splitRatio; const containerWidth = e.currentTarget.parentElement!.offsetWidth; const handleMouseMove = (moveEvent: MouseEvent) => { const deltaX = moveEvent.clientX - startX; const deltaRatio = (deltaX / containerWidth) * 100; handleResize(startRatio + deltaRatio); }; const handleMouseUp = () => { document.removeEventListener("mousemove", handleMouseMove); document.removeEventListener("mouseup", handleMouseUp); }; document.addEventListener("mousemove", handleMouseMove); document.addEventListener("mouseup", handleMouseUp); }} >
)} {/* 우측 패널 */}
{hasRightScreen ? ( ) : (

우측 화면을 선택하세요

)}
); }