@notmrabhi/flowforge 0.1.54 → 0.1.55

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.
Files changed (30) hide show
  1. package/dist/GatewayBranchEdge-6rCziASt.js +2 -0
  2. package/dist/GatewayBranchEdge-6rCziASt.js.map +1 -0
  3. package/dist/GatewayBranchEdge-PsxBbEky.js +1538 -0
  4. package/dist/GatewayBranchEdge-PsxBbEky.js.map +1 -0
  5. package/dist/{WorkflowExecutionHistory-B0OiFCyi.js → WorkflowExecutionHistory-CF0-D-7q.js} +3 -3
  6. package/dist/{WorkflowExecutionHistory-B0OiFCyi.js.map → WorkflowExecutionHistory-CF0-D-7q.js.map} +1 -1
  7. package/dist/{WorkflowExecutionHistory-BHb6-2lt.js → WorkflowExecutionHistory-CQkhhFQr.js} +2 -2
  8. package/dist/{WorkflowExecutionHistory-BHb6-2lt.js.map → WorkflowExecutionHistory-CQkhhFQr.js.map} +1 -1
  9. package/dist/canvas.cjs +1 -1
  10. package/dist/canvas.d.ts +7 -0
  11. package/dist/canvas.js +3 -3
  12. package/dist/core.cjs +1 -1
  13. package/dist/core.d.ts +7 -0
  14. package/dist/core.js +1 -1
  15. package/dist/defaultUi.cjs +1 -1
  16. package/dist/defaultUi.js +1 -1
  17. package/dist/index.cjs +1 -1
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.js +3 -3
  20. package/dist/{messages-O9Tw_XXR.js → messages-Bg7b9RbI.js} +2 -2
  21. package/dist/messages-Bg7b9RbI.js.map +1 -0
  22. package/dist/{messages-CO299wPN.js → messages-CRZgWFU-.js} +15 -8
  23. package/dist/messages-CRZgWFU-.js.map +1 -0
  24. package/package.json +1 -1
  25. package/dist/GatewayBranchEdge-BWz43Sat.js +0 -1411
  26. package/dist/GatewayBranchEdge-BWz43Sat.js.map +0 -1
  27. package/dist/GatewayBranchEdge-Ukfp7i1Q.js +0 -2
  28. package/dist/GatewayBranchEdge-Ukfp7i1Q.js.map +0 -1
  29. package/dist/messages-CO299wPN.js.map +0 -1
  30. package/dist/messages-O9Tw_XXR.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("react/jsx-runtime"),c=require("reactflow"),z=require("@mui/material"),ke=require("react-icons/gr"),ee=require("react"),ve=require("./messages-Bg7b9RbI.js"),g=require("react-icons/md"),F=require("react-icons/fa"),we=require("react-icons/fi"),D=require("./canvasTokens-gKNYrPl4.js"),te=ee.createContext({onEditNode:()=>{},onDeleteNode:()=>{},onAddStep:()=>{},onClickAddTrigger:()=>{},messages:ve.defaultFlowForgeMessages,nodeRegistry:null,nodeBody:"full"}),P=()=>ee.useContext(te),ne=()=>e.jsxs("div",{style:{width:350,display:"flex",justifyContent:"center"},children:[e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0,left:"50%"}}),e.jsx("div",{style:{padding:"8px 28px",borderRadius:999,background:"#f5f5f5",border:"1.5px solid #bdbdbd",fontSize:13,fontWeight:500,color:"#424242",userSelect:"none"},children:"Start"})]}),se=()=>e.jsxs("div",{style:{width:350,display:"flex",justifyContent:"center"},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0,left:"50%"}}),e.jsx("div",{style:{padding:"8px 28px",borderRadius:999,background:"#f5f5f5",border:"1.5px solid #bdbdbd",fontSize:13,fontWeight:500,color:"#424242",userSelect:"none"},children:"End"})]}),ie=()=>{const{onClickAddTrigger:t,messages:i}=P();return e.jsxs("div",{style:{width:350,display:"flex",justifyContent:"center"},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0,left:"50%"}}),e.jsx(z.Tooltip,{title:i.addTriggerTooltip,placement:"top",arrow:!0,children:e.jsxs("div",{onClick:t,role:"button",tabIndex:0,onKeyDown:s=>{s.key==="Enter"&&t()},style:{padding:"10px 24px",borderRadius:8,border:"1.5px dashed #d0d0d0",background:"#fff",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:[e.jsx(ke.GrTrigger,{size:16}),e.jsx("span",{className:"ff-text-black",style:{fontSize:13},"data-testid":"add-trigger-btn-text",children:i.addTriggerButton})]})}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0,left:"50%"}})]})},Se=({id:t})=>{const{onAddStep:i}=P();return e.jsxs("div",{onClick:()=>i(t),role:"button",tabIndex:0,onKeyDown:s=>{s.key==="Enter"&&i(t)},style:{width:28,height:28,borderRadius:"50%",border:"1.5px solid #9e9e9e",background:"#fff",display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer",fontSize:18,color:"#757575",lineHeight:1,userSelect:"none"},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),"+",e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}})]})};function oe(t){return t?t.replace(/[_-]+/g," ").toLowerCase().replace(/\b\w/g,i=>i.toUpperCase()):""}function Te(t){if(typeof t!="string"&&t.label)return t.label;const i=typeof t=="string"?t:t.value??"";return oe(i)}const le=({data:t})=>{const{onClickAddTrigger:i,messages:s}=P(),{type:d,eventType:a,sources:o,label:x,source:n,previewWorkflow:r,executionStatus:f,infoText:u="This node decides the flow trigger type and configuration."}=t??{},h=N=>{N==null||N.stopPropagation(),i()},m=Array.isArray(o)&&o.length>0,y=!!(x||n),l=d==="scheduler"?(s==null?void 0:s.schedulerTriggerTitle)??"Scheduler Trigger":d==="event"||m||y?(s==null?void 0:s.eventTriggerSourceTitle)??"Event Trigger Source":(s==null?void 0:s.selectTriggerTitle)??"Select Trigger",j=(()=>{if(d==="scheduler")return e.jsx("span",{children:(s==null?void 0:s.schedulerToBeConfigured)??"Scheduler to be configured"});if(d==="event"||m){const N=x||oe(a);return e.jsxs("div",{children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center",children:[e.jsx("span",{style:{fontWeight:600},children:N}),e.jsx("span",{className:"ff-ms-2 ff-text-muted",style:{fontSize:12},children:"via"})]}),e.jsx("div",{className:"ff-d-flex ff-flex-wrap ff-mt-2",style:{gap:4},children:m?o.map((k,C)=>e.jsx(z.Chip,{label:Te(k),variant:"outlined",size:"small",className:"ff-text-dark"},C)):e.jsx("span",{className:"ff-text-muted",style:{fontSize:12},children:(s==null?void 0:s.noSourceSelected)??"No source selected"})})]})}return y?e.jsxs("div",{className:"ff-d-flex ff-flex-wrap ff-align-items-center",style:{gap:6},children:[x&&e.jsx("span",{style:{fontWeight:600},children:x}),n&&e.jsx(z.Chip,{label:n,variant:"outlined",size:"small"})]}):e.jsx("span",{role:"button",tabIndex:0,onClick:h,onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&h(N)},style:{cursor:"pointer",color:"#1e88e5"},children:(s==null?void 0:s.selectTriggerCta)??"Click to select a trigger to start your workflow"})})(),S=f?e.jsxs(e.Fragment,{children:[f.status==="success"&&e.jsx(F.FaCheckCircle,{size:16,color:"#1DBF60",style:{marginRight:8}}),f.status==="failed"&&e.jsx(F.FaTimesCircle,{size:16,color:"#f44336",style:{marginRight:8}})]}):e.jsxs("div",{className:"ff-d-flex ff-align-items-center",children:[!r&&e.jsx("div",{role:"button",tabIndex:0,onClick:h,onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&h(N)},className:"ff-me-2",style:{cursor:"pointer",color:"#212121"},"aria-label":"Edit trigger",children:e.jsx(g.MdOutlineModeEdit,{size:16})}),e.jsx(z.Tooltip,{title:e.jsx("div",{children:u}),placement:"right",arrow:!0,children:e.jsx("span",{children:e.jsx(g.MdInfoOutline,{color:"gray",size:16})})})]});return e.jsxs("div",{style:{width:350},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #a5d6a7",borderRadius:8,background:"#fff",overflow:"hidden"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"12px 14px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:28,height:28,borderRadius:6,background:"rgba(76,175,80,0.1)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx(g.MdInput,{size:16,color:"#388e3c"})}),e.jsx("span",{style:{fontSize:14,fontWeight:500,color:"#212121"},children:l})]}),e.jsx("div",{className:"ff-d-flex ff-align-items-center",children:S})]}),e.jsx("div",{style:{background:"#f5f5f5",fontSize:12,color:"#212121",padding:"14px 16px",margin:"0 10px 12px",borderRadius:6,textAlign:"left"},children:j})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0},id:"1"})]})};function re(t){return t?t.replace(/[_-]+/g," ").replace(/\b\w/g,i=>i.toUpperCase()):""}function Ee(t){if(typeof t!="string"&&t.label)return t.label;const i=typeof t=="string"?t:t.value??"";return re(i)}const Pe=({data:t})=>{const{header:i="Event",title:s,eventType:d,sources:a,executionStatus:o,infoText:x="This event is raised by the system. It cannot be configured."}=t??{},n=s||re(d)||"—";return e.jsxs("div",{style:{width:350},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #a5d6a7",borderRadius:8,background:"#fff",overflow:"hidden"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"12px 14px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:28,height:28,borderRadius:6,background:"rgba(76,175,80,0.1)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx(g.MdInput,{size:16,color:"#388e3c"})}),e.jsx("span",{style:{fontSize:14,fontWeight:500,color:"#212121"},children:i})]}),e.jsxs("div",{className:"ff-d-flex ff-align-items-center",children:[(o==null?void 0:o.status)==="success"&&e.jsx(F.FaCheckCircle,{size:16,color:"#1DBF60",style:{marginRight:8}}),(o==null?void 0:o.status)==="failed"&&e.jsx(F.FaTimesCircle,{size:16,color:"#f44336",style:{marginRight:8}}),!o&&e.jsx(z.Tooltip,{title:e.jsx("div",{children:x}),placement:"right",arrow:!0,children:e.jsx("span",{children:e.jsx(g.MdInfoOutline,{color:"gray",size:16})})})]})]}),e.jsxs("div",{style:{background:"#f5f5f5",fontSize:13,color:"#212121",padding:"14px 16px",margin:"0 10px 12px",borderRadius:6,textAlign:"left"},children:[e.jsx("div",{style:{fontWeight:600},children:n}),Array.isArray(a)&&a.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"ff-text-muted",style:{fontSize:12,marginTop:4},children:"via"}),e.jsx("div",{className:"ff-d-flex ff-flex-wrap ff-mt-1",style:{gap:4},children:a.map((r,f)=>e.jsx(z.Chip,{label:Ee(r),variant:"outlined",size:"small",className:"ff-text-dark"},f))})]})]})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0},id:"1"})]})},de=({rail:t,cardWidth:i})=>{const s=i/2;i/2+t.indent;const d="var(--ff-edge-color, #b0bec5)";return e.jsxs("svg",{width:i+t.indent+200,height:t.height,style:{position:"absolute",left:0,top:"100%",pointerEvents:"none",overflow:"visible"},children:[e.jsx("line",{x1:s,y1:0,x2:s,y2:t.height,stroke:d,strokeWidth:1.5}),t.branches.map((a,o)=>{const x=a.y;return e.jsxs("g",{transform:`translate(0, ${x})`,children:[e.jsx("rect",{x:s-5,y:-5,width:10,height:10,fill:"#fff",stroke:d,strokeWidth:1.5,transform:`rotate(45, ${s}, 0)`}),e.jsx("text",{x:s+14,y:4,fontSize:12,fontWeight:500,fill:"var(--ff-text, #212121)",style:{fontFamily:"sans-serif"},children:a.label})]},o)})]})},ce=({id:t,data:i})=>{const{onEditNode:s,onDeleteNode:d}=P(),{conditions:a=[],infoText:o="Filter conditions applied to workflow data",_branchRail:x}=i;return e.jsxs("div",{style:{width:350,position:"relative"},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #ffe082",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center",children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded",style:{width:25,height:25,background:"rgba(255,160,0,0.1)"},children:e.jsx(we.FiFilter,{className:"ff-text-warning",size:16})}),e.jsx("span",{className:"ff-ms-2 ff-fw-medium ff-text-dark",style:{fontSize:14},children:"Filter"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:n=>{n.stopPropagation(),s(t)},onKeyDown:n=>{n.key==="Enter"&&(n.stopPropagation(),s(t))},children:e.jsx(g.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:n=>{n.stopPropagation(),d(t)},onKeyDown:n=>{n.key==="Enter"&&(n.stopPropagation(),d(t))},children:e.jsx(g.MdDeleteOutline,{color:"red",size:16})}),e.jsx(z.Tooltip,{title:o,placement:"right",arrow:!0,children:e.jsx("div",{className:"ff-ms-2",children:e.jsx(g.MdInfoOutline,{color:"gray",size:16})})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#fafafa",fontSize:12},children:a.length===0?e.jsx("span",{className:"ff-text-muted",children:"No conditions configured"}):a.map((n,r)=>e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-mb-1",children:[e.jsx("p",{className:"ff-m-0 ff-fw-bold ff-me-1 ff-text-truncate",style:{maxWidth:100},title:n.field,children:n.field}),e.jsx("span",{className:"ff-text-muted",children:n.operator}),e.jsx("p",{className:"ff-text-dark ff-text-truncate ff-mx-1 ff-m-0",title:n.value,children:n.value}),r<a.length-1&&e.jsx("p",{className:"ff-bg-primary ff-text-white ff-fw-bold ff-ms-1 ff-px-1 ff-rounded-1 ff-m-0",children:n.logicalOperator})]},r))})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}}),x&&e.jsx(de,{rail:x,cardWidth:350})]})},ae=({id:t,data:i})=>{const{onEditNode:s,onDeleteNode:d,nodeRegistry:a,nodeBody:o="full",messages:x}=P(),{title:n="Task",descriptorType:r,groupBlocks:f,groups:u,roles:h,groupId:m,roleId:y,infoText:l=""}=i,j=r?a==null?void 0:a.forType(r):void 0,S=j==null?void 0:j.icon,N=p=>p==null?"":typeof p=="string"?p:typeof p=="object"&&"label"in p?String(p.label):String(p),k=p=>Array.isArray(p)?p.map(N).filter(Boolean):p!=null&&p!==""?[N(p)]:[],C=new Set(["descriptorType","title","header","icon","infoText","label","conditionConfig","_conditionConfig"]),E=j==null?void 0:j.formSchema,L=p=>{if(Array.isArray(E)){const b=E.find(v=>(v==null?void 0:v.id)===p||(v==null?void 0:v.name)===p);if(b!=null&&b.label)return b.label}return p.replace(/[_-]+/g," ").replace(/\b\w/g,b=>b.toUpperCase())},R=p=>{if(Array.isArray(p)){const b=p.map(A=>typeof A=="object"&&A?A.label??A.name??A.value??"":String(A)).filter(Boolean),v=b.slice(0,3).join(", ");return b.length>3?`${v} +${b.length-3}`:v}if(p&&typeof p=="object"){const b=p;return b.label??b.name??b.value??JSON.stringify(p)}return String(p)},T=Object.entries(i||{}).filter(([p,b])=>!C.has(p)&&b!==""&&b!==null&&b!==void 0&&!(Array.isArray(b)&&b.length===0)),w=(i==null?void 0:i.conditionConfig)??(i==null?void 0:i._conditionConfig),I=w&&typeof w=="object"?Object.entries(w).filter(([,p])=>Array.isArray(p)&&p.length>0).map(([p,b])=>({path:p,entries:b})):[],W=(f==null?void 0:f.flatMap(p=>p.groups??[]))??[...k(u),...k(h),...k(m),...k(y)],ue=W.length>0;return e.jsxs("div",{style:{width:350},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b0bec5",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[S&&e.jsx("div",{style:{display:"flex",alignItems:"center"},children:S}),e.jsx("span",{className:"ff-text-dark",style:{fontSize:14,fontWeight:500},children:n})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:p=>{p.stopPropagation(),s(t)},onKeyDown:p=>{p.key==="Enter"&&(p.stopPropagation(),s(t))},children:e.jsx(g.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:p=>{p.stopPropagation(),d(t)},onKeyDown:p=>{p.key==="Enter"&&(p.stopPropagation(),d(t))},children:e.jsx(g.MdDeleteOutline,{color:"red",size:16})}),l&&e.jsx(z.Tooltip,{title:l,placement:"right",arrow:!0,children:e.jsx("div",{className:"ff-ms-2",children:e.jsx(g.MdInfoOutline,{color:"gray",size:16})})})]})]}),o!=="title-only"&&e.jsx("div",{style:{margin:"0 8px 8px",padding:8,borderRadius:4,background:"#f8f9fa",fontSize:12,textAlign:"left",color:"#212529",lineHeight:1.4},children:j!=null&&j.renderNode?j.renderNode(i):T.length>0||I.length>0?e.jsxs("div",{style:{display:"flex",flexDirection:"column"},children:[I.map((p,b)=>e.jsxs("div",{children:[e.jsx("div",{style:{color:"#6c757d"},children:"When"}),p.entries.slice(0,3).map((v,A,ye)=>{const me=v.field||"",je=v.fieldLabel||L(me),be=v.operator||"",B=v.value==null?"":typeof v.value=="object"?R(v.value):String(v.value),Ne=v.connector||"and";return e.jsxs("div",{style:{display:"flex",alignItems:"center",flexWrap:"wrap",marginTop:4},children:[e.jsx("span",{style:{fontWeight:700,marginRight:4,color:"#212529"},children:je}),e.jsx("span",{style:{color:"#6c757d",marginRight:4},children:be}),e.jsx("span",{style:{color:"#212529",marginRight:4},title:B,children:B}),A<ye.length-1&&e.jsx("span",{style:{background:"#0d6efd",color:"#fff",fontWeight:700,marginLeft:4,padding:"0 4px",borderRadius:2,textTransform:"uppercase",fontSize:10},children:Ne})]},A)}),p.entries.length>3&&e.jsxs("div",{style:{color:"#6c757d",fontSize:11,marginTop:2},children:["+",p.entries.length-3," more"]})]},`cond-${b}`)),T.length>0&&e.jsx("div",{style:{marginTop:4,color:"#212529",display:"flex",justifyContent:"flex-start"},children:(j==null?void 0:j.label)||n}),T.length>0&&e.jsxs("div",{style:{display:"flex",flexWrap:"wrap",gap:4,marginTop:4},children:[T.slice(0,6).map(([p,b])=>e.jsx("span",{title:`${L(p)}: ${R(b)}`,style:{background:"#212529",color:"#fff",padding:"4px 8px",borderRadius:4,fontSize:11},children:R(b)},p)),T.length>6&&e.jsxs("span",{style:{color:"#6c757d",fontSize:11,alignSelf:"center"},children:["+",T.length-6]})]})]}):ue?e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:W.map((p,b)=>e.jsx("span",{title:p,style:{background:"#212529",color:"#fff",padding:"4px 8px",borderRadius:4,fontSize:11},children:p},b))}):e.jsx("span",{style:{color:"#6c757d"},children:(x==null?void 0:x.clickEditToConfigure)??"Click edit to configure"})})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}})]})},O=2;function Ce(t,i,s){const d=(t==null?void 0:t.toLowerCase())||(i?"sequential":null);return d?(s==null?void 0:s[d])??d.charAt(0).toUpperCase()+d.slice(1):null}function ze(t){var o,x;const i=Array.isArray(t.userIds)?t.userIds.length:0,s=((o=t.groupName)==null?void 0:o.trim())??"",d=((x=t.roleName)==null?void 0:x.trim())??"",a=i>0||!!s||!!d;return s?{label:`Group: ${s}`,configured:!0}:d?{label:`Role: ${d}`,configured:!0}:i>0?{label:`${i} approver${i!==1?"s":""}`,configured:!0}:{label:"Not configured",configured:a}}const fe=({id:t,data:i})=>{const{onEditNode:s,onDeleteNode:d}=P(),{approvalData:a,isPreview:o=!1,_branchRail:x,executionModeLabel:n}=i,r=(a==null?void 0:a.policy)??{},f=r.stages??[],u=f.length,h=f.slice(0,O),m=u-O,y=r.name??r.policyName??"Untitled Policy";return e.jsxs("div",{style:{width:350,position:"relative"},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #ffe082",borderRadius:8,background:"#fff",overflow:"hidden"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 8px 8px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded",style:{width:25,height:25,background:"rgba(251,192,45,0.2)"},children:e.jsx(g.MdCheckCircle,{style:{color:"#FBC02D"},size:16})}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:"Approval Policy"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[!o&&e.jsx("div",{role:"button",tabIndex:0,style:{cursor:"pointer"},onClick:l=>{l.stopPropagation(),s(t)},onKeyDown:l=>{l.key==="Enter"&&(l.stopPropagation(),s(t))},"data-testid":"approval-node-edit-btn",children:e.jsx(g.MdOutlineModeEdit,{size:16,className:"ff-text-secondary"})}),!o&&e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,style:{cursor:"pointer"},onClick:l=>{l.stopPropagation(),d(t)},onKeyDown:l=>{l.key==="Enter"&&(l.stopPropagation(),d(t))},"data-testid":"approval-node-delete-btn",children:e.jsx(g.MdDeleteOutline,{color:"red",size:16})}),e.jsx(z.Tooltip,{title:"This approval policy determines who must approve a request before the workflow continues.",arrow:!0,placement:"right",children:e.jsx("span",{className:"ff-ms-2 ff-d-inline-flex",children:e.jsx(g.MdInfoOutline,{color:"gray",size:16})})})]})]}),e.jsx("div",{className:"ff-text-truncate ff-text-dark ff-fw-bold",style:{margin:"0 10px 8px",fontSize:13},title:y,children:y}),e.jsx("div",{style:{margin:"0 10px 10px",display:"flex",flexDirection:"column",gap:8},children:f.length===0?e.jsx("div",{className:"ff-text-center",style:{fontSize:12,color:"#9e9e9e",padding:"14px 0",borderRadius:6,border:"1px dashed #FEE79A",background:"#FFFDE7"},children:"No stages configured"}):e.jsxs(e.Fragment,{children:[h.map((l,j)=>{var E;const S=((E=l.stageName)==null?void 0:E.trim())||`Stage ${j+1}`,{label:N,configured:k}=ze(l),C=Ce(l.executionMode,l.isSequential,n);return e.jsxs("div",{style:{background:"#f5f5f5",borderRadius:6,padding:8},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center",style:{gap:8},children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-flex-shrink-0",style:{width:28,height:28,borderRadius:"50%",background:"#f5f5f5b6",border:"1px solid #E0E0E0",color:"#424242",fontSize:12,fontWeight:700},children:j+1}),e.jsx("div",{className:"ff-text-dark ff-text-truncate",style:{fontSize:12,fontWeight:700,marginRight:"auto"},children:S}),e.jsxs("div",{className:`ff-d-flex ff-align-items-center ff-flex-shrink-0 ${k?"ff-text-dark":"ff-text-muted"}`,style:{gap:4,fontSize:12},children:[e.jsx(g.MdPeople,{size:15,style:{color:k?"#5D4037":"#9E9E9E"}}),N]})]}),C&&e.jsxs("div",{className:"ff-d-flex ff-align-items-center",style:{gap:4,fontSize:11,color:"#1a73e8",marginTop:4,paddingLeft:36},children:[e.jsx(g.MdArrowForward,{size:11}),C]})]},j)}),m>0&&e.jsxs("div",{className:"ff-text-primary",style:{fontSize:12,marginTop:4,cursor:o?"default":"pointer",color:"#1976d2"},role:o?void 0:"button",tabIndex:o?void 0:0,onClick:l=>{o||(l.stopPropagation(),s(t))},onKeyDown:l=>{o||(l.key==="Enter"||l.key===" ")&&(l.stopPropagation(),s(t))},children:["+ ",m," More Stage",m>1?"s":""]})]})})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}}),x&&e.jsx(de,{rail:x,cardWidth:350})]})},pe=({id:t,data:i})=>{const{onEditNode:s,onDeleteNode:d}=P(),{duration:a,unit:o}=i,x=a!=null&&o,n=x?`Wait ${a} ${o}`:"Not configured";return e.jsxs("div",{style:{width:350},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b0bec5",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center ff-mx-2 ff-mt-2 ff-mb-1",children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded",style:{width:25,height:25,background:"rgba(33,150,243,0.1)"},children:e.jsx(g.MdSchedule,{size:16,color:"#1976d2"})}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:"Delay"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:r=>{r.stopPropagation(),s(t)},onKeyDown:r=>{r.key==="Enter"&&(r.stopPropagation(),s(t))},children:e.jsx(g.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:r=>{r.stopPropagation(),d(t)},onKeyDown:r=>{r.key==="Enter"&&(r.stopPropagation(),d(t))},children:e.jsx(g.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{className:"ff-mx-2 ff-mb-2 ff-p-2 ff-rounded",style:{background:"#fafafa",fontSize:12},children:e.jsx("span",{className:x?"ff-text-dark ff-fw-medium":"ff-text-muted",children:n})})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}})]})},K={email:{label:"Email",bg:"#e3f2fd",color:"#1565c0",iconType:g.MdEmail},slack:{label:"Slack",bg:"#e8f5e9",color:"#2e7d32",iconType:g.MdNotifications},teams:{label:"MS Teams",bg:"#ede7f6",color:"#4527a0",iconType:g.MdNotifications},sms:{label:"SMS",bg:"#fce4ec",color:"#880e4f",iconType:g.MdSms},"in-app":{label:"In-App",bg:"#fff3e0",color:"#e65100",iconType:g.MdNotifications},webhook:{label:"Webhook",bg:"#f3e5f5",color:"#6a1b9a",iconType:g.MdWebhook}},Ie={label:"Notification",bg:"rgba(156,39,176,0.1)",color:"#7b1fa2",iconType:g.MdNotifications};function Ae(t){var i;switch(t.channel){case"email":return((i=t.emailTo)==null?void 0:i.join(", "))??t.recipient??null;case"slack":return t.slackChannel??null;case"teams":return t.teamsMessage?"Message configured":null;case"sms":return t.smsTo??null;case"in-app":return t.inAppRecipient??null;case"webhook":return t.webhookUrl??null;default:return t.recipient??null}}function De(t){switch(t.channel){case"email":return t.emailSubject??t.subject??null;case"slack":{const i=t.slackMessage;return i?i.length>60?`${i.slice(0,60)}…`:i:null}case"in-app":return t.inAppTitle??null;default:return t.subject??null}}const xe=({id:t,data:i})=>{const{onEditNode:s,onDeleteNode:d}=P(),a=i,o=a.channel&&K[a.channel]?K[a.channel]:Ie,x=Ae(a),n=De(a),r=!!(a.channel&&x),f=o.iconType;return e.jsxs("div",{style:{width:D.NODE_WIDTH},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b0bec5",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded",style:{width:25,height:25,background:o.bg},children:e.jsx(f,{size:16,color:o.color})}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:a.channel?`${o.label} Notification`:"Notification"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:u=>{u.stopPropagation(),s(t)},onKeyDown:u=>{(u.key==="Enter"||u.key===" ")&&(u.stopPropagation(),s(t))},children:e.jsx(g.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:u=>{u.stopPropagation(),d(t)},onKeyDown:u=>{(u.key==="Enter"||u.key===" ")&&(u.stopPropagation(),d(t))},children:e.jsx(g.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#fafafa",fontSize:12},children:r?e.jsxs("div",{className:"ff-d-flex ff-flex-column ff-gap-1",children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("span",{className:"ff-px-2 ff-py-1 ff-rounded",style:{fontSize:10,background:o.bg,color:o.color,fontWeight:600,flexShrink:0},children:o.label}),e.jsx("span",{className:"ff-text-dark ff-text-truncate",style:{maxWidth:220},children:x})]}),n&&e.jsx("span",{className:"ff-text-muted ff-text-truncate",style:{maxWidth:280},children:n})]}):e.jsx("span",{className:"ff-text-muted",children:"Not configured"})})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}})]})},_={"api-key":"API Key",hmac:"HMAC"},ge=({data:t})=>{const{onClickAddTrigger:i}=P(),{label:s="Webhook Trigger",endpointUrl:d,authMethod:a,source:o}=t,x=r=>{r.stopPropagation(),i()},n=r=>{r.stopPropagation(),d&&navigator.clipboard.writeText(d).catch(()=>{})};return e.jsxs("div",{style:{width:D.NODE_WIDTH},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #90caf9",borderRadius:8,background:"#fff",overflow:"hidden"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:28,height:28,borderRadius:6,background:"rgba(33,150,243,0.1)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx(g.MdWebhook,{size:16,color:"#1565c0"})}),e.jsx("span",{style:{fontSize:13,fontWeight:600,color:"#212121"},children:"Webhook Trigger"})]}),e.jsx("div",{role:"button",tabIndex:0,onClick:x,onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&x(r)},className:"ff-d-flex ff-align-items-center",style:{paddingRight:4,cursor:"pointer"},children:e.jsx(g.MdOutlineModeEdit,{size:16,color:"#555"})})]}),e.jsxs("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#e3f2fd",border:"1px solid #90caf9"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-flex-wrap ff-gap-2 ff-mb-1",children:[e.jsx("span",{style:{fontSize:12,color:"#1565c0",fontWeight:600},children:s}),o&&e.jsx("span",{className:"ff-px-2 ff-py-1 ff-rounded",style:{fontSize:11,background:"#fff",border:"1px solid #90caf9",color:"#1565c0"},children:o}),a&&a!=="none"&&_[a]&&e.jsx("span",{className:"ff-px-2 ff-py-1 ff-rounded",style:{fontSize:10,background:"#1565c0",color:"#fff",fontWeight:600},children:_[a]})]}),d&&e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-1",style:{marginTop:4},children:[e.jsx("span",{style:{fontSize:10,color:"#1565c0",fontFamily:"monospace",flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:d}),e.jsx(z.Tooltip,{title:"Copy URL",placement:"top",arrow:!0,children:e.jsx("div",{role:"button",tabIndex:0,onClick:n,onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&n(r)},style:{cursor:"pointer",flexShrink:0},children:e.jsx(g.MdContentCopy,{size:12,color:"#1565c0"})})})]})]})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}})]})},he=({id:t,data:i})=>{var m;const{onEditNode:s,onDeleteNode:d,nodeRegistry:a}=P(),{method:o,url:x,descriptorType:n}=i,r=n?(m=a==null?void 0:a.forType(n))==null?void 0:m.icon:e.jsx(g.MdHttp,{size:16,color:"#546e7a"}),f=!!(o&&x),u=(o==null?void 0:o.toUpperCase())??"",h=D.HTTP_METHOD_STYLE[u]??null;return e.jsxs("div",{style:{width:D.NODE_WIDTH},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b0bec5",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:25,height:25,display:"flex",alignItems:"center",justifyContent:"center"},children:r}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:"REST API Call"})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:y=>{y.stopPropagation(),s(t)},onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.stopPropagation(),s(t))},children:e.jsx(g.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:y=>{y.stopPropagation(),d(t)},onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.stopPropagation(),d(t))},children:e.jsx(g.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#fafafa",fontSize:12},children:f?e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[h&&e.jsx("span",{style:{fontSize:10,fontWeight:700,padding:"2px 6px",borderRadius:4,background:h.bg,color:h.color,flexShrink:0},children:u}),e.jsx("span",{className:"ff-text-dark ff-text-truncate",style:{fontFamily:"monospace",fontSize:11},title:x,children:x})]}):e.jsx("span",{className:"ff-text-muted",children:"Not configured"})})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}})]})},Le={eq:"=",neq:"≠",gt:">",gte:"≥",lt:"<",lte:"≤",contains:"contains",startsWith:"starts with",endsWith:"ends with",isEmpty:"is empty",isNotEmpty:"is not empty"},Re=({id:t,data:i})=>{const{onEditNode:s,onDeleteNode:d}=P(),{title:a="Condition Branch",branchConfigs:o=[],defaultBranch:x}=i,n=o.length>0;return e.jsxs("div",{style:{width:D.NODE_WIDTH},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #b39ddb",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:25,height:25,borderRadius:6,background:"rgba(103,58,183,0.1)",display:"flex",alignItems:"center",justifyContent:"center"},children:e.jsx(g.MdCallSplit,{size:16,color:"#512da8"})}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:a})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:r=>{r.stopPropagation(),s(t)},onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&(r.stopPropagation(),s(t))},children:e.jsx(g.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:r=>{r.stopPropagation(),d(t)},onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&(r.stopPropagation(),d(t))},children:e.jsx(g.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:"#fafafa",fontSize:12},children:n?e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:4},children:[o.map((r,f)=>{var y,l;const u=D.BRANCH_PALETTE[f%D.BRANCH_PALETTE.length],h=(y=r.conditions)==null?void 0:y[0],m=(((l=r.conditions)==null?void 0:l.length)??0)-1;return e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx("span",{style:{fontSize:10,fontWeight:600,padding:"2px 7px",borderRadius:10,background:u.bg,color:u.color,flexShrink:0},children:r.label||r.key}),h?e.jsxs("span",{style:{fontSize:11,color:"#616161",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:[h.field," ",Le[h.operator]??h.operator,h.value?` ${h.value}`:"",m>0?` +${m} more`:""]}):e.jsx("span",{style:{fontSize:11,color:"#9e9e9e"},children:"No conditions yet"})]},r.key)}),x&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginTop:2},children:[e.jsx("span",{style:{fontSize:10,fontWeight:600,padding:"2px 7px",borderRadius:10,background:"#f5f5f5",color:"#757575",flexShrink:0},children:"Default"}),e.jsx("span",{style:{fontSize:11,color:"#9e9e9e"},children:"fallback path"})]})]}):e.jsx("span",{className:"ff-text-muted",children:"Not configured — click edit to add branches"})})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}})]})},We=({id:t,data:i})=>{var y;const{onEditNode:s,onDeleteNode:d,nodeRegistry:a}=P(),{title:o="Sub-Workflow",workflowId:x,workflowLabel:n,descriptorType:r,onPreview:f}=i,u=r?(y=a==null?void 0:a.forType(r))==null?void 0:y.icon:e.jsx(g.MdAccountTree,{size:16,color:"#00695c"}),h=!!x,m=l=>{l.stopPropagation(),x&&f&&f(x)};return e.jsxs("div",{style:{width:D.NODE_WIDTH},children:[e.jsx(c.Handle,{type:"target",position:c.Position.Top,style:{opacity:0}}),e.jsxs("div",{style:{border:"1.5px solid #80cbc4",borderRadius:8,background:"#fff"},children:[e.jsxs("div",{className:"ff-d-flex ff-justify-content-between ff-align-items-center",style:{padding:"10px 6px"},children:[e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-gap-2",children:[e.jsx("div",{style:{width:25,height:25,borderRadius:6,background:"rgba(0,137,123,0.1)",display:"flex",alignItems:"center",justifyContent:"center"},children:u}),e.jsx("span",{className:"ff-fw-medium ff-text-dark",style:{fontSize:14},children:o})]}),e.jsxs("div",{className:"node-actions ff-d-flex ff-align-items-center",children:[e.jsx("div",{role:"button",tabIndex:0,onClick:l=>{l.stopPropagation(),s(t)},onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.stopPropagation(),s(t))},children:e.jsx(g.MdOutlineModeEdit,{size:16})}),e.jsx("div",{className:"ff-ms-2",role:"button",tabIndex:0,onClick:l=>{l.stopPropagation(),d(t)},onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.stopPropagation(),d(t))},children:e.jsx(g.MdDeleteOutline,{color:"red",size:16})})]})]}),e.jsx("div",{style:{margin:"0 6px 10px",padding:"10px 12px",borderRadius:6,background:h?"#e0f2f1":"#fafafa",fontSize:12,border:h?"1px solid #b2dfdb":"none"},children:h?e.jsxs("div",{className:"ff-d-flex ff-align-items-center ff-justify-content-between",children:[e.jsxs("div",{className:"ff-d-flex ff-flex-column ff-gap-1",children:[e.jsx("span",{style:{fontSize:12,fontWeight:600,color:"#00695c"},children:n||x}),e.jsxs("span",{style:{fontSize:10,color:"#80cbc4",fontFamily:"monospace"},children:["ID: ",x]})]}),f&&e.jsxs("div",{role:"button",tabIndex:0,onClick:m,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&m(l)},style:{cursor:"pointer",display:"flex",alignItems:"center",gap:3,fontSize:11,color:"#00897b"},children:[e.jsx(g.MdOpenInNew,{size:13}),"Preview"]})]}):e.jsx("span",{className:"ff-text-muted",children:"Not configured — select a workflow"})})]}),e.jsx(c.Handle,{type:"source",position:c.Position.Bottom,style:{opacity:0}})]})},Me={startNode:ne,endNode:se,addTriggerNode:ie,addStepNode:Se,triggerNode:le,eventNode:Pe,filterNode:ce,actionNode:ae,approvalNode:fe,delayNode:pe,notificationNode:xe,webhookTriggerNode:ge,restApiNode:he,conditionBranchNode:Re,subWorkflowNode:We},$e=11.5,q=2,M=6,U=40,V=20,G=4,He=({id:t,sourceX:i,sourceY:s,targetX:d,targetY:a,sourcePosition:o,targetPosition:x,source:n,target:r,data:f})=>{const[u,h,m]=c.getStraightPath({sourceX:i,sourceY:s,targetX:d,targetY:a}),y=f==null?void 0:f.label,l=y==="Pass",j=l||y==="Fail",S=i+(d-i)/3,N=s+(a-s)/3,k=i+2*(d-i)/3,C=s+2*(a-s)/3,E=f==null?void 0:f.onAddStepClick,L=I=>{if(I.stopPropagation(),typeof E!="function")return;const W={edgeId:t,nodeId:n,sourceNodeId:n,targetNodeId:r,position:"between",referenceNodeId:n,referenceNodeType:f==null?void 0:f.referenceNodeType,stepVisibility:f==null?void 0:f.stepVisibility};E(n,W)},R=I=>{(I.key==="Enter"||I.key===" ")&&(I.preventDefault(),L(I))},T=()=>e.jsxs(e.Fragment,{children:[e.jsxs("g",{className:"plus-icon-container",children:[e.jsx("circle",{r:$e,className:"edge-plus-circle"}),e.jsx("line",{x1:0,y1:-M,x2:0,y2:M,strokeWidth:q,strokeLinecap:"round",className:"plus-line"}),e.jsx("line",{x1:-M,y1:0,x2:M,y2:0,strokeWidth:q,strokeLinecap:"round",className:"plus-line"})]}),e.jsxs("g",{className:"edge-plus-tooltip",transform:"translate(18, 0)",children:[e.jsx("rect",{x:0,y:-10,width:65,height:20,rx:4,className:"tooltip-bg"}),e.jsx("path",{d:"M0 -4 L-4 0 L0 4 Z",className:"tooltip-bg"}),e.jsx("text",{x:32,y:0,textAnchor:"middle",dominantBaseline:"central",fill:"white",style:{fontSize:10,fontWeight:600,pointerEvents:"none"},children:"Add Step"})]})]}),w=E?{onClick:L,onKeyDown:R,role:"button",tabIndex:0,style:{cursor:"pointer",pointerEvents:"all"}}:{style:{cursor:"default",pointerEvents:"all"}};return e.jsxs("g",{className:"edge-with-plus-wrapper",children:[e.jsx(c.BaseEdge,{id:t,path:u}),j?e.jsxs(e.Fragment,{children:[e.jsxs("g",{transform:`translate(${S}, ${N})`,children:[e.jsx("rect",{x:-U/2,y:-V/2,width:U,height:V,rx:G,ry:G,fill:l?"#ADE6C5":"#FDBFBF"}),e.jsx("text",{textAnchor:"middle",dominantBaseline:"central",fill:l?"#1DBF60":"#C50000",style:{fontSize:12,fontWeight:500},children:y})]}),e.jsx("g",{className:"nodrag nopan edge-plus-svg",transform:`translate(${k}, ${C})`,"data-testid":"plus-node-icon",...w,children:e.jsx(T,{})})]}):e.jsx("g",{className:"nodrag nopan edge-plus-svg",transform:`translate(${h}, ${m})`,"data-testid":"plus-node-icon",...w,children:e.jsx(T,{})})]})},Fe=11.5,Z=2,$=6,Be=({id:t,sourceX:i,sourceY:s,targetX:d,targetY:a,source:o,target:x,data:n})=>{const[r,f,u]=c.getStraightPath({sourceX:i,sourceY:s,targetX:d,targetY:a}),h=n==null?void 0:n.onAddStepClick,m=l=>{l.stopPropagation(),typeof h=="function"&&h(o,{edgeId:t,nodeId:o,sourceNodeId:o,targetNodeId:x,position:"between",referenceNodeId:o,referenceNodeType:n==null?void 0:n.referenceNodeType,stepVisibility:n==null?void 0:n.stepVisibility,filterId:n==null?void 0:n.filterId,branch:n==null?void 0:n.branch})},y=l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),m(l))};return e.jsxs("g",{className:"edge-with-plus-wrapper",children:[e.jsx(c.BaseEdge,{id:t,path:r,style:{stroke:"#b0bec5"}}),e.jsxs("g",{className:"nodrag nopan edge-plus-svg",transform:`translate(${f}, ${u})`,style:{cursor:h?"pointer":"default",pointerEvents:"all",outline:"none"},onClick:h?m:void 0,onKeyDown:h?y:void 0,role:h?"button":void 0,tabIndex:h?0:void 0,"data-testid":"plus-node-icon",children:[e.jsx("circle",{r:Fe,className:"edge-plus-circle"}),e.jsx("line",{x1:0,y1:-$,x2:0,y2:$,strokeWidth:Z,strokeLinecap:"round",className:"plus-line"}),e.jsx("line",{x1:-$,y1:0,x2:$,y2:0,strokeWidth:Z,strokeLinecap:"round",className:"plus-line"}),e.jsxs("g",{className:"edge-plus-tooltip",transform:"translate(18, 0)",children:[e.jsx("rect",{x:0,y:-10,width:65,height:20,rx:4,className:"tooltip-bg"}),e.jsx("path",{d:"M0 -4 L-4 0 L0 4 Z",className:"tooltip-bg"}),e.jsx("text",{x:32,y:0,textAnchor:"middle",dominantBaseline:"central",fill:"white",style:{fontSize:10,fontWeight:600,pointerEvents:"none"},children:"Add Step"})]})]})]})},Oe=({id:t,sourceX:i,sourceY:s,targetX:d,targetY:a})=>{const[o]=c.getStraightPath({sourceX:i,sourceY:s,targetX:d,targetY:a});return e.jsx(c.BaseEdge,{id:t,path:o,style:{stroke:"#b0bec5"}})},Ke=11.5,Y=2,H=6,_e=-24,J=40,Q=20,X=4,qe=({id:t,sourceX:i,sourceY:s,targetX:d,targetY:a,source:o,target:x,data:n})=>{const[r,f,u]=c.getStraightPath({sourceX:i,sourceY:s,targetX:d,targetY:a}),h=n==null?void 0:n.label,m=h==="Pass",y=m||h==="Fail",l=n==null?void 0:n.onAddStepClick,j=(n==null?void 0:n.showPlus)!==!1&&!!l,S=k=>{k.stopPropagation(),typeof l=="function"&&l(o,{edgeId:t,nodeId:o,sourceNodeId:o,targetNodeId:x,position:"between",referenceNodeId:o,referenceNodeType:n==null?void 0:n.referenceNodeType,stepVisibility:n==null?void 0:n.stepVisibility})},N=k=>{(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),S(k))};return e.jsxs("g",{className:"edge-with-plus-wrapper",children:[e.jsx(c.BaseEdge,{id:t,path:r,style:{stroke:"#b0bec5"}}),e.jsxs("g",{className:"nodrag nopan edge-plus-svg",transform:`translate(${f}, ${u})`,style:{cursor:l?"pointer":"default",pointerEvents:"all",outline:"none"},onClick:l?S:void 0,onKeyDown:l?N:void 0,role:l?"button":void 0,tabIndex:l?0:void 0,children:[y&&e.jsxs("g",{transform:`translate(0, ${j?_e:0})`,children:[e.jsx("rect",{x:-J/2,y:-Q/2,width:J,height:Q,rx:X,ry:X,fill:m?"#ADE6C5":"#FDBFBF"}),e.jsx("text",{textAnchor:"middle",dominantBaseline:"central",fill:m?"#1DBF60":"#C50000",style:{fontSize:12,fontWeight:500},children:h})]}),j&&e.jsxs("g",{className:"plus-icon-container",children:[e.jsx("circle",{r:Ke,className:"edge-plus-circle"}),e.jsx("line",{x1:0,y1:-H,x2:0,y2:H,strokeWidth:Y,strokeLinecap:"round",className:"plus-line"}),e.jsx("line",{x1:-H,y1:0,x2:H,y2:0,strokeWidth:Y,strokeLinecap:"round",className:"plus-line"})]}),j&&e.jsxs("g",{className:"edge-plus-tooltip",transform:"translate(22, 0)",children:[e.jsx("rect",{x:0,y:-10,width:65,height:20,rx:4,className:"tooltip-bg"}),e.jsx("path",{d:"M0 -4 L-4 0 L0 4 Z",className:"tooltip-bg"}),e.jsx("text",{x:32,y:0,textAnchor:"middle",dominantBaseline:"central",fill:"white",style:{fontSize:10,fontWeight:600,pointerEvents:"none"},children:"Add Step"})]})]})]})},Ue=({id:t,source:i,target:s,sourceX:d,sourceY:a,targetX:o,targetY:x,style:n={},markerEnd:r,data:f})=>{const u=(f==null?void 0:f.verticalRouting)??!1,h=30,m=u?(()=>{const w=x-h;return`M ${d},${w} L ${o},${w} L ${o},${x}`})():(()=>{const w=a+30;return`M ${d},${a} L ${d},${w} L ${o},${w} L ${o},${x}`})(),y=n.stroke||"#d1d5db",l=f==null?void 0:f.label,j=(f==null?void 0:f.isFirst)??!1,S=f==null?void 0:f.onAddStepClick,N=u?x-h:a+30,k=d+(o-d)*(u?.25:.35),C=d+(o-d)*(u?.65:.7),E=N,L=w=>{w.stopPropagation(),S&&S(i,{edgeId:t,nodeId:i,sourceNodeId:i,targetNodeId:s,position:"between",referenceNodeId:i,filterId:f==null?void 0:f.filterId,branch:f==null?void 0:f.branch})},R=11.5,T=6;return e.jsxs("g",{children:[e.jsx("path",{id:t,d:m,fill:"none",stroke:y,strokeWidth:1.5,markerEnd:r}),l&&!u&&e.jsx("g",{transform:`translate(${k}, ${E})`,children:(()=>{const w=Math.max(44,l.length*7+20);return e.jsxs(e.Fragment,{children:[e.jsx("rect",{x:-w/2,y:-11,width:w,height:22,rx:11,fill:j?"#e8f5e9":"#ffebee",stroke:j?"#81c784":"#e57373",strokeWidth:1}),e.jsx("text",{x:0,y:4,textAnchor:"middle",fontSize:10,fontWeight:600,fill:j?"#2e7d32":"#c62828",style:{fontFamily:"sans-serif",pointerEvents:"none"},children:l})]})})()}),S&&e.jsxs("g",{transform:`translate(${C}, ${E})`,onClick:L,style:{cursor:"pointer",pointerEvents:"all"},className:"nodrag nopan edge-plus-svg",children:[e.jsx("circle",{r:R,className:"edge-plus-circle"}),e.jsx("line",{x1:0,y1:-T,x2:0,y2:T,strokeWidth:2,strokeLinecap:"round",className:"plus-line"}),e.jsx("line",{x1:-T,y1:0,x2:T,y2:0,strokeWidth:2,strokeLinecap:"round",className:"plus-line"})]})]})};exports.ActionNode=ae;exports.AddTriggerNode=ie;exports.ApprovalNode=fe;exports.DelayNode=pe;exports.EdgeWithPlusLabel=He;exports.EndNode=se;exports.FilterNode=ce;exports.GatewayBranchEdge=Ue;exports.LabelPlusEdge=qe;exports.NotificationNode=xe;exports.PlainEdge=Oe;exports.PlusEdge=Be;exports.RestApiNode=he;exports.StartNode=ne;exports.TriggerNode=le;exports.WebhookTriggerNode=ge;exports.WorkflowCanvasContext=te;exports.builtInNodeTypes=Me;
2
+ //# sourceMappingURL=GatewayBranchEdge-6rCziASt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayBranchEdge-6rCziASt.js","sources":["../src/WorkflowCanvas/WorkflowCanvasContext.ts","../src/WorkflowCanvas/nodes/StartNode.tsx","../src/WorkflowCanvas/nodes/EndNode.tsx","../src/WorkflowCanvas/nodes/AddTriggerNode.tsx","../src/WorkflowCanvas/nodes/AddStepNode.tsx","../src/WorkflowCanvas/nodes/TriggerNode.tsx","../src/WorkflowCanvas/nodes/EventNode.tsx","../src/WorkflowCanvas/nodes/BranchRailDecoration.tsx","../src/WorkflowCanvas/nodes/FilterNode.tsx","../src/WorkflowCanvas/nodes/ActionNode.tsx","../src/WorkflowCanvas/nodes/ApprovalNode.tsx","../src/WorkflowCanvas/nodes/DelayNode.tsx","../src/WorkflowCanvas/nodes/NotificationNode.tsx","../src/WorkflowCanvas/nodes/WebhookTriggerNode.tsx","../src/WorkflowCanvas/nodes/RestApiNode.tsx","../src/WorkflowCanvas/nodes/ConditionBranchNode.tsx","../src/WorkflowCanvas/nodes/SubWorkflowNode.tsx","../src/WorkflowCanvas/nodes/index.ts","../src/WorkflowCanvas/edges/EdgeWithPlusLabel.tsx","../src/WorkflowCanvas/edges/PlusEdge.tsx","../src/WorkflowCanvas/edges/PlainEdge.tsx","../src/WorkflowCanvas/edges/LabelPlusEdge.tsx","../src/WorkflowCanvas/edges/GatewayBranchEdge.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\r\nimport { defaultFlowForgeMessages } from './messages';\r\nimport { FlowForgeMessages } from './types';\r\nimport type { NodeTypeRegistry } from '../nodeRegistry';\r\n\r\nexport interface CanvasHandlers {\r\n onEditNode: (slotId: string) => void;\r\n onDeleteNode: (slotId: string) => void;\r\n onAddStep: (afterSlotId: string) => void;\r\n onClickAddTrigger: () => void;\r\n messages: FlowForgeMessages;\r\n nodeRegistry: NodeTypeRegistry | null;\r\n /** How much of a node's data to show on its card. Default: 'full'. */\r\n nodeBody?: 'full' | 'title-only';\r\n}\r\n\r\nexport const WorkflowCanvasContext = createContext<CanvasHandlers>({\r\n onEditNode: () => {},\r\n onDeleteNode: () => {},\r\n onAddStep: () => {},\r\n onClickAddTrigger: () => {},\r\n messages: defaultFlowForgeMessages,\r\n nodeRegistry: null,\r\n nodeBody: 'full',\r\n});\r\n\r\nexport const useCanvasHandlers = () => useContext(WorkflowCanvasContext);\r\n","import React from 'react';\r\nimport { Handle, Position } from 'reactflow';\r\n\r\nconst StartNode = () => (\r\n <div style={{ width: 350, display: 'flex', justifyContent: 'center' }}>\r\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0, left: '50%' }} />\r\n <div style={{ padding: '8px 28px', borderRadius: 999, background: '#f5f5f5', border: '1.5px solid #bdbdbd', fontSize: 13, fontWeight: 500, color: '#424242', userSelect: 'none' }}>\r\n Start\r\n </div>\r\n </div>\r\n);\r\n\r\nexport default StartNode;\r\n","import React from 'react';\r\nimport { Handle, Position } from 'reactflow';\r\n\r\nconst EndNode = () => (\r\n <div style={{ width: 350, display: 'flex', justifyContent: 'center' }}>\r\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0, left: '50%' }} />\r\n <div style={{ padding: '8px 28px', borderRadius: 999, background: '#f5f5f5', border: '1.5px solid #bdbdbd', fontSize: 13, fontWeight: 500, color: '#424242', userSelect: 'none' }}>\r\n End\r\n </div>\r\n </div>\r\n);\r\n\r\nexport default EndNode;\r\n","import React from 'react';\r\nimport { Handle, Position } from 'reactflow';\r\nimport { Tooltip } from '@mui/material';\r\nimport { GrTrigger } from 'react-icons/gr';\r\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\r\n\r\nconst AddTriggerNode = () => {\r\n const { onClickAddTrigger, messages } = useCanvasHandlers();\r\n return (\r\n <div style={{ width: 350, display: 'flex', justifyContent: 'center' }}>\r\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0, left: '50%' }} />\r\n <Tooltip title={messages.addTriggerTooltip} placement=\"top\" arrow>\r\n <div\r\n onClick={onClickAddTrigger}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter') onClickAddTrigger(); }}\r\n style={{ padding: '10px 24px', borderRadius: 8, border: '1.5px dashed #d0d0d0', background: '#fff', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8 }}\r\n >\r\n <GrTrigger size={16} />\r\n <span className=\"ff-text-black\" style={{ fontSize: 13 }} data-testid=\"add-trigger-btn-text\">\r\n {messages.addTriggerButton}\r\n </span>\r\n </div>\r\n </Tooltip>\r\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0, left: '50%' }} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default AddTriggerNode;\r\n","import React from 'react';\r\nimport { Handle, Position, NodeProps } from 'reactflow';\r\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\r\n\r\nconst AddStepNode = ({ id }: NodeProps) => {\r\n const { onAddStep } = useCanvasHandlers();\r\n return (\r\n <div\r\n onClick={() => onAddStep(id)}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter') onAddStep(id); }}\r\n style={{ width: 28, height: 28, borderRadius: '50%', border: '1.5px solid #9e9e9e', background: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', fontSize: 18, color: '#757575', lineHeight: 1, userSelect: 'none' }}\r\n >\r\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\r\n +\r\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default AddStepNode;\r\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { Chip, Tooltip } from '@mui/material';\nimport { MdInput, MdOutlineModeEdit, MdInfoOutline } from 'react-icons/md';\nimport { FaCheckCircle, FaTimesCircle } from 'react-icons/fa';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\n\ninterface TriggerSource {\n value?: string;\n label?: string;\n}\n\ninterface TriggerExecutionStatus {\n status?: 'success' | 'failed' | string;\n}\n\ninterface TriggerNodeData {\n /** Trigger flavour. 'event' = event-based; 'scheduler' = cron/scheduler; absent = nothing chosen yet. */\n type?: 'event' | 'scheduler';\n /** Raw event-type code (e.g. 'PAM_TICKET_CREATED'). The human label\n * should be passed via `label` (curated) — `eventType` is only humanized\n * as a fallback. */\n eventType?: string;\n /** Selected event sources (for type === 'event'). Each rendered as a chip. */\n sources?: TriggerSource[];\n /** Legacy / simple shape — single label + optional source, used when no `type`/`sources` are supplied. */\n label?: string;\n source?: string;\n /** Hides edit icon when previewing a stored workflow. */\n previewWorkflow?: boolean;\n /** When present, replaces the edit icon with a status badge. */\n executionStatus?: TriggerExecutionStatus;\n /** Optional info text shown in the (i) tooltip; defaults to a generic explanation. */\n infoText?: string;\n}\n\n// Last-resort humaniser for a raw code string. The package is generic — it\n// must NOT carry IAM-/PAM-/IGA-specific mappings. The host is expected to\n// supply human labels via `template.label` (merged into nodeData.label) and\n// via each source's `label` field (returned from loadTriggerSources). This\n// helper only runs when the host gave us nothing readable to display.\nfunction humaniseCode(code?: string): string {\n if (!code) return '';\n return code\n .replace(/[_-]+/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (m) => m.toUpperCase());\n}\n\n// Source label preference: host-provided `label` first, then humanise.\nfunction formatSource(s: TriggerSource | string): string {\n if (typeof s !== 'string' && s.label) return s.label;\n const value = typeof s === 'string' ? s : (s.value ?? '');\n return humaniseCode(value);\n}\n\nconst TriggerNode = ({ data }: NodeProps) => {\n const { onClickAddTrigger, messages } = useCanvasHandlers();\n const {\n type, eventType, sources,\n label, source,\n previewWorkflow, executionStatus,\n infoText = 'This node decides the flow trigger type and configuration.',\n } = (data ?? {}) as TriggerNodeData;\n\n const handleEdit = (e?: React.SyntheticEvent) => {\n e?.stopPropagation();\n onClickAddTrigger();\n };\n\n // ── Shape flags ─────────────────────────────────────────────────────────────\n const hasEventSources = Array.isArray(sources) && sources.length > 0;\n const hasSimpleShape = !!(label || source);\n\n // ── Title text — always a generic role label, never the configured value.\n // The configured value (event name, sources) lives in the body below.\n const title =\n type === 'scheduler'\n ? (messages?.schedulerTriggerTitle ?? 'Scheduler Trigger')\n : (type === 'event' || hasEventSources || hasSimpleShape)\n ? (messages?.eventTriggerSourceTitle ?? 'Event Trigger Source')\n : (messages?.selectTriggerTitle ?? 'Select Trigger');\n\n const body: React.ReactNode = (() => {\n if (type === 'scheduler') {\n return <span>{messages?.schedulerToBeConfigured ?? 'Scheduler to be configured'}</span>;\n }\n\n if (type === 'event' || hasEventSources) {\n // Prefer the template's own `label` (human-curated) over a code-derived\n // title. Falls back to a humanised form of the raw code for back-compat\n // with shapes that only carry the eventType code.\n const eventDisplay = label || humaniseCode(eventType);\n return (\n <div>\n <div className=\"ff-d-flex ff-align-items-center\">\n <span style={{ fontWeight: 600 }}>{eventDisplay}</span>\n <span className=\"ff-ms-2 ff-text-muted\" style={{ fontSize: 12 }}>via</span>\n </div>\n <div className=\"ff-d-flex ff-flex-wrap ff-mt-2\" style={{ gap: 4 }}>\n {hasEventSources ? (\n sources!.map((s, i) => (\n <Chip\n key={i}\n label={formatSource(s)}\n variant=\"outlined\"\n size=\"small\"\n className=\"ff-text-dark\"\n />\n ))\n ) : (\n <span className=\"ff-text-muted\" style={{ fontSize: 12 }}>{messages?.noSourceSelected ?? 'No source selected'}</span>\n )}\n </div>\n </div>\n );\n }\n\n if (hasSimpleShape) {\n return (\n <div className=\"ff-d-flex ff-flex-wrap ff-align-items-center\" style={{ gap: 6 }}>\n {label && <span style={{ fontWeight: 600 }}>{label}</span>}\n {source && <Chip label={source} variant=\"outlined\" size=\"small\" />}\n </div>\n );\n }\n\n return (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={handleEdit}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleEdit(e); }}\n style={{ cursor: 'pointer', color: '#1e88e5' }}\n >\n {messages?.selectTriggerCta ?? 'Click to select a trigger to start your workflow'}\n </span>\n );\n })();\n\n // ── Right-side cluster: execution status badge OR (edit + info) ─────────────\n const rightCluster = executionStatus ? (\n <>\n {executionStatus.status === 'success' && (\n <FaCheckCircle size={16} color=\"#1DBF60\" style={{ marginRight: 8 }} />\n )}\n {executionStatus.status === 'failed' && (\n <FaTimesCircle size={16} color=\"#f44336\" style={{ marginRight: 8 }} />\n )}\n </>\n ) : (\n <div className=\"ff-d-flex ff-align-items-center\">\n {!previewWorkflow && (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleEdit}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleEdit(e); }}\n className=\"ff-me-2\"\n style={{ cursor: 'pointer', color: '#212121' }}\n aria-label=\"Edit trigger\"\n >\n <MdOutlineModeEdit size={16} />\n </div>\n )}\n <Tooltip title={<div>{infoText}</div>} placement=\"right\" arrow>\n <span><MdInfoOutline color=\"gray\" size={16} /></span>\n </Tooltip>\n </div>\n );\n\n return (\n <div style={{ width: 350 }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #a5d6a7', borderRadius: 8, background: '#fff', overflow: 'hidden' }}>\n {/* Header row — original layout: icon in tinted square + small generic title */}\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '12px 14px'}}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div\n style={{\n width: 28, height: 28, borderRadius: 6,\n background: 'rgba(76,175,80,0.1)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <MdInput size={16} color=\"#388e3c\" />\n </div>\n <span style={{ fontSize: 14, fontWeight: 500, color: '#212121' }}>{title}</span>\n </div>\n <div className=\"ff-d-flex ff-align-items-center\">{rightCluster}</div>\n </div>\n\n {/* Body */}\n <div\n style={{\n background: '#f5f5f5',\n fontSize: 12,\n color: '#212121',\n padding: '14px 16px',\n margin: '0 10px 12px',\n borderRadius: 6,\n textAlign: 'left',\n }}\n >\n {body}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} id=\"1\" />\n </div>\n );\n};\n\nexport default TriggerNode;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { Chip, Tooltip } from '@mui/material';\nimport { MdInput, MdInfoOutline } from 'react-icons/md';\nimport { FaCheckCircle, FaTimesCircle } from 'react-icons/fa';\n\n/**\n * EventNode — fixed, display-only \"system event\" marker (e.g. the\n * `User Created` step that's pre-seeded in the END_USER_CREATION template).\n *\n * Shares the green/event visual language with TriggerNode but has NO edit\n * affordance — this node represents an event the system raises, not something\n * the user configures. Click → no drawer opens.\n */\n\ninterface EventSource {\n value?: string;\n label?: string;\n}\n\ninterface EventExecutionStatus {\n status?: 'success' | 'failed' | string;\n}\n\ninterface EventNodeData {\n header?: string;\n title?: string;\n eventType?: string;\n sources?: EventSource[];\n /** Optional tooltip text on the (i) icon */\n infoText?: string;\n /** Optional execution badge (success / failed) */\n executionStatus?: EventExecutionStatus;\n}\n\nfunction humanize(code?: string): string {\n if (!code) return '';\n return code.replace(/[_-]+/g, ' ').replace(/\\b\\w/g, (m) => m.toUpperCase());\n}\n\nfunction formatSource(s: EventSource | string): string {\n if (typeof s !== 'string' && s.label) return s.label;\n const value = typeof s === 'string' ? s : s.value ?? '';\n return humanize(value);\n}\n\nconst EventNode = ({ data }: NodeProps) => {\n const {\n header = 'Event',\n title,\n eventType,\n sources,\n executionStatus,\n infoText = 'This event is raised by the system. It cannot be configured.',\n } = (data ?? {}) as EventNodeData;\n\n const displayTitle = title || humanize(eventType) || '—';\n\n return (\n <div style={{ width: 350 }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #a5d6a7', borderRadius: 8, background: '#fff', overflow: 'hidden' }}>\n {/* Header row */}\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '12px 14px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div\n style={{\n width: 28, height: 28, borderRadius: 6,\n background: 'rgba(76,175,80,0.1)',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <MdInput size={16} color=\"#388e3c\" />\n </div>\n <span style={{ fontSize: 14, fontWeight: 500, color: '#212121' }}>{header}</span>\n </div>\n <div className=\"ff-d-flex ff-align-items-center\">\n {executionStatus?.status === 'success' && (\n <FaCheckCircle size={16} color=\"#1DBF60\" style={{ marginRight: 8 }} />\n )}\n {executionStatus?.status === 'failed' && (\n <FaTimesCircle size={16} color=\"#f44336\" style={{ marginRight: 8 }} />\n )}\n {!executionStatus && (\n <Tooltip title={<div>{infoText}</div>} placement=\"right\" arrow>\n <span><MdInfoOutline color=\"gray\" size={16} /></span>\n </Tooltip>\n )}\n </div>\n </div>\n\n {/* Body */}\n <div\n style={{\n background: '#f5f5f5',\n fontSize: 13,\n color: '#212121',\n padding: '14px 16px',\n margin: '0 10px 12px',\n borderRadius: 6,\n textAlign: 'left',\n }}\n >\n <div style={{ fontWeight: 600 }}>{displayTitle}</div>\n {Array.isArray(sources) && sources.length > 0 && (\n <>\n <div className=\"ff-text-muted\" style={{ fontSize: 12, marginTop: 4 }}>via</div>\n <div className=\"ff-d-flex ff-flex-wrap ff-mt-1\" style={{ gap: 4 }}>\n {sources.map((s, i) => (\n <Chip\n key={i}\n label={formatSource(s)}\n variant=\"outlined\"\n size=\"small\"\n className=\"ff-text-dark\"\n />\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} id=\"1\" />\n </div>\n );\n};\n\nexport default EventNode;\n","import React from 'react';\n\nexport interface BranchRailEntry {\n /** Y position of this branch's bullet, relative to gateway card's bottom edge */\n y: number;\n label: string;\n /** First/primary branch — used for pill coloring */\n isPass: boolean;\n}\n\nexport interface BranchRailSpec {\n branches: BranchRailEntry[];\n /** Total rail height, from gateway card bottom to end of last branch */\n height: number;\n /** Horizontal offset from gateway center to branch step center (px) */\n indent: number;\n}\n\n/**\n * Vertical rail decoration that hangs off the bottom of a gateway (filter/approval)\n * card. Provides the Workato-style visual: a left vertical line with branch bullets\n * + labels at the Y position of each branch's first step.\n *\n * Positioned absolutely so it overflows the node's bounding box without affecting\n * ReactFlow's measured size.\n */\nconst BranchRailDecoration: React.FC<{ rail: BranchRailSpec; cardWidth: number }> = ({ rail, cardWidth }) => {\n // Rail X sits just inside the gateway card's left edge, descending from card bottom.\n // Branch step center is at (cardCenter + indent). Card center is at cardWidth/2.\n // The bullet anchors on the rail and a short connector reaches the step.\n const railX = cardWidth / 2; // center of gateway card; rail descends from here\n const stepCenterX = cardWidth / 2 + rail.indent;\n const stroke = 'var(--ff-edge-color, #b0bec5)';\n\n return (\n <svg\n width={cardWidth + rail.indent + 200}\n height={rail.height}\n style={{ position: 'absolute', left: 0, top: '100%', pointerEvents: 'none', overflow: 'visible' }}\n >\n {/* Vertical rail */}\n <line x1={railX} y1={0} x2={railX} y2={rail.height} stroke={stroke} strokeWidth={1.5} />\n\n {rail.branches.map((b, idx) => {\n const bulletY = b.y;\n return (\n <g key={idx} transform={`translate(0, ${bulletY})`}>\n {/* Diamond bullet on the rail */}\n <rect\n x={railX - 5} y={-5} width={10} height={10}\n fill=\"#fff\" stroke={stroke} strokeWidth={1.5}\n transform={`rotate(45, ${railX}, 0)`}\n />\n {/* Plain-text label to the right of the bullet (Workato-style) */}\n <text x={railX + 14} y={4} fontSize={12} fontWeight={500}\n fill=\"var(--ff-text, #212121)\" style={{ fontFamily: 'sans-serif' }}>\n {b.label}\n </text>\n </g>\n );\n })}\n </svg>\n );\n};\n\nexport default BranchRailDecoration;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { FiFilter } from 'react-icons/fi';\nimport { MdInfoOutline, MdOutlineModeEdit, MdDeleteOutline } from 'react-icons/md';\nimport { Tooltip } from '@mui/material';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport BranchRailDecoration, { BranchRailSpec } from './BranchRailDecoration';\n\ninterface Condition {\n field: string;\n operator: string;\n value: string;\n logicalOperator?: string;\n}\n\nconst FilterNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\n const { conditions = [], infoText = 'Filter conditions applied to workflow data', _branchRail } = data as { conditions?: Condition[]; infoText?: string; _branchRail?: BranchRailSpec };\n\n return (\n <div style={{ width: 350, position: 'relative' }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #ffe082', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center\">\n <div className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded\" style={{ width: 25, height: 25, background: 'rgba(255,160,0,0.1)' }}>\n <FiFilter className=\"ff-text-warning\" size={16} />\n </div>\n <span className=\"ff-ms-2 ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>Filter</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n <Tooltip title={infoText} placement=\"right\" arrow>\n <div className=\"ff-ms-2\"><MdInfoOutline color=\"gray\" size={16} /></div>\n </Tooltip>\n </div>\n </div>\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#fafafa', fontSize: 12 }}>\n {conditions.length === 0 ? (\n <span className=\"ff-text-muted\">No conditions configured</span>\n ) : conditions.map((condition, index) => (\n <div key={index} className=\"ff-d-flex ff-align-items-center ff-mb-1\">\n <p className=\"ff-m-0 ff-fw-bold ff-me-1 ff-text-truncate\" style={{ maxWidth: 100 }} title={condition.field}>{condition.field}</p>\n <span className=\"ff-text-muted\">{condition.operator}</span>\n <p className=\"ff-text-dark ff-text-truncate ff-mx-1 ff-m-0\" title={condition.value}>{condition.value}</p>\n {index < conditions.length - 1 && (\n <p className=\"ff-bg-primary ff-text-white ff-fw-bold ff-ms-1 ff-px-1 ff-rounded-1 ff-m-0\">{condition.logicalOperator}</p>\n )}\n </div>\n ))}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n {_branchRail && <BranchRailDecoration rail={_branchRail} cardWidth={350} />}\n </div>\n );\n};\n\nexport default FilterNode;\n","import { ReactNode } from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdInfoOutline, MdOutlineModeEdit, MdDeleteOutline } from 'react-icons/md';\nimport { Tooltip } from '@mui/material';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\n\ninterface ActionNodeData {\n title?: string;\n descriptorType?: string;\n groupBlocks?: { groups?: string[]; isFallback?: boolean; isAlways?: boolean }[];\n groups?: unknown;\n roles?: unknown;\n groupId?: unknown;\n roleId?: unknown;\n notes?: string;\n infoText?: string;\n}\n\nconst ActionNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode, nodeRegistry, nodeBody = 'full', messages } = useCanvasHandlers();\n const { title = 'Task', descriptorType, groupBlocks, groups, roles, groupId, roleId, infoText = '' } = data as ActionNodeData;\n const descriptor = descriptorType ? nodeRegistry?.forType(descriptorType) : undefined;\n const icon: ReactNode = descriptor?.icon as ReactNode;\n\n const toDisplayString = (v: unknown): string => {\n if (v == null) return '';\n if (typeof v === 'string') return v;\n if (typeof v === 'object' && 'label' in (v as object)) return String((v as Record<string, unknown>).label);\n return String(v);\n };\n\n // Normalise a field that may be a single value or an array of values into a string list.\n const toList = (v: unknown): string[] =>\n Array.isArray(v) ? v.map(toDisplayString).filter(Boolean)\n : (v != null && v !== '' ? [toDisplayString(v)] : []);\n\n const INTERNAL_KEYS = new Set([\n 'descriptorType',\n 'title',\n 'header',\n 'icon',\n 'infoText',\n 'label',\n 'conditionConfig',\n '_conditionConfig',\n ]);\n const formSchema = (descriptor?.formSchema as\n | Array<{ id?: string; name?: string; label?: string }>\n | undefined);\n const labelFor = (key: string): string => {\n if (Array.isArray(formSchema)) {\n const f = formSchema.find((x) => x?.id === key || x?.name === key);\n if (f?.label) return f.label;\n }\n return key.replace(/[_-]+/g, ' ').replace(/\\b\\w/g, (m) => m.toUpperCase());\n };\n const renderValue = (v: unknown): string => {\n if (Array.isArray(v)) {\n const parts = v\n .map((x) =>\n typeof x === 'object' && x\n ? ((x as Record<string, unknown>).label as string) ??\n ((x as Record<string, unknown>).name as string) ??\n ((x as Record<string, unknown>).value as string) ??\n ''\n : String(x)\n )\n .filter(Boolean);\n const head = parts.slice(0, 3).join(', ');\n return parts.length > 3 ? `${head} +${parts.length - 3}` : head;\n }\n if (v && typeof v === 'object') {\n const obj = v as Record<string, unknown>;\n return (obj.label as string) ?? (obj.name as string) ?? (obj.value as string) ?? JSON.stringify(v);\n }\n return String(v);\n };\n const genericEntries = Object.entries(data || {}).filter(\n ([k, v]) =>\n !INTERNAL_KEYS.has(k) &&\n v !== '' &&\n v !== null &&\n v !== undefined &&\n !(Array.isArray(v) && v.length === 0)\n );\n\n const rawCondCfg =\n (data as Record<string, unknown>)?.conditionConfig ??\n (data as Record<string, unknown>)?._conditionConfig;\n const conditionGroups: Array<{ path: string; entries: Array<Record<string, unknown>> }> =\n rawCondCfg && typeof rawCondCfg === 'object'\n ? Object.entries(rawCondCfg as Record<string, unknown>)\n .filter(([, entries]) => Array.isArray(entries) && (entries as unknown[]).length > 0)\n .map(([path, entries]) => ({\n path,\n entries: (entries as Array<Record<string, unknown>>),\n }))\n : [];\n\n const legacyDisplayValues: string[] = groupBlocks?.flatMap((b) => b.groups ?? [])\n ?? [...toList(groups), ...toList(roles), ...toList(groupId), ...toList(roleId)];\n const legacyConfigured = legacyDisplayValues.length > 0;\n\n return (\n <div style={{ width: 350 }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #b0bec5', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n {icon && <div style={{ display: 'flex', alignItems: 'center' }}>{icon as ReactNode}</div>}\n <span className=\"ff-text-dark\" style={{ fontSize: 14, fontWeight: 500 }}>{title}</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n {infoText && (\n <Tooltip title={infoText} placement=\"right\" arrow>\n <div className=\"ff-ms-2\"><MdInfoOutline color=\"gray\" size={16} /></div>\n </Tooltip>\n )}\n </div>\n </div>\n\n {nodeBody !== 'title-only' && (\n <div\n style={{\n margin: '0 8px 8px',\n padding: 8,\n borderRadius: 4,\n background: '#f8f9fa',\n fontSize: 12,\n textAlign: 'left',\n color: '#212529',\n lineHeight: 1.4,\n }}\n >\n {descriptor?.renderNode ? (\n descriptor.renderNode(data as Record<string, unknown>)\n ) : genericEntries.length > 0 || conditionGroups.length > 0 ? (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n {/* ── 1. \"When\" + condition rows ── */}\n {conditionGroups.map((group, gi) => (\n <div key={`cond-${gi}`}>\n <div style={{ color: '#6c757d' }}>When</div>\n {group.entries.slice(0, 3).map((entry, idx, arr) => {\n const fieldKey = (entry.field as string) || '';\n const fieldLabel =\n (entry.fieldLabel as string) || labelFor(fieldKey);\n const operator = (entry.operator as string) || '';\n const value =\n entry.value == null\n ? ''\n : typeof entry.value === 'object'\n ? renderValue(entry.value)\n : String(entry.value);\n const connector = (entry.connector as string) || 'and';\n return (\n <div\n key={idx}\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n marginTop: 4,\n }}\n >\n <span style={{ fontWeight: 700, marginRight: 4, color: '#212529' }}>\n {fieldLabel}\n </span>\n <span style={{ color: '#6c757d', marginRight: 4 }}>{operator}</span>\n <span style={{ color: '#212529', marginRight: 4 }} title={value}>\n {value}\n </span>\n {idx < arr.length - 1 && (\n <span\n style={{\n background: '#0d6efd',\n color: '#fff',\n fontWeight: 700,\n marginLeft: 4,\n padding: '0 4px',\n borderRadius: 2,\n textTransform: 'uppercase',\n fontSize: 10,\n }}\n >\n {connector}\n </span>\n )}\n </div>\n );\n })}\n {group.entries.length > 3 && (\n <div style={{ color: '#6c757d', fontSize: 11, marginTop: 2 }}>\n +{group.entries.length - 3} more\n </div>\n )}\n </div>\n ))}\n\n {/* ── 2. Action subtitle (descriptor label, falls back to slot title) ── */}\n {genericEntries.length > 0 && (\n <div\n style={{\n marginTop: 4,\n color: '#212529',\n display: 'flex',\n justifyContent: 'flex-start',\n }}\n >\n {descriptor?.label || title}\n </div>\n )}\n\n {/* ── 3. Form values as dark badges ── */}\n {genericEntries.length > 0 && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, marginTop: 4 }}>\n {genericEntries.slice(0, 6).map(([k, v]) => (\n <span\n key={k}\n title={`${labelFor(k)}: ${renderValue(v)}`}\n style={{\n background: '#212529',\n color: '#fff',\n padding: '4px 8px',\n borderRadius: 4,\n fontSize: 11,\n }}\n >\n {renderValue(v)}\n </span>\n ))}\n {genericEntries.length > 6 && (\n <span style={{ color: '#6c757d', fontSize: 11, alignSelf: 'center' }}>\n +{genericEntries.length - 6}\n </span>\n )}\n </div>\n )}\n </div>\n ) : legacyConfigured ? (\n // Legacy display fallback: dark badges for old-shape data\n // (groupBlocks/groups/roles/groupId/roleId on the slot)\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {legacyDisplayValues.map((v, i) => (\n <span\n key={i}\n title={v}\n style={{\n background: '#212529',\n color: '#fff',\n padding: '4px 8px',\n borderRadius: 4,\n fontSize: 11,\n }}\n >\n {v}\n </span>\n ))}\n </div>\n ) : (\n <span style={{ color: '#6c757d' }}>{messages?.clickEditToConfigure ?? 'Click edit to configure'}</span>\n )}\n </div>\n )}\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default ActionNode;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport {\n MdOutlineModeEdit,\n MdDeleteOutline,\n MdInfoOutline,\n MdCheckCircle,\n MdPeople,\n MdArrowForward,\n} from 'react-icons/md';\nimport { Tooltip } from '@mui/material';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport BranchRailDecoration, { BranchRailSpec } from './BranchRailDecoration';\n\n/**\n * ApprovalNode — renders an approval-policy slot.\n *\n * Visual layout matches IAM's ApprovalNodeLabel:\n * - Header: yellow check chip + \"Approval Policy\" + edit / delete / info\n * - Policy name (truncated, full name in tooltip)\n * - Up to MAX_VISIBLE_STAGES (2) stage rows, each on a gray bg-light card with:\n * ┌──┐ StageName 👥 Group: <name> / Role: <name> / N approvers\n * │N │ (executionMode chip below if set)\n * └──┘\n * - \"+ N More Stages\" link to overflow into the config drawer\n * - \"No stages configured\" dashed-amber empty state\n *\n * Stage execution mode label is supplied via the optional `executionModeLabel`\n * map on `nodeData` — consumer ships e.g. `{ sequential: 'Sequential', parallel: 'Parallel' }`.\n * Falls back to the raw mode string when absent. Keeps the package i18n-friendly.\n */\n\nconst MAX_VISIBLE_STAGES = 2;\n\ninterface Stage {\n stageName?: string;\n userIds?: string[];\n groupName?: string;\n roleName?: string;\n executionMode?: string;\n isSequential?: boolean;\n}\n\ninterface ApprovalPolicy {\n name?: string;\n policyName?: string;\n executionMode?: string;\n stages?: Stage[];\n}\n\ninterface ApprovalNodeData {\n approvalData?: { policy?: ApprovalPolicy };\n isPreview?: boolean;\n _branchRail?: BranchRailSpec;\n /** Optional execution-mode label map ({ sequential: 'Sequential', parallel: 'Parallel', ... }). */\n executionModeLabel?: Record<string, string>;\n}\n\nfunction resolveExecLabel(\n executionMode: string | undefined,\n isSequential: boolean | undefined,\n labelMap: Record<string, string> | undefined,\n): string | null {\n const raw = executionMode?.toLowerCase() || (isSequential ? 'sequential' : null);\n if (!raw) return null;\n return labelMap?.[raw] ?? raw.charAt(0).toUpperCase() + raw.slice(1);\n}\n\nfunction stageSummary(stage: Stage): { label: string; configured: boolean } {\n const approverCount = Array.isArray(stage.userIds) ? stage.userIds.length : 0;\n const groupName = stage.groupName?.trim() ?? '';\n const roleName = stage.roleName?.trim() ?? '';\n const configured = approverCount > 0 || !!groupName || !!roleName;\n if (groupName) return { label: `Group: ${groupName}`, configured: true };\n if (roleName) return { label: `Role: ${roleName}`, configured: true };\n if (approverCount > 0) {\n return {\n label: `${approverCount} approver${approverCount !== 1 ? 's' : ''}`,\n configured: true,\n };\n }\n return { label: 'Not configured', configured };\n}\n\nconst ApprovalNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\n const { approvalData, isPreview = false, _branchRail, executionModeLabel } =\n data as ApprovalNodeData;\n\n const policy = approvalData?.policy ?? {};\n const stages = policy.stages ?? [];\n const stageCount = stages.length;\n const visibleStages = stages.slice(0, MAX_VISIBLE_STAGES);\n const remainingStages = stageCount - MAX_VISIBLE_STAGES;\n const policyName = policy.name ?? policy.policyName ?? 'Untitled Policy';\n\n return (\n <div style={{ width: 350, position: 'relative' }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #ffe082', borderRadius: 8, background: '#fff', overflow: 'hidden' }}>\n {/* ── Header row ────────────────────────────────────────────── */}\n <div\n className=\"ff-d-flex ff-justify-content-between ff-align-items-center\"\n style={{ padding: '10px 8px 8px' }}\n >\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div\n className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded\"\n style={{ width: 25, height: 25, background: 'rgba(251,192,45,0.2)' }}\n >\n <MdCheckCircle style={{ color: '#FBC02D' }} size={16} />\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>\n Approval Policy\n </span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n {!isPreview && (\n <div\n role=\"button\"\n tabIndex={0}\n style={{ cursor: 'pointer' }}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onEditNode(id); } }}\n data-testid=\"approval-node-edit-btn\"\n >\n <MdOutlineModeEdit size={16} className=\"ff-text-secondary\" />\n </div>\n )}\n {!isPreview && (\n <div\n className=\"ff-ms-2\"\n role=\"button\"\n tabIndex={0}\n style={{ cursor: 'pointer' }}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onDeleteNode(id); } }}\n data-testid=\"approval-node-delete-btn\"\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n )}\n <Tooltip\n title=\"This approval policy determines who must approve a request before the workflow continues.\"\n arrow\n placement=\"right\"\n >\n <span className=\"ff-ms-2 ff-d-inline-flex\">\n <MdInfoOutline color=\"gray\" size={16} />\n </span>\n </Tooltip>\n </div>\n </div>\n\n {/* ── Policy name ──────────────────────────────────────────── */}\n <div\n className=\"ff-text-truncate ff-text-dark ff-fw-bold\"\n style={{ margin: '0 10px 8px', fontSize: 13 }}\n title={policyName}\n >\n {policyName}\n </div>\n\n {/* ── Stage list ───────────────────────────────────────────── */}\n <div style={{ margin: '0 10px 10px', display: 'flex', flexDirection: 'column', gap: 8 }}>\n {stages.length === 0 ? (\n <div\n className=\"ff-text-center\"\n style={{\n fontSize: 12,\n color: '#9e9e9e',\n padding: '14px 0',\n borderRadius: 6,\n border: '1px dashed #FEE79A',\n background: '#FFFDE7',\n }}\n >\n No stages configured\n </div>\n ) : (\n <>\n {visibleStages.map((stage, index) => {\n const displayName = stage.stageName?.trim() || `Stage ${index + 1}`;\n const { label: summaryLabel, configured } = stageSummary(stage);\n const execLabel = resolveExecLabel(\n stage.executionMode,\n stage.isSequential,\n executionModeLabel,\n );\n\n return (\n <div\n key={index}\n style={{ background: '#f5f5f5', borderRadius: 6, padding: 8 }}\n >\n <div\n className=\"ff-d-flex ff-align-items-center\"\n style={{ gap: 8 }}\n >\n <div\n className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-flex-shrink-0\"\n style={{\n width: 28,\n height: 28,\n borderRadius: '50%',\n background: '#f5f5f5b6',\n border: '1px solid #E0E0E0',\n color: '#424242',\n fontSize: 12,\n fontWeight: 700,\n }}\n >\n {index + 1}\n </div>\n <div\n className=\"ff-text-dark ff-text-truncate\"\n style={{ fontSize: 12, fontWeight: 700, marginRight: 'auto' }}\n >\n {displayName}\n </div>\n <div\n className={`ff-d-flex ff-align-items-center ff-flex-shrink-0 ${configured ? 'ff-text-dark' : 'ff-text-muted'}`}\n style={{ gap: 4, fontSize: 12 }}\n >\n <MdPeople\n size={15}\n style={{ color: configured ? '#5D4037' : '#9E9E9E' }}\n />\n {summaryLabel}\n </div>\n </div>\n\n {execLabel && (\n <div\n className=\"ff-d-flex ff-align-items-center\"\n style={{\n gap: 4,\n fontSize: 11,\n color: '#1a73e8',\n marginTop: 4,\n paddingLeft: 36, // align under the stage name (28px circle + 8px gap)\n }}\n >\n <MdArrowForward size={11} />\n {execLabel}\n </div>\n )}\n </div>\n );\n })}\n\n {remainingStages > 0 && (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className=\"ff-text-primary\"\n style={{\n fontSize: 12,\n marginTop: 4,\n cursor: isPreview ? 'default' : 'pointer',\n color: '#1976d2',\n }}\n role={isPreview ? undefined : 'button'}\n tabIndex={isPreview ? undefined : 0}\n onClick={(e) => {\n if (isPreview) return;\n e.stopPropagation();\n onEditNode(id);\n }}\n onKeyDown={(e) => {\n if (isPreview) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation();\n onEditNode(id);\n }\n }}\n >\n + {remainingStages} More Stage{remainingStages > 1 ? 's' : ''}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n {_branchRail && <BranchRailDecoration rail={_branchRail} cardWidth={350} />}\n </div>\n );\n};\n\nexport default ApprovalNode;\n","import React from 'react';\r\nimport { Handle, Position, NodeProps } from 'reactflow';\r\nimport { MdOutlineModeEdit, MdDeleteOutline, MdSchedule } from 'react-icons/md';\r\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\r\n\r\ninterface DelayNodeData {\r\n duration?: number;\r\n unit?: 'minutes' | 'hours' | 'days';\r\n}\r\n\r\nconst DelayNode = ({ id, data }: NodeProps) => {\r\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\r\n const { duration, unit } = data as DelayNodeData;\r\n const configured = duration !== undefined && duration !== null && unit;\r\n const displayText = configured ? `Wait ${duration} ${unit}` : 'Not configured';\r\n\r\n return (\r\n <div style={{ width: 350 }}>\r\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\r\n <div style={{ border: '1.5px solid #b0bec5', borderRadius: 8, background: '#fff' }}>\r\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center ff-mx-2 ff-mt-2 ff-mb-1\">\r\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\r\n <div className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded\" style={{ width: 25, height: 25, background: 'rgba(33,150,243,0.1)' }}>\r\n <MdSchedule size={16} color=\"#1976d2\" />\r\n </div>\r\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>Delay</span>\r\n </div>\r\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\r\n <div\r\n role=\"button\" tabIndex={0}\r\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\r\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onEditNode(id); } }}\r\n >\r\n <MdOutlineModeEdit size={16} />\r\n </div>\r\n <div\r\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\r\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\r\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); onDeleteNode(id); } }}\r\n >\r\n <MdDeleteOutline color=\"red\" size={16} />\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"ff-mx-2 ff-mb-2 ff-p-2 ff-rounded\" style={{ background: '#fafafa', fontSize: 12 }}>\r\n <span className={configured ? 'ff-text-dark ff-fw-medium' : 'ff-text-muted'}>{displayText}</span>\r\n </div>\r\n </div>\r\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default DelayNode;\r\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdDeleteOutline, MdNotifications, MdEmail, MdSms, MdWebhook } from 'react-icons/md';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH } from '../canvasTokens';\n\ninterface NotificationNodeData {\n channel?: string;\n emailTo?: string[];\n emailSubject?: string;\n slackChannel?: string;\n slackMessage?: string;\n teamsMessage?: string;\n smsTo?: string;\n inAppRecipient?: string;\n inAppTitle?: string;\n webhookUrl?: string;\n // legacy shape\n recipient?: string;\n subject?: string;\n}\n\ninterface ChannelMeta {\n label: string;\n bg: string;\n color: string;\n iconType: React.ElementType;\n}\n\nconst CHANNEL_META: Record<string, ChannelMeta> = {\n email: { label: 'Email', bg: '#e3f2fd', color: '#1565c0', iconType: MdEmail },\n slack: { label: 'Slack', bg: '#e8f5e9', color: '#2e7d32', iconType: MdNotifications },\n teams: { label: 'MS Teams', bg: '#ede7f6', color: '#4527a0', iconType: MdNotifications },\n sms: { label: 'SMS', bg: '#fce4ec', color: '#880e4f', iconType: MdSms },\n 'in-app': { label: 'In-App', bg: '#fff3e0', color: '#e65100', iconType: MdNotifications },\n webhook: { label: 'Webhook', bg: '#f3e5f5', color: '#6a1b9a', iconType: MdWebhook },\n};\n\nconst FALLBACK_META: ChannelMeta = {\n label: 'Notification',\n bg: 'rgba(156,39,176,0.1)',\n color: '#7b1fa2',\n iconType: MdNotifications,\n};\n\nfunction getRecipientPreview(data: NotificationNodeData): string | null {\n switch (data.channel) {\n case 'email': return data.emailTo?.join(', ') ?? data.recipient ?? null;\n case 'slack': return data.slackChannel ?? null;\n case 'teams': return data.teamsMessage ? 'Message configured' : null;\n case 'sms': return data.smsTo ?? null;\n case 'in-app': return data.inAppRecipient ?? null;\n case 'webhook': return data.webhookUrl ?? null;\n default: return data.recipient ?? null;\n }\n}\n\nfunction getSubjectPreview(data: NotificationNodeData): string | null {\n switch (data.channel) {\n case 'email': return data.emailSubject ?? data.subject ?? null;\n case 'slack': {\n const msg = data.slackMessage;\n return msg ? (msg.length > 60 ? `${msg.slice(0, 60)}…` : msg) : null;\n }\n case 'in-app': return data.inAppTitle ?? null;\n default: return data.subject ?? null;\n }\n}\n\nconst NotificationNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\n const d = data as NotificationNodeData;\n const meta = (d.channel && CHANNEL_META[d.channel]) ? CHANNEL_META[d.channel] : FALLBACK_META;\n const recipient = getRecipientPreview(d);\n const subjectLine = getSubjectPreview(d);\n const configured = !!(d.channel && recipient);\n const IconComponent = meta.iconType;\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #b0bec5', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div className=\"ff-d-flex ff-align-items-center ff-justify-content-center ff-rounded\" style={{ width: 25, height: 25, background: meta.bg }}>\n <IconComponent size={16} color={meta.color} />\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>\n {d.channel ? `${meta.label} Notification` : 'Notification'}\n </span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#fafafa', fontSize: 12 }}>\n {configured ? (\n <div className=\"ff-d-flex ff-flex-column ff-gap-1\">\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <span className=\"ff-px-2 ff-py-1 ff-rounded\" style={{ fontSize: 10, background: meta.bg, color: meta.color, fontWeight: 600, flexShrink: 0 }}>\n {meta.label}\n </span>\n <span className=\"ff-text-dark ff-text-truncate\" style={{ maxWidth: 220 }}>{recipient}</span>\n </div>\n {subjectLine && <span className=\"ff-text-muted ff-text-truncate\" style={{ maxWidth: 280 }}>{subjectLine}</span>}\n </div>\n ) : (\n <span className=\"ff-text-muted\">Not configured</span>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default NotificationNode;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdContentCopy, MdWebhook } from 'react-icons/md';\nimport { Tooltip } from '@mui/material';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH } from '../canvasTokens';\n\ninterface WebhookTriggerNodeData {\n label?: string;\n endpointUrl?: string;\n authMethod?: 'none' | 'api-key' | 'hmac';\n source?: string;\n}\n\nconst AUTH_LABELS: Record<string, string> = {\n 'api-key': 'API Key',\n hmac: 'HMAC',\n};\n\nconst WebhookTriggerNode = ({ data }: NodeProps) => {\n const { onClickAddTrigger } = useCanvasHandlers();\n const { label = 'Webhook Trigger', endpointUrl, authMethod, source } = data as WebhookTriggerNodeData;\n\n const handleEdit = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.stopPropagation();\n onClickAddTrigger();\n };\n\n const handleCopy = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.stopPropagation();\n if (endpointUrl) navigator.clipboard.writeText(endpointUrl).catch(() => undefined);\n };\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #90caf9', borderRadius: 8, background: '#fff', overflow: 'hidden' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div style={{ width: 28, height: 28, borderRadius: 6, background: 'rgba(33,150,243,0.1)', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <MdWebhook size={16} color=\"#1565c0\" />\n </div>\n <span style={{ fontSize: 13, fontWeight: 600, color: '#212121' }}>Webhook Trigger</span>\n </div>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleEdit}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') handleEdit(e); }}\n className=\"ff-d-flex ff-align-items-center\"\n style={{ paddingRight: 4, cursor: 'pointer' }}\n >\n <MdOutlineModeEdit size={16} color=\"#555\" />\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#e3f2fd', border: '1px solid #90caf9' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-flex-wrap ff-gap-2 ff-mb-1\">\n <span style={{ fontSize: 12, color: '#1565c0', fontWeight: 600 }}>{label}</span>\n {source && (\n <span className=\"ff-px-2 ff-py-1 ff-rounded\" style={{ fontSize: 11, background: '#fff', border: '1px solid #90caf9', color: '#1565c0' }}>\n {source}\n </span>\n )}\n {authMethod && authMethod !== 'none' && AUTH_LABELS[authMethod] && (\n <span className=\"ff-px-2 ff-py-1 ff-rounded\" style={{ fontSize: 10, background: '#1565c0', color: '#fff', fontWeight: 600 }}>\n {AUTH_LABELS[authMethod]}\n </span>\n )}\n </div>\n {endpointUrl && (\n <div className=\"ff-d-flex ff-align-items-center ff-gap-1\" style={{ marginTop: 4 }}>\n <span style={{ fontSize: 10, color: '#1565c0', fontFamily: 'monospace', flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {endpointUrl}\n </span>\n <Tooltip title=\"Copy URL\" placement=\"top\" arrow>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleCopy}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') handleCopy(e); }}\n style={{ cursor: 'pointer', flexShrink: 0 }}\n >\n <MdContentCopy size={12} color=\"#1565c0\" />\n </div>\n </Tooltip>\n </div>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default WebhookTriggerNode;\n","import React, { ReactNode } from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdDeleteOutline, MdHttp } from 'react-icons/md';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH, HTTP_METHOD_STYLE } from '../canvasTokens';\n\ninterface RestApiNodeData {\n method?: string;\n url?: string;\n descriptorType?: string;\n}\n\nconst RestApiNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode, nodeRegistry } = useCanvasHandlers();\n const { method, url, descriptorType } = data as RestApiNodeData;\n const icon: ReactNode = descriptorType\n ? (nodeRegistry?.forType(descriptorType)?.icon as ReactNode)\n : <MdHttp size={16} color=\"#546e7a\" />;\n const configured = !!(method && url);\n const methodKey = method?.toUpperCase() ?? '';\n const methodStyle = HTTP_METHOD_STYLE[methodKey] ?? null;\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #b0bec5', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div style={{ width: 25, height: 25, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {icon as ReactNode}\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>REST API Call</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#fafafa', fontSize: 12 }}>\n {configured ? (\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n {methodStyle && (\n <span style={{ fontSize: 10, fontWeight: 700, padding: '2px 6px', borderRadius: 4, background: methodStyle.bg, color: methodStyle.color, flexShrink: 0 }}>\n {methodKey}\n </span>\n )}\n <span className=\"ff-text-dark ff-text-truncate\" style={{ fontFamily: 'monospace', fontSize: 11 }} title={url}>{url}</span>\n </div>\n ) : (\n <span className=\"ff-text-muted\">Not configured</span>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default RestApiNode;\n","import React from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdDeleteOutline, MdCallSplit } from 'react-icons/md';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH, BRANCH_PALETTE } from '../canvasTokens';\n\ninterface BranchCondition {\n field: string;\n operator: string;\n value?: string;\n logicalOperator?: string;\n}\n\ninterface BranchConfig {\n key: string;\n label: string;\n conditions?: BranchCondition[];\n}\n\ninterface ConditionBranchNodeData {\n title?: string;\n branchConfigs?: BranchConfig[];\n defaultBranch?: string;\n}\n\nconst OPERATOR_LABELS: Record<string, string> = {\n eq: '=', neq: '≠', gt: '>', gte: '≥', lt: '<', lte: '≤',\n contains: 'contains', startsWith: 'starts with', endsWith: 'ends with',\n isEmpty: 'is empty', isNotEmpty: 'is not empty',\n};\n\nconst ConditionBranchNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode } = useCanvasHandlers();\n const { title = 'Condition Branch', branchConfigs = [], defaultBranch } = data as ConditionBranchNodeData;\n const configured = branchConfigs.length > 0;\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #b39ddb', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div style={{ width: 25, height: 25, borderRadius: 6, background: 'rgba(103,58,183,0.1)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <MdCallSplit size={16} color=\"#512da8\" />\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>{title}</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: '#fafafa', fontSize: 12 }}>\n {configured ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {branchConfigs.map((branch, idx) => {\n const palette = BRANCH_PALETTE[idx % BRANCH_PALETTE.length];\n const firstCondition = branch.conditions?.[0];\n const extraCount = (branch.conditions?.length ?? 0) - 1;\n return (\n <div key={branch.key} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span style={{ fontSize: 10, fontWeight: 600, padding: '2px 7px', borderRadius: 10, background: palette.bg, color: palette.color, flexShrink: 0 }}>\n {branch.label || branch.key}\n </span>\n {firstCondition ? (\n <span style={{ fontSize: 11, color: '#616161', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {firstCondition.field} {OPERATOR_LABELS[firstCondition.operator] ?? firstCondition.operator}\n {firstCondition.value ? ` ${firstCondition.value}` : ''}\n {extraCount > 0 ? ` +${extraCount} more` : ''}\n </span>\n ) : (\n <span style={{ fontSize: 11, color: '#9e9e9e' }}>No conditions yet</span>\n )}\n </div>\n );\n })}\n {defaultBranch && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginTop: 2 }}>\n <span style={{ fontSize: 10, fontWeight: 600, padding: '2px 7px', borderRadius: 10, background: '#f5f5f5', color: '#757575', flexShrink: 0 }}>\n Default\n </span>\n <span style={{ fontSize: 11, color: '#9e9e9e' }}>fallback path</span>\n </div>\n )}\n </div>\n ) : (\n <span className=\"ff-text-muted\">Not configured — click edit to add branches</span>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default ConditionBranchNode;\n","import React, { ReactNode } from 'react';\nimport { Handle, Position, NodeProps } from 'reactflow';\nimport { MdOutlineModeEdit, MdDeleteOutline, MdAccountTree, MdOpenInNew } from 'react-icons/md';\nimport { useCanvasHandlers } from '../WorkflowCanvasContext';\nimport { NODE_WIDTH } from '../canvasTokens';\n\ninterface SubWorkflowNodeData {\n title?: string;\n workflowId?: string;\n workflowLabel?: string;\n descriptorType?: string;\n onPreview?: (workflowId: string) => void;\n}\n\nconst SubWorkflowNode = ({ id, data }: NodeProps) => {\n const { onEditNode, onDeleteNode, nodeRegistry } = useCanvasHandlers();\n const { title = 'Sub-Workflow', workflowId, workflowLabel, descriptorType, onPreview } = data as SubWorkflowNodeData;\n const icon: ReactNode = descriptorType\n ? (nodeRegistry?.forType(descriptorType)?.icon as ReactNode)\n : <MdAccountTree size={16} color=\"#00695c\" />;\n const configured = !!workflowId;\n\n const handlePreview = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.stopPropagation();\n if (workflowId && onPreview) onPreview(workflowId);\n };\n\n return (\n <div style={{ width: NODE_WIDTH }}>\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ border: '1.5px solid #80cbc4', borderRadius: 8, background: '#fff' }}>\n <div className=\"ff-d-flex ff-justify-content-between ff-align-items-center\" style={{ padding: '10px 6px' }}>\n <div className=\"ff-d-flex ff-align-items-center ff-gap-2\">\n <div style={{ width: 25, height: 25, borderRadius: 6, background: 'rgba(0,137,123,0.1)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {icon as ReactNode}\n </div>\n <span className=\"ff-fw-medium ff-text-dark\" style={{ fontSize: 14 }}>{title}</span>\n </div>\n <div className=\"node-actions ff-d-flex ff-align-items-center\">\n <div\n role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onEditNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onEditNode(id); } }}\n >\n <MdOutlineModeEdit size={16} />\n </div>\n <div\n className=\"ff-ms-2\" role=\"button\" tabIndex={0}\n onClick={(e) => { e.stopPropagation(); onDeleteNode(id); }}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); onDeleteNode(id); } }}\n >\n <MdDeleteOutline color=\"red\" size={16} />\n </div>\n </div>\n </div>\n\n <div style={{ margin: '0 6px 10px', padding: '10px 12px', borderRadius: 6, background: configured ? '#e0f2f1' : '#fafafa', fontSize: 12, border: configured ? '1px solid #b2dfdb' : 'none' }}>\n {configured ? (\n <div className=\"ff-d-flex ff-align-items-center ff-justify-content-between\">\n <div className=\"ff-d-flex ff-flex-column ff-gap-1\">\n <span style={{ fontSize: 12, fontWeight: 600, color: '#00695c' }}>\n {workflowLabel || workflowId}\n </span>\n <span style={{ fontSize: 10, color: '#80cbc4', fontFamily: 'monospace' }}>ID: {workflowId}</span>\n </div>\n {onPreview && (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handlePreview}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => { if (e.key === 'Enter' || e.key === ' ') handlePreview(e); }}\n style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 3, fontSize: 11, color: '#00897b' }}\n >\n <MdOpenInNew size={13} />\n Preview\n </div>\n )}\n </div>\n ) : (\n <span className=\"ff-text-muted\">Not configured — select a workflow</span>\n )}\n </div>\n </div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\n\nexport default SubWorkflowNode;\n","import { NodeTypes } from 'reactflow';\r\nimport StartNode from './StartNode';\r\nimport EndNode from './EndNode';\r\nimport AddTriggerNode from './AddTriggerNode';\r\nimport AddStepNode from './AddStepNode';\r\nimport TriggerNode from './TriggerNode';\r\nimport EventNode from './EventNode';\r\nimport FilterNode from './FilterNode';\r\nimport ActionNode from './ActionNode';\r\nimport ApprovalNode from './ApprovalNode';\r\nimport DelayNode from './DelayNode';\r\nimport NotificationNode from './NotificationNode';\r\nimport WebhookTriggerNode from './WebhookTriggerNode';\r\nimport RestApiNode from './RestApiNode';\r\nimport ConditionBranchNode from './ConditionBranchNode';\r\nimport SubWorkflowNode from './SubWorkflowNode';\r\n\r\nexport const builtInNodeTypes: NodeTypes = {\r\n startNode: StartNode,\r\n endNode: EndNode,\r\n addTriggerNode: AddTriggerNode,\r\n addStepNode: AddStepNode,\r\n triggerNode: TriggerNode,\r\n eventNode: EventNode,\r\n filterNode: FilterNode,\r\n actionNode: ActionNode,\r\n approvalNode: ApprovalNode,\r\n delayNode: DelayNode,\r\n notificationNode: NotificationNode,\r\n webhookTriggerNode: WebhookTriggerNode,\r\n restApiNode: RestApiNode,\r\n conditionBranchNode: ConditionBranchNode,\r\n subWorkflowNode: SubWorkflowNode,\r\n};\r\n\r\nexport { StartNode, EndNode, AddTriggerNode, AddStepNode, TriggerNode, EventNode, FilterNode, ActionNode, ApprovalNode, DelayNode, NotificationNode, WebhookTriggerNode, RestApiNode, ConditionBranchNode, SubWorkflowNode };\r\n","import React from 'react';\r\nimport { getStraightPath, BaseEdge, EdgeProps } from 'reactflow';\r\nimport './EdgeWithPlusLabel.scss';\r\n\r\nconst R = 11.5;\r\nconst STROKE = 2;\r\nconst PLUS_HALF = 6;\r\nconst PILL_WIDTH = 40;\r\nconst PILL_HEIGHT = 20;\r\nconst PILL_R = 4;\r\n\r\nexport interface EdgeWithPlusLabelData {\r\n label?: string;\r\n onAddStepClick?: (sourceNodeId: string, context: AddStepContext) => void;\r\n referenceNodeType?: string;\r\n stepVisibility?: unknown;\r\n}\r\n\r\nexport interface AddStepContext {\r\n edgeId: string;\r\n nodeId: string;\r\n sourceNodeId: string;\r\n targetNodeId: string;\r\n position: 'between';\r\n referenceNodeId: string;\r\n referenceNodeType?: string;\r\n stepVisibility?: unknown;\r\n // branch context — set when this edge is inside a filter branch\r\n filterId?: string;\r\n branch?: string;\r\n}\r\n\r\nconst EdgeWithPlusLabel = ({\r\n id: edgeId,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition,\r\n source,\r\n target,\r\n data,\r\n}: EdgeProps<EdgeWithPlusLabelData>) => {\r\n const [edgePath, labelX, labelY] = getStraightPath({\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n });\r\n\r\n const edgeLabel = data?.label;\r\n const isPass = edgeLabel === 'Pass';\r\n const showLabel = isPass || edgeLabel === 'Fail';\r\n\r\n const oneThirdX = sourceX + (targetX - sourceX) / 3;\r\n const oneThirdY = sourceY + (targetY - sourceY) / 3;\r\n const twoThirdsX = sourceX + (2 * (targetX - sourceX)) / 3;\r\n const twoThirdsY = sourceY + (2 * (targetY - sourceY)) / 3;\r\n\r\n const handleAddStepClick = data?.onAddStepClick;\r\n\r\n const handleClick = (e: React.MouseEvent | React.KeyboardEvent) => {\r\n e.stopPropagation();\r\n if (typeof handleAddStepClick !== 'function') return;\r\n const context: AddStepContext = {\r\n edgeId,\r\n nodeId: source,\r\n sourceNodeId: source,\r\n targetNodeId: target,\r\n position: 'between',\r\n referenceNodeId: source,\r\n referenceNodeType: data?.referenceNodeType,\r\n stepVisibility: data?.stepVisibility,\r\n };\r\n handleAddStepClick(source, context);\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleClick(e);\r\n }\r\n };\r\n\r\n const PlusContent = () => (\r\n <>\r\n <g className=\"plus-icon-container\">\r\n <circle r={R} className=\"edge-plus-circle\" />\r\n <line x1={0} y1={-PLUS_HALF} x2={0} y2={PLUS_HALF} strokeWidth={STROKE} strokeLinecap=\"round\" className=\"plus-line\" />\r\n <line x1={-PLUS_HALF} y1={0} x2={PLUS_HALF} y2={0} strokeWidth={STROKE} strokeLinecap=\"round\" className=\"plus-line\" />\r\n </g>\r\n <g className=\"edge-plus-tooltip\" transform=\"translate(18, 0)\">\r\n <rect x={0} y={-10} width={65} height={20} rx={4} className=\"tooltip-bg\" />\r\n <path d=\"M0 -4 L-4 0 L0 4 Z\" className=\"tooltip-bg\" />\r\n <text x={32} y={0} textAnchor=\"middle\" dominantBaseline=\"central\" fill=\"white\" style={{ fontSize: 10, fontWeight: 600, pointerEvents: 'none' }}>\r\n Add Step\r\n </text>\r\n </g>\r\n </>\r\n );\r\n\r\n const plusProps = handleAddStepClick ? {\r\n onClick: handleClick,\r\n onKeyDown: handleKeyDown,\r\n role: 'button' as const,\r\n tabIndex: 0,\r\n style: { cursor: 'pointer', pointerEvents: 'all' as const },\r\n } : {\r\n style: { cursor: 'default', pointerEvents: 'all' as const },\r\n };\r\n\r\n return (\r\n <g className=\"edge-with-plus-wrapper\">\r\n <BaseEdge id={edgeId} path={edgePath} />\r\n {showLabel ? (\r\n <>\r\n <g transform={`translate(${oneThirdX}, ${oneThirdY})`}>\r\n <rect x={-PILL_WIDTH / 2} y={-PILL_HEIGHT / 2} width={PILL_WIDTH} height={PILL_HEIGHT} rx={PILL_R} ry={PILL_R} fill={isPass ? '#ADE6C5' : '#FDBFBF'} />\r\n <text textAnchor=\"middle\" dominantBaseline=\"central\" fill={isPass ? '#1DBF60' : '#C50000'} style={{ fontSize: 12, fontWeight: 500 }}>\r\n {edgeLabel}\r\n </text>\r\n </g>\r\n <g className=\"nodrag nopan edge-plus-svg\" transform={`translate(${twoThirdsX}, ${twoThirdsY})`} data-testid=\"plus-node-icon\" {...plusProps}>\r\n <PlusContent />\r\n </g>\r\n </>\r\n ) : (\r\n <g className=\"nodrag nopan edge-plus-svg\" transform={`translate(${labelX}, ${labelY})`} data-testid=\"plus-node-icon\" {...plusProps}>\r\n <PlusContent />\r\n </g>\r\n )}\r\n </g>\r\n );\r\n};\r\n\r\nexport default EdgeWithPlusLabel;\r\n","import React from \"react\";\r\nimport { getStraightPath, BaseEdge, EdgeProps } from \"reactflow\";\r\nimport { AddStepContext } from \"./EdgeWithPlusLabel\";\r\nimport \"./EdgeWithPlusLabel.scss\";\r\n\r\nconst R = 11.5;\r\nconst STROKE = 2;\r\nconst PLUS_HALF = 6;\r\n\r\nexport interface PlusEdgeData {\r\n onAddStepClick?: (sourceNodeId: string, context: AddStepContext) => void;\r\n referenceNodeType?: string;\r\n stepVisibility?: unknown;\r\n filterId?: string;\r\n branch?: string;\r\n}\r\n\r\nconst PlusEdge = ({\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n source,\r\n target,\r\n data,\r\n}: EdgeProps<PlusEdgeData>) => {\r\n const [edgePath, labelX, labelY] = getStraightPath({\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n });\r\n\r\n const handleAddStepClick = data?.onAddStepClick;\r\n\r\n const handleClick = (e: React.MouseEvent | React.KeyboardEvent) => {\r\n e.stopPropagation();\r\n if (typeof handleAddStepClick !== \"function\") return;\r\n handleAddStepClick(source, {\r\n edgeId: id,\r\n nodeId: source,\r\n sourceNodeId: source,\r\n targetNodeId: target,\r\n position: \"between\",\r\n referenceNodeId: source,\r\n referenceNodeType: data?.referenceNodeType,\r\n stepVisibility: data?.stepVisibility,\r\n filterId: data?.filterId,\r\n branch: data?.branch,\r\n });\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n handleClick(e);\r\n }\r\n };\r\n\r\n return (\r\n <g className=\"edge-with-plus-wrapper\">\r\n <BaseEdge id={id} path={edgePath} style={{ stroke: \"#b0bec5\" }} />\r\n <g\r\n className=\"nodrag nopan edge-plus-svg\"\r\n transform={`translate(${labelX}, ${labelY})`}\r\n style={{\r\n cursor: handleAddStepClick ? \"pointer\" : \"default\",\r\n pointerEvents: \"all\",\r\n outline: \"none\",\r\n }}\r\n onClick={handleAddStepClick ? handleClick : undefined}\r\n onKeyDown={handleAddStepClick ? handleKeyDown : undefined}\r\n role={handleAddStepClick ? \"button\" : undefined}\r\n tabIndex={handleAddStepClick ? 0 : undefined}\r\n data-testid=\"plus-node-icon\"\r\n >\r\n <circle r={R} className=\"edge-plus-circle\" />\r\n <line\r\n x1={0}\r\n y1={-PLUS_HALF}\r\n x2={0}\r\n y2={PLUS_HALF}\r\n strokeWidth={STROKE}\r\n strokeLinecap=\"round\"\r\n className=\"plus-line\"\r\n />\r\n <line\r\n x1={-PLUS_HALF}\r\n y1={0}\r\n x2={PLUS_HALF}\r\n y2={0}\r\n strokeWidth={STROKE}\r\n strokeLinecap=\"round\"\r\n className=\"plus-line\"\r\n />\r\n <g className=\"edge-plus-tooltip\" transform=\"translate(18, 0)\">\r\n <rect\r\n x={0}\r\n y={-10}\r\n width={65}\r\n height={20}\r\n rx={4}\r\n className=\"tooltip-bg\"\r\n />\r\n <path d=\"M0 -4 L-4 0 L0 4 Z\" className=\"tooltip-bg\" />\r\n <text\r\n x={32}\r\n y={0}\r\n textAnchor=\"middle\"\r\n dominantBaseline=\"central\"\r\n fill=\"white\"\r\n style={{ fontSize: 10, fontWeight: 600, pointerEvents: \"none\" }}\r\n >\r\n Add Step\r\n </text>\r\n </g>\r\n </g>\r\n </g>\r\n );\r\n};\r\n\r\nexport default PlusEdge;\r\n","import React from 'react';\r\nimport { getStraightPath, BaseEdge, EdgeProps } from 'reactflow';\r\n\r\nconst PlainEdge = ({ id, sourceX, sourceY, targetX, targetY }: EdgeProps) => {\r\n const [edgePath] = getStraightPath({ sourceX, sourceY, targetX, targetY });\r\n return <BaseEdge id={id} path={edgePath} style={{ stroke: '#b0bec5' }} />;\r\n};\r\n\r\nexport default PlainEdge;\r\n","import React from 'react';\r\nimport { getStraightPath, BaseEdge, EdgeProps } from 'reactflow';\r\nimport { AddStepContext } from './EdgeWithPlusLabel';\r\nimport './EdgeWithPlusLabel.scss';\r\n\r\nconst R = 11.5;\r\nconst STROKE = 2;\r\nconst PLUS_HALF = 6;\r\nconst LABEL_OFFSET_Y = -24;\r\nconst PILL_WIDTH = 40;\r\nconst PILL_HEIGHT = 20;\r\nconst PILL_R = 4;\r\n\r\nexport interface LabelPlusEdgeData {\r\n label?: string;\r\n onAddStepClick?: (sourceNodeId: string, context: AddStepContext) => void;\r\n referenceNodeType?: string;\r\n stepVisibility?: unknown;\r\n showPlus?: boolean;\r\n}\r\n\r\nconst LabelPlusEdge = ({\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n source,\r\n target,\r\n data,\r\n}: EdgeProps<LabelPlusEdgeData>) => {\r\n const [edgePath, labelX, labelY] = getStraightPath({ sourceX, sourceY, targetX, targetY });\r\n\r\n const edgeLabel = data?.label;\r\n const isPass = edgeLabel === 'Pass';\r\n const showLabel = isPass || edgeLabel === 'Fail';\r\n const handleAddStepClick = data?.onAddStepClick;\r\n const showPlus = data?.showPlus !== false && !!handleAddStepClick;\r\n\r\n const handleClick = (e: React.MouseEvent | React.KeyboardEvent) => {\r\n e.stopPropagation();\r\n if (typeof handleAddStepClick !== 'function') return;\r\n handleAddStepClick(source, {\r\n edgeId: id,\r\n nodeId: source,\r\n sourceNodeId: source,\r\n targetNodeId: target,\r\n position: 'between',\r\n referenceNodeId: source,\r\n referenceNodeType: data?.referenceNodeType,\r\n stepVisibility: data?.stepVisibility,\r\n });\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleClick(e);\r\n }\r\n };\r\n\r\n return (\r\n <g className=\"edge-with-plus-wrapper\">\r\n <BaseEdge id={id} path={edgePath} style={{ stroke: '#b0bec5' }} />\r\n <g\r\n className=\"nodrag nopan edge-plus-svg\"\r\n transform={`translate(${labelX}, ${labelY})`}\r\n style={{ cursor: handleAddStepClick ? 'pointer' : 'default', pointerEvents: 'all', outline: 'none' }}\r\n onClick={handleAddStepClick ? handleClick : undefined}\r\n onKeyDown={handleAddStepClick ? handleKeyDown : undefined}\r\n role={handleAddStepClick ? 'button' : undefined}\r\n tabIndex={handleAddStepClick ? 0 : undefined}\r\n >\r\n {showLabel && (\r\n <g transform={`translate(0, ${showPlus ? LABEL_OFFSET_Y : 0})`}>\r\n <rect\r\n x={-PILL_WIDTH / 2} y={-PILL_HEIGHT / 2}\r\n width={PILL_WIDTH} height={PILL_HEIGHT}\r\n rx={PILL_R} ry={PILL_R}\r\n fill={isPass ? '#ADE6C5' : '#FDBFBF'}\r\n />\r\n <text textAnchor=\"middle\" dominantBaseline=\"central\" fill={isPass ? '#1DBF60' : '#C50000'} style={{ fontSize: 12, fontWeight: 500 }}>\r\n {edgeLabel}\r\n </text>\r\n </g>\r\n )}\r\n\r\n {showPlus && (\r\n <g className=\"plus-icon-container\">\r\n <circle r={R} className=\"edge-plus-circle\" />\r\n <line x1={0} y1={-PLUS_HALF} x2={0} y2={PLUS_HALF} strokeWidth={STROKE} strokeLinecap=\"round\" className=\"plus-line\" />\r\n <line x1={-PLUS_HALF} y1={0} x2={PLUS_HALF} y2={0} strokeWidth={STROKE} strokeLinecap=\"round\" className=\"plus-line\" />\r\n </g>\r\n )}\r\n\r\n {showPlus && (\r\n <g className=\"edge-plus-tooltip\" transform=\"translate(22, 0)\">\r\n <rect x={0} y={-10} width={65} height={20} rx={4} className=\"tooltip-bg\" />\r\n <path d=\"M0 -4 L-4 0 L0 4 Z\" className=\"tooltip-bg\" />\r\n <text x={32} y={0} textAnchor=\"middle\" dominantBaseline=\"central\" fill=\"white\" style={{ fontSize: 10, fontWeight: 600, pointerEvents: 'none' }}>\r\n Add Step\r\n </text>\r\n </g>\r\n )}\r\n </g>\r\n </g>\r\n );\r\n};\r\n\r\nexport default LabelPlusEdge;\r\n","import React from 'react';\r\nimport { EdgeProps } from 'reactflow';\r\nimport { AddStepContext } from './EdgeWithPlusLabel';\r\n\r\ninterface GatewayBranchEdgeData {\r\n label?: string;\r\n branch?: string;\r\n isFirst?: boolean;\r\n filterId?: string;\r\n onAddStepClick?: (sourceNodeId: string, context: AddStepContext) => void;\r\n /** When true, route as a vertical rail (sourceX → down to targetY → right to target). Default: horizontal fan-out. */\r\n verticalRouting?: boolean;\r\n}\r\n\r\nconst GatewayBranchEdge = ({\r\n id,\r\n source,\r\n target,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n style = {},\r\n markerEnd,\r\n data,\r\n}: EdgeProps<GatewayBranchEdgeData>) => {\r\n const verticalRouting = data?.verticalRouting ?? false;\r\n // Workato-style vertical routing: the rail decoration draws the vertical line +\r\n // bullet. The edge L-routes (90° elbow) from the bullet Y (BULLET_OFFSET above the\r\n // target top) across to the step's centerX, then down into the step's top handle.\r\n // This applies to every branch, including empty ones (target = End).\r\n // BULLET_OFFSET must match BULLET_TO_STEP_GAP in WorkflowCanvas applyVerticalBranchLayout.\r\n const BULLET_OFFSET = 30;\r\n const path = verticalRouting\r\n ? (() => {\r\n const bulletY = targetY - BULLET_OFFSET;\r\n return `M ${sourceX},${bulletY} L ${targetX},${bulletY} L ${targetX},${targetY}`;\r\n })()\r\n : (() => {\r\n const elbowY = sourceY + 30;\r\n return `M ${sourceX},${sourceY} L ${sourceX},${elbowY} L ${targetX},${elbowY} L ${targetX},${targetY}`;\r\n })();\r\n const stroke = (style as React.CSSProperties & { stroke?: string }).stroke || '#d1d5db';\r\n const label = data?.label;\r\n const isPass = data?.isFirst ?? false;\r\n const onAddStepClick = data?.onAddStepClick;\r\n\r\n // Label + \"+\" sit on the horizontal segment.\r\n // - Vertical mode: horizontal segment is at bulletY (= targetY - BULLET_OFFSET)\r\n // - Horizontal mode: horizontal segment is at the elbow (sourceY+30)\r\n const segmentY = verticalRouting ? targetY - BULLET_OFFSET : sourceY + 30;\r\n const pillX = sourceX + (targetX - sourceX) * (verticalRouting ? 0.25 : 0.35);\r\n const plusX = sourceX + (targetX - sourceX) * (verticalRouting ? 0.65 : 0.7);\r\n const labelY = segmentY;\r\n\r\n const handlePlusClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (!onAddStepClick) return;\r\n onAddStepClick(source, {\r\n edgeId: id,\r\n nodeId: source,\r\n sourceNodeId: source,\r\n targetNodeId: target,\r\n position: 'between',\r\n referenceNodeId: source,\r\n filterId: data?.filterId,\r\n branch: data?.branch,\r\n });\r\n };\r\n\r\n const R = 11.5;\r\n const HALF = 6;\r\n\r\n return (\r\n <g>\r\n <path id={id} d={path} fill=\"none\" stroke={stroke} strokeWidth={1.5} markerEnd={markerEnd} />\r\n\r\n {/* Pass / Fail pill — hidden in vertical-routing mode (the rail decoration renders the label instead) */}\r\n {label && !verticalRouting && (\r\n <g transform={`translate(${pillX}, ${labelY})`}>\r\n {(() => {\r\n const pillW = Math.max(44, label.length * 7 + 20);\r\n return (\r\n <>\r\n <rect x={-pillW / 2} y={-11} width={pillW} height={22} rx={11}\r\n fill={isPass ? '#e8f5e9' : '#ffebee'}\r\n stroke={isPass ? '#81c784' : '#e57373'}\r\n strokeWidth={1}\r\n />\r\n <text x={0} y={4} textAnchor=\"middle\" fontSize={10} fontWeight={600}\r\n fill={isPass ? '#2e7d32' : '#c62828'}\r\n style={{ fontFamily: 'sans-serif', pointerEvents: 'none' }}\r\n >\r\n {label}\r\n </text>\r\n </>\r\n );\r\n })()}\r\n </g>\r\n )}\r\n\r\n {/* \"+\" button */}\r\n {onAddStepClick && (\r\n <g\r\n transform={`translate(${plusX}, ${labelY})`}\r\n onClick={handlePlusClick}\r\n style={{ cursor: 'pointer', pointerEvents: 'all' }}\r\n className=\"nodrag nopan edge-plus-svg\"\r\n >\r\n <circle r={R} className=\"edge-plus-circle\" />\r\n <line x1={0} y1={-HALF} x2={0} y2={HALF} strokeWidth={2} strokeLinecap=\"round\" className=\"plus-line\" />\r\n <line x1={-HALF} y1={0} x2={HALF} y2={0} strokeWidth={2} strokeLinecap=\"round\" className=\"plus-line\" />\r\n </g>\r\n )}\r\n </g>\r\n );\r\n};\r\n\r\nexport default GatewayBranchEdge;\r\n"],"names":["WorkflowCanvasContext","createContext","defaultFlowForgeMessages","useCanvasHandlers","useContext","StartNode","jsxs","jsx","Handle","Position","EndNode","AddTriggerNode","onClickAddTrigger","messages","Tooltip","e","GrTrigger","AddStepNode","id","onAddStep","humaniseCode","code","m","formatSource","s","value","TriggerNode","data","type","eventType","sources","label","source","previewWorkflow","executionStatus","infoText","handleEdit","hasEventSources","hasSimpleShape","title","body","eventDisplay","i","Chip","rightCluster","Fragment","FaCheckCircle","FaTimesCircle","MdOutlineModeEdit","MdInfoOutline","MdInput","humanize","EventNode","header","displayTitle","BranchRailDecoration","rail","cardWidth","railX","stroke","b","idx","bulletY","FilterNode","onEditNode","onDeleteNode","conditions","_branchRail","FiFilter","MdDeleteOutline","condition","index","ActionNode","nodeRegistry","nodeBody","descriptorType","groupBlocks","groups","roles","groupId","roleId","descriptor","icon","toDisplayString","v","toList","INTERNAL_KEYS","formSchema","labelFor","key","f","x","renderValue","parts","head","obj","genericEntries","k","rawCondCfg","conditionGroups","entries","path","legacyDisplayValues","legacyConfigured","group","gi","entry","arr","fieldKey","fieldLabel","operator","connector","MAX_VISIBLE_STAGES","resolveExecLabel","executionMode","isSequential","labelMap","raw","stageSummary","stage","approverCount","groupName","_a","roleName","_b","configured","ApprovalNode","approvalData","isPreview","executionModeLabel","policy","stages","stageCount","visibleStages","remainingStages","policyName","MdCheckCircle","displayName","summaryLabel","execLabel","MdPeople","MdArrowForward","DelayNode","duration","unit","displayText","MdSchedule","CHANNEL_META","MdEmail","MdNotifications","MdSms","MdWebhook","FALLBACK_META","getRecipientPreview","getSubjectPreview","msg","NotificationNode","d","meta","recipient","subjectLine","IconComponent","NODE_WIDTH","AUTH_LABELS","WebhookTriggerNode","endpointUrl","authMethod","handleCopy","MdContentCopy","RestApiNode","method","url","MdHttp","methodKey","methodStyle","HTTP_METHOD_STYLE","OPERATOR_LABELS","ConditionBranchNode","branchConfigs","defaultBranch","MdCallSplit","branch","palette","BRANCH_PALETTE","firstCondition","extraCount","SubWorkflowNode","workflowId","workflowLabel","onPreview","MdAccountTree","handlePreview","MdOpenInNew","builtInNodeTypes","R","STROKE","PLUS_HALF","PILL_WIDTH","PILL_HEIGHT","PILL_R","EdgeWithPlusLabel","edgeId","sourceX","sourceY","targetX","targetY","sourcePosition","targetPosition","target","edgePath","labelX","labelY","getStraightPath","edgeLabel","isPass","showLabel","oneThirdX","oneThirdY","twoThirdsX","twoThirdsY","handleAddStepClick","handleClick","context","handleKeyDown","PlusContent","plusProps","BaseEdge","PlusEdge","PlainEdge","LABEL_OFFSET_Y","LabelPlusEdge","showPlus","GatewayBranchEdge","style","markerEnd","verticalRouting","BULLET_OFFSET","elbowY","onAddStepClick","segmentY","pillX","plusX","handlePlusClick","HALF","pillW"],"mappings":"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"}