"use client"; import React, { useState, useEffect, useCallback, useMemo } from "react"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; import { Check, ChevronsUpDown } from "lucide-react"; import { cn } from "@/lib/utils"; import { tableManagementApi, getTableColumns } from "@/lib/api/tableManagement"; import { screenApi } from "@/lib/api/screen"; import type { RelatedDataButtonsConfig } from "./types"; // 화면 정보 타입 interface ScreenInfo { screenId: number; screenName: string; tableName?: string; } // 화면 선택 컴포넌트 interface ScreenSelectorProps { value?: number; onChange: (screenId: number | undefined, tableName?: string) => void; placeholder?: string; } const ScreenSelector: React.FC = ({ value, onChange, placeholder = "화면 선택" }) => { const [open, setOpen] = useState(false); const [screens, setScreens] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { const loadScreens = async () => { setLoading(true); try { const response = await screenApi.getScreens({ size: 500 }); if (response.data) { setScreens(response.data.map((s: any) => ({ screenId: s.screenId, screenName: s.screenName || s.name || `화면 ${s.screenId}`, tableName: s.tableName || s.table_name, }))); } } catch (error) { console.error("화면 목록 로드 실패:", error); } finally { setLoading(false); } }; loadScreens(); }, []); const selectedScreen = screens.find(s => s.screenId === value); return ( 화면을 찾을 수 없습니다. {screens.map((screen) => ( { onChange(screen.screenId, screen.tableName); setOpen(false); }} className="text-xs" > {screen.screenName} ({screen.screenId}) ))} ); }; interface TableInfo { tableName: string; displayName?: string; } interface ColumnInfo { columnName: string; columnLabel?: string; } interface RelatedDataButtonsConfigPanelProps { config: RelatedDataButtonsConfig; onChange: (config: RelatedDataButtonsConfig) => void; tables?: TableInfo[]; } export const RelatedDataButtonsConfigPanel: React.FC = ({ config, onChange, tables: propTables = [], }) => { const [allTables, setAllTables] = useState([]); const [sourceTableColumns, setSourceTableColumns] = useState([]); const [buttonTableColumns, setButtonTableColumns] = useState([]); const [targetModalTableColumns, setTargetModalTableColumns] = useState([]); // 대상 모달 테이블 컬럼 const [targetModalTableName, setTargetModalTableName] = useState(""); // 대상 모달 테이블명 const [eventTargetTableColumns, setEventTargetTableColumns] = useState([]); // 하위 테이블 연동 대상 테이블 컬럼 // Popover 상태 const [sourceTableOpen, setSourceTableOpen] = useState(false); const [buttonTableOpen, setButtonTableOpen] = useState(false); // 전체 테이블 로드 useEffect(() => { const loadTables = async () => { try { const response = await tableManagementApi.getTableList(); if (response.success && response.data) { setAllTables(response.data.map((t: any) => ({ tableName: t.tableName || t.table_name, displayName: t.tableLabel || t.table_label || t.displayName, }))); } } catch (error) { console.error("테이블 목록 로드 실패:", error); } }; loadTables(); }, []); // 소스 테이블 컬럼 로드 useEffect(() => { const loadColumns = async () => { if (!config.sourceMapping?.sourceTable) { setSourceTableColumns([]); return; } try { const response = await getTableColumns(config.sourceMapping.sourceTable); if (response.success && response.data?.columns) { setSourceTableColumns(response.data.columns.map((c: any) => ({ columnName: c.columnName || c.column_name, columnLabel: c.columnLabel || c.column_label || c.displayName, }))); } } catch (error) { console.error("소스 테이블 컬럼 로드 실패:", error); } }; loadColumns(); }, [config.sourceMapping?.sourceTable]); // 버튼 테이블 컬럼 로드 useEffect(() => { const loadColumns = async () => { if (!config.buttonDataSource?.tableName) { setButtonTableColumns([]); return; } try { const response = await getTableColumns(config.buttonDataSource.tableName); if (response.success && response.data?.columns) { setButtonTableColumns(response.data.columns.map((c: any) => ({ columnName: c.columnName || c.column_name, columnLabel: c.columnLabel || c.column_label || c.displayName, }))); } } catch (error) { console.error("버튼 테이블 컬럼 로드 실패:", error); } }; loadColumns(); }, [config.buttonDataSource?.tableName]); // 대상 모달 화면의 테이블명 로드 (초기 로드 및 screenId 변경 시) useEffect(() => { const loadTargetScreenTable = async () => { if (!config.modalLink?.targetScreenId) { setTargetModalTableName(""); return; } try { const screenInfo = await screenApi.getScreen(config.modalLink.targetScreenId); if (screenInfo?.tableName) { setTargetModalTableName(screenInfo.tableName); } } catch (error) { console.error("대상 모달 화면 정보 로드 실패:", error); } }; loadTargetScreenTable(); }, [config.modalLink?.targetScreenId]); // 대상 모달 테이블 컬럼 로드 useEffect(() => { const loadColumns = async () => { if (!targetModalTableName) { setTargetModalTableColumns([]); return; } try { const response = await getTableColumns(targetModalTableName); if (response.success && response.data?.columns) { setTargetModalTableColumns(response.data.columns.map((c: any) => ({ columnName: c.columnName || c.column_name, columnLabel: c.columnLabel || c.column_label || c.displayName, }))); } } catch (error) { console.error("대상 모달 테이블 컬럼 로드 실패:", error); } }; loadColumns(); }, [targetModalTableName]); // 하위 테이블 연동 대상 테이블 컬럼 로드 useEffect(() => { const loadColumns = async () => { if (!config.events?.targetTable) { setEventTargetTableColumns([]); return; } try { const response = await getTableColumns(config.events.targetTable); if (response.success && response.data?.columns) { setEventTargetTableColumns(response.data.columns.map((c: any) => ({ columnName: c.columnName || c.column_name, columnLabel: c.columnLabel || c.column_label || c.displayName, }))); } } catch (error) { console.error("하위 테이블 연동 대상 테이블 컬럼 로드 실패:", error); } }; loadColumns(); }, [config.events?.targetTable]); // 설정 업데이트 헬퍼 const updateConfig = useCallback((updates: Partial) => { onChange({ ...config, ...updates }); }, [config, onChange]); const updateSourceMapping = useCallback((updates: Partial) => { onChange({ ...config, sourceMapping: { ...config.sourceMapping, ...updates }, }); }, [config, onChange]); const updateHeaderDisplay = useCallback((updates: Partial>) => { onChange({ ...config, headerDisplay: { ...config.headerDisplay, ...updates } as any, }); }, [config, onChange]); const updateButtonDataSource = useCallback((updates: Partial) => { onChange({ ...config, buttonDataSource: { ...config.buttonDataSource, ...updates }, }); }, [config, onChange]); const updateButtonStyle = useCallback((updates: Partial>) => { onChange({ ...config, buttonStyle: { ...config.buttonStyle, ...updates }, }); }, [config, onChange]); const updateAddButton = useCallback((updates: Partial>) => { onChange({ ...config, addButton: { ...config.addButton, ...updates }, }); }, [config, onChange]); const updateEvents = useCallback((updates: Partial>) => { onChange({ ...config, events: { ...config.events, ...updates }, }); }, [config, onChange]); const updateModalLink = useCallback((updates: Partial>) => { onChange({ ...config, modalLink: { ...config.modalLink, ...updates }, }); }, [config, onChange]); const tables = allTables.length > 0 ? allTables : propTables; return (
{/* 소스 매핑 (좌측 패널 연결) */}
테이블을 찾을 수 없습니다. {tables.map((table) => ( { updateSourceMapping({ sourceTable: table.tableName }); setSourceTableOpen(false); }} > {table.displayName || table.tableName} {table.displayName && ({table.tableName})} ))}
{/* 헤더 표시 설정 */}
updateHeaderDisplay({ show: checked })} />
{config.headerDisplay?.show !== false && (
)}
{/* 버튼 데이터 소스 */}
테이블을 찾을 수 없습니다. {tables.map((table) => ( { updateButtonDataSource({ tableName: table.tableName }); setButtonTableOpen(false); }} > {table.displayName || table.tableName} {table.displayName && ({table.tableName})} ))}
{/* 버튼 스타일 */}
{/* 기본 표시 설정 */}
{config.buttonStyle?.defaultIndicator?.column && (
updateButtonStyle({ defaultIndicator: { ...config.buttonStyle?.defaultIndicator, column: config.buttonStyle?.defaultIndicator?.column || "", showStar: checked, }, })} />
)}
{/* 이벤트 설정 (하위 테이블 연동) */}
테이블을 찾을 수 없습니다. {tables.map((table) => ( { updateEvents({ targetTable: table.tableName }); }} > {table.displayName || table.tableName} ))}
{eventTargetTableColumns.length === 0 && config.events?.targetTable && (

컬럼을 불러오는 중...

)} {!config.events?.targetTable && (

먼저 대상 테이블을 선택하세요

)}
{/* 추가 버튼 설정 */}
updateAddButton({ show: checked })} />
{config.addButton?.show && (
updateAddButton({ label: e.target.value })} placeholder="+ 버전 추가" />
updateAddButton({ modalScreenId: screenId })} placeholder="화면 선택" />
)}
{/* 모달 연동 설정 (선택된 버튼 데이터를 모달로 전달) */}
updateModalLink({ enabled: checked })} />
{config.modalLink?.enabled && (
{config.modalLink?.triggerType === "button" && ( <>
updateModalLink({ buttonLabel: e.target.value })} placeholder="공정 추가" />
)}
{ updateModalLink({ targetScreenId: screenId }); if (tableName) { setTargetModalTableName(tableName); } }} placeholder="화면 선택" /> {targetModalTableName && (

테이블: {targetModalTableName}

)}

선택된 버튼 데이터를 모달 초기값으로 전달합니다.

{targetModalTableColumns.length === 0 && targetModalTableName && (

컬럼을 불러오는 중...

)} {!targetModalTableName && (

먼저 대상 모달 화면을 선택하세요

)}
)}
{/* 기타 설정 */}
updateConfig({ autoSelectFirst: checked })} />
updateConfig({ emptyMessage: e.target.value })} placeholder="데이터가 없습니다" />
); }; export default RelatedDataButtonsConfigPanel;