"use client"; import React, { useState, useEffect } from "react"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { Separator } from "@/components/ui/separator"; import { Settings, Clock, Info, Workflow } from "lucide-react"; import { ComponentData } from "@/types/screen"; import { getNodeFlows, NodeFlow } from "@/lib/api/nodeFlows"; interface ImprovedButtonControlConfigPanelProps { component: ComponentData; onUpdateProperty: (path: string, value: any) => void; } /** * πŸ”₯ λ‹¨μˆœν™”λœ λ²„νŠΌ μ œμ–΄ μ„€μ • νŒ¨λ„ * * λ…Έλ“œ ν”Œλ‘œμš° μ‹€ν–‰λ§Œ 지원: * - ν”Œλ‘œμš° 선택 및 μ‹€ν–‰ 타이밍 μ„€μ • */ export const ImprovedButtonControlConfigPanel: React.FC = ({ component, onUpdateProperty, }) => { const config = component.webTypeConfig || {}; const dataflowConfig = config.dataflowConfig || {}; // πŸ”₯ State 관리 const [flows, setFlows] = useState([]); const [loading, setLoading] = useState(false); // πŸ”₯ ν”Œλ‘œμš° λͺ©λ‘ λ‘œλ”© useEffect(() => { if (config.enableDataflowControl) { loadFlows(); } }, [config.enableDataflowControl]); /** * πŸ”₯ ν”Œλ‘œμš° λͺ©λ‘ λ‘œλ“œ */ const loadFlows = async () => { try { setLoading(true); console.log("πŸ” ν”Œλ‘œμš° λͺ©λ‘ λ‘œλ”©..."); const flowList = await getNodeFlows(); setFlows(flowList); console.log(`βœ… ν”Œλ‘œμš° ${flowList.length}개 λ‘œλ”© μ™„λ£Œ`); } catch (error) { console.error("❌ ν”Œλ‘œμš° λͺ©λ‘ λ‘œλ”© μ‹€νŒ¨:", error); setFlows([]); } finally { setLoading(false); } }; /** * πŸ”₯ ν”Œλ‘œμš° 선택 ν•Έλ“€λŸ¬ */ const handleFlowSelect = (flowId: string) => { const selectedFlow = flows.find((f) => f.flowId.toString() === flowId); if (selectedFlow) { // 전체 dataflowConfig μ—…λ°μ΄νŠΈ (selectedDiagramId 포함) onUpdateProperty("webTypeConfig.dataflowConfig", { ...dataflowConfig, selectedDiagramId: selectedFlow.flowId, // λ°±μ—”λ“œμ—μ„œ μ‚¬μš© selectedRelationshipId: null, // λ…Έλ“œ ν”Œλ‘œμš°λŠ” 관계 ID λΆˆν•„μš” flowConfig: { flowId: selectedFlow.flowId, flowName: selectedFlow.flowName, executionTiming: "before", // κΈ°λ³Έκ°’ contextData: {}, }, }); } }; return (
{/* πŸ”₯ μ œμ–΄κ΄€λ¦¬ ν™œμ„±ν™” μŠ€μœ„μΉ˜ */}

λ²„νŠΌ 클릭 μ‹œ μΆ”κ°€ μž‘μ—…μ„ μžλ™μœΌλ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€

onUpdateProperty("webTypeConfig.enableDataflowControl", checked)} />
{/* πŸ”₯ μ œμ–΄κ΄€λ¦¬κ°€ ν™œμ„±ν™”λœ κ²½μš°μ—λ§Œ μ„€μ • ν‘œμ‹œ */} {config.enableDataflowControl && (
{dataflowConfig.flowConfig && (
onUpdateProperty("webTypeConfig.dataflowConfig.flowConfig.executionTiming", timing) } />

λ…Έλ“œ ν”Œλ‘œμš° μ‹€ν–‰ 정보:

μ„ νƒν•œ ν”Œλ‘œμš°μ˜ λͺ¨λ“  λ…Έλ“œκ°€ 순차적/λ³‘λ ¬λ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

β€’ 독립 νŠΈλžœμž­μ…˜: 각 μ•‘μ…˜μ€ λ…λ¦½μ μœΌλ‘œ 컀밋/λ‘€λ°±

β€’ 연쇄 쀑단: λΆ€λͺ¨ λ…Έλ“œ μ‹€νŒ¨ μ‹œ μžμ‹ λ…Έλ“œ μŠ€ν‚΅

)}
)}
); }; /** * πŸ”₯ ν”Œλ‘œμš° 선택 μ»΄ν¬λ„ŒνŠΈ */ const FlowSelector: React.FC<{ flows: NodeFlow[]; selectedFlowId?: number; onSelect: (flowId: string) => void; loading: boolean; }> = ({ flows, selectedFlowId, onSelect, loading }) => { return (
); }; /** * πŸ”₯ μ‹€ν–‰ 타이밍 선택 μ»΄ν¬λ„ŒνŠΈ */ const ExecutionTimingSelector: React.FC<{ value: string; onChange: (timing: "before" | "after" | "replace") => void; }> = ({ value, onChange }) => { return (
); };