"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 type { RelatedDataButtonsConfig } from "./types"; 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([]); // 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]); // 설정 업데이트 헬퍼 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 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} ))}
updateEvents({ targetFilterColumn: e.target.value })} placeholder="예: routing_version_id" />
{/* 추가 버튼 설정 */}
updateAddButton({ show: checked })} />
{config.addButton?.show && (
updateAddButton({ label: e.target.value })} placeholder="+ 버전 추가" />
updateAddButton({ modalScreenId: parseInt(e.target.value) || undefined })} placeholder="화면 ID" />
)}
{/* 기타 설정 */}
updateConfig({ autoSelectFirst: checked })} />
updateConfig({ emptyMessage: e.target.value })} placeholder="데이터가 없습니다" />
); }; export default RelatedDataButtonsConfigPanel;