@hrspd-gss/bole-clickwizard-designer 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/WorkflowEditor.d.ts +7 -0
- package/dist/bole-clickwizard-designer.css +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +6 -0
- package/dist/index.mjs +1221 -0
- package/dist/types.d.ts +91 -0
- package/package.json +38 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { Workflow, WorkflowEditorProps } from './types';
|
|
3
|
+
export interface WorkflowEditorRef {
|
|
4
|
+
getWorkflow: () => Workflow;
|
|
5
|
+
setWorkflow: (workflow: Workflow) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const WorkflowEditor: React.ForwardRefExoticComponent<WorkflowEditorProps & React.RefAttributes<WorkflowEditorRef>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.workflow-editor{border:1px solid #e0e0e0;border-radius:8px;background:#fdfdfd;font-family:sans-serif;display:flex;flex-direction:column;overflow:hidden}.workflow-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #e0e0e0;background:#fff}.workflow-btn-primary{background:#007bff;color:#fff;border:none;padding:8px 14px;border-radius:6px;cursor:pointer}.workflow-canvas{position:relative;width:100%;background-color:#f8f9fa;background-image:linear-gradient(rgba(0,0,0,.1) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.1) 1px,transparent 1px);background-size:20px 20px;overflow:auto}.workflow-canvas-content{position:absolute;top:0;left:0;min-width:100%;min-height:100%;pointer-events:none}.workflow-node{position:absolute;background:#fff;border:1px solid #adb5bd;border-radius:8px;box-shadow:0 2px 5px #0000001a;cursor:grab;width:200px;min-height:80px;font-size:14px;z-index:2}.workflow-node:active{cursor:grabbing;box-shadow:0 4px 10px #0003}.workflow-node-header{background-color:#e9ecef;border-bottom:1px solid #ced4da;padding:8px 12px;font-weight:700;border-top-left-radius:7px;border-top-right-radius:7px}.workflow-node-body{padding:8px 12px}.workflow-node-body p{margin:0}.workflow-node-type{font-size:12px;color:#666;margin-bottom:4px}.workflow-node-params{margin-top:4px;border-top:1px dashed #e0e0e0;padding-top:4px}.workflow-node-param{font-size:10px;color:#888;line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:180px}.workflow-node-param-more{color:#aaa;font-style:italic}.workflow-editor-container{display:flex;flex-direction:column;height:100vh;border:1px solid #ccc;border-radius:8px;overflow:hidden}.workflow-body{display:flex;flex:1;overflow:hidden}.workflow-canvas{flex:1}.properties-popup-overlay{position:fixed;inset:0;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.properties-popup{background:#fff;border-radius:8px;box-shadow:0 4px 20px #00000040;min-width:350px;max-width:500px;max-height:80vh;display:flex;flex-direction:column;overflow:hidden}.properties-popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #e0e0e0;background:#f8f9fa;cursor:move;-webkit-user-select:none;user-select:none;border-top-left-radius:8px;border-top-right-radius:8px}.properties-popup-header h4{margin:0;font-size:16px;color:#333;pointer-events:none}.properties-popup.dragging{opacity:.9;box-shadow:0 8px 30px #00000059}.properties-popup-close{background:none;border:none;font-size:24px;color:#666;cursor:pointer;padding:0;line-height:1;transition:color .2s}.properties-popup-close:hover{color:#333}.properties-popup-content{padding:20px;overflow-y:auto;flex:1}.properties-popup-footer{padding:16px 20px;border-top:1px solid #e0e0e0;background:#f8f9fa;display:flex;justify-content:flex-end;gap:8px}.form-group{margin-bottom:12px}.form-group label{display:block;margin-bottom:4px;font-size:13px;font-weight:500;color:#333}.form-group input,.form-group select{width:100%;padding:8px 10px;border:1px solid #ccc;border-radius:4px;box-sizing:border-box;font-size:14px;height:38px;line-height:1.5}.form-group input[type=checkbox]{width:auto;height:auto}.form-group select{background-color:#fff;cursor:pointer}.form-group input[readonly]{background-color:#eee;cursor:not-allowed}.workflow-node.selected{border-color:#007bff;box-shadow:0 0 10px #007bff80}.workflow-node.node-connecting-hover{border-color:#28a745;box-shadow:0 0 20px #28a745b3,0 0 40px #28a74566;transition:box-shadow .2s ease,border-color .2s ease}.workflow-node.node-connecting-hover .workflow-node-header{background-color:#d4edda;border-bottom-color:#28a745}.workflow-edge{fill:none;stroke-width:1.5px}.workflow-edge.selected{stroke-width:3px}.workflow-edge.reconnecting{opacity:.3;stroke-dasharray:5,5}.edge-label-bg{fill:#fff;stroke:#6c757d;stroke-width:1px;pointer-events:none}.edge-label-bg.selected{stroke:#007bff}.edge-label{font-size:11px;fill:#495057;pointer-events:none;font-family:sans-serif}.edge-label.selected{fill:#007bff;font-weight:500}.edge-condition-indicator{cursor:pointer}.edge-condition-bg{fill:#fff3cd;stroke:#ffc107;stroke-width:2px;transition:all .2s ease}.edge-condition-bg.selected{fill:#cce5ff;stroke:#007bff}.edge-condition-bg:hover{fill:#ffe69c}.edge-condition-icon{stroke:#856404;pointer-events:none}.edge-condition-icon.selected{stroke:#007bff}.edge-connector{fill:#fff;stroke:#6c757d;stroke-width:2px;pointer-events:none}.edge-connector.selected{stroke:#007bff}.workflow-edge-interactive{fill:none;stroke:transparent;stroke-width:15px;cursor:pointer;pointer-events:auto}.workflow-svg-layer{position:absolute;top:0;left:0;width:100%;height:100%;min-width:100%;min-height:100%;pointer-events:none;z-index:1;overflow:visible}.workflow-svg-connectors{position:absolute;top:0;left:0;width:100%;height:100%;min-width:100%;min-height:100%;pointer-events:none;z-index:3;overflow:visible}.workflow-svg-connectors .edge-connector{pointer-events:auto;cursor:pointer}.workflow-svg-edge-actions{position:absolute;top:0;left:0;width:100%;height:100%;min-width:100%;min-height:100%;pointer-events:none;z-index:100;overflow:visible}.add-node-toolbar{display:flex;align-items:center;gap:8px}.add-node-toolbar span{font-size:14px;font-weight:500}.add-node-toolbar button{background:#6c757d;color:#fff;border:none;padding:5px 10px;border-radius:4px;cursor:pointer;font-size:12px}.add-node-toolbar button:hover{background:#5a6268}.workflow-btn-secondary{background:#f0f0f0;color:#333;border:1px solid #ccc;padding:8px 14px;border-radius:6px;cursor:pointer}.workflow-btn-secondary:hover{background:#e0e0e0}.workflow-io-buttons{display:flex;gap:8px}.properties-panel-footer{margin-top:24px;padding-top:16px;border-top:1px solid #ddd;display:flex;justify-content:flex-end}.btn-danger{background-color:#dc3545;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer}.btn-danger:hover{background-color:#c82333}.btn-primary{background-color:#007bff;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer}.btn-primary:hover{background-color:#0056b3}.workflow-edge-preview{fill:none;stroke:#007bff;stroke-width:2px;stroke-dasharray:5,5}.workflow-node-preview{position:absolute;background:#ffffffe6;border:2px dashed #007bff;border-radius:6px;box-shadow:0 2px 8px #007bff4d;width:120px;min-height:50px;font-size:11px;z-index:100;pointer-events:none;transform:translate(10px,-50%);opacity:.85}.workflow-node-preview-header{background-color:#007bff26;border-bottom:1px dashed #007bff;padding:4px 8px;font-weight:700;color:#007bff;border-top-left-radius:4px;border-top-right-radius:4px;font-size:10px}.workflow-node-preview-body{padding:6px 8px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px}.workflow-node-preview-hint{color:#6c757d;font-size:9px;font-style:italic}.workflow-node-preview-esc{color:#999;font-size:8px;background:#f0f0f0;padding:1px 4px;border-radius:3px;border:1px solid #ddd}.workflow-node-preview.workflow-node-preview-connect{border-color:#28a745;background:#d4eddaf2}.workflow-node-preview.workflow-node-preview-connect .workflow-node-preview-header{background-color:#28a74533;border-bottom-color:#28a745;color:#28a745}.node-active .workflow-node-header{background-color:#28a745;color:#fff}.node-active{border-color:#28a745;box-shadow:0 0 15px #28a745b3}.edge-active{stroke:#28a745;stroke-width:4px}.edge-handle{fill:#007bff;stroke:#fff;stroke-width:2px;cursor:move}.node-add-handle-container{position:absolute;display:flex;align-items:center;justify-content:center;padding:6px;background:#fffffff2;border-radius:8px;box-shadow:0 2px 8px #00000026;z-index:10}.node-add-handle-container.handle-right{top:50%;transform:translateY(-50%);right:-20px}.node-add-handle-container.handle-left{top:50%;transform:translateY(-50%);left:-20px}.node-add-handle-container.handle-bottom{left:50%;transform:translate(-50%);bottom:-20px}.node-add-handle{width:20px;height:20px;background-color:#007bff;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;cursor:pointer;box-shadow:0 1px 3px #0000004d}.node-add-handle:hover{background-color:#0056b3}.handle-left{top:50%;transform:translateY(-50%);left:-11px}.handle-right{top:50%;transform:translateY(-50%);right:-10px}.handle-bottom{left:50%;transform:translate(-50%);bottom:-11px}.node-connecting-target{border-style:dashed;border-color:#28a745}.edge-condition-editor{margin-top:8px}.edge-condition-editor .form-group{margin-bottom:16px}.edge-condition-editor .form-group label{display:block;margin-bottom:6px;font-size:13px;font-weight:500;color:#333}.edge-condition-editor select{width:100%;padding:8px 12px;border:1px solid #ccc;border-radius:4px;font-size:14px;background-color:#fff;cursor:pointer;height:38px;line-height:1.5;box-sizing:border-box}.edge-condition-editor select:focus{border-color:#007bff;outline:none;box-shadow:0 0 0 2px #007bff40}.compare-condition-editor{background:#f8f9fa;border:1px solid #e9ecef;border-radius:6px;padding:16px;margin-top:12px}.condition-value-group{margin-bottom:12px}.condition-value-group label{display:block;margin-bottom:6px;font-size:12px;font-weight:500;color:#666}.condition-value-row{display:flex;gap:8px;align-items:center}.condition-source-select{flex:0 0 100px;padding:8px 10px;border:1px solid #ccc;border-radius:4px;font-size:14px;background-color:#fff;height:38px;line-height:1.5;box-sizing:border-box}.condition-value-input{flex:1;padding:8px 10px;border:1px solid #ccc;border-radius:4px;font-size:14px;height:38px;line-height:1.5;box-sizing:border-box}.condition-value-input:focus,.condition-source-select:focus{border-color:#007bff;outline:none;box-shadow:0 0 0 2px #007bff40}.edge-condition-editor textarea{width:100%;padding:8px 12px;border:1px solid #ccc;border-radius:4px;font-size:13px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;resize:vertical;box-sizing:border-box}.edge-condition-editor textarea:focus{border-color:#007bff;outline:none;box-shadow:0 0 0 2px #007bff40}.form-hint{display:block;margin-top:6px;font-size:11px;color:#888;line-height:1.4}.edge-action-buttons{pointer-events:auto}.edge-action-container-bg{fill:#fffffff2;stroke:#dee2e6;stroke-width:1px;filter:drop-shadow(0 2px 4px rgba(0,0,0,.15))}.edge-action-btn{transition:opacity .15s ease}.edge-action-bg{fill:#007bff;stroke:#fff;stroke-width:2px;transition:fill .15s ease}.edge-action-edit .edge-action-bg{fill:#007bff}.edge-action-edit:hover .edge-action-bg{fill:#0056b3}.edge-action-reconnect .edge-action-bg{fill:#28a745}.edge-action-reconnect:hover .edge-action-bg{fill:#1e7e34}.edge-action-icon{pointer-events:none}.workflow-edge-reconnect{stroke:#28a745;stroke-width:2px;stroke-dasharray:8,4}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
(function(te,f){typeof exports=="object"&&typeof module<"u"?f(exports,require("react")):typeof define=="function"&&define.amd?define(["exports","react"],f):(te=typeof globalThis<"u"?globalThis:te||self,f(te.BoleClickwizardDesigner={},te.React))})(this,(function(te,f){"use strict";var Ie={exports:{}},xe={};var De;function Fe(){if(De)return xe;De=1;var D=Symbol.for("react.transitional.element"),U=Symbol.for("react.fragment");function re(T,M,C){var c=null;if(C!==void 0&&(c=""+C),M.key!==void 0&&(c=""+M.key),"key"in M){C={};for(var B in M)B!=="key"&&(C[B]=M[B])}else C=M;return M=C.ref,{$$typeof:D,type:T,key:c,ref:M!==void 0?M:null,props:C}}return xe.Fragment=U,xe.jsx=re,xe.jsxs=re,xe}var ve={};var Ae;function ze(){return Ae||(Ae=1,process.env.NODE_ENV!=="production"&&(function(){function D(o){if(o==null)return null;if(typeof o=="function")return o.$$typeof===A?null:o.displayName||o.name||null;if(typeof o=="string")return o;switch(o){case Q:return"Fragment";case ae:return"Profiler";case _e:return"StrictMode";case J:return"Suspense";case ie:return"SuspenseList";case g:return"Activity"}if(typeof o=="object")switch(typeof o.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),o.$$typeof){case se:return"Portal";case je:return o.displayName||"Context";case ue:return(o._context.displayName||"Context")+".Consumer";case Re:var d=o.render;return o=o.displayName,o||(o=d.displayName||d.name||"",o=o!==""?"ForwardRef("+o+")":"ForwardRef"),o;case ce:return d=o.displayName||null,d!==null?d:D(o.type)||"Memo";case ye:d=o._payload,o=o._init;try{return D(o(d))}catch{}}return null}function U(o){return""+o}function re(o){try{U(o);var d=!1}catch{d=!0}if(d){d=console;var j=d.error,N=typeof Symbol=="function"&&Symbol.toStringTag&&o[Symbol.toStringTag]||o.constructor.name||"Object";return j.call(d,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",N),U(o)}}function T(o){if(o===Q)return"<>";if(typeof o=="object"&&o!==null&&o.$$typeof===ye)return"<...>";try{var d=D(o);return d?"<"+d+">":"<...>"}catch{return"<...>"}}function M(){var o=pe.A;return o===null?null:o.getOwner()}function C(){return Error("react-stack-top-frame")}function c(o){if(fe.call(o,"key")){var d=Object.getOwnPropertyDescriptor(o,"key").get;if(d&&d.isReactWarning)return!1}return o.key!==void 0}function B(o,d){function j(){v||(v=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",d))}j.isReactWarning=!0,Object.defineProperty(o,"key",{get:j,configurable:!0})}function m(){var o=D(this.type);return Ee[o]||(Ee[o]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),o=this.props.ref,o!==void 0?o:null}function G(o,d,j,N,$,ke){var E=j.ref;return o={$$typeof:we,type:o,key:d,props:j,_owner:N},(E!==void 0?E:null)!==null?Object.defineProperty(o,"ref",{enumerable:!1,get:m}):Object.defineProperty(o,"ref",{enumerable:!1,value:null}),o._store={},Object.defineProperty(o._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(o,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(o,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:$}),Object.defineProperty(o,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:ke}),Object.freeze&&(Object.freeze(o.props),Object.freeze(o)),o}function x(o,d,j,N,$,ke){var E=d.children;if(E!==void 0)if(N)if(q(E)){for(N=0;N<E.length;N++)V(E[N]);Object.freeze&&Object.freeze(E)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else V(E);if(fe.call(d,"key")){E=D(o);var ee=Object.keys(d).filter(function(Se){return Se!=="key"});N=0<ee.length?"{key: someKey, "+ee.join(": ..., ")+": ...}":"{key: someKey}",ge[E+N]||(ee=0<ee.length?"{"+ee.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
|
|
2
|
+
let props = %s;
|
|
3
|
+
<%s {...props} />
|
|
4
|
+
React keys must be passed directly to JSX without using spread:
|
|
5
|
+
let props = %s;
|
|
6
|
+
<%s key={someKey} {...props} />`,N,E,ee,E),ge[E+N]=!0)}if(E=null,j!==void 0&&(re(j),E=""+j),c(d)&&(re(d.key),E=""+d.key),"key"in d){j={};for(var be in d)be!=="key"&&(j[be]=d[be])}else j=d;return E&&B(j,typeof o=="function"?o.displayName||o.name||"Unknown":o),G(o,E,j,M(),$,ke)}function V(o){Ne(o)?o._store&&(o._store.validated=1):typeof o=="object"&&o!==null&&o.$$typeof===ye&&(o._payload.status==="fulfilled"?Ne(o._payload.value)&&o._payload.value._store&&(o._payload.value._store.validated=1):o._store&&(o._store.validated=1))}function Ne(o){return typeof o=="object"&&o!==null&&o.$$typeof===we}var oe=f,we=Symbol.for("react.transitional.element"),se=Symbol.for("react.portal"),Q=Symbol.for("react.fragment"),_e=Symbol.for("react.strict_mode"),ae=Symbol.for("react.profiler"),ue=Symbol.for("react.consumer"),je=Symbol.for("react.context"),Re=Symbol.for("react.forward_ref"),J=Symbol.for("react.suspense"),ie=Symbol.for("react.suspense_list"),ce=Symbol.for("react.memo"),ye=Symbol.for("react.lazy"),g=Symbol.for("react.activity"),A=Symbol.for("react.client.reference"),pe=oe.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,fe=Object.prototype.hasOwnProperty,q=Array.isArray,L=console.createTask?console.createTask:function(){return null};oe={react_stack_bottom_frame:function(o){return o()}};var v,Ee={},X=oe.react_stack_bottom_frame.bind(oe,C)(),S=L(T(C)),ge={};ve.Fragment=Q,ve.jsx=function(o,d,j){var N=1e4>pe.recentlyCreatedOwnerStacks++;return x(o,d,j,!1,N?Error("react-stack-top-frame"):X,N?L(T(o)):S)},ve.jsxs=function(o,d,j){var N=1e4>pe.recentlyCreatedOwnerStacks++;return x(o,d,j,!0,N?Error("react-stack-top-frame"):X,N?L(T(o)):S)}})()),ve}var Le;function Ue(){return Le||(Le=1,process.env.NODE_ENV==="production"?Ie.exports=Fe():Ie.exports=ze()),Ie.exports}var t=Ue();const Y=200,ne=80,Je=31,Xe=16,Ze=16,Ke=9,Qe=14,qe=f.forwardRef(({initialWorkflow:D,onChange:U,className:re,nodeTypeConfigs:T=[]},M)=>{const C=f.useMemo(()=>{const e=new Map;return T.forEach(r=>{e.set(r.type,r)}),e},[T]),[c,B]=f.useState(D),[m,G]=f.useState(null),[x,V]=f.useState(null),[Ne,oe]=f.useState(null),[we,se]=f.useState(null),[Q,_e]=f.useState(null),[ae,ue]=f.useState(null),[je,Re]=f.useState(!1),[J,ie]=f.useState(null),[ce,ye]=f.useState(new Map),[g,A]=f.useState(null),[pe,fe]=f.useState(null),q=f.useRef(null),L=f.useRef(null),v=f.useRef(null),Ee=f.useRef(null),X=f.useRef(new Map);f.useEffect(()=>{B(D)},[D]);const S=e=>{B(e),U?.(e)};f.useEffect(()=>{const e=()=>{const s=new Map;X.current.forEach((a,i)=>{a&&s.set(i,a.offsetHeight)});let n=!1;s.forEach((a,i)=>{ce.get(i)!==a&&(n=!0)}),(n||s.size!==ce.size)&&ye(s)};e();const r=new ResizeObserver(()=>{e()});return X.current.forEach(s=>{s&&r.observe(s)}),()=>{r.disconnect()}},[c.nodes]),f.useImperativeHandle(M,()=>({getWorkflow:()=>c,setWorkflow:e=>{S(e),G(null)}}));const ge=f.useCallback(()=>{if(!m)return;let e=[...c.nodes],r=[...c.edges];if(m.type==="node"){const s=c.nodes.find(n=>n.id===m.id);if(s?.type==="start"||s?.type==="end")return;e=c.nodes.filter(n=>n.id!==m.id),r=c.edges.filter(n=>n.sourceNodeId!==m.id&&n.targetNodeId!==m.id)}else r=c.edges.filter(s=>s.id!==m.id);G(null),S({nodes:e,edges:r})},[m,c,S]);f.useEffect(()=>{const e=r=>{const s=r.target,n=s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.tagName==="SELECT"||s.isContentEditable;if(r.key==="Escape"){if(g){A(null),fe(null);return}if(x){V(null);return}if(m){J&&(B(J),U?.(J)),G(null),ue(null),ie(null);return}}m&&(r.key==="Delete"||r.key==="Backspace")&&!n&&ge()};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[m,ge,J,U,x,g]);const o=(e,r)=>{const n=e.target.closest(".workflow-node").getBoundingClientRect();q.current={nodeId:r,offset:{x:e.clientX-n.left,y:e.clientY-n.top}},e.dataTransfer.effectAllowed="move"},d=e=>{e.preventDefault()},j=e=>{if(e.preventDefault(),!q.current||!v.current)return;const r=v.current.getBoundingClientRect(),s={x:e.clientX-r.left+v.current.scrollLeft-q.current.offset.x,y:e.clientY-r.top+v.current.scrollTop-q.current.offset.y},n=c.nodes.map(a=>a.id===q.current?.nodeId?{...a,position:{x:Math.max(0,s.x),y:Math.max(0,s.y)}}:a);S({...c,nodes:n}),q.current=null},N=(e,r)=>{ie(JSON.parse(JSON.stringify(c))),G({type:e,id:r})},$=(e,r)=>{if(m){if(m.type==="node"){const s=c.nodes.map(n=>{if(n.id===m.id){if(e==="type"){const i=C.get(r),l=i?.defaultParameters?{...i.defaultParameters}:{};return{...n,type:r,parameters:l}}if(e in n&&e!=="parameters")return{...n,[e]:r};const a={...n.parameters||{},[e]:r};return{...n,parameters:a}}return n});S({...c,nodes:s})}else if(m.type==="edge"){const s=c.edges.map(n=>n.id===m.id?{...n,[e]:r}:n);S({...c,edges:s})}}},ke=(e,r)=>{if(e.stopPropagation(),!v.current)return;const s=v.current.getBoundingClientRect(),n=c.nodes.find(u=>u.id===r);if(!n)return;const a=X.current.get(r),i=a?a.offsetHeight:ne,l={x:n.position.x+Y,y:n.position.y+i/2};V({startNodeId:r,startPos:l,endPos:{x:e.clientX-s.left+v.current.scrollLeft,y:e.clientY-s.top+v.current.scrollTop}})},E=(e,r,s)=>{if(e.stopPropagation(),!v.current)return;const n=c.edges.find(w=>w.id===r);if(!n)return;const a=v.current.getBoundingClientRect(),i=n.sourceNodeId,l=n.targetNodeId,u=c.nodes.find(w=>w.id===i),k=c.nodes.find(w=>w.id===l);if(!u||!k)return;const p=X.current.get(i),I=p?p.offsetHeight:ne,h={x:u.position.x+Y,y:u.position.y+I/2};A({edgeId:r,endpoint:s,startPos:h,endPos:{x:e.clientX-a.left+v.current.scrollLeft,y:e.clientY-a.top+v.current.scrollTop}}),se(null)},ee=e=>{if(!v.current)return;if(g){e.preventDefault();const s=v.current.getBoundingClientRect();A({...g,endPos:{x:e.clientX-s.left+v.current.scrollLeft,y:e.clientY-s.top+v.current.scrollTop}});return}if(!x)return;e.preventDefault();const r=v.current.getBoundingClientRect();V({...x,endPos:{x:e.clientX-r.left+v.current.scrollLeft,y:e.clientY-r.top+v.current.scrollTop}})},be=(e,r)=>{if(e.stopPropagation(),g){const a=c.edges.find(p=>p.id===g.edgeId);if(!a){A(null);return}if(g.endpoint==="source"&&r===a.targetNodeId){A(null);return}if(g.endpoint==="target"&&r===a.sourceNodeId){A(null);return}const i=g.endpoint==="source"?r:a.sourceNodeId,l=g.endpoint==="target"?r:a.targetNodeId;if(c.edges.some(p=>p.id!==a.id&&p.sourceNodeId===i&&p.targetNodeId===l)){A(null);return}const k=c.edges.map(p=>p.id===g.edgeId?{...p,sourceNodeId:i,targetNodeId:l}:p);S({...c,edges:k}),A(null);return}if(!x){N("node",r);return}if(x.startNodeId===r){V(null);return}const s={id:`edge_${Date.now()}`,sourceNodeId:x.startNodeId,targetNodeId:r};if(c.edges.some(a=>a.sourceNodeId===s.sourceNodeId&&a.targetNodeId===s.targetNodeId)){V(null);return}S({...c,edges:[...c.edges,s]}),V(null)},Se=e=>{if(g){A(null);return}if(x&&v.current){const r=v.current.getBoundingClientRect(),s=e.clientX-r.left+v.current.scrollLeft,n=e.clientY-r.top+v.current.scrollTop;ie(JSON.parse(JSON.stringify(c)));const a=`node_${Date.now()}`,i=T.length>0?T[0].type:"task",l=T.length>0?T[0]:null,u=l?.defaultParameters?{...l.defaultParameters}:{},k={id:a,name:"New Node",type:i,position:{x:Math.max(0,s-Y/2),y:Math.max(0,n-ne/2)},parameters:u},p={id:`edge_${Date.now()}`,sourceNodeId:x.startNodeId,targetNodeId:a},I={nodes:[...c.nodes,k],edges:[...c.edges,p]};S(I),V(null),G({type:"node",id:a});return}G(null)},et=e=>{if(e.type==="start")return null;if(e.type==="end")return t.jsxs("div",{className:"form-group",style:{display:"flex",alignItems:"center",gap:"8px",cursor:"pointer"},children:[t.jsx("input",{type:"checkbox",id:"end-autoclose",checked:!!e.parameters?.autoCloseTab,onChange:s=>$("autoCloseTab",s.target.checked)}),t.jsx("label",{htmlFor:"end-autoclose",style:{margin:0,cursor:"pointer"},children:"自動關閉 Tab"})]});const r=C.get(e.type);if((e.type==="goto"||e.type==="click")&&e.parameters){const s=e.parameters.dialogMode||"autoAccept";return t.jsxs("div",{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Dialog 處理"}),t.jsxs("select",{value:s,onChange:n=>$("dialogMode",n.target.value),children:[t.jsx("option",{value:"autoAccept",children:"autoAccept(自動接受 confirm,並關閉 alert)"}),t.jsx("option",{value:"autoDismiss",children:"autoDismiss(自動取消 confirm)"}),t.jsx("option",{value:"reportOnly",children:"reportOnly(僅回報)"})]})]}),r?.renderProperties?r.renderProperties(e.parameters,$):null]})}return r?.renderProperties&&e.parameters?r.renderProperties(e.parameters,$):null},le=(e,r)=>{if(!m||m.type!=="edge")return;const s=c.edges.find(i=>i.id===m.id);if(!s)return;let n=s.condition?{...s.condition}:{type:"none"};if(e==="type")r==="none"?n=void 0:(n={type:r},r==="compare"&&(n.left={source:"variable",name:""},n.operator="==",n.right={source:"literal",value:""}));else if(n){if(e==="operator")n.operator=r;else if(e==="expression")n.expression=r;else if(e.startsWith("left.")){const i=e.substring(5);(!n.left||typeof n.left!="object")&&(n.left={source:"variable",name:""}),i==="source"?n.left={source:r}:n.left[i]=r}else if(e.startsWith("right.")){const i=e.substring(6);(!n.right||typeof n.right!="object")&&(n.right={source:"literal",value:""}),i==="source"?n.right={source:r}:n.right[i]=r}}const a=c.edges.map(i=>i.id===m.id?{...i,condition:n}:i);S({...c,edges:a})},tt=f.useCallback(e=>{const r=[],n=(e?c.edges.find(l=>l.id===e):null)?.sourceNodeId,a=new Set,i=new Set;if(n){const l=c.nodes.find(u=>u.type==="start");if(l){l.id;const u=new Map;c.edges.forEach(p=>{u.has(p.targetNodeId)||u.set(p.targetNodeId,new Set),u.get(p.targetNodeId).add(p.sourceNodeId)});const k=p=>{if(a.has(p))return;a.add(p),i.add(p);const I=u.get(p);I&&I.forEach(h=>k(h))};k(n)}}else c.nodes.forEach(l=>i.add(l.id));return c.nodes.forEach(l=>{if(i.has(l.id)&&l.parameters){const u=l.parameters.outputVariable;u&&typeof u=="string"&&u.trim()!==""&&r.push(u.trim())}}),[...new Set(r)].sort()},[c]),$e=(e,r,s,n)=>{const a=r?.source||"literal",i=tt(n);return t.jsxs("div",{className:"condition-value-group",children:[t.jsx("label",{children:s}),t.jsxs("div",{className:"condition-value-row",children:[t.jsxs("select",{value:a,onChange:l=>le(`${e}.source`,l.target.value),className:"condition-source-select",children:[t.jsx("option",{value:"literal",children:"固定值"}),t.jsx("option",{value:"variable",children:"變數"}),t.jsx("option",{value:"result",children:"節點結果"})]}),a==="literal"&&t.jsx("input",{type:"text",value:r?.value??"",onChange:l=>le(`${e}.value`,l.target.value),placeholder:"輸入值",className:"condition-value-input"}),a==="variable"&&t.jsxs(t.Fragment,{children:[t.jsx("input",{type:"text",list:`${e}-variable-list`,value:r?.name??"",onChange:l=>le(`${e}.name`,l.target.value),placeholder:i.length>0?"輸入或選擇變數...":"輸入變數名稱",className:"condition-value-input"}),i.length>0&&t.jsx("datalist",{id:`${e}-variable-list`,children:i.map(l=>t.jsx("option",{value:l},l))})]}),a==="result"&&t.jsx("input",{type:"text",value:r?.path??"",onChange:l=>le(`${e}.path`,l.target.value),placeholder:"結果路徑 (如: data.value)",className:"condition-value-input"})]})]})},nt=e=>{const r=e.condition,s=r?.type||"none";return t.jsxs("div",{className:"edge-condition-editor",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"條件類型"}),t.jsxs("select",{value:s,onChange:n=>le("type",n.target.value),children:[t.jsx("option",{value:"none",children:"無條件(總是執行)"}),t.jsx("option",{value:"success",children:"成功時執行"}),t.jsx("option",{value:"failure",children:"失敗時執行"}),t.jsx("option",{value:"compare",children:"比較條件"}),t.jsx("option",{value:"expression",children:"自訂表達式"}),t.jsx("option",{value:"else",children:"其他條件皆不成立時 (Else)"})]})]}),s==="compare"&&t.jsxs("div",{className:"compare-condition-editor",children:[$e("left",r?.left,"左值",e.id),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"運算子"}),t.jsxs("select",{value:r?.operator||"==",onChange:n=>le("operator",n.target.value),children:[t.jsx("option",{value:"==",children:"等於 (==)"}),t.jsx("option",{value:"===",children:"嚴格等於 (===)"}),t.jsx("option",{value:"!=",children:"不等於 (!=)"}),t.jsx("option",{value:"!==",children:"嚴格不等於 (!==)"}),t.jsx("option",{value:">",children:"大於 (>)"}),t.jsx("option",{value:">=",children:"大於等於 (>=)"}),t.jsx("option",{value:"<",children:"小於 (<)"}),t.jsx("option",{value:"<=",children:"小於等於 (<=)"}),t.jsx("option",{value:"contains",children:"包含"}),t.jsx("option",{value:"startsWith",children:"開頭是"}),t.jsx("option",{value:"endsWith",children:"結尾是"}),t.jsx("option",{value:"matches",children:"正則匹配"})]})]}),$e("right",r?.right,"右值",e.id)]}),s==="expression"&&t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"表達式"}),t.jsx("textarea",{value:r?.expression||"",onChange:n=>le("expression",n.target.value),placeholder:"例如: result.success && variables.count > 0",rows:3}),t.jsx("small",{className:"form-hint",children:"可用變數: result (節點結果), context (執行上下文), variables (工作流程變數)"})]})]})},rt=()=>{J&&(B(J),U?.(J)),G(null),ue(null),ie(null)},ot=()=>{G(null),ue(null),ie(null)},st=e=>{if(e.target.closest("input, select, textarea, button"))return;e.preventDefault(),Re(!0);const r=Ee.current;if(!r)return;const s=r.getBoundingClientRect(),n=ae?.x??s.left,a=ae?.y??s.top;L.current={startX:e.clientX,startY:e.clientY,startPosX:n,startPosY:a}};f.useEffect(()=>{if(!je)return;const e=s=>{if(!L.current)return;const n=s.clientX-L.current.startX,a=s.clientY-L.current.startY;ue({x:L.current.startPosX+n,y:L.current.startPosY+a})},r=()=>{Re(!1),L.current=null};return document.addEventListener("mousemove",e),document.addEventListener("mouseup",r),()=>{document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r)}},[je]);const at=()=>{if(!m)return null;let e,r=m.type==="node";if(r?e=c.nodes.find(n=>n.id===m.id):e=c.edges.find(n=>n.id===m.id),!e)return null;T.map(n=>n.type);const s=ae?{position:"fixed",left:ae.x,top:ae.y,transform:"none"}:{};return t.jsx("div",{className:"properties-popup-overlay",onClick:n=>n.stopPropagation(),children:t.jsxs("div",{ref:Ee,className:`properties-popup ${je?"dragging":""}`,style:s,children:[t.jsxs("div",{className:"properties-popup-header",onMouseDown:st,children:[t.jsxs("h4",{children:["Edit: ",r?e.name:"Edge"]}),t.jsx("button",{className:"properties-popup-close",onClick:rt,children:"×"})]}),t.jsxs("div",{className:"properties-popup-content",children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"ID"}),t.jsx("input",{type:"text",readOnly:!0,value:e.id})]}),r&&e.type!=="start"&&e.type!=="end"&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Name"}),t.jsx("input",{type:"text",value:e.name,onChange:n=>$("name",n.target.value)})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{children:"Type"}),t.jsx("select",{value:e.type,onChange:n=>$("type",n.target.value),children:T.map(n=>t.jsx("option",{value:n.type,children:n.label||n.type},n.type))})]})]}),r&&et(e),!r&&nt(e)]}),t.jsxs("div",{className:"properties-popup-footer",children:[(r&&e.type!=="start"&&e.type!=="end"||!r)&&t.jsx("button",{className:"btn-danger",onClick:ge,children:"Delete"}),t.jsx("button",{className:"btn-primary",onClick:ot,children:"OK"})]})]})})},He=new Map(c.nodes.map(e=>[e.id,e])),We=e=>{const r=ce.get(e.id);if(r&&r>0)return r;if(!e.parameters||Object.keys(e.parameters).length===0)return ne;const s=Object.entries(e.parameters).filter(([p,I])=>I!=null&&I!=="");if(s.length===0)return ne;const n=Math.min(s.length,3),a=s.length>3,i=n+(a?1:0),l=Je+Xe+Ze,u=Ke+i*Qe,k=l+u;return Math.max(ne,k)},Ye=(e,r,s,n,a,i,l,u,k,p,I,h,w=10)=>{const de=k-5,Z=p-5,H=I+10,_=h+10;for(let he=1;he<w;he++){const R=he/w,b=Math.pow(1-R,3)*e+3*Math.pow(1-R,2)*R*s+3*(1-R)*Math.pow(R,2)*a+Math.pow(R,3)*l,y=Math.pow(1-R,3)*r+3*Math.pow(1-R,2)*R*n+3*(1-R)*Math.pow(R,2)*i+Math.pow(R,3)*u;if(b>=de&&b<=de+H&&y>=Z&&y<=Z+_)return!0}return!1},Te=(()=>{const e=new Map,r=new Map;return c.edges.forEach(s=>{const n=[s.sourceNodeId,s.targetNodeId].sort().join("-");e.set(n,(e.get(n)||0)+1)}),c.edges.map(s=>{const n=He.get(s.sourceNodeId),a=He.get(s.targetNodeId);if(!n||!a)return null;const i=We(n),l=We(a),u=[s.sourceNodeId,s.targetNodeId].sort().join("-"),k=e.get(u)||1,p=r.get(u)||0;r.set(u,p+1);const w=(p-(k-1)/2)*15,Pe=n.position.y+i/2,de=a.position.x+Y/2,Z=a.position.y+l/2,H=n.position.x+Y,_=Pe+w,he=de-H,R=Z-_;let b,y,W;Math.abs(he)>Math.abs(R)?he>0?(b=a.position.x,y=Z+w,W="left"):(b=a.position.x+Y,y=Z+w,W="right"):R>0?(b=de+w,y=a.position.y,W="top"):(b=de+w,y=a.position.y+l,W="bottom");const Ge=de-(n.position.x+Y/2),Ve=Z-Pe,it=Math.sqrt(Ge*Ge+Ve*Ve);let F=Math.max(40,it*.3),me=H+F,z=_,K,P;W==="left"?(K=b-F,P=y):W==="right"?(K=b+F,P=y):W==="top"?(K=b,P=y-F):(K=b,P=y+F);let Oe=Ye(H,_,me,z,K,P,b,y,a.position.x,a.position.y,Y,l);if(Oe){const Ce=l+30;if(W==="right"?(Z<=_?(z=_+Ce,P=y+Ce):(z=_-Ce,P=y-Ce),me=H+F*1.5,K=b+F*1.5):(W==="top"||W==="bottom")&&(me=H+F*1.5,W==="top"?P=y-F*1.5:P=y+F*1.5),Oe=Ye(H,_,me,z,K,P,b,y,a.position.x,a.position.y,Y,l),Oe){const Me=l+60;Z<=_?(z=Math.max(z,_+Me),P=Math.max(P,y+Me)):(z=Math.min(z,_-Me),P=Math.min(P,y-Me))}}const ct=`M ${H},${_} C ${me},${z} ${K},${P} ${b},${y}`,lt=m?.id===s.id?"url(#arrowhead-selected)":"url(#arrowhead)",O=.5,dt=Math.pow(1-O,3)*H+3*Math.pow(1-O,2)*O*me+3*(1-O)*Math.pow(O,2)*K+Math.pow(O,3)*b,ut=Math.pow(1-O,3)*_+3*Math.pow(1-O,2)*O*z+3*(1-O)*Math.pow(O,2)*P+Math.pow(O,3)*y;return{edge:s,pathData:ct,markerId:lt,startX:H,startY:_,endX:b,endY:y,midX:dt,midY:ut,isSelected:m?.id===s.id}}).filter(Boolean)})(),Be=f.useMemo(()=>{let n=800,a=600;return c.nodes.forEach(i=>{const l=ce.get(i.id)||ne,u=i.position.x+Y+100,k=i.position.y+l+100;u>n&&(n=u),k>a&&(a=k)}),{width:n,height:a}},[c.nodes,ce]);return t.jsx("div",{className:`workflow-editor-container ${re||""}`,children:t.jsx("div",{className:"workflow-body",children:t.jsxs("div",{ref:v,className:"workflow-canvas",onDragOver:d,onDrop:j,onMouseMove:ee,onClick:Se,children:[t.jsx("div",{className:"workflow-canvas-content",style:{width:`${Be.width}px`,height:`${Be.height}px`}}),t.jsxs("svg",{className:"workflow-svg-layer",children:[t.jsxs("defs",{children:[t.jsx("marker",{id:"arrowhead",viewBox:"0 0 10 10",refX:"8",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse",children:t.jsx("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"#495057"})}),t.jsx("marker",{id:"arrowhead-selected",viewBox:"0 0 10 10",refX:"8",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse",children:t.jsx("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"#007bff"})}),t.jsx("marker",{id:"arrowhead-active",viewBox:"0 0 10 10",refX:"8",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse",children:t.jsx("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"#28a745"})}),Te.map(({edge:e,startX:r,startY:s,endX:n,endY:a,isSelected:i})=>t.jsxs("linearGradient",{id:`edge-gradient-${e.id}`,gradientUnits:"userSpaceOnUse",x1:r,y1:s,x2:n,y2:a,children:[t.jsx("stop",{offset:"0%",stopColor:i?"#007bff":"#adb5bd"}),t.jsx("stop",{offset:"100%",stopColor:i?"#0056b3":"#495057"})]},`gradient-${e.id}`))]}),Te.map(({edge:e,pathData:r,markerId:s,midX:n,midY:a,isSelected:i})=>{e.id;const l=g?.edgeId===e.id;return t.jsxs("g",{onClick:u=>{u.stopPropagation(),N("edge",e.id)},onMouseEnter:()=>se(e.id),onMouseLeave:()=>se(null),children:[t.jsx("path",{className:`workflow-edge ${i?"selected":""} ${l?"reconnecting":""}`,d:r,stroke:`url(#edge-gradient-${e.id})`,markerEnd:s}),t.jsx("path",{className:"workflow-edge-interactive",d:r}),e.condition&&t.jsxs("g",{className:"edge-condition-indicator",onClick:u=>{u.stopPropagation(),N("edge",e.id)},style:{cursor:"pointer"},children:[t.jsx("path",{d:`M ${n} ${a-10} L ${n+10} ${a} L ${n} ${a+10} L ${n-10} ${a} Z`,className:`edge-condition-bg ${i?"selected":""}`}),t.jsx("path",{d:`M ${n-4} ${a-3} L ${n} ${a+1} L ${n+4} ${a-3} M ${n} ${a+1} L ${n} ${a+4}`,className:`edge-condition-icon ${i?"selected":""}`,fill:"none",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})]})]},e.id)}),x&&t.jsx("path",{className:"workflow-edge-preview",d:`M ${x.startPos.x},${x.startPos.y} L ${x.endPos.x},${x.endPos.y}`,markerEnd:"url(#arrowhead)"}),g&&t.jsx("path",{className:"workflow-edge-preview workflow-edge-reconnect",d:`M ${g.startPos.x},${g.startPos.y} L ${g.endPos.x},${g.endPos.y}`,markerEnd:g.endpoint==="target"?"url(#arrowhead)":void 0,markerStart:g.endpoint==="source"?"url(#arrowhead)":void 0})]}),x&&!Q&&t.jsxs("div",{className:"workflow-node-preview",style:{left:`${x.endPos.x}px`,top:`${x.endPos.y}px`},children:[t.jsx("div",{className:"workflow-node-preview-header",children:"New Node"}),t.jsxs("div",{className:"workflow-node-preview-body",children:[t.jsx("span",{className:"workflow-node-preview-hint",children:"點擊放置節點"}),t.jsx("span",{className:"workflow-node-preview-esc",children:"ESC 取消"})]})]}),x&&Q&&t.jsxs("div",{className:"workflow-node-preview workflow-node-preview-connect",style:{left:`${x.endPos.x}px`,top:`${x.endPos.y}px`},children:[t.jsx("div",{className:"workflow-node-preview-header",children:"連接節點"}),t.jsxs("div",{className:"workflow-node-preview-body",children:[t.jsx("span",{className:"workflow-node-preview-hint",children:"點擊連接到此節點"}),t.jsx("span",{className:"workflow-node-preview-esc",children:"ESC 取消"})]})]}),c.nodes.map(e=>{const r=C.get(e.type),s=e.parameters&&Object.keys(e.parameters).length>0?Object.entries(e.parameters).filter(([h,w])=>w!=null&&w!=="").map(([h,w])=>{const Pe=typeof w=="string"&&w.length>20?w.substring(0,20)+"...":String(w);return`${h}: ${Pe}`}).slice(0,3):[],n=x&&x.startNodeId!==e.id,a=Q===e.id&&n,i=g?c.edges.find(h=>h.id===g.edgeId):null,l=g&&i?g.endpoint==="target"?i.targetNodeId:i.sourceNodeId:null,u=i?.sourceNodeId,k=u?c.edges.filter(h=>h.sourceNodeId===u).map(h=>h.targetNodeId):[],p=g&&l!==e.id&&u!==e.id&&!k.includes(e.id),I=pe===e.id&&p;return t.jsxs("div",{ref:h=>{h?X.current.set(e.id,h):X.current.delete(e.id)},draggable:!0,onDragStart:h=>o(h,e.id),onMouseEnter:()=>{oe(e.id),x&&x.startNodeId!==e.id&&_e(e.id),p&&fe(e.id)},onMouseLeave:()=>{oe(null),Q===e.id&&_e(null),pe===e.id&&fe(null)},onClick:h=>be(h,e.id),"data-node-id":e.id,className:`workflow-node ${m?.id===e.id?"selected":""} ${x?"node-connecting-target":""} ${a?"node-connecting-hover":""} ${g?"node-connecting-target":""} ${I?"node-connecting-hover":""}`,style:{top:`${e.position.y}px`,left:`${e.position.x}px`},children:[t.jsx("div",{className:"workflow-node-header",children:e.name}),t.jsxs("div",{className:"workflow-node-body",children:[t.jsxs("p",{className:"workflow-node-type",children:["Type: ",r?.label||e.type]}),s.length>0&&t.jsxs("div",{className:"workflow-node-params",children:[s.map((h,w)=>t.jsx("div",{className:"workflow-node-param",children:h},w)),e.parameters&&Object.keys(e.parameters).filter(h=>e.parameters[h]!==void 0&&e.parameters[h]!==null&&e.parameters[h]!=="").length>3&&t.jsx("div",{className:"workflow-node-param workflow-node-param-more",children:"..."})]})]}),Ne===e.id&&e.type!=="end"&&!x&&!g&&t.jsx("div",{className:"node-add-handle-container handle-right",children:t.jsx("div",{className:"node-add-handle",onClick:h=>ke(h,e.id),children:"+"})})]},e.id)}),t.jsx("svg",{className:"workflow-svg-connectors",children:Te.map(({edge:e,startX:r,startY:s,isSelected:n})=>Ne===e.sourceNodeId?null:t.jsx("circle",{cx:r,cy:s,r:4,className:`edge-connector ${n?"selected":""}`,onClick:a=>{a.stopPropagation(),N("edge",e.id)}},e.id))}),t.jsx("svg",{className:"workflow-svg-edge-actions",children:Te.map(({edge:e,midX:r,midY:s,isSelected:n})=>!(we===e.id||n)||g?null:t.jsxs("g",{className:"edge-action-buttons",onMouseEnter:()=>se(e.id),onMouseLeave:()=>se(null),children:[t.jsx("rect",{x:r-38,y:s-18,width:76,height:36,rx:18,ry:18,className:"edge-action-container-bg"}),t.jsxs("g",{className:"edge-action-btn edge-action-edit",onClick:i=>{i.stopPropagation(),N("edge",e.id)},style:{cursor:"pointer"},children:[t.jsx("circle",{cx:r-16,cy:s,r:12,className:"edge-action-bg"}),t.jsx("path",{d:`M ${r-20} ${s+2} L ${r-14} ${s-4} L ${r-12} ${s-2} L ${r-18} ${s+4} Z`,className:"edge-action-icon",fill:"#fff"})]}),t.jsxs("g",{className:"edge-action-btn edge-action-reconnect",onClick:i=>E(i,e.id,"target"),style:{cursor:"pointer"},children:[t.jsx("circle",{cx:r+16,cy:s,r:12,className:"edge-action-bg"}),t.jsx("path",{d:`M ${r+11} ${s} L ${r+21} ${s} M ${r+18} ${s-3} L ${r+21} ${s} L ${r+18} ${s+3}`,className:"edge-action-icon",fill:"none",stroke:"#fff",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})]},e.id))}),at()]})})})});te.WorkflowEditor=qe,Object.defineProperty(te,Symbol.toStringTag,{value:"Module"})}));
|