import { __ } from '@wordpress/i18n'; import { useState, useEffect, useRef } from 'react'; export default function ControlPanel({ onAddNode, onSaveFlow }) { const imgPath = window.WAIC_DATA.imgPath; const waicWorkflow = window.WAIC_WORKFLOW || {}; const initialTitle = waicWorkflow.title?.trim() || ''; const globalSettings = waicWorkflow.global || {}; const taskId = parseInt(waicWorkflow.task_id) || 0; const [title, setTitle] = useState((initialTitle.length > 0 ? initialTitle : waicWorkflow.lang?.title_plh) || ''); const [showDialog, setShowDialog] = useState(false); const [tempTitle, setTempTitle] = useState(''); const [showLog, setShowLog] = useState(false); const [logDate, setLogDate] = useState(''); const [showSettings, setShowSettings] = useState(false); const [tempSettings, setTempSettings] = useState({}); const [taskStatus, setTaskStatus] = useState(waicWorkflow.status || 0); const dialogLogRef = useRef(null); useEffect(() => { if (!showLog) return; const dialog = dialogLogRef.current; if (!dialog) return; let isDragging = false; let offsetX = 0; let offsetY = 0; const header = dialog.querySelector('.waic-dialog-header'); const onMouseDown = (e) => { isDragging = true; offsetX = e.clientX - dialog.offsetLeft; offsetY = e.clientY - dialog.offsetTop; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); }; const onMouseMove = (e) => { if (!isDragging) return; dialog.style.left = e.clientX - offsetX + 'px'; dialog.style.top = e.clientY - offsetY + 'px'; }; const onMouseUp = () => { isDragging = false; document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); }; header.addEventListener('mousedown', onMouseDown); return () => { header.removeEventListener('mousedown', onMouseDown); }; }, [showLog]); const onChangeTitle = () => { setTempTitle(waicWorkflow.title || ''); setShowDialog(true); }; const onConfirmTitle = () => { const t = tempTitle.trim() || ''; setTitle(t); window.WAIC_WORKFLOW.title = t; waicWorkflow.isDirty = true; setShowDialog(false); }; const onCancelTitle = () => { setShowDialog(false); }; const onChangeSettings = () => { setTempSettings(waicWorkflow.flow?.settings || {}); setShowSettings(true); }; const onCancelSettings = () => { setShowSettings(false); }; const onConfirmSettings = () => { window.WAIC_WORKFLOW.flow.settings = tempSettings || {}; waicWorkflow.isDirty = true; setShowSettings(false); }; const onShowLog = () => { setShowLog(true); }; const onCloseLog = () => { setShowLog(false); }; useEffect(() => { if (showLog) { getLogData(''); } }, [showLog]); const getLogData = (date) => { setLogDate(date); const logBlock = document.querySelector('.waic-log-block'); const loader = document.querySelector('.waic-log-loader'); if (!logBlock || !loader) return; logBlock.classList.add('wbw-hidden'); loader.classList.remove('wbw-hidden'); jQuery.sendFormWaic({ data: { task_id: taskId, mod: 'workflow', action: 'getLogData', date: date, pl: 'waic', reqType: 'ajax', waicNonce: window.WAIC_DATA.waicNonce, }, onSuccess: function(res) { if (!res.error && res.html) { logBlock.innerHTML = res.html || ''; } else { logBlock.innerHTML = '
Error loading logs
'; } logBlock.classList.remove('wbw-hidden'); loader.classList.add('wbw-hidden'); } }); }; const onRunFlow = () => { jQuery.sendFormWaic({ elem: jQuery('.waic-control-run'), data: { task_id: taskId, mod: 'workflow', action: waicWorkflow.status == 4 ? 'stopWorkflow' : 'runWorkflow', pl: 'waic', reqType: 'ajax', waicNonce: window.WAIC_DATA.waicNonce, }, onSuccess: function(res) { if (!res.error && res.data && res.data.status) { window.WAIC_WORKFLOW.status = res.data.status; setTaskStatus(res.data.status); } } }); }; const handleSettingChange = (key, value) => { setTempSettings((prev) => ({ ...prev, [key]: value, })); }; const renderLabel = (setting, key) => { if (setting.label !== '') { return (
{setting.label}
); } return null; }; const renderSettingField = (key, setting) => { const value = tempSettings?.[key]; switch (setting.type) { case 'input': return ( <> {renderLabel(setting, key)}
handleSettingChange(key, e.target.value)} />
); case 'select': return ( <> {renderLabel(setting, key)}
); case 'number': return ( <> {renderLabel(setting, key)}
handleSettingChange(key, e.target.value)} />
); default: return null; } }; const shouldShowSetting = (setting, allValues) => { if (!setting.show) return true; return Object.entries(setting.show).every(([depKey, allowedValues]) => allowedValues.includes(allValues?.[depKey]) ); }; const getSettingsValues = (settingsConfig, settings) => { const result = {}; Object.entries(settingsConfig).forEach(([key, setting]) => { result[key] = settings?.[key] ?? setting.default ?? ''; }); return result; }; return (
{title}
{showDialog && (
{window.WAIC_WORKFLOW?.lang?.title_dialog || ''}
Close
setTempTitle(e.target.value)} className="waic-dialog-input" />
)} {showSettings && (
{window.WAIC_WORKFLOW?.lang?.settings_dialog || ''}
Close
{Object.entries(globalSettings || {}).map(([key, setting]) => { if (setting.inner) return null; const currentValues = getSettingsValues(globalSettings, tempSettings); if (!shouldShowSetting(setting, currentValues)) return null; const addFields = setting.add?.map((addKey) => { const addSetting = globalSettings?.[addKey]; if (!addSetting) return null; if (!shouldShowSetting(addSetting, currentValues)) return null; return ( <> {renderSettingField(addKey, addSetting)} ); }); return (
{renderSettingField(key, setting)} {addFields}
); })}
)} {showLog && (
{window.WAIC_WORKFLOW?.lang?.log_dialog || ''}
Close
{window.WAIC_WORKFLOW?.lang?.date_label || ''}
getLogData(e.target.value)} />
)}
); }