"use client"; /** * UnifiedBiz 설정 패널 * 통합 비즈니스 컴포넌트의 세부 설정을 관리합니다. */ import React, { useState, useEffect } from "react"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Separator } from "@/components/ui/separator"; import { Checkbox } from "@/components/ui/checkbox"; import { tableTypeApi } from "@/lib/api/screen"; interface UnifiedBizConfigPanelProps { config: Record; onChange: (config: Record) => void; } interface TableOption { tableName: string; displayName: string; } interface ColumnOption { columnName: string; displayName: string; } export const UnifiedBizConfigPanel: React.FC = ({ config, onChange, }) => { // 테이블 목록 const [tables, setTables] = useState([]); const [loadingTables, setLoadingTables] = useState(false); // 컬럼 목록 (소스/대상/관련 테이블용) const [sourceColumns, setSourceColumns] = useState([]); const [targetColumns, setTargetColumns] = useState([]); const [relatedColumns, setRelatedColumns] = useState([]); const [categoryColumns, setCategoryColumns] = useState([]); const [loadingColumns, setLoadingColumns] = useState(false); // 설정 업데이트 핸들러 const updateConfig = (field: string, value: any) => { onChange({ ...config, [field]: value }); }; // 테이블 목록 로드 useEffect(() => { const loadTables = async () => { setLoadingTables(true); try { const data = await tableTypeApi.getTables(); setTables(data.map(t => ({ tableName: t.tableName, displayName: t.displayName || t.tableName }))); } catch (error) { console.error("테이블 목록 로드 실패:", error); } finally { setLoadingTables(false); } }; loadTables(); }, []); // 소스 테이블 선택 시 컬럼 목록 로드 useEffect(() => { const loadColumns = async () => { if (!config.sourceTable) { setSourceColumns([]); return; } try { const data = await tableTypeApi.getColumns(config.sourceTable); setSourceColumns(data.map((c: any) => ({ columnName: c.columnName || c.column_name, displayName: c.displayName || c.columnName || c.column_name }))); } catch (error) { console.error("소스 컬럼 로드 실패:", error); } }; loadColumns(); }, [config.sourceTable]); // 대상 테이블 선택 시 컬럼 목록 로드 useEffect(() => { const loadColumns = async () => { if (!config.targetTable) { setTargetColumns([]); return; } try { const data = await tableTypeApi.getColumns(config.targetTable); setTargetColumns(data.map((c: any) => ({ columnName: c.columnName || c.column_name, displayName: c.displayName || c.columnName || c.column_name }))); } catch (error) { console.error("대상 컬럼 로드 실패:", error); } }; loadColumns(); }, [config.targetTable]); // 관련 테이블 선택 시 컬럼 목록 로드 useEffect(() => { const loadColumns = async () => { if (!config.relatedTable) { setRelatedColumns([]); return; } try { const data = await tableTypeApi.getColumns(config.relatedTable); setRelatedColumns(data.map((c: any) => ({ columnName: c.columnName || c.column_name, displayName: c.displayName || c.columnName || c.column_name }))); } catch (error) { console.error("관련 컬럼 로드 실패:", error); } }; loadColumns(); }, [config.relatedTable]); // 카테고리 테이블 선택 시 컬럼 목록 로드 useEffect(() => { const loadColumns = async () => { if (!config.tableName) { setCategoryColumns([]); return; } setLoadingColumns(true); try { const data = await tableTypeApi.getColumns(config.tableName); setCategoryColumns(data.map((c: any) => ({ columnName: c.columnName || c.column_name, displayName: c.displayName || c.columnName || c.column_name }))); } catch (error) { console.error("카테고리 컬럼 로드 실패:", error); } finally { setLoadingColumns(false); } }; loadColumns(); }, [config.tableName]); return (
{/* 비즈니스 타입 */}
{/* 플로우 설정 */} {config.bizType === "flow" && (
updateConfig("flowId", e.target.value ? Number(e.target.value) : undefined)} placeholder="플로우 ID" className="h-8 text-xs" />
updateConfig("editable", checked)} />
updateConfig("showMinimap", checked)} />
)} {/* 랙 구조 설정 */} {config.bizType === "rack" && (
updateConfig("rows", e.target.value ? Number(e.target.value) : undefined)} placeholder="5" min="1" className="h-8 text-xs" />
updateConfig("columns", e.target.value ? Number(e.target.value) : undefined)} placeholder="10" min="1" className="h-8 text-xs" />
updateConfig("showLabels", checked)} />
)} {/* 채번 규칙 설정 */} {config.bizType === "numbering" && (
updateConfig("ruleId", e.target.value ? Number(e.target.value) : undefined)} placeholder="규칙 ID" className="h-8 text-xs" />
updateConfig("prefix", e.target.value)} placeholder="예: INV-" className="h-8 text-xs" />
updateConfig("autoGenerate", checked)} />
)} {/* 카테고리 설정 */} {config.bizType === "category" && (
{config.tableName && (
)}
)} {/* 데이터 매핑 설정 */} {config.bizType === "data-mapping" && (
)} {/* 관련 데이터 설정 */} {config.bizType === "related-data" && (
{config.relatedTable && (
)}
updateConfig("buttonText", e.target.value)} placeholder="관련 데이터 보기" className="h-8 text-xs" />
)}
); }; UnifiedBizConfigPanel.displayName = "UnifiedBizConfigPanel"; export default UnifiedBizConfigPanel;